Blog PlainApp

Ghi chú kỹ thuật

Phân tích chuyên sâu về kiến trúc peer-to-peer, thiết kế transport và mật mã học của PlainApp — trực tiếp từ mã nguồn.

Transport16 min read

DLNA Cast: Xây dựng Bộ Gửi và Bộ Nhận UPnP Từ Đầu

Cách PlainApp triển khai DLNA/UPnP AV casting ở cả hai phía: quét và điều khiển TV qua SOAP với vai trò bộ gửi, và biến chính chiếc điện thoại thành một UPnP MediaRenderer với vai trò bộ nhận — bao gồm SSDP discovery, DIDL-Lite metadata, media serving với Range request, GENA event callback, và mô hình tin cậy allow/deny dựa trên IP người gửi, tất cả bằng Kotlin Multiplatform thuần.

Đọc bài viết
Architecture15 min read

Screen Mirror: Kiến trúc Casting độ trễ thấp

Bài viết này trình bày thiết kế end-to-end của hệ thống screen mirror trên PlainApp: cách Android capture và mã hóa phần cứng H.264/Opus qua MediaCodec, cách các frame di chuyển qua WebSocket bằng giao thức nhị phân tùy chỉnh, cách phía web giải mã bằng WebCodecs và render qua WebGL2 với zero CPU copies, cách xử lý loss detection, xoay màn hình và remote touch control, cũng như cách đồng bộ vòng đời MediaProjection.

Đọc bài viết
Security12 min read

PlainApp Bảo mật: phân tích chuyên sâu

PlainApp bảo vệ dữ liệu của bạn trên Wi-Fi nội bộ như thế nào — với bằng chứng từ mã nguồn mở.

Đọc bài viết
Transport19 min read

Thiết kế tầng vận chuyển Wi-Fi Aware — Khám phá láng giềng và các đường dẫn dữ liệu

Bài viết này giải thích cách PlainApp sử dụng Wi-Fi Aware (NAN — Neighbor Awareness Networking) làm tầng trung gian trong chuỗi dự phòng của tầng vận chuyển peer, nằm giữa LAN (HTTPS cùng subnet) và BLE (GATT RPC phương án cuối). Wi-Fi Aware giúp hai thiết bị PlainApp giao tiếp được với nhau khi ở các SSID khác nhau, VLAN khách với IoT, hoặc không có cơ sở hạ tầng Wi-Fi nào — mà không cần địa chỉ IP từ máy chủ DHCP.

Đọc bài viết
Transport15 min read

Thiết kế tầng vận chuyển BLE — Tin nhắn và tải tệp xuống

Bài viết này trình bày cách PlainApp đẩy tin nhắn trò chuyện và tải tệp xuống qua Bluetooth Low Energy khi cả LAN lẫn Wi-Fi Aware đều không khả dụng. BLE là tầng dự phòng được đảm bảo: chậm, nhưng hoạt động mà không cần bất kỳ kết nối IP nào. Bài viết đề cập đến định dạng đường truyền, thiết kế phân khối hai lớp, cách lưu lượng đồng thời được (và không được) ưu tiên, và lý do mỗi kết nối đều bị hủy bỏ sau mỗi yêu cầu.

Đọc bài viết
Architecture12 min read

Kiến trúc Chat Peer & Channel

Bài viết này giải thích cách chat ưu tiên ngoại tuyến của PlainApp hoạt động đầu cuối: cách một tin nhắn đi từ một cú chạm trong giao diện UI đến một thiết bị khác qua tầng vận chuyển peer, cách các kênh nhóm phân phát tin nhắn đến nhiều thành viên, và cách hệ thống giữ được khả năng chịu lỗi khi mạng biến mất. Quá trình pairing (việc thiết lập tin cậy và trao đổi khóa để khởi tạo hai thiết bị) được đề cập đến trong bài viết Pairing Flow riêng biệt.

Đọc bài viết
Security10 min read

Luồng ghép nối

Bài viết này giải thích cách hai thiết bị PlainApp thiết lập niềm tin lần đầu tiên — cách chúng khám phá lẫn nhau, trao đổi khóa, và đi đến khóa vận chuyển ChaCha20 chung dùng để mã hóa mọi tin nhắn trò chuyện, truyền tệp và tín hiệu trạng thái hiện diện sau đó. Kiến trúc trò chuyện và kênh tiêu thụ khóa này được trình bày riêng trong bài viết Kiến trúc Trò chuyện.

Đọc bài viết