通过对CarPlay协议的逆向实现,可将自定义设备的音视频内容投影到支持CarPlay功能的车机上使用,可以较大的丰富车内设备的应用场景,同时降低设备成本。
因为是模拟iPhone手机的功能,需要尽可能的破译手机的处理逻辑,在功能实现上,需要尽可能多的实现手机的功能,这样才能兼容市场上各家供应商的车机。逆向中要实现的功能点如下:
驱动层实现USB通信中的iAP2接口和NCM功能。iAP2协议的逆向实现,需要支持主从设备两种模式的通信。一般CarPlay功能中都是车机先做为主设备,再去申请主从切换后进行iAP2通信,但是有部分车机供应商的实现中,在车机做为主设备的时候,会先进行iAP2的通信,等认证通过后,再去申请主从切换,最后再进行一次iAP2通信认证流程。另外在iAP2协议实现中,需要尽可能的处理车机在Identification过程中定义的发送和接受消息集。在Authentication过程中,需要注意目前认证芯片中的2.0C和3.0版本在证书长度上不一致。Bonjour服务中手机端服务的注册及车机端服务的接收处理。CarPlay协议中的PairSetup和PairVerify步骤处理。CarPlay协议中的AuthSetup步骤处理。CarPlay协议中的Get /info步骤处理,主要分析屏幕参数、各音频类型支持的采样率、HID设备描述符解析。屏幕参数指明车机端可以接受的视频流分辨屏,不要改变大小。采样率指明车机端不同音频流支持的采样率,不要随意使用。HID需要根据用户操作车机时发送的hidReport指令解析数据。CarPlay协议中的NTP实现,用于音视频流的时间同步。CarPlay协议中的H264视频流传输处理,一般的视频流使用AnnexB格式,但是CarPlay协议使用的是AVCC格式,需要进行转换之后再发送。另外视频流需要经过加密之后再发送。CarPlay协议中的ResourceManager实现,需要根据文档中处理流程反推手机中的处理逻辑,再根据用户操作处理音视频流的SETUP和TEARDOWN指令。目前车机端使用的CarPlay协议有两个主版本,老版本在2014年左右推出,不支持PairSetup和PairVerify。CarPlay中的通信数据进行了加密处理,好在CarPlay提供的Plugin代码中提供了大部分的实现,逆向实现难度不会太大。不过最重要的一点是,要完全兼容市场上各家供应商的车机,实在是太难,这是一个漫长而痛苦的过程。所以有对此功能感兴趣的同学,欢迎私信联系交流。