ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Open Headunit Protobuf消息体系:9个.proto文件定义Android Auto通信语法

Open Headunit Protobuf消息体系:9个.proto文件定义Android Auto通信语法 Open Headunit Protobuf消息体系9个.proto文件定义Android Auto通信语法【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen Headunit 是一款开源的 Android Auto 车机接收端应用能把 Android 平板或手机变成 Android Auto 主机。它背后最容易被忽略、却决定一切的功能是 proto/ 目录下的9 个文件8 个.proto协议定义 1 个protoc生成脚本——手机和车机之间的每一条握手、每一帧导航、每一个触摸事件都用 Protobuf 消息语法精确定义。为什么是 ProtobufAndroid Auto 的手机端并不公开完整的协议文档但它的线上传输格式是 Protocol Buffers简称 Protobuf。Open Headunit 通过逆向分析用 9 个文件重建了整套通信语法跨平台同一份.proto定义可生成 Java/Kotlin 代码App 端直接序列化发送⚡体积小二进制编码比 JSON 紧凑得多适合车载实时通道可读性强每个消息字段都有编号注释里还记录了与真实手机抓包交叉验证的结果。所有文件都声明syntax proto2统一位于包com.andrerinas.openheadunit.aap.protocol.proto下编译后生成同名 Java 外层类如Control、Media、Input供 AapMessageHandler.kt 等消息处理器直接调用。9个文件全景一张表看懂分工文件角色典型消息common.proto公共错误码与车机身份MessageStatus、HeadUnitInfocontrol.proto控制平面连接生命周期服务发现、开/关通道、Pingwireless.proto无线投屏握手WPPWi-Fi 凭证、协议版本input.proto按键与触摸事件上报KeyEvent、TouchEventmedia.proto音视频流协商编码器、麦克风、视频焦点navigation.proto仪表盘导航显示下一个转弯、剩余距离playback.proto媒体播放状态歌曲元数据、播放状态sensors.proto车辆传感器数据车速、档位、油耗gen.sh用protoc批量生成 Java 类—逐个拆解每个文件定义了什么1️⃣ common.proto错误码字典任何响应消息都会带一个MessageStatuscommon.proto 第5-39行定义了从STATUS_SUCCESS到STATUS_PING_TIMEOUT等 30 余种状态码覆盖证书错误、蓝牙配对失败、内存不足等几乎所有异常场景。它还定义了HeadUnitInfo车机向手机申报品牌、车型、年份。一个有意思的细节是注释里写明——vehicle_type字段是车机声明我是摩托车的唯一途径手机端会据此决定是否使用自己的麦克风。2️⃣ control.proto连接生命周期的总指挥这是最大的文件定义了ControlMsgType枚举版本协商MESSAGE_VERSION_REQUEST→ 服务发现MESSAGE_SERVICE_DISCOVERY_*→ 开通道MESSAGE_CHANNEL_OPEN_*→ 心跳MESSAGE_PING_*→ 告别MESSAGE_BYEBYE_*。其中 ServiceDiscoveryResponse 是车机自我介绍的核心消息包含车型信息、驾驶员座位位置左舵/右舵以及每个服务的能力卡片MediaSinkService车机能解码的音视频配置分辨率从 800x480 到 4K支持 H.264、HEVC、VP9、AV1 等编码类型InputSourceService支持哪些按键、触摸屏尺寸BluetoothService/PhoneStatusService/WifiProjectionService等。3️⃣ wireless.proto无线连接前的蓝牙暗号投屏开始前手机和车机先通过蓝牙RFCOMM完成 WPPWiFi Projection Protocol握手wireless.proto定义了 11 类消息WifiStartRequestType 1车机告知手机投屏会话的地址和端口WifiInfoRequest/ResponseType 2/3手机索取并收到 Wi-Fi SSID 和密码WifiVersionRequest/ResponseType 4/5双方交换协议版本与车机身份WifiConnectStatusType 6手机回报我连上你的网络了失败时还附错误提示。文件头部的注释值得细读作者说明每个字段都与参考实现和真实抓包交叉核对过甚至记录了手机实际回 -8 而非预期值这类抓包细节——这是逆向工程文档化的典范。4️⃣ input.proto你的每一次触摸车机触摸屏的每个动作都被打包成InputReport消息上报TouchEvent按下/抬起/移动/多点触摸、KeyEvent物理按键、AbsoluteEvent与RelativeEvent摇杆等相对/绝对位移以及按键绑定请求。手机端正是靠这套语法知道你在车机上点了哪里。5️⃣ media.proto音视频流的合同media.proto 定义了MEDIA_MESSAGE_START/STOP/SETUP等控制帧以及MediaCodecType枚举PCM、AAC、H.264、VP9、AV1、H.265。AudioConfiguration约定采样率、位深、声道数VideoFocusRequestNotification处理手机切回原生界面时的画面焦点移交MicrophoneRequest甚至细化到回声消除EC与降噪ANC开关。投屏成功后车机会用这张测试图校验视频渲染通道6️⃣ navigation.proto让仪表盘学会导航MsgType定义了INSTRUMENT_CLUSTER_*系列消息开始/停止导航、下一转向详情左拐、环岛、上下匝道共 20 余种NextEvent、转弯距离与时间含米/英里/码等单位。手机端据此在方向盘后的仪表屏上显示转向图标。7️⃣ playback.proto 与 8️⃣ sensors.proto状态回传playback.protoMediaMetaData携带歌名、歌手、专辑封面MediaPlaybackStatus报告播放/暂停/随机模式车机媒体卡片由此更新sensors.protoSensorBatch是一个数据篮可批量装定位、车速、转速、油耗、档位含 P/R/N/D、GPS 卫星数等 21 种传感器注释还诚实标注了哪些传感器已可用/尚未支持。9️⃣ gen.sh一行命令生成全部 Java 类gen.sh 是 9 个文件中的第 9 位它调用protoc依次编译 8 个.proto文件把 Java 类输出到../java/源码目录。这正是定义即代码——协议变更时跑一次脚本序列化/反序列化代码自动就绪。一次投屏中这些消息如何流转手机 ⇄ 车机蓝牙/Wi-Fi 通道 1. WifiVersionRequest —— 交换协议版本 2. WifiInfoResponse —— 下发 SSID 与密码 3. WifiConnectStatus —— 手机回报入网成功 4. Version/ServiceDiscovery —— 车机申报身份与服务能力 5. ChannelOpenRequest —— 按服务打开数据通道 6. 流数据导航帧、媒体帧、传感器批次…… 7. Ping / ByeBye —— 保活与优雅断开控制平面的消息类型统一由 MsgType.kt 与 Channel.kt 做分发与映射想深入某条链路的处理逻辑可以从 aap/ 目录的AapMessageHandler.kt入手。写在最后9 个文件、不到 1500 行定义构成了 Open Headunit 与 Android Auto 手机端的完整契约。对于想理解 Android Auto 协议、或为自己车机做协议扩展的开发者从 common.proto 的错误码读起、再沿 control.proto 的服务发现走一遍是成本最低的一条学习路径。【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表