Android的USB通信 (AOA Android開放配件協議)

USB 主機和配件概覽Android 通過 USB 配件和 USB 主機兩種模式支持各種 USB 外圍設備和 Android USB 配件(實現 Android 配件協議的硬件)。在 USB 配件模式下,外部 USB 硬件充當 USB 主機。配件示例可能包括機器人控制器、擴展塢、診斷和音樂設備、自助服務終端、讀卡器等等。這樣,不具備主機功能的 Android 設備就能夠與 USB 硬件互動。

USB 主機和配件概覽

Android 通過 USB 配件和 USB 主機兩種模式支持各種 USB 外圍設備和 Android USB 配件(實現 Android 配件協議的硬件)。在 USB 配件模式下,外部 USB 硬件充當 USB 主機。配件示例可能包括機器人控制器、擴展塢、診斷和音樂設備、自助服務終端、讀卡器等等。這樣,不具備主機功能的 Android 設備就能夠與 USB 硬件互動。Android USB 配件必須設計為與 Android 設備兼容,并且必須遵守 Android 配件通信協議。在 USB 主機模式下,Android 設備充當主機。設備示例包括數碼相機、鍵盤、鼠標和游戲控制器。針對各類應用和環境設計的 USB 設備仍可與能夠與設備正常通信的 Android 應用互動。

下圖展示了這兩種模式之間的差異。當 Android 設備處于主機模式時,它會充當 USB 主機并為總線供電。當 Android 設備處于 USB 配件模式時,所連接的 USB 硬件(本例中為 Android USB 配件)充當主機并為總線供電。
在這里插入圖片描述
Android 3.1(API 級別 12)或更高版本的平臺直接支持 USB 配件和主機模式。USB 配件模式還作為插件庫向后移植到 Android 2.3.4(API 級別 10)中,以支持更廣泛的設備。設備制造商可以選擇是否在設備的系統映像中添加該插件庫。
注意:配件模式取決于設備硬件;部分設備可能不支持配件模式。您可以在相應應用的 Android 清單中使用 元素過濾出支持配件模式的設備。

Android 開放配件 (AOA)

Android 開放配件 (AOA) 支持功能可讓外部 USB 硬件(Android USB 配件)與處于配件模式下的 Android 設備進行交互。當某臺 Android 設備處于配件模式時,所連接的配件會充當 USB 主機(為總線供電并列舉設備),而 Android 設備則充當 USB 配件。
Android USB 配件專門用于和 Android 設備相連。這些配件遵循 AOA 要求,從而能夠檢測到支持配件模式的 Android 設備,并且必須提供 500 毫安(電壓為 5 伏)的充電電流。之前發布的部分 Android 設備只能充當 USB 設備,無法發起與外部 USB 設備的連接。AOA 支持功能打破了這一局限,讓您能夠構建可以與各種 Android 設備建立連接并與其進行交互的配件。

AOA 設備握手過程

AOA 協議規定 Android 設備和配件之間握手的大致過程如下:
(1)通過 USB 線連接 Android 設備與配件。
(2)配件枚舉連接過來的設備。根據 VID 和 PID 判斷當前 Android 設備是否處于 Accessory Mode。如果否,則配件會向 Android 設備發出切換到 AOA 模式的請求,進入第(3)步; 如果是,則直接調轉到第(5)步。

判斷 Android 設備處于 Accessory Mode 時,VID 和 PID 值必須滿足如下條件如下:

VID模式
0X18D1
PID模式
0x2D00accessory
0x2D01accessory + adb
0x2D02audio
0x2D03audio + adb
0x2D04accessory + audio
0x2D05accessory + audio + adb

