工程笔记
深入剖析 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 实现 0 拷贝 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、访客 VLAN 与 IoT VLAN,甚至完全没有 Wi-Fi 基础设施的情况下也能通信——而无需从 DHCP 服务器获取任何 IP 地址。
BLE 传输层设计 —— 消息与文件下载
本文介绍了当 LAN 和 Wi-Fi Aware 均不可用时,PlainApp 如何通过蓝牙低功耗(BLE)推送聊天消息并下载文件。BLE 是有保证的回退方案:速度慢,但无需任何 IP 连接即可工作。文章涵盖线路格式、两层分片设计、并发流量如何(以及如何不)被优先调度,以及为何每次请求后都要拆除连接。
对端与频道聊天架构
本文端到端地介绍了 PlainApp 离线优先的聊天机制:一条消息如何从 UI 中的点击出发,经由对端传输层到达另一台设备;群组频道如何将消息扇出给众多成员;以及当网络消失时系统如何保持韧性。配对(用于引导两台设备完成信任与密钥交换的过程)在单独的《Pairing Flow》文章中介绍。
配对流程
本文介绍了两台 PlainApp 设备如何首次建立信任——它们如何发现彼此、交换密钥,并最终得到共享的 ChaCha20 传输密钥,之后每条聊天消息、文件传输和在线状态心跳都使用该密钥进行加密。使用此密钥的聊天与频道架构在另一篇《Chat Architecture》文章中单独介绍。