工程筆記
深入剖析 PlainApp 的點對點架構、傳輸層設計與密碼學實作——來自原始碼的第一手資料。
DLNA 投放:從零實作 UPnP 傳送端與接收端
詳解 PlainApp 如何在 DLNA/UPnP AV 協定上同時實作傳送端與接收端:作為傳送端透過 SOAP 掃描並控制智慧電視,作為接收端把手機本身變成一臺 UPnP MediaRenderer——涵蓋 SSDP 發現、DIDL-Lite 元資料、支援 Range 請求的媒體服務、GENA 事件回呼,以及基於傳送方 IP 的允許/拒絕信任模型,全部用純 Kotlin Multiplatform 實作。
螢幕鏡像:低延遲投放架構設計
本文完整介紹 PlainApp 螢幕鏡像方案的端到端設計:Android 端如何用 MediaCodec 硬體編碼 H.264/Opus,如何透過自訂二進位協定經 WebSocket 傳輸,Web 端如何用 WebCodecs + WebGL2 實現零複製 GPU 直渲,以及封包遺失偵測、螢幕旋轉、系統投放生命週期等工程難點的解決思路。
PlainApp 安全性深度剖析
PlainApp 如何在本地 Wi-Fi 上保護你的資料——以開源程式碼為證。
Wi-Fi Aware 傳輸層設計 —— 鄰居探索與資料路徑
本文說明 PlainApp 如何使用 Wi-Fi Aware(NAN —— Neighbor Awareness Networking)作為對端傳輸備援鏈的中層,介於 LAN(同子網 HTTPS)與 BLE(最後手段的 GATT RPC)之間。Wi-Fi Aware 讓兩台 PlainApp 裝置在不同 SSID、訪客與 IoT VLAN,或完全沒有 Wi-Fi 基礎設施時仍能通訊——無需從 DHCP 伺服器取得任何 IP 位址。
BLE 傳輸層設計 —— 訊息與檔案下載
本文說明當 LAN 與 Wi-Fi Aware 皆不可用時,PlainApp 如何透過藍牙低功耗(BLE)推播聊天訊息並下載檔案。BLE 是保證的備援方案:速度慢,但無需任何 IP 連線即可運作。本文涵蓋線路格式、兩層分塊設計、並行流量如何(以及如何不)被優先排程,以及為何每次請求後都要拆除連線。
對端與頻道聊天架構
本文說明 PlainApp 離線優先聊天如何端對端運作:一則訊息如何從 UI 中的點選一路旅行到另一台裝置的對端傳輸層、群組頻道如何將訊息扇出給多名成員,以及系統如何在網路消失時保持韌性。配對(啟動兩台裝置的信任與金鑰交換)在另一篇《Pairing Flow》文章中說明。
配對流程
本文說明兩台 PlainApp 裝置如何首次建立信任——它們如何發現彼此、交換金鑰,並最終得到共享的 ChaCha20 傳輸金鑰,之後每則聊天訊息、檔案傳輸與上線狀態心跳都以此金鑰加密。使用此金鑰的聊天與頻道架構在另一篇《Chat Architecture》文章中另行介紹。