(3)配件發送查詢指令給 Android 設備。絕大多數 Android 設備,在缺省情況下都不掛載Accessory 驅動,即不會默認處于 Accessory Mode,在配件與 Android 設備建立 USB 連接時,配件會通過握手協議查詢該設備是否為Android 設備且是否支持 AOA 協議以及支持的版本號。配件向 endpoint 0 端口中寫入 51 號指令,如果返回值為1 或者 2,則說明Android 設備支持 AOA1.0 或者 AOA2.0,如果小于 1 或者大于 2,則說明連接設備不支持AOA協議或者支持的 AOA 協議版本號不正確。

(4) Android 配件發送認證信息給 Android 設備,并發送開始通信的指令。認證信息可以包含以下屬性:manufacturer(廠商)、model(型號)、version(版本)、description(描述信息)、URL(Web頁面)。

配件也會向Android設備發出53號指令,請求Android設備切換到AOA模式,Android 設備會執行請求,將 USB 切換到 AOA 模式;在這個過程中,USB 連接會出現一次邏輯插拔,配件會重新枚舉設備,進入第(2)步。Android 設備接收到配件通過 52 指令發送過來的參數信息以后,使用其中的三個參數 Manufacturer、Model 、Version 來確定綁定到該配件的 App。如果系統內無任何 App 可以匹配配件設備發來的上述三個參數,則 Android 設備會彈出一個對話框,向用戶提供 Accessory 設備發送過來的描述信息和 URL 信息,用戶可以點擊 URL 訪問它指向的 Web 頁面。
如果系統內有 App 可以匹配 Accessory 設備發來的握手信息,則 Android 系統會彈出一個對話框詢問用戶是否立刻啟動該 App。如果用戶選擇 OK 則啟動該App;同時該對話框提供一個勾選框,勾選之后每次 Accessory 設備連接后會自動啟動該 App。應該要求用戶勾選該對話框,否則 App 啟動后向 USB Manager獲取 Accessory 設備后可能因為 Permission 問題無法打開文件描述符建立通訊連接。

(5)建立連接

指令作用
51判斷設備是否支持 AOA 協議,并獲取支持 AOA 協議的版本號。
52發送配件相關設備認證信息,Android 設備可 以據此來確定綁定到該配件的 APP。
53請求 Android 設備切換到 Accessory Mode
54~57HID支持功能
58音頻支持( Android 8.0 中已被棄用)

AOA 配件端開發

在Android車機或者Android平板開發中,以車機或平臺為配件端,與Android手機通過數據線進行通信。
Android 官方是提供 USB 的相關接口用來進行 AOA 連接,主要有UsbManager, UsbDevice, UsbInterface, UsbDeviceConnection 等。具體參考官方文檔:USB 主機概覽
以下代碼段是執行同步數據傳輸的一種簡單方式:

    private Byte[] bytes;private static int TIMEOUT = 0;private boolean forceClaim = true;...UsbInterface intf = device.getInterface(0);UsbEndpoint endpoint = intf.getEndpoint(0);UsbDeviceConnection connection = usbManager.openDevice(device);connection.claimInterface(intf, forceClaim);connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread

AOA 主機端開發

在與Android車機或Android平板USB通信過程中,手機作為主機端,默認不開啟配件模式,需要與配件建立AOA通信才會開啟啟動配件模式。
具體參考Google官方文檔:USB 配件模式
與配件通信代碼如下:

    UsbAccessory accessory;ParcelFileDescriptor fileDescriptor;FileInputStream inputStream;FileOutputStream outputStream;...private void openAccessory() {Log.d(TAG, "openAccessory: " + accessory);fileDescriptor = usbManager.openAccessory(accessory);if (fileDescriptor != null) {FileDescriptor fd = fileDescriptor.getFileDescriptor();inputStream = new FileInputStream(fd);outputStream = new FileOutputStream(fd);Thread thread = new Thread(null, this, "AccessoryThread");thread.start();}}

----------------------------------------------------------------------------------------------------------------------------

Android 設備的USB 依據USB協議有多個接口(功能設備),多數 Android 設備中定義了 MTP 接口(功能設備),PTP接口 (功能設備)和 U 盤接口(功能設備),這些接口(功能設備)主要用來和 USB 主機傳輸媒體文件。

