Carlife Iphone IAP2连接与认证过程

您所在的位置:网站首页 carlife支持苹果 Carlife Iphone IAP2连接与认证过程

Carlife Iphone IAP2连接与认证过程

2023-12-15 14:52| 来源: 网络整理| 查看: 265

背景

最近在做百度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 deviceList = mUsbManager.getDeviceList();

   //遍历设备

    Iterator 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字符串需要带上’\0’。也就是说如果使用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,从紫色部分开始。

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3