概述
背景
最近在做百度carlife手机互联项目,项目要求支持无线连接,USB连接和无感连接,USB连接要支持Android手机与Iphone手机连接。我主要负责的是iphone手机与车机连接的功能,现将主要技术要点做个简单的总结。
连接流程
根据百度和苹果给的文档iphone车机Carlife连接要经过经下几步才能够通信。
- 手机插入车机后,车机会根据枚举的信息(设备VID、PID)来判断当前是什么类型
的手机,如果不是苹果手机仍然保持HOST 模式。
- 检测到是苹果手机,车机会通过USB 的EP0 给手机发送role switch 命令,来切换模式
手机收到role switch 命令后,首先会判断是否支持,手机不支持role switch 命令,HU 不会做任何处理手机支持role switch 命令,车机会主动断开与手机的USB 连接,并拉到D+等待。
- 手机来重新枚举。
- 车机在切换到从模式时,需要想手机上报两个USB 端口:EA Native Transport、IAP2端口。分别用来做CarLife 的数据传输和苹果的IAP2 认证。
- 通过IAP2端口进行认证。
- 认证成功后通过EAP端口进行通信。
步骤说明
设备枚举
手机插入车机后,车机会根据枚举的信息(设备VID、PID)来判断当前是什么类型
的手机,如果不是苹果手机仍然保持HOST 模式。
手机枚举过程:由于项目使用的车机是安卓系统,所以我们使用了Android DeviceManager提
供的API和接收安卓接供的USB插入的时收到的广播来来获取当前设备的实例。
主要代码如下:
UsbManager mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
//获取USBManager.
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
//遍历设备
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
If (device == null) {
continue;
}
}
//遍历设备
mUsbManager.requestPermission(device, mPermissionIntent);
//请求权限
int vid = device.getVendorId();
int pid = device.getProductId();
//获取设备VID和PID来识别当前设备是否是Iphone
模式切换
检测到是苹果手机,车机会通过USB的EP0 给手机发送role switch 命令,来切换模式
手机收到role switch 命令后,首先会判断是否支持,手机不支持role switch 命令,HU 不会做任何处理手机支持role switch 命令,车机会主动断开与手机的USB 连接,并拉到D+等待。
- 首先通示USB的EP0端口来将手机由从模式切换到主模式。
切换方法指令如下:
bmRequest:0x40
bRequest:0x51
wValue:0x00
wIndex:0x00
wLength:0x00
Android发送指令示令程序:
mUsbDeviceConnection = mUsbManager.openDevice(mUsbDevice); //与USB设备建立连接
int ret = mUsbDeviceConnection.controlTransfer(0x40, 0x51,0x00, 0x00, null, 0x00, 0);//切换
- 再将车机由主模式切换到从模式
将车机由主模式切到从模式,这个每个车机都不同,基本方法为向USB的控制器的节点里写入特定的值。
重新枚举
手机来重新枚举车机,这一步是由手机完成的,但是需要注意如下问题。
车机为主手机为从设备时,车机在给手机供电,当进行模式切换后正常情况车机不会再给手机供电,需要查看一下是否能够正常枚举,如果不能需要给车机的vbus上电。以便车机继续给手机供电完成枚举。
端口上报
车机在切换到从模式时,需要想手机上报两个USB 端口:EA Native Transport、IAP2端口。分别用来做CarLife 的数据传输和苹果的IAP2 认证。
具体端口中的参数请参照Carlife文档。这一步是由驱动程序完成的。需要向外暴露出两个备节点。/dev/eap和/dev/iap(名字可以更改)。这部分主要用到的技术为USB gadget驱动开发相关的技术。
可以参照gadget驱动中的其它代码完成。由于本人非驱动开发者具体技术细节不再叙述。现在把这要更技术点说明如下:
- 修改kernel里面的代码,包括在drivers/usb/gadget/function里面添加对应的驱动文件(驱动需要自己实现)。
- 修改对应的KConfig和makefile文件。使得加入的文件和功能可被配置进内核。
- 修改相关的启动文件。如init.rc或是其它脚本,使得编译出来的ko文件可以被插入到内核中。insert iap.ko/insert eap.ko
- 在配置configfs的脚本添加相关的功能脚本.这个过程网上有人写过详细过程。
可以在网上找一下。
5、编译。
认证过程
经过上面的几个步骤,我们就可以开始进行iap认证了。IAP认证过程如下图所示:
手机与HU通过IAP端口进行通信。认证程序收到对应的认证请求后,通过去挂载在i2c总线上的MFI芯片进行认证,MFI芯片把认证后的数据发送给认证程序。认证程序再发给手机。
LINK
在开始认证之前车机要与手机进行Link操作。车机需要给手机发送如下指令:
FF 55 02 00 EE 10
成功会给车机返回
FF 55 02 00 EE 10
协商
连接成功后需要和手机进行通信前的协商。
通信报文
在与IAP通信的过程中这个报文格式是一直在使用的,唯一不同的是协商的payload数据的格式与认证的不同。
协商数据报文格式
具体的传输协议需要阅读苹果的相关文档。这部分苹果给源码,大家可以参照源码来实现。
认证流程
协商完成后就可以进行认证了。具体的认证过程如下:
(需要注意的是协商的session version版本号是1还是2)
认证Payload数据格式
后面所有的数据格式都是control session data.
EAP功能认证
功能认证流程
IdentificationInformation 命令的具体含义请参照苹果文档中的IdentificationInformation一节,IdentificationInformation中SupportedExternalAccessoryProtocol及USBHostTransportComponent是非常重要的两个参数。SupportedExternalAccessoryProtocol 命令中的ExternalAccessoryProtocolName 都是com.baidu.CarLifeVehicleProtocol。
关于IdentificationInformation参数需要注意以下几点:
utf8字符串需要带上’ ’。也就是说如果使用strlen来求取长度,求得的长度需要加1.
如果使用memcpy(str1,str2,strlen(str2))来拷贝字符串,需要加上0x00.
拉起手机端APP
拉起手起端APP车机向手机发送一条EA02的指令。需要选择无提示的拉起,否则不好处理EAP的读取。
数据通信
打开EAP节点读取数据。
传输协议介绍
Start of Packet MSB(0xFF): 固定值FF
Start of Packet LSB (0x5A): 固定值0x5A
Package Length MSB和Package Length LSB:两字节报文长度,为报文的全部长度从Start of Packet MSB开始到Payload CheckSum的长度。
Control Byte:控制标识:SYN:0x80,ACK:0x40,AYN&ACK:0xc0,RST:0x10
Packaget Sequence Number:序列号0~255,初始值为随机数,每发一条报文需要加1.
Package Acknowledgement number: ACK序列号,为收到报文的序列号。如果收到连序的报文,序列号为1,2,3,5.这里候回ACK的序列号为3,因为5不是连续的。
Session identifier :session 标识符。
Checksum:从Start of Package MSB到session identifier的checksum值。
Payload checksum: Payload的checksum值。
Checksum的计算方法:
苹果文档上面有给出具体的函数。
Payload报文
协商报文
Link Version:固定值0x01.
下面的数据不同的传输方式有不同的值,苹果文档中有给出建议值,可以参照。
Control Session Payload
Start of Message MSB :固定值 0x40.
Start of Message LSB :固定值0x40.
Message Length : Message的长度包括参数,包括Start of Message MSB和Start of Message LSB
和长度。
Message ID:需要发送的Message ID.
Parameter :参数。
参数格式:
Parameter Length MSB
Parameter Length LSB
Parameter ID MSB
Parameter ID LSB
Param Data
例子:比如要发送0xAA00这条消息:
0xFF,0x5A,0x00,0x10,0x40,0xA7,0xE5,0x01,0xCA,0x40,0x40,0x00,0x06,0xAA,0x00,0x0d
红色部分为控制报文,黑色部分为Control session payload.
对上面的报文回复ACK为:0xFF,0x5A,0x00,0x09,0x40,0xE5,0xA7,0x00,0xd2
主要关注蓝色部分的序列号和ACK序列号。回复ACK时序列号不需要加1.
协商完成后所有的数据的control bytes都是0x40 ACK。但是回复ACK时不需要带数据只需要发送9个字节的报文。发送Message时有数据序列号需要加1.
例子:对上面的报文做带数据的回复
0xAA00这条消息是手机发送给车机请求进行IAP证,车机端需要回复0xAA01证书数据给手机,回复报文如下:
0xFF,0x5A,0x00,0x10,0x40,0xE6,0xA7,0x01,0x62,0x40,0x40,0x02,0x6b,0xAA,0x01, 0xxx,0x0xx,0x00,0x00,00……..
多个参数传输:
0xFF,0x5A,0x00,0x10,0x40,0xE6,0xA7,0x01,0x62,0x40,0x40,0x02,0x6b,0xEA,0x02,0x00,0x05,0x00,0x00,00
0x00,0x06,0x01,0x00,0x01.
这条报文有两个参数每别是0和1,从紫色部分开始。
最后
以上就是复杂萝莉为你收集整理的Carlife Iphone IAP2连接与认证过程背景连接流程步骤说明 LINK协商认证流程拉起手机端APP数据通信传输协议介绍的全部内容,希望文章能够帮你解决Carlife Iphone IAP2连接与认证过程背景连接流程步骤说明 LINK协商认证流程拉起手机端APP数据通信传输协议介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复