另外AOA 協議也為 Android 設備定義了一些接口選擇,通過設置不同的選項,可以與 USB 配件實現不同的功能。

AOA 協議定義了三種 USB 接口類型:

  • ADB 接口:主要用來調試配件
  • Accessory接口:用來交換數據
  • Audio 接口:用來將音頻輸出到配件

AOA 協議將上述3種接口組合出6種 USB 接口層設備,這些USB設備的廠商 ID 統一為 0x18D1 (Google Inc),產品ID 如下圖

3. AOA標準請求

這部分可以解決第 2 個問題。

AOA 協議定義了標準控制請求包格式,如下圖所示:

USB 配件與 Android 設備建立連接主要通過 AOA 標準控制請求完成,這些標準請求通過控制端點 0 傳輸。

每個請求的請求號標識和功能如下,即request字段:

4. 配件連接流程

這部分可以解決第 3 個問題

4.1?USB枚舉

USB 配件物理連接到 Android設備之后,USB配件中的主機協議棧首先會來枚舉。枚舉將獲得 Android設備的USB 描述符信息。

4.2?根據枚舉得到的設備描述符來檢測 Android 設備是否處在配件模式

配件模式下的USB 設備描述符中的廠商 ID 應為 0x18D1,產品 ID 應為 0x2Dxx,即應該是AOA 協議定義的 6 種USB 設備類中的一種。只要廠商 ID 和產品 ID 符合條件,就確定 Android 設備處于配件模式,即可進行通信,如果 Android 設備不在配件模式下,則需要開啟配件模式。

4.3?開啟配件模式

  • 如果 Android 設備未處于配件模式,則 USB 配件要發送 51 號請求來詢問 Android 設備是否支持 AOA 協議,如果返回非0值,說明支持 AOA 協議,這個值表示 AOA 協議版本號。

該標準請求格式如下所示:

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)
  • USB 配件獲得 AOA 版本號之后,USB 配件發送 52 號請求將驗證字符串信息發送給 Android 設備,這些字符串包括 USB 配件的制作商名稱、模型名稱、描述、版本、訪問配件的 URI 和 序列號,對應字符串的 ID 分別為 0、1、2、3、4、5,Android 設備收到這些字符串之后,會試圖找到與USB 配件對應的應用程序,如果沒有找到,Android 設備會 提供應用程序的URL提示安裝。

該標準請求格式如下所示:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        52
value:          0
index:          string ID
data            zero terminated UTF8 string sent from accessory to device

其中string ID如下:

manufacturer name 廠商名稱:  0
model name 模型名稱:         1
description 描述:           2
version 版本:               3
URI:                       4
serial number 序列號:       5
  • USB配件發送完驗證字符串信息后,USB 配件發送 53 號控制命令來嘗試開啟配件模式,在這個過程中,Android 設備會修改 USB 設備描述符并復位觸發配件對總線進行再次枚舉。

該標準請求格式如下所示:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        53
value:          0
index:          0
data:           none       
  • 4.4?重新枚舉

Android 設備接收到 53 號請求之后,會自動復位 USB 總線,USB 配件重新枚舉,Android 設備會返回新的描述符信息,枚舉成功后,USB 配件獲得的設備描述符中 廠商 ID 和產品 ID 應為 AOA 協議中定義的一個。

4.5?開啟 HID 功能

如果 USB 配件需要 HID 功能,可以在與 Android 設備建立連接之后,發送 HID 控制請求給 Android 設備,這些請求仍然是通過端點 0 發送的。

到這里我也有幾個問題未解決:

  • 當第二次枚舉的時候,Android 設備返回的描述符信息是怎么修改好的?
  • 第一次枚舉和第二次枚舉的描述符有什么區別
  • 使用USB Device Viewer可以看到Android 設備的USB描述符信息,如在文章一開始舉的例子,第二次枚舉返回的描述符只是這幾個接口的重新組合還是又重新定義了一組描述符

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95257.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能視頻畫質增強和修復軟件Topaz Video AI v7.1.1最新漢化,自帶星光模型

