Carplay wired認證

2023-11-15   ?   orange

CarPlay是蘋果公司為車載系統(tǒng)開發(fā)的一項功能,該功能將iOS設(shè)備的界面通過USB或wireless(藍牙+Wi-Fi)投影顯示在車載屏幕上,可以讓駕駛員在車內(nèi)通過車載屏幕直接方便地使用iOS設(shè)備上的功能。例如,在車載屏幕上直接使用iPhone或iPad上的地圖、導(dǎo)航、Siri語音助手、音樂、電話、短信等各項iOS上的服務(wù)及功能。換句話說,就相當于是在自己的車載系統(tǒng)上安裝了一個“iOS操作系統(tǒng)”。該功能在很大程度上減少了駕駛員在車內(nèi)對iPhone或iPad的直接使用及操作,從而降低了對駕駛員在車輛駕駛過程中的干擾。

目前,在很多報道中將CarPlay理解成一套車載系統(tǒng),這種解釋是不完全正確的。CarPlay是蘋果公司為車載系統(tǒng)開發(fā)的一項功能,也可以說是車載系統(tǒng)中的一項新的應(yīng)用,并非是一套車載系統(tǒng)。

CarPlay有兩種實現(xiàn)途徑:

一種是通過wired(USB)連接iOS設(shè)備和車載系統(tǒng)設(shè)備,另一種是通過wireless(藍牙+Wi-Fi)來連接iOS設(shè)備和車載系統(tǒng)設(shè)備。CarPlay的兩種連接方案都是需要通過iAP2 (iOS Accessory Protocol,version 2)協(xié)議以及Bonjour服務(wù)來建立CarPlay會話(CarPlay Session)從而實現(xiàn)CarPlay功能的。在我接下來的博客中,我將分別介紹CarPlay的wired(USB)連接方案,CarPlay的wireless(藍牙+Wi-Fi)連接方案,以及兩種連接方案相互切換的實現(xiàn)。

另外,對于CarPlay的USB連接方案,在硬件上需要支持USB 2.0(含)以上版本。iOS設(shè)備需要支持閃電接口(Lightning接口),也就是說iPhone5之前的蘋果設(shè)備不支持wired(USB)連接方式的CarPlay。在操作系統(tǒng)方面,蘋果公司從iOS 7.1開始加入了CarPlay的功能,無論是wired還是wireless的連接方式,iOS設(shè)備的操作系統(tǒng)版本都需要在7.1及以上。

  CarPlay wired connect:

首先,CarPlay的wired(USB)的連接方案要求車載設(shè)備至少要支持USB2.0 Hi-Speed,能夠同時處理bulk IN和bulk OUT傳輸。該方案還要求車載設(shè)備必須支持USB Host Mode,該模式要求車載設(shè)備能夠工作在USB device模式下,因為Apple設(shè)備在CarPlay中是作為USB Host的。而通常情況下,車載設(shè)備USB是工作在USB Host模式的,而外接的USB設(shè)備是工作在USB Device模式的,因而在這種情況下的CarPlay wired(USB)連接方案中就需要進行USB的模式切換。

下圖則是CarPlay的USB模式切換處理邏輯框圖:


Carplay wired認證(圖1)

當角色切換完成后,按照協(xié)議要求有以下幾點需要注意:

1.車載設(shè)備(USB device)需要等待至少1000ms,目的是等待Apple設(shè)備(USB host)來枚舉;

2.如果1000ms后沒有任何traffic,車載設(shè)備(USB device)得切換回USB Host模式;

3.當Apple設(shè)備偵測到總線掉電(the loss of VBUS),Apple設(shè)備將切換回USB Device模式;

4.如果車載設(shè)備(USB device)偵測到USB總線至少有200ms處于不活躍(inactivity)狀態(tài),車載設(shè)備(USB device)將切換回USB Host模式。

iAP2在CarPlay wired(USB)連接方案中的接口描述符(Inte***ce Descriptor)和i數(shù)據(jù)傳輸(Data Transfers):

1.iAP2接口描述符(Inte***ce Descriptor):

