
Rust WebRTC P2P #29 - P2PTalkingState — Heartbeat + Timeout
Trong phần 29 này, chúng ta sẽ tiến tới trạng thái quan trọng nhất trong vòng đời cuộc gọi: P2PTalkingState. Đây là giai đoạn hai người dùng đang đàm thoại trực tiếp với nhau. Tuy nhiên, vì đây là kết nối P2P (media không đi qua server), chúng ta cần một cơ chế để server biết cuộc gọi còn đang diễn ra hay đã bị ngắt kết nối một cách “im lặng”.
1. Nội dung trọng tâm trong video:
Thiết kế TalkingState:
Xây dựng cấu trúc dữ liệu để theo dõi trạng thái cuộc gọi, bao gồm last_active_caller và last_active_callee sử dụng kiểu Instant để lưu lại thời điểm tương tác gần nhất của mỗi bên. Đồng thời lưu trữ thông tin client để điều phối message chính xác.
Cơ chế Heartbeat (nhịp đập hệ thống):
Server định kỳ gửi bản tin in_call_request mỗi 5 giây tới cả caller và callee để kiểm tra trạng thái kết nối. Đây là giải pháp cần thiết vì server không tham gia vào luồng media.
Xử lý Timeout & tự động kết thúc:
Nếu sau 30 giây một trong hai bên không phản hồi, server sẽ coi như kết nối đã mất và tự động chuyển sang EndState để giải phóng tài nguyên.
Xử lý in_call_notify:
Xây dựng handler để nhận phản hồi từ client. Khi nhận được tín hiệu “vẫn đang trong cuộc gọi”, server sẽ cập nhật lại mốc thời gian hoạt động bằng Instant::now().
Hoàn thiện State Machine:
On Enter: Thông báo bắt đầu đàm thoại
On Event: Vẫn tiếp nhận ICE Candidate gửi muộn
On Timer: Kiểm tra heartbeat định kỳ và reset timer
2. Kiến thức đạt được:
Hiểu vai trò của signaling server trong giai đoạn Talking của WebRTC
Nắm được cách quản lý thời gian thực với Instant và Duration trong Rust
Biết cách thiết kế cơ chế heartbeat/timeout để hệ thống tự phục hồi và tránh leak tài nguyên
Khóa học thực chiến giúp bạn xây dựng từ đầu một Signaling Server bằng Rust, xử lý các cuộc gọi audio/video trực tiếp giữa hai trình duyệt thông qua WebRTC Peer-to-Peer mà không cần Media Server. Bạn sẽ nắm vững kiến trúc WebRTC signaling, cách trao đổi SDP Offer/Answer và ICE Candidates giữa các peer thông qua WebSocket. Khóa học sử dụng Axum + Tokio cho backend, MongoDB để lưu trữ dữ liệu, và JWT để xác thực người dùng. Đây là Phần 1 trong series 7 phần về Lập trình Rust với VoIP, bao gồm: WebRTC P2P, Media Server (Janus, LiveKit, Kurento, Asterisk, FreePBX), và hệ thống CRM/Queue/nhạc chờ/chuyển tiếp cuộc gọi. Yêu cầu tiên quyết: Kiến thức cơ bản về Rust (Ownership, Lifetimes, Traits, Async/Await).
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
32 bàiRust WebRTC P2P #1 - Giới thiệu khóa học
5:29
Rust WebRTC P2P #2 - VoIP là gì? WebRTC là gì?
7:13
Rust WebRTC P2P #3 - SIP overview + Why choose Rust
3:23
Rust WebRTC P2P #4 - Install Rust + RustRover + Cargo Commands
7:36
Rust WebRTC P2P #5 - Hello World + Tokio Runtime + Cargo.toml
5:13
Rust WebRTC P2P #6 - Axum Server + Config Loading
42:44
Rust WebRTC P2P #7 - MongoDB + Logging with log4rs
15:44
Rust WebRTC P2P #8 - Create WebSocket Endpoint with Axum
15:45
Rust WebRTC P2P #9 - ConnectionState — Client Online management
8:46
Rust WebRTC P2P #10 - Message Routing — Dispatcher Pattern
9:37
Rust WebRTC P2P #11 - Nginx Config + Deploy Live on VPS
16:28
Rust WebRTC P2P #12 - User Model + MongoDB Queries
4:34
Rust WebRTC P2P #13 - Login Service + JWT + Argon2
22:03
Rust WebRTC P2P #14 - Auth Middleware HTTP + WebSocket Auth Flow
50:35
Rust WebRTC P2P #15 - Demo Login + WebSocket Auth từ Postman
5:12
Rust WebRTC P2P #16 - State Pattern — P2PCallStateHandler Trait
12:04
Rust WebRTC P2P #17 - CallActor - Event Loop + Timer Management
4:25
Rust WebRTC P2P #18 - CallSupervisor - Call lifetime management
23:08
Rust WebRTC P2P #19 - P2P Architecture + Offer/Answer/ICE Overview
2:31
Rust WebRTC P2P #20 - SDP Detail — ipv4, Port, Codec
4:10
Rust WebRTC P2P #21 - ICE Candidate — STUN/TURN/coTURN
5:04
Rust WebRTC P2P #22 - Chrome webrtc-internals + Firefox about:webrtc
3:00
Rust WebRTC P2P #23 - State Machine + Cơ chế Transition
6:50
Rust WebRTC P2P #24 - Call Start State
15:53
Rust WebRTC P2P #25 - P2PWaitingCallerSdpState — Caller SDP Waiting
17:23
Rust WebRTC P2P #26 - P2PConnectToCalleeState - Incoming Call
16:33
Rust WebRTC P2P #27 - call_answer_req — Codes 100/180/486
11:05
Rust WebRTC P2P #28 - P2PWaitingCalleeSDPState → P2PTalkingState
12:34
Rust WebRTC P2P #29 - P2PTalkingState — Heartbeat + Timeout
18:26
Rust WebRTC P2P #30 - ICE Candidate Forwarding trong Talking State - End State
17:20
Rust WebRTC P2P #31 - Test End-to-End: 2 real browser
15:21
Rust WebRTC P2P #32 - Tổng kết và kế hoạch tiếp theo
3:44
Bài học liên quan
Xem khóa học
Rust WebRTC P2P #32 - Tổng kết và kế hoạch tiếp theo
Sau một hành trình dài từ những dòng code đầu tiên, trong video này chúng ta sẽ cùng nhìn lại toàn bộ hệ thống đã xây dựng, tổng kết những gì đã đạt được, đồng thời phân tích các hạn chế của mô hình P2P và định hướng lộ trình học tập tiếp theo với các hệ thống Media Server chuyên nghiệp.
Bài 32
Rust WebRTC P2P #31 - Test End-to-End: 2 real browser
Trong phần 31 này, chúng ta sẽ thực hiện bước quan trọng nhất sau toàn bộ quá trình xây dựng hệ thống: Test End-to-End (E2E) với hai trình duyệt thật. Đây là bước kiểm chứng toàn bộ pipeline từ build, deploy cho đến thực hiện cuộc gọi P2P thực tế giữa hai user.
Bài 31
Rust WebRTC P2P #30 - ICE Candidate Forwarding trong Talking State - End State
Trong phần 30 này, chúng ta sẽ hoàn thiện mảnh ghép cuối cùng trong vòng đời cuộc gọi: EndState. Đây là trạng thái đảm nhiệm việc kết thúc cuộc gọi một cách an toàn, đảm bảo hệ thống không bị rò rỉ tài nguyên và tất cả các bên đều được thông báo chính xác khi cuộc gọi dừng lại.
Bài 30
Rust WebRTC P2P #28 - P2PWaitingCalleeSDPState → P2PTalkingState
Trong phần 28 này, chúng ta sẽ thực hiện bước cuối cùng trong quy trình Signaling: Triển khai trạng thái P2PWaitingCalleeSDPState. Đây là giai đoạn quan trọng để Server điều phối bản tin SDP Answer từ người bị gọi (Callee) quay trở lại cho người gọi (Caller), đồng thời hoàn tất việc trao đổi các ICE Candidates để hai bên có thể thiết lập kết nối Media.
Bài 28
Rust WebRTC P2P #27 - call_answer_req — Codes 100/180/486
Trong phần 27 này, chúng ta tiếp tục hoàn thiện logic phía Server bằng cách xây dựng lệnh call_answer_req. Đây là bước quan trọng giúp người bị gọi (Callee) phản hồi lại yêu cầu từ người gọi, thông báo trạng thái đổ chuông, từ chối hoặc chấp nhận cuộc gọi theo các mã chuẩn trong signaling.
Bài 27
Rust WebRTC P2P #26 - P2PConnectToCalleeState - Incoming Call
Trong phần 26 này, chúng ta sẽ xây dựng một trong những state phức tạp và thú vị nhất của Signaling Server: P2PConnectToCalleeState. Đây là giai đoạn server thực hiện kết nối tới người bị gọi, điều phối bản tin giữa các thiết bị và xử lý các phản hồi chấp nhận hoặc từ chối cuộc gọi.
Bài 26
Rust WebRTC P2P #25 - P2PWaitingCallerSdpState — Caller SDP Waiting
Trong phần 25 này, chúng ta bắt đầu implement trạng thái đầu tiên trong bộ máy điều khiển cuộc gọi: **P2PWaitingCallerSdpState**. Đây là trạng thái có nhiệm vụ chờ đợi bản tin SDP Offer từ phía Caller sau khi quá trình khởi tạo cuộc gọi đã hoàn tất.
Bài 25
Rust WebRTC P2P #24 - Call Start State
Trong phần 24 này, chúng ta bắt đầu viết những dòng code đầu tiên cho nghiệp vụ cuộc gọi bằng cách xây dựng handler xử lý lệnh call_start_request. Đây là bước khởi đầu quan trọng để server xác thực yêu cầu và chuẩn bị tài nguyên trước khi hai bên bắt đầu trao đổi SDP.
Bài 24
Rust WebRTC P2P #23 - State Machine + Cơ chế Transition
Trong phần 23 này, chúng ta bắt đầu hiện thực hóa kiến trúc đã thiết kế bằng cách xây dựng State Machine và cơ chế transition cho hệ thống signaling. Đây là một bước rất quan trọng để quản lý logic cuộc gọi một cách rõ ràng, chặt chẽ và an toàn.
Bài 23Hiển thị 9 / 31 bài học