十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Open Headunit WppFraming 消息分帧实现指南:字节级协议解析原理全解

Open Headunit WppFraming 消息分帧实现指南:字节级协议解析原理全解 Open Headunit WppFraming 消息分帧实现指南字节级协议解析原理全解【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen Headunit 是一款能把安卓平板或手机变成 Android Auto 车机主机的开源应用。本文带你读懂它最底层的 WppFraming 消息分帧模块——手机与车机在无线握手阶段正是靠这套 4 字节头 载荷的信封格式交换协议消息。不需要高深基础读完你能完全理解它为什么长这样。什么是 WppFraming一句话说清楚WPPWiFi Projection ProtocolWiFi 投屏协议是 Android Auto 无线连接时手机和车机之间对话的语言。而WppFraming 消息分帧解决的是一个朴素的问题字节流是一整条河怎么知道一条消息从哪里开始、到哪里结束答案是每条消息前面都贴一个 4 字节的信封头告诉接收方后面跟着多长的数据、以及这是什么类型的消息。帧格式4 字节头 数据体整个协议的结构极其简单用一张表就能看懂字节位置01234 及以后含义长度高字节长度低字节类型高字节类型低字节protobuf 数据体载荷长度2 字节大端序uint16 BE最大值0xFFFF即 65535 字节消息类型2 字节大端序取值见下文消息类型一节数据体protobuf 编码的具体消息格式定义在 wireless.proto举个具体例子一条 258 字节、类型为 3INFO_RESPONSE的消息前 4 个字节就是0x01 0x02 0x00 0x03——258 写成大端十六进制是0x0102类型 3 写成0x0003。消息类型速查表WppHandshakeSession.kt 定义了这套握手对话中的全部消息类型编号名称方向用途1START_REQUEST车机 → 手机告知手机投屏会话的地址2INFO_REQUEST手机 → 车机索要网络连接凭证3INFO_RESPONSE车机 → 手机返回 SSID、密码等凭证4VERSION_REQUEST车机 → 手机声明协议版本与车辆身份5VERSION_RESPONSE手机 → 车机回应协议版本6CONNECT_STATUS手机 → 车机汇报是否成功加入网络7START_RESPONSE手机 → 车机确认 START_REQUEST8 / 9PING_REQUEST / RESPONSE双向心跳保活一次典型握手就像点餐车机先自我介绍类型 4手机要菜单类型 2车机把网络密码递过去类型 3手机确认入座类型 6投屏正式开始。消息内容的构造集中在 WppMessages.kt。为什么坚持大端序字节级一致性的意义源码注释里有一句话很关键这套帧格式是逐字节与参考实现保持一致的。大端序高字节在前是这类网络协议的通用习惯接收端严格按约定解读(第0字节 × 256) 第1字节 载荷长度 (第2字节 × 256) 第3字节 消息类型一旦大小端弄反比如把 258 读成 512后面所有消息的切分点就全错了而且日志里什么都看不出来——手机会直接静默丢弃畸形消息。这就是为什么项目把分帧逻辑写得纯粹且可测试。编码与解码对称的四个函数WppFraming.kt 只有四个入口职责划分一目了然函数作用encodeHeader由长度和类型生成 4 字节头encodeFrame头 完整载荷拼出整帧decodePayloadSize从头部解出载荷长度decodeType从头部解出消息类型其中藏着两个宁死也不妥协的设计细节超长载荷直接报错绝不截断。如果长度悄悄溢出回绕接收方会把后续每条消息都从错误的偏移量开始读连接永久失步。头不足 4 字节就拒绝解码而不是越界硬读——宁可让调用方发现数据没到齐。用单元测试钉死字节协议实现最怕看起来对所以 WppFramingTest.kt 把字节级行为逐一钉死手工验算例子258 字节 类型 3 必须精确等于0x01 0x02 0x00 0x03边界值往返测试0、1、255、256、990、65535专门覆盖跨字节边界的 255/256初级编码器最容易在这翻车超长载荷65536和负数长度必须抛异常短头解码必须拒绝这类字节钉死测试的价值在于协议错位的 bug 不会出现在日志里只会在真机上表现为手机没反应。它跑在哪些通道上同一个 WppFraming两种传输蓝牙 RFCOMM 通道手机还没连上我们的网络时握手先走蓝牙完成TCP 通道Android Auto 17.4 起手机可直接拨打车机宣告的 TCP 地址WppTcpServer.kt 在 5299 端口应答让重连无需再走一次蓝牙握手两条通道共用同一套帧格式和消息构造——源码注释直言如果两条路径的字节有任何差异那将是日志永远无法暴露的缺陷因为手机对畸形消息的回应是沉默。小结4 个字节换整个协议Open Headunit 的 WppFraming 模块用一个极小的设计讲透了协议分帧的本质4 字节大端头 长度 类型简单到不可能记错严格校验拒绝溢出、拒绝短头把静默失步挡在发生之前单元测试用手工字节值做锚点保证与真实协议逐字节一致理解了这套分帧你就拿到了读懂 Android Auto 无线握手全链路的第一把钥匙。想继续深入可以从 WppHandshakeSession.kt 的状态机以及 wireless.proto 中各消息的数据结构入手。【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表