PlainApp 博客

工程笔记

深入剖析 PlainApp 的点对点架构、传输层设计与密码学实现——来自源码的第一手资料。

Transport16 min read

DLNA 投屏:从零实现 UPnP 发送端与接收端

详解 PlainApp 如何在 DLNA/UPnP AV 协议上同时实现发送端与接收端:作为发送端通过 SOAP 扫描并控制智能电视,作为接收端把手机本身变成一台 UPnP MediaRenderer——涵盖 SSDP 发现、DIDL-Lite 元数据、支持 Range 请求的媒体服务、GENA 事件回调,以及基于发送方 IP 的允许/拒绝信任模型,全部用纯 Kotlin Multiplatform 实现。

阅读文章
Architecture14 min read

屏幕镜像:低延迟投屏架构设计

本文完整介绍 PlainApp 屏幕镜像方案的端到端设计:Android 端如何用 MediaCodec 硬件编码 H.264/Opus,如何通过自定义二进制协议经 WebSocket 传输,Web 端如何用 WebCodecs + WebGL2 实现 0 拷贝 GPU 直渲,以及丢包检测、横屏旋转、系统投屏生命周期等工程难点的解决思路。

阅读文章
Security12 分钟阅读

PlainApp 安全详解

PlainApp 如何在本地 Wi-Fi 上保护你的数据 —— 所有内容均可在开源代码中验证。

阅读文章
Transport19 min read

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 地址。

阅读文章
Transport15 min read

BLE 传输层设计 —— 消息与文件下载

本文介绍了当 LAN 和 Wi-Fi Aware 均不可用时,PlainApp 如何通过蓝牙低功耗(BLE)推送聊天消息并下载文件。BLE 是有保证的回退方案:速度慢,但无需任何 IP 连接即可工作。文章涵盖线路格式、两层分片设计、并发流量如何(以及如何不)被优先调度,以及为何每次请求后都要拆除连接。

阅读文章
Architecture12 min read

对端与频道聊天架构

本文端到端地介绍了 PlainApp 离线优先的聊天机制:一条消息如何从 UI 中的点击出发,经由对端传输层到达另一台设备;群组频道如何将消息扇出给众多成员;以及当网络消失时系统如何保持韧性。配对(用于引导两台设备完成信任与密钥交换的过程)在单独的《Pairing Flow》文章中介绍。

阅读文章
Security10 min read

配对流程

本文介绍了两台 PlainApp 设备如何首次建立信任——它们如何发现彼此、交换密钥,并最终得到共享的 ChaCha20 传输密钥,之后每条聊天消息、文件传输和在线状态心跳都使用该密钥进行加密。使用此密钥的聊天与频道架构在另一篇《Chat Architecture》文章中单独介绍。

阅读文章