安卓USB开发教程 五 安卓 AOA 1.0
Android Open Accessory Protocol 1.0(AOA 協(xié)議 1.0)
Android USB 配件必須遵從 Android Open Accessory(AOA)協(xié)議,該協(xié)議定義了配件如何檢測(cè)和建立與 Android 設(shè)備的通信。配件應(yīng)執(zhí)行以下步驟:
1. 等待并檢測(cè)連接的設(shè)備
2. 確定設(shè)備的配件模式支持
3. 嘗試以配件模式下啟動(dòng)設(shè)備(如果需要)
4. 如果設(shè)備支持 AOA,與設(shè)備建立通信
以下部分介紹如何實(shí)現(xiàn)這些步驟。
Note:在開發(fā)通過(guò) USB 連接到 Android 設(shè)備的新配件時(shí),請(qǐng)使用?AOAv2。
等待并檢測(cè)連接的設(shè)備
配件應(yīng)該連續(xù)檢查連接的 Android 設(shè)備。連接設(shè)備時(shí),配件應(yīng)確定設(shè)備是否支持配件模式。
確定配件模式支持
當(dāng)連接 Android 設(shè)備時(shí),它可以是以下三種狀態(tài)之一:
1. 支持 Android 配件模式,并已經(jīng)處于配件模式。
2. 支持 Android 配件模式,但不處于配件模式。
3. 不支持 Android 配件模式。
在初始連接期間,附件應(yīng)檢查連接設(shè)備的 USB 設(shè)備描述符的廠商 ID 和產(chǎn)品 ID。廠商 ID 應(yīng)該匹配 Google 的 ID(0x18D1)。如果設(shè)備已經(jīng)處于配件模式,產(chǎn)品 ID 應(yīng)為0x2D00 或 0x2D01,配件可以使用自己的通信協(xié)議通過(guò)批量傳輸端點(diǎn)?establish communication with the device(設(shè)備不需要在附件模式下啟動(dòng))。
Note:0x2D00 保留給支持配件模式的 Android 設(shè)備。0x2D01 保留用于支持配件模式的設(shè)備以及 Android Debug Bridge(ADB)協(xié)議,該協(xié)議顯示了用于 ADB 協(xié)議的有兩個(gè)批量端點(diǎn)的第二個(gè)接口。如果你正在計(jì)算機(jī)上模擬配件,可以使用這些端點(diǎn)來(lái)調(diào)試配件應(yīng)用程序。通常,不要使用此接口,除非配件在設(shè)備上實(shí)現(xiàn)到 ADB 的傳輸。
如果 USB 設(shè)備描述符中發(fā)現(xiàn)的廠商 ID 或產(chǎn)品 ID 與預(yù)期值不匹配,則配件無(wú)法確定設(shè)備是否支持 Android 配件模式。配件應(yīng)嘗試以配件模式(詳細(xì)說(shuō)明如下)啟動(dòng)設(shè)備,以確定設(shè)備支持情況。
嘗試從配件模式啟動(dòng)
如果廠商和產(chǎn)品 ID 與配件模式下的 Android 設(shè)備不相符,則配件無(wú)法辨別設(shè)備是否支持(支持但不處于)配件模式,或者設(shè)備是否不支持配件模式。這可能是因?yàn)橹С峙浼J?#xff08;但不處于配件模式)的設(shè)備最初報(bào)告設(shè)備制造商廠商和產(chǎn)品 ID 而不是 AOA 廠商和產(chǎn)品 ID。
配件應(yīng)嘗試以配件模式啟動(dòng)設(shè)備,以確定設(shè)備是否支持該模式:
1. 發(fā)送 51 控制請(qǐng)求(“Get Protocol”)以確定設(shè)備是否支持 Android 配件協(xié)議。如果設(shè)備支持協(xié)議,則返回非零數(shù)字,表示支持的協(xié)議版本。控制請(qǐng)求在端點(diǎn)0上具有以下特征:
requestType: USB_DIR_IN | USB_TYPE_VENDOR request: 51 value: 0 index: 0 data: protocol version number (16 bits little endian sent from thedevice to the accessory)
2. 如果設(shè)備返回支持的協(xié)議版本,則向設(shè)備發(fā)送帶有標(biāo)識(shí)字符串信息的控制請(qǐng)求。該信息允許設(shè)備確定適合配件的應(yīng)用(或者向用戶呈現(xiàn) URL 若不存在適合的應(yīng)用)??刂普?qǐng)求位于端點(diǎn)0(對(duì)于每個(gè)字符串 ID),具有以下特征:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
支持以下字符串ID,每個(gè)字符串的最大為256字節(jié)(必須以 \ 0 為零終止)。
manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
3. 發(fā)送控制請(qǐng)求,要求設(shè)備以配件模式啟動(dòng)。控制請(qǐng)求在端點(diǎn)0上具有以下特征:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
完成這些步驟后,配件應(yīng)等待連接的 USB 設(shè)備在配件模式下將其自身重新引入總線,然后重新枚舉所連接的設(shè)備。如果設(shè)備成功切換到配件模式,則通過(guò)檢查廠商和產(chǎn)品 ID 的算法determines accessory mode support?應(yīng)該是正確的(例如,對(duì)應(yīng)于Google的供應(yīng)商和產(chǎn)品ID而不是設(shè)備制造商的ID)。如果 ID 正確,則配件移動(dòng)至?establish communication with the device。
Note:AOA 當(dāng)前不支持同時(shí)進(jìn)行 AOA 和 MTP 連接。 要從 AOA 切換到 MTP,配件必須首先斷開 USB 設(shè)備(物理上或電氣上等效的方式),然后使用 MTP 重新連接。
如果任何步驟失敗,配件確定設(shè)備不支持 Android 配件模式,并等待下一個(gè)設(shè)備連接。
建立與設(shè)備的通信
如果配件檢測(cè)到處于配件模式的 Android 設(shè)備,則配件可以查詢?cè)O(shè)備接口和端點(diǎn)描述符,以獲取與設(shè)備通信的批量端點(diǎn)。
接口和批量端點(diǎn)的數(shù)量取決于產(chǎn)品 ID。 Android 設(shè)備有產(chǎn)品 ID:
1. 0x2D00?具有一個(gè)有兩個(gè)批量端點(diǎn)的接口,用于輸入和輸出通信。
2.?0x2D01 具有兩個(gè)接口,每個(gè)接口具有兩個(gè)批量端點(diǎn),用于輸入和輸出通信。 第一個(gè)接口處理標(biāo)準(zhǔn)通信,第二個(gè)接口處理 ADB 通信。 要使用接口,請(qǐng)找到第一個(gè)批量輸入和輸出端點(diǎn),使用 SET_CONFIGURATION(0x09)設(shè)備請(qǐng)求將設(shè)備配置設(shè)置為 1,然后使用端點(diǎn)進(jìn)行通信。
原文鏈接:https://source.android.com/devices/accessories/aoa
總結(jié)
以上是生活随笔為你收集整理的安卓USB开发教程 五 安卓 AOA 1.0的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Tomcat服务器启动错误之Offend
- 下一篇: 什么是跨域?跨域如何解决