
Rust VoIP - Janus Media Server #13: Route from Phone to Rust Server
Trong bài học này, chúng ta sẽ bắt đầu hiện thực hóa luồng kết nối từ "thế giới bên ngoài" vào hệ thống nội bộ. Cụ thể, chúng ta sẽ cấu hình để một cuộc gọi từ điện thoại (thông qua Softphone Zoiper) có thể đi xuyên qua nhiều lớp trung gian và đi đến Rust Server của chúng ta. Đây là bước cực kỳ quan trọng để backend Rust có thể nhận diện được cuộc gọi đến và chuẩn bị tài nguyên trên Janus Media Server cho luồng SIP-to-App.
1. Cấu hình Dispatcher tại Telco Simulator
→ Update dispatcher.list:
• Trỏ về Kamailio Server
• SIP Port 5061
→ Setup routing logic:
• Khi gọi tới đầu số giả lập:
- 1900 1098
• Telco Simulator sẽ tự động:
- Forward SIP INVITE
- Route sang Kamailio
2. Xử lý SIP Message tại Kamailio
→ Sử dụng Kamailio Cookbook để:
• Setup global variable
• Kiểm tra SIP request
• Xử lý routing logic
→ Nhận SIP INVITE
→ Extract SDP từ body request
→ Forward SIP message bằng:
• t_relay()
→ Relay sang Rust Server:
• UDP protocol
• Port 9982
3. Xây dựng UDP Server trong Rust
→ Tạo module shift_transport
→ Bind UDP socket:
• Public IP
• UDP Port
→ Implement receive_loop:
• Chạy trên thread riêng
• Listen liên tục từ socket
• Parse SIP message
→ Sử dụng:
• Arc
• Shared State
để quản lý kết nối trong toàn hệ thống.
4. Testing Signaling Flow
📞 Luồng cuộc gọi thực tế:
Zoiper
→ Telco Simulator
→ Kamailio
→ Rust Server
→ Theo dõi log thực tế:
• SIP INVITE
• SDP
• Record-Route
• Via Header
→ Kiểm tra Rust Server nhận SIP message thành công
5. 🚀 Kết quả đạt được:
→ Route thành công SIP signaling từ Phone → Rust
→ Hiểu cách hoạt động của SIP Proxy chain
→ Làm chủ UDP socket trong Rust
→ Parse và xử lý SIP message cơ bản
→ Chuẩn bị nền tảng cho SIP-to-App flow
Đây là bước cực kỳ quan trọng trước khi xử lý SIP INVITE, SDP negotiation và media bridging với Janus Media Server.
6. Tài nguyên bài học:
Kamailio Cookbook:
https://www.kamailio.org/docs/modules/5.8.x/
https://www.kamailio.org/wikidocs/#cookbooks
https://www.kamailio.org/wikidocs/cookbooks/5.8.x/pseudovariables/
Source code:
https://github.com/bytebuffer-voip/janus-call-service/tree/feat/sip-to-app-part-1-config-connect-sip-to-rust-server
SIP document:
https://datatracker.ietf.org/doc/html/rfc3261
Nâng tầm ứng dụng WebRTC của bạn lên quy mô Production Nếu bạn đã hiểu cách các trình duyệt kết nối trực tiếp qua WebRTC P2P, thì đây chính là bước đi tiếp theo để đưa ứng dụng của bạn vào thực tế Mô hình P2P rất tuyệt vời cho các kết nối đơn giản, nhưng khi đối mặt với các bài toán lớn hơn, nó bộc lộ 4 hạn chế nghiêm trọng: 1. Khả năng mở rộng: Với 10 người dùng, hệ thống P2P cần tới 90 kết nối trực tiếp, khiến việc mở rộng là gần như không thể 2. Tốn tài nguyên: Client phải upload đồng thời nhiều luồng media, gây ngốn CPU và nhanh hết pin, đặc biệt là trên thiết bị di động 3. Không thể ghi âm tập trung: Media truyền trực tiếp giữa các peer nên không có cách nào ghi lại cuộc gọi một cách tập trung tại server 4. Vấn đề NAT: Khoảng 15% người dùng gặp lỗi kết nối do NAT nghiêm ngặt Giải pháp đột phá với Janus Media Server Khóa học này sẽ hướng dẫn bạn sử dụng Janus Media Server – một thành phần trung gian mạnh mẽ để thay thế mô hình kết nối trực tiếp . Thay vì gửi dữ liệu cho nhau, tất cả client sẽ gửi media lên server để server xử lý và phân phối lại Chúng ta sẽ tập trung sâu vào kiến trúc Modular của Janus, đặc biệt là Audiobridge plugin Cơ chế Mixing: Server sẽ trộn (mix) các luồng audio lại thành một luồng duy nhất, giúp giảm đáng kể băng thông và tải cho phía người dùng Khả năng Scale: Hệ thống có thể đáp ứng hàng trăm, thậm chí hàng nghìn người dùng cùng lúc Bạn sẽ học được gì? Xuyên suốt khóa học, chúng ta sẽ cùng nhau lập trình bằng ngôn ngữ Rust để xây dựng một hệ thống hoàn chỉnh với các tính năng thực tế nhất: Call App to App: Kết nối giọng nói giữa hai ứng dụng WebRTC. Call App to SIP: Tích hợp gọi từ Web/App sang hệ thống tổng đài SIP truyền thống. Call SIP to App: Nhận cuộc gọi ngược lại từ hệ thống SIP về Web/App. Auto Callout: Phát triển hệ thống tự động gọi ra chuyên nghiệp. Mục tiêu khóa học Toàn bộ nội dung được thiết kế theo lộ trình từ cơ bản đến nâng cao, giúp bạn không chỉ hiểu về mặt lý thuyết mà còn có đủ kỹ năng để tự tay xây dựng một hệ thống Voice IP thực tế.
Công nghệ sử dụng
Tác giả
ByteBuffer
Coder cỏ tại DTS Group và IPAS
Chuyên gia về Rust và hệ thống VoIP/WebRTC. Nhiều năm kinh nghiệm xây dựng các hệ thống real-time communication với hiệu năng cao và độ trễ thấp.
Bài học
26 bàiRust VoIP - Janus Media Server #1: Giới thiệu khóa học
3:46
Rust VoIP - Janus Media Server #2: Setup Janus Media Server
8:38
Rust VoIP - Janus Media Server #3: Setup Codebase + Config Janus
16:14
Rust VoIP - Janus Media Server #4: Code + Test Janus API
29:18
Rust VoIP - Janus Media Server #5: Call App to App - Setup Call
42:50
Rust VoIP - Janus Media Server #6: Call App to App - Waiting Caller SDP
45:37
Rust VoIP - Janus Media Server #7: Call App to App - Connect to Callee
24:20
Rust VoIP - Janus Media Server #8: Call App to App - Talking State
27:43
Rust VoIP - Janus Media Server #9: Call App to App - End State + Keep Alive
19:16
Rust VoIP - Janus Media Server #10: Call App to App - Tổng kết
10:29
Rust VoIP - Janus Media Server #11: Setup Telco Simulator
25:09
Rust VoIP - Janus Media Server #12: Setup SIP server & RTP-engine
26:08
Rust VoIP - Janus Media Server #13: Route from Phone to Rust Server
33:00
Rust VoIP - Janus Media Server #14: Sip To App - Create Call and Define Call State
33:30
Rust VoIP - Janus Media Server #15: Sip To App - Join SIP Member State
32:15
Rust VoIP - Janus Media Server #16: Sip To App - Join SIP Member State: SIP SDP Processing
45:32
Rust VoIP - Janus Media Server #17: Sip To App - Join SIP Member State: Finish
30:37
Rust VoIP - Janus Media Server #18: Sip To App - Connect to Agent
24:49
Rust VoIP - Janus Media Server #19: Sip To App - End state and EDGE case
27:42
Rust VoIP - Janus Media Server #20: Sip To App - Talking State
19:07
Rust VoIP - Janus Media Server #21: Sip To App - Debug RTP Media
13:39
Rust VoIP - Janus Media Server #22: App To Sip: Setup Call
24:42
Rust VoIP - Janus Media Server #23: App To Sip: Waiting Caller SDP State
30:51
Rust VoIP - Janus Media Server #24: App To Sip: Build + Deploy + Debug App to SIP.
16:01
Rust VoIP - Janus Media Server #25: App To Sip: Connect To SIP State
1:09:22
Rust VoIP - Janus Media Server #26: App To Sip: Talking State & End State
24:51
Bài học liên quan
Xem khóa học
Rust VoIP - Janus Media Server #26: App To Sip: Talking State & End State
Trong bài học này, chúng ta sẽ hoàn thiện những bước cuối cùng của luồng gọi App-to-SIP với Rust và Janus Media Server. Sau khi đã kết nối thành công từ WebRTC Browser đến SIP Phone ở bài trước, video hôm nay sẽ tập trung vào việc triển khai Talking State và End State để quản lý toàn bộ vòng đời cuộc gọi VoIP từ khi bắt đầu đàm thoại đến lúc giải phóng tài nguyên hoàn toàn. Bạn sẽ học cách xử lý SIP 200 OK, quản lý SIP Dialog, xử lý sự kiện kết thúc cuộc gọi từ nhiều nguồn khác nhau và cleanup tài nguyên trên Janus Media Server một cách chính xác trong hệ thống SIP ↔ WebRTC production.
Bài 26
Rust VoIP - Janus Media Server #25: App To Sip: Connect To SIP State
Trong bài học này, chúng ta sẽ thực hiện một trong những bước quan trọng nhất của luồng App-to-SIP: Trạng thái Connect to SIP. Đây là giai đoạn hệ thống Rust Server của chúng ta đóng vai trò là một SIP Client (UAC) để khởi tạo cuộc gọi đến SIP Server (Kamailio) và chuyển tiếp yêu cầu từ người dùng WebRTC ra thế giới điện thoại. Bạn sẽ học cách build một bản tin SIP INVITE hoàn chỉnh, cách khai thác Janus Admin API để lấy thông tin media và cách cấu hình Kamailio để điều phối cuộc gọi đi (Outbound Call).
Bài 25
Rust VoIP - Janus Media Server #24: App To Sip: Build + Deploy + Debug App to SIP.
Trong bài học này, chúng ta sẽ tiếp tục hoàn thiện luồng App-to-SIP. Sau khi đã xử lý xong trạng thái chờ SDP từ người gọi, video hôm nay sẽ tập trung vào việc Build, Deploy và Debug thực tế để chuyển dịch sang trạng thái tiếp theo: Connect to SIP State. Bạn sẽ học cách định nghĩa cấu trúc trạng thái mới, xử lý các sự kiện bất đồng bộ từ WebSocket và Janus để đảm bảo điều kiện "webrtcup" được thỏa mãn trước khi thực hiện kết nối ra phía nhà mạng.
Bài 24
Rust VoIP - Janus Media Server #23: App To Sip: Waiting Caller SDP State
Sau khi đã xây dựng xong bộ khung cho luồng:📞 App-to-SIP, ở bài trước, hôm nay chúng ta sẽ bắt đầu hiện thực hóa state đầu tiên của outbound calling flow: → Waiting Caller SDP State. Đây là giai đoạn quan trọng để thiết lập media path từ WebRTC Browser trước khi hệ thống thực hiện cuộc gọi ra phía SIP/Telco.
Bài 23
Rust VoIP - Janus Media Server #22: App To Sip: Setup Call
Sau khi đã triển khai thành công các luồng gọi: App-to-App, SIP-to-App, trong bài học này, chúng ta sẽ bắt đầu xây dựng luồng ngược lại: 📞 App-to-SIP. Đây là tính năng cho phép WebRTC Browser thực hiện cuộc gọi trực tiếp tới số điện thoại SIP thông qua hệ thống Telco Simulator.
Bài 22
Rust VoIP - Janus Media Server #21: Sip To App - Debug RTP Media
Chào mừng bạn đến với Bài 21 của khóa học: "Lập trình VoIP với Rust: Janus Media Server".
Bài 21
Rust VoIP - Janus Media Server #20: Sip To App - Talking State
Chào mừng bạn đến với Bài 20 của khóa học: "Lập trình VoIP với Rust: Janus Media Server". Sau khi đã xử lý xong các trạng thái chờ và các tình huống ngoại lệ (Edge Cases) ở bài trước, hôm nay chúng ta sẽ đi vào giai đoạn cuối cùng của luồng gọi SIP-to-App: → Talking State Đây là trạng thái đàm thoại chính thức, nơi các bản tin signaling cuối cùng được trao đổi để thiết lập luồng media hoàn chỉnh giữa: 📞 SIP Phone ↔ RTP ↔ Janus Media Server ↔ WebRTC Browser Trong video này, bạn sẽ học cách định nghĩa Talking State, build SIP 200 OK chuẩn RFC và quản lý toàn bộ signaling trong suốt thời gian cuộc gọi diễn ra.
Bài 20
Rust VoIP - Janus Media Server #19: Sip To App - End state and EDGE case
Trong bài học này, chúng ta sẽ chưa đi ngay vào trạng thái Talking mà tập trung xử lý một phần cực kỳ quan trọng trong hệ thống VoIP Production: → End State → SIP Edge Cases → Resource Cleanup → SIP Dialog Management Video sẽ hướng dẫn cách xử lý các SIP message như: • CANCEL • BYE • ACK • PRACK đồng thời đảm bảo mọi tài nguyên trên Janus Media Server được giải phóng chính xác khi cuộc gọi kết thúc. Đây là bước cực kỳ quan trọng để tránh: • Memory leak • SIP retransmission loop • Zombie session • Treo signaling • Room/Handle không được cleanup
Bài 19
Rust VoIP - Janus Media Server #18: Sip To App - Connect to Agent
Sau khi đã hoàn thành việc đưa SIP Member vào phòng họp ở bài trước, hôm nay chúng ta sẽ thực hiện bước tiếp theo trong luồng SIP-to-App: → Kết nối với WebRTC Client (Agent) Mặc dù logic này có nhiều điểm tương đồng với cuộc gọi App-to-App, nhưng việc tích hợp vào luồng SIP đòi hỏi sự quản lý chặt chẽ hơn về: • WebSocket Events • Janus Events • State Machine • SDP Signaling Video này sẽ hướng dẫn cách gửi thông báo cuộc gọi, xử lý phản hồi từ trình duyệt và hoàn tất quá trình bắt tay WebRTC để chuẩn bị bước sang Talking State.
Bài 18Hiển thị 9 / 25 bài học