一、引言
1.1 目的
此文档记录CarPlay 开发中有线连接开发部分,详细介绍CarPlay有线连接的流程,希望可以给开发CarPlay小伙伴一些帮助,无线连接后续再梳理。
二、架构设计
2.1 架构图
注:此图翻译自苹果官方的开发帮助文档
身份认证 (Authentication):CarPlay是一种经过认证的解决方案,需要使用通过Apple获得的Apple认 证协处理器。设备只能流向授权的车机。使用Apple认证协处理器的CarPlay配件3.0只能声明与iOS 10.3或更高版本兼容。iAP2(iOS Accessory Protocol II)和CarPlay接口上的通信都需要身份验证,每个接口都提供一个具体的身份验证API。为了加快这些双重身份验证步骤,提供了X.509证书的本地缓存苹果认证协处理器。所有经过认证的配件都需要根据Apple MFi计划进行认证。CarPlay车机必须成功通过符合性测试,以确保来自设备的所有数字内容将被正确解码和播放,并且满足本规范中描述的所有电气要求。
会话建立 (Session Establishment):车机检测到连接的设备上有CarPlay后,必须请求会话启动并在“CarPlayStartSession”(《Accessory Interface Specification CarPlay Addendum R7》第241页)消息中提供所需参数。一旦建立了连接,在车机通过CarPlay接口完成认证后,将开始设置和内容传输。连接启用CarPlay的设备时,车机不得自动发送播放命令。请参阅媒体库:车机接口规范中的播放要求。有关设置CarPlay会话的更多信息,请参阅“ Setup and Control”(《Accessory Interface Specification CarPlay Addendum R7》第98页)。车机必须能够在设备连接后3秒内建立CarPlay会话。
三、连接流程
3.1 配置接口描述符
此功能最为复杂,需要驱动层配置iAP2接口描述符和NCM接口描述符,如果作为项目Tire 2的角色开发CarPlay的话这个步骤不需要自己完成,将需求提给Tire 1,让他们进行适配。
3.1.1 iAP2 Interface Descriptor
USB Descriptor | Value | Description |
---|---|---|
Interface Number | 0xNN | Must be different from the USB NCM Control interface and USB NCM data interface numbers. |
Interface Class | 0xFF | Vendor-specific interface |
Interface Subclass | 0xF0 | MFi accessory |
Interface Protocol | 0x00 | |
Interface String | 'iAP Interface' | |
Number of Endpoints | 2 | 1 bulk IN and 1 bulk OUT endpoint descriptor shall be specified |
Table-3.1
3.1.2 NCM Control Interface Descriptor
USB Descriptor | Value | Description |
---|---|---|
Interface Number | 0xNN | Must be different from the iAP2 interface and USB NCM data interface numbers. Must match the USBHostTransportCarPlayInterfaceNumber,see Accessory Identification in the Accessory Interface Specification |
Interface Class | 0x02 | USB Communication Interface Class |
Interface Subclass | 0x0D | Network Control Model |
Interface Protocol | 0x00 | No encapsulated commands / responses |
Number of Endpoints | 1 | Interrupt IN (optional): This is typically used to convey changes in link status. Since link is expected to be maintained at all times, we will synthesize link up if there is a read completion via the data interface. |
Table-3.2
3.1.3 NCM USB NCM Data Interface Descriptor
USB Descriptor | Value | Description |
---|---|---|
Interface Number | 0xNN | Must be different from the iAP2 interface and USB NCM control interface numbers. |
Interface Class | 0x0A | USB Data Interface Class |
Interface Subclass | 0x00 | |
Interface Protocol | 0x01 | NCM Data Class |
Number of Endpoints | 0 | (for Alternate Setting 0) |
Number of Endpoints | 2 | (for Alternate Setting 1) 1 Bulk IN; and 1 Bulk OUT |
Table-3.3
3.2 枚举设备
当有USB设备插入时,通过USBDevice的PID、VID判断是否是IPhone设备。
Apple Vendor ID = 0x05AC
Apple Product ID = 0x12nn
3.3 检查设备是否支持CarPlay
检查到iphone 设备之后,通过USB controlTransfer发送 请求,查询设备CarPlay是否可用
参数 | 值 | 备注 |
---|---|---|
bmRequestType | 0xC0 | Device-to-Host,数据由Device发给Host |
bRequest | 0x53 | 供应商定义的USB获取启用功能请求 |
wValue | 0x00 | N/A |
wIndex | 0x00 | N/A |
wLength | 4 | 返回的数据长度为4字节 |
Table-3.4
当iphone答复0x01 表示iphone支持CarPlay。
3.4 Iphone Usb角色切换
当IPhone设备通过USB连接到车机时,IPhone作为Device设备,车机作为Host,若想连接CarPlay需要先将IPhone切换为Host
参数 | 值 | 备注 |
---|---|---|
bmRequestType | 0x40 | Device-to-Host,数据由Device发给Host |
bRequest | 0x51 | 供应商定义的USB角色切换请求 |
wValue | 0x01 | 0x01为切换到Host |
wIndex | 0x00 | N/A |
wLength | 0 | N/A |
Table-3.5
3.5 车机角色切换
车机默认是Host模式,需要切换成device模式,每个车机的切换方法不同,在此不做详细说明。
3.6 iAP2 身份认证
在USB角色切换成功后USB通道就成功建立,可以接收/发送iAP2数据,按照CarPlay标准流程进行Identification,Authentication,所需数据较多,且无线与有线的身份认证有差异,但数据包格式相同。具体参考《Accessory Interface Specification CarPlay Addendum R7》
3.7 激活NCM功能
激活NCM功能,设置IP路由,每个项目都有差异,需要与Tire 1提出此需求,NCM功能激活后通过网络协议便正式开启CarPlay 会话,CarPlay Session相关数据传输则通过苹果官方插件库中提供的方法进行。
四、总结
4.1 经验总结
在3.6 iAP2 身份认证阶段中的iAP2数据包内容较多,数据拼接极容易出错,若在此步骤时出错,可能会出现以下几种情况:发送Identification/Authentication消息后未收到响应;发送Identification后收到Reject消息。出现第一种情况九成概率是因为数据包拼接有问题,重点检查数据包checksum。后者需要解析回复的reject中的MSG ID,查看是具体是哪些信息被拒绝。
4.2 辅助工具
建议开发过程中使用MAC + ATS软件+USB分析仪辅助,若没有专业工具则通过爱思助手抓取IPhone日志分析。
来源地址:https://blog.csdn.net/xiaojian_007/article/details/130421388