CarPlay 有线连接流程
一、引言
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日志分析。
CarPlay 有线连接流程相关推荐
- CarPlay 有线连接(USB)方案详解
首先,CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,能够同时处理bulk IN和bulk OUT传输.该方案还要求车载设备必须支持USB Host ...
- AndroidAuto连接流程及代码实现
AndroidAuto连接流程及代码实现 文章目录 AndroidAuto连接流程及代码实现 AndroidAuto介绍 有线连接流程 AOA协议 AAP协议 USB连接 蓝牙连接 无线连接流程 代码 ...
- CarPlay 无线连接(蓝牙+WIFI)
一.引言 1.1 目的 此文档记录CarPlay 开发中无线连接开发部分,详细介绍CarPlay无线连接的流程. 1.2 简介 Carplay的无线连接,需要用户手动先连蓝牙,蓝牙连接上后,系统会自动 ...
- kali linux有线连接不见网络图标不见(解决方案)
kali linux有线连接不见&&网络图标不见(解决方案) 参考文章: (1)kali linux有线连接不见&&网络图标不见(解决方案) (2)https://ww ...
- carlife android 无线,carlife无线连接流程是什么
[太平洋汽车网]carlife无线连接流程:首先在手机上安装CarLife的APP,在手机设置中启用蜂窝移动数据,然后打开手机 WiFi 开启个人热点,同时车机开启 WiFi,在车机WiFi上连接手机 ...
- Android wifi carlife,carlife可以无线连接吗?carlife蓝牙连接流程
Carlife可以无线连接.目前无线连接支持iPhone手机使用,而安卓手机只有少部分可以使用.连接方法如下: 1.打开手机设置启用蜂窝移动数据,再打开手机WiFi,并且开一个无线热点. 2.找到车机 ...
- win10开机自动有线连接拨号上网
实验室台式机win10安装后连接有线网总是频繁自己断开,根据博客方法解决问题后希望设置每次开机自动有线连接拨号上网,供参考 win+x键打开选项目录,点击计算机管理: 在管理窗口中左侧,点击选中&qu ...
- 同一局域网下,一台电脑连接另一台电脑的虚拟机(从属机(window)连接主机(window)虚拟机(Linux)的连接流程)
同一局域网下,一台电脑连接另一台电脑的虚拟机(从属机(window)连接主机(window)虚拟机(Linux)的连接流程) 一. 通过NET网络模式连接 查看主机本身ip: win+r 输入cmd, ...
- [问题解决]电脑有线 连接天翼光猫 不分配ip 电脑有线无法上网
家里更换了电信天翼宽带,做了几个水晶头,想用有线连接光猫路由器,直接上网,稳定,还少辐射. 也问了安装师傅,送的光猫是自带路由功能的,还有WIFI功能. 问题: 一切准备就绪,接上台式电脑,发现网口灯 ...
最新文章
- Nexus Repository Manager 3 远程命令执行漏洞 CVE-2019-7238
- C++静态成员函数小结
- Geany整体增加减少缩进快捷键
- nodejs实现一个简单的 HTTP静态文件服务器(一)
- JAVA中深拷贝与浅拷贝(在网上找到的) 希望对于理解深拷贝与浅拷贝有帮助...
- MFC用PostMessage传递消息
- mysql hash切分_轻松优化MySQL-之数据库切分1
- PHPCMS V9.6.0 SQL注入漏洞EXP
- BZOJ1007[HNOI2008] 水平可见直线
- 话单分析账单分析行踪分析综合数据研判软件
- 埃森哲互动并购了56家广告公司
- Ubuntu下载anaconda教程(全过程)
- 浅谈某定设计网站非会员去除水印
- Blob和File对象API与兼容性问题
- CentOS下搭建Frp内网穿透服务
- mysql 枚举字段,MySQL字段中的枚举是什么意思 | 学步园
- 项目经理?项目成员?
- How to Pronounce PROBABLY
- 【Ubuntu 16.04中为Chromium、Chrome、Firefox安装Flash播放器插件教程】
- Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS(好文章)
热门文章
- 个性主张:玩转你的86400秒
- websocket自动断开连接问题
- 如何用开源组件“攒”出一个大数据建模平台?
- 概率论常用公式(期末版)
- 小学生图片_这家水果店不得了!每天几波小学生轮流打卡只是为了……
- 一篇好文,以在迷茫时阅读
- YOLOv5改进系列(8)——添加SOCA注意力机制
- LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR®-工程案例)
- leetcode/加减的目标值,给数组元素添加+或-号组成的表达式值=target的方案数
- 使用php吧excel数据存到数据库,php导入excel表,保存进数据库,使用phpexcel插件