軟件介紹 這是一款專業的視頻修復工具-topaz video ai,該版本是解壓即可使用,自帶漢化,免登陸無輸出水印。 軟件特點 不登錄不注冊解壓即可使用無水印輸出視頻畫質提升 軟件使用 選擇我們需要提升畫質的視頻即可 軟件下載 夸克 其他網盤…

LeetCode 777.在LR字符串中交換相鄰字符

在一個由 ‘L’ , ‘R’ 和 ‘X’ 三個字符組成的字符串(例如"RXXLRXRXL")中進行移動操作。一次移動操作指用一個 “LX” 替換一個 “XL”,或者用一個 “XR” 替換一個 “RX”。現給定起始字符串 start 和結束字符串 result&#x…

RK-Android15-WIFI白名單功能實現

實現WIFI白名單功能 。 三個模式: 1、默認模式:允許搜索所有的WIFI顯示、搜索出來 ; 2、禁用模式:允許所有WIFI顯示,能夠搜索出來 ;3、白名單模式:允許指定WIFI名單顯示,被搜索出來 文章目錄 前言-需求 一、參考資料 二、核心修改文件和實現方式 1、修改文件 疑問思考 …

Maven + JUnit:Java單元測試的堅實組合

Maven JUnit:Java單元測試的堅實組合Maven JUnit:Java單元測試的堅實組合一、什么是軟件測試?二、測試的維度:階段與方法(一)測試的四大階段(二)測試的三大方法三、main方法測試與…

FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265視頻編碼測試

上10bitffmpeg 8.0 b570最新驅動 ,CPU 12100F 顯卡 Intel b570 ffmpeg -hwaccel_output_format qsv -i "XXX.mkv" -vf "formatp010le" -c:v hevc_qsv -global_quality 19 -quality best -rc_mode ICQ -preset veryslow -g 120 -refs 5 -b…

SQL分類詳解:掌握DQL、DML、DDL等數據庫語言類型

如果你是一名數據庫運維工程師,或者正在學習數據庫技術,那么理解SQL的不同類型是非常重要的。讓我們一起看看SQL到底有哪些種類,以及它們各自的作用。 1. 什么是SQL? SQL(Structured Query Language)是一種…

[特殊字符] 預告!我正在開發一款讓自動化操作變得「像呼吸一樣自然」的AI神器

各位技術愛好者和創作者朋友們,我要解決一個行業痛點!在上一個項目中(🔥 重磅預告!我要用AI開發一個自媒體神器,徹底解決創作者的7大痛點!),我本來雄心勃勃地打算直接用R…

加密軟件哪個好用?加密軟件-為數據共享提供安全保障

企業與合作伙伴協作時需共享大量數據,若缺乏保護,數據可能被非法獲取,影響合作信任,甚至引發商業糾紛。加密軟件可確保共享數據僅授權方可見,為數據共享提供安全保障,推動合作順利開展。?1.固信軟件固信加…

FPGA復位

1:能不復位盡量不要復位,減少邏輯扇出數:比如打拍信號。2:xilinx的FPGA推薦高復位,ATERAL的FPGA推薦低復位。3:盡量使用異步復位:大多數廠商目標庫內的觸發器都只有異步復位端口,采用同步復位需消耗較多邏輯資源。一&a…

Cursor 教我學 Python

文章目錄1. 寫在最前面2. Python 語法2.1 yield2.1.1 yield 和 return 的區別2.1.2 golang 中實現 yield 語法3. aiohttp 庫3.1 原始寫法3.2 修改寫法3.2 耗時對比分析4. 碎碎念5. 參考資料1. 寫在最前面 最近加了很多 Python Coding 的任務,雖然在 AI 加持下能夠順…

Ollama:本地大語言模型部署和使用詳解

