【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】
CarPlay 在车机侧的蓝牙通信原理与角色划分详解
Apple CarPlay 是苹果推出的一种车载互联系统,它允许 iPhone 与车载系统无缝连接,实现地图导航、电话、消息和音乐等功能。在无线 CarPlay 场景下,蓝牙与 Wi-Fi 是通信的两大核心基础。本文将从车机侧作为 Server 和 Client 的视角,结合 AOSP 实现细节,全面分析 CarPlay 中的蓝牙处理逻辑与关键 UUID 的作用。
一、车机在 CarPlay 中的角色划分:Server 与 Client
1. 蓝牙 SPP Server 角色
车机作为 CarPlay 的蓝牙服务端,主要用于监听来自 iPhone 的连接请求。
private static final UUID SERVER_SPP_UUID = UUID.fromString("00000000-deca-fade-deca-deafdecacaff");
BluetoothServerSocket ss = adapter.listenUsingRfcommWithServiceRecord("com.running.android.carplay", SERVER_SPP_UUID);
此处,车机通过 listenUsingRfcommWithServiceRecord()
使用 IAP2 协议的 SPP UUID 打开一个 RFCOMM 服务,用于等待 iPhone 主动连接。此服务是 CarPlay 初始化阶段的基础。
2. 蓝牙 SPP Client 角色(极少数场景)
如果车机需要主动连接 iPhone 上已暴露的服务(实验或特殊情况),则使用如下代码:
BluetoothDevice device = ...;
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00000000-deca-fade-deca-deafdecacafe"));
socket.connect();
该 UUID(00000000-deca-fade-deca-deafdecacafe)作为 Client 端连接时使用,与 decacaff 结尾的 UUID(即正式 IAP2 服务 UUID)进行配合。其在苹果文档中未明确定义为标准 UUID,但在某些实现中用于 Client 模拟测试。
二、CarPlay 蓝牙协议与 UUID 功能详解
UUID 名称 | 值 | 用途 |
---|---|---|
UUID_DEVICE_CARPLAY_EIR | 2d8d2466-e14d-451c-88bc-7301abea291a | 用于 EIR(蓝牙广播)中标识设备支持 CarPlay,帮助车机筛选目标设备 |
UUID_IAP_ACCESSORY | 00000000-deca-fade-deca-deafdecacaff | IAP2 协议 UUID,建立 RFCOMM 通道进行 CarPlay 初始化连接 |
UUID_IAP_ACCESSORY_ALT | 00000000-deca-fade-deca-deafdecacafe | 非标准 UUID,用于特定调试场景的 Client 连接测试 |
UUID_CARPLAY | ec884348-cd41-40a2-9727-575d50bf1fd3 | CarPlay 的核心数据传输 UUID,用于管理媒体、地图等功能的数据交换 |
三者关系说明:
-
识别阶段:车机通过扫描到的 EIR 包中是否包含
UUID_DEVICE_CARPLAY_EIR 2d8d2466-e14d-451c-88bc-7301abea291a
来判断设备是否支持 CarPlay。 -
握手阶段:建立 SPP 通道,进行身份认证和功能协商。
-
Server 端使用
UUID_IAP_ACCESSORY 00000000-deca-fade-deca-deafdecacaff
手机 主动 连接 车机的场景 -
Client 端可以使用
UUID_IAP_ACCESSORY_ALT 00000000-deca-fade-deca-deafdecacafe
进行 车机 主动 连接 手机的场景
-
-
会话阶段:建立基于
UUID_CARPLAY ec884348-cd41-40a2-9727-575d50bf1fd3
的 CarPlay Session,开始媒体/导航功能。
三、SPP Server 与 Client 用法区别
SPP Server 示例(车机监听连接)
UUID sppUuid = UUID.fromString("00000000-deca-fade-deca-deafdecacaff");
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("CarPlayService", sppUuid);
BluetoothSocket socket = serverSocket.accept();
SPP Client 示例(设备主动连接)
UUID sppUuid = UUID.fromString("00000000-deca-fade-deca-deafdecacafe");
BluetoothDevice device = ...;
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(sppUuid);
socket.connect();
注意:标准 CarPlay 通常由 iPhone 作为 SPP Client,车机作为 Server 使用 decacaff
UUID。
四、Wi-Fi 架构模式与蓝牙交互差异
无线 CarPlay 支持两种 Wi-Fi 架构:
模式类型 | 描述 | 蓝牙行为差异 |
---|---|---|
手机连接车机热点 | 车机为 AP,手机作为 STA | 车机通过蓝牙传递其热点信息,iPhone 主动连接 |
车机连接手机热点 | iPhone 为 AP,车机作为 STA | iPhone 通过蓝牙传递热点 SSID/PW,车机连接手机热点 |
通用蓝牙通信流程(不论哪种 Wi-Fi 架构):
-
蓝牙配对阶段
- 使用 IAP2 UUID 建立 RFCOMM 通道
-
能力协商阶段
- 通过 IAP2 传递 Wi-Fi 架构信息、热点参数、CarPlay 支持类型
-
网络配置阶段
- 根据协商结果,手机或车机连接指定的热点
-
Wi-Fi 上层通信启动
- CarPlay 使用 mDNS 寻找
_carplay._tcp
服务
- CarPlay 使用 mDNS 寻找
五、CarPlay 初始化完整流程(蓝牙视角)
-
EIR 广播识别
- iPhone 开启 EIR 广播,包含
UUID_DEVICE_CARPLAY_EIR 2d8d2466-e14d-451c-88bc-7301abea291a
- 车机通过蓝牙扫描识别支持 CarPlay 的 iPhone
- iPhone 开启 EIR 广播,包含
-
蓝牙连接
- 需要没有配对,需要先配对
- iPhone 主动连接车机的 SPP Server UUID (
UUID_IAP_ACCESSORY 00000000-deca-fade-deca-deafdecacaff
)- 车机需要先 listenUsingRfcommWithServiceRecord
- 车机作为 Client 主动连接 iPhone 暴露的 Server UUID
- (需 iPhone 开启EIR 广播)
-
IAP2 协议交互
- 交换设备信息、认证令牌、能力参数(支持哪种 Wi-Fi 架构)
-
Wi-Fi 建链
- 手机连接车机热点,或车机连接手机热点,完成 IP 建立
-
TCP & mDNS 发现 CarPlay 服务
- 建立 TCP 通信,寻找
_carplay._tcp.local
服务,启动 CarPlay Session
- 建立 TCP 通信,寻找
-
启动投屏/音频/导航服务
补充说明:
- 在 AOSP 蓝牙协议栈中,车机注册 SPP Server 时,会在 SDP 服务记录中添加
UUID_IAP_ACCESSORY
,供 iPhone 查询。 - iPhone 会在发起连接前,通过 SDP 请求确认车机是否支持 IAP2 UUID,从而判断是否为 CarPlay 兼容设备。
- 蓝牙连接建立成功后,IAP2 协议的消息流转将通过 RFCOMM 通道进行,该阶段非常关键,决定了后续 Wi-Fi 和 CarPlay 会话是否能成功建立。
六、总结
在无线 CarPlay 中,蓝牙连接不仅仅用于配对,还承载了 CarPlay 初始化的重要握手与协商流程。车机大多数情况下扮演 蓝牙 SPP Server,监听 UUID_IAP_ACCESSORY
,而 iPhone 作为 Client 进行连接。蓝牙通道用于协商 Wi-Fi 架构、交换热点信息,为最终的 CarPlay 服务通信铺路。
理解 CarPlay 的蓝牙交互机制,有助于调试连接问题、分析断连原因,并对自定义车机系统中的 CarPlay 接入与认证流程提供理论依据。