車載設(shè)備(USB Device)與Apple設(shè)備(USB Host)建立一個iAP2連接,需要申明一個vendor指定(vendor-specific)的接口,該接口有一個bulk IN端點(endpoint)和一個bulk OUT端點(endpoint)。


Carplay wired認證(圖2)

2.iAP2數(shù)據(jù)傳輸(Data Transfers):

Apple設(shè)備(USB Host)通過bulk OUT端點發(fā)送iAP2數(shù)據(jù)給車載設(shè)備(USB Device)。依據(jù)USB協(xié)議,如果車載設(shè)備 (USB Device)成功地接收到Apple設(shè)備發(fā)送的iAP2數(shù)據(jù)便會回復(fù)一個USB ACK包,反之則回復(fù)一個USB NAK包。如果車載設(shè)備(USB Device)重復(fù)地回復(fù)USB NAK包并且超過1秒,便會視為接收超時。

  車載設(shè)備在iAP2傳輸通道上成功的建立一個iAP2連接,通過iAP2進行認證,該認證過程有以下7種iAP2控制會話消息:

1.Request Authentication Certificate

2.Authentication Certificate

3.Request Authentication Challenge Response

4.Authentication Response

5.Authentication Failed

6.Authentication Succeeded

7.Accessory Authentication Serial Number

  接下來,再介紹一下USB的NCM(Network Control Model)的兩個接口:

1.USB NCM 控制接口(Control Inte***ce)描述符(Descriptor):


Carplay wired認證(圖3)

2.USB NCM數(shù)據(jù)接口(Data Inte***ce)描述符(Descriptor):


Carplay wired認證(圖4)

車載設(shè)備需要在這個接口上完成USB Hi-Speed NCM。這個接口需要支持到64KB封裝的數(shù)據(jù)報的傳輸(也就是到40個1514字節(jié)的以太網(wǎng)幀(Ethernet Frame)的傳輸)和16比特的NCM傳輸塊。

使用CarPlay USB NCM接口的車載設(shè)備需要支持至少100Mbps的帶寬,TCP和UDP的延遲小于5ms,UDP的丟包率(iperf測試下)要低于1%。

當Apple設(shè)備連上或斷開的時候,車載設(shè)備需要對NCM接口狀態(tài)作相應(yīng)的改變。當Apple設(shè)備連接上的時候,在網(wǎng)絡(luò)協(xié)議棧的頭部需要標注NCM接口可用。

   建立/終止CarPlay會話(session):

建立CarPlay會話(session),車載設(shè)備首先需要同Apple設(shè)備建立IP網(wǎng)絡(luò)連接,因此需要虛擬一個網(wǎng)絡(luò)接口并分配MAC地址和ip地址,該ip連接必須是IPv6。車載設(shè)備在這個接口上需要支持Apple Bonjour零配置網(wǎng)絡(luò)連接(zero-configuration networking)。一旦網(wǎng)絡(luò)連接建立成功,車載設(shè)備在完成認證后將在CarPlay接口上開始設(shè)置(setup)和內(nèi)容傳輸(content transfer)。需要注意的是,按協(xié)議要求,車載設(shè)備需要在與Apple設(shè)備網(wǎng)絡(luò)連接建立好后的3秒鐘內(nèi)建立CarPlay會話,如果與Apple設(shè)備的物理連接斷開,車載設(shè)備也需要檢測到該斷開情況并且在1秒鐘內(nèi)終止CarPlay會話。

下圖是wired(USB)的CarPlay會話建立框圖:


Carplay wired認證(圖5)

相關(guān)內(nèi)容:
  • 車載音響CarPlay認證項目及流程
  • 車充CarPlay認證項目及費用
  • CarPlay認證產(chǎn)品及流程
  • CarPlay認證全攻略
  • 車載娛樂CarPlay認證
  • QQ在線咨詢
    全球認證咨詢
    13632500972
    實驗室座機
    0755-23059481
    <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://#/hm.js?6844225bf949cff65b89ec7139b9ad0f"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>