1.什么是Ollama? Ollama是一個開源的大語言模型管理工具,具有以下特點: 簡單易用:提供簡單的命令行接口本地部署:模型運行在本地,保護數據隱私跨平臺支持:支持Windows、macOS、Linux豐富的模型…

云計算學習100天-第41天 -普羅米修斯2

目錄 五、添加被監控端 1、在web1[192.168.88.100]上部署node exporter 2、在Prometheus服務器上添加監控節點 3、瀏覽器查看添加結果 六、Grafana的部署 概述 部署步驟 七、監控MySQL數據庫 1、配置MySQL 2、配置mysql exporter 3、配置prometheus監控mysql 五、添…

集成電路學習:什么是SVM支持向量機

SVM:支持向量機 SVM,即支持向量機(Support Vector Machine),是一種常用的機器學習算法,特別適用于分類和回歸問題。以下是對SVM的詳細解析: 一、SVM的基本原理 SVM的基本思想是在特征空間中尋找一個最優的超平面,使得不同類別的樣本能夠被最大化地分開。這個最優…

盲盒抽谷機小程序開發:如何用3D技術重構沉浸式體驗?

在盲盒經濟中,“沉浸感”是提升用戶停留時長與轉化率的核心武器。某品牌通過3D扭蛋機旋轉、卡牌翻轉特效,使用戶停留時長從15秒延長至45秒,轉化率提升25%;另一品牌上線AR試戴功能后,單次抽谷時長延長至2分鐘&#xff0…

集采與反腐雙重壓力下,醫藥銷售的破局之道:從資源依賴到價值重構

在醫藥行業進入集采常態化與反腐縱深推進的新階段,“資源匱乏”“拜訪受阻” 成為縈繞在眾多醫藥銷售人員心頭的難題。當傳統的資金投入、學術活動等資源型打法逐漸失效,行業正面臨一場從 “資源驅動” 到 “價值驅動” 的深刻變革。那些曾在市場中創造過…

Elasticsearch常用命令(未完)

網上針對es常用命令好多都是寫的感覺非常復雜難以理解,所以我還是自己整理了一下相關的常用命令。 對es輸入指令可以用很多種方法比如用es的谷歌瀏覽器插件,亦或者postman,我個人比較喜歡用postman比較簡單直接 1.刪除指定索引下的所有數據…

【系統架構設計(七)】 需求工程之:面向對象需求分析方法:統一建模語言(UML)(下)

文章目錄一、用例圖1. 用例模型建立的系統化流程第一步:識別參與者第二步:合并需求獲得用例第三步:細化用例描述第四步:調整用例模型(可選步驟)2. 用例之間的關系類型二、類圖與對象圖概念類之間的關系三、…

數據結構——樹(04二叉樹,二叉搜索樹專項,代碼練習)

文章目錄一、概念二、構造1.1先序序列 構造BST1.2中序序列 轉換為BST1.3中序序列鏈表轉換為BST1.4BST轉換為中序序列鏈表1.7BST的序列化和反序列化1.6BST的種數二、BST的增刪改查2.1驗證是否為BST2.2查找值為val的節點2.3插入一個值為val的節點2.4刪除一個值為val的節點2.5恢復…

ArkUI核心功能組件使用

1.Tabs(選項卡) 1.1 概述 Tabs組件的頁面組成包含兩個部分,分別是TabContent和TabBar。TabContent是內容頁,TabBar是導航頁簽欄。 TabBar是導航頁簽欄,頁面結構如下圖所示,根據不同的導航類型,布…

Qt5 多媒體大綱

一、入門準備 基礎知識 熟悉 Qt 的信號槽機制、事件循環 掌握 .pro 工程文件配置(QT multimedia multimediawidgets) 熟悉常見的音視頻格式與編解碼器基礎 環境配置 Qt Creator Qt 5.x 確認安裝了 multimedia 模塊與 mediaservice 插件 熟悉調試…