Android USB OTG通信
USB相关概念:
简单来说,USB 是一个使用于数据交换的总线(Bus)。发启(initiate)数据交换的一方称为主机 (host),另一方称为外设(peripheral),两者通过总线实现通信,由主机负责供电。一个 USB 系 统里只有一个主机,但可以有多个外设,外设的主要信息记录在形容符(descriptor)里。一个 外设就是一个单独的物理实体,但它却可能有多个逻辑上的设施功能(device function),比方 一个网络摄像头,除了有照相机,还可能有内置的麦克风,这种外接设施也被称为复合设施 (composite device)。
USB OTG:USB On-The-Go 通常缩写为 USB OTG,是 USB2.0 规格的补充标准。它可使 USB 设施,例如播放器或者手机,从 USB 周边设施变为 USB 主机,与其余 USB 设施连接通信。在 正常情况下,这些支持 OTG 的 USB 设施和 USB 主机(如台式机或者者手提电脑),依然作为 USB 周边设施用。
Android 平台下 USB 开发有以下两种模式:
USB Host Mode:
顾名思义,Android 设施作为主机,需要安卓设施支持 OTG 接头。常见应使用场景诸如连接数 码相机、键盘、鼠标、游戏手柄等硬件。
USB Accessory Mode:
这种模式下 Android 设施承担外设的角色。应使用场景诸如连接机器人控制器、音响、医疗器 材等,当然前提是这些设施支持与Android设施连接并且遵守Android accessory communication protocol。这种模式可以让不具备 host 能力的 Android 设施与其余硬件交互。
image.png
Android 开放配件协议(AOA)
Android 开放配件 (AOA) 支持功能可让外部 USB 硬件(Android USB 配件)与处于配件模 式下的 Android 设施进行交互。当某台 Android 设施处于配件模式时,所连接的配件会充 当 USB 主机(为总线供电并列举设施),而 Android 设施则充任 USB 配件。
1、协议 API USB Host Mode:
UsbManager:USB 设施管理类,提供获取 USB 设施相关 API。
UsbDevice:USB 设施实体类,定义设施的相关属性。
UsbInterface:表示 USB 设施的接口,它定义了设施的一组功能。设施可以具备一个或者多个进 行通信的接口。
UsbEndpoint:表示接口端点,作为接口的通信通道。接口可以有一个或者多个端点,并且通常 包括使用于与设施进行双向通信的输入和输出端点。 UsbDeviceConnection:表示与设施的连接,通过端点传输数据。此类支持同步和异步两种方 式传输数据。
UsbRequest:通过 UsbDeviceConnection 与设施通信的异步请求。 UsbConstants:定义协议相关常量。
USB Accessory Mode: UsbManager:同上。
UsbAccessory:表示 USB 配件设施,包含相关的属性和 API。
2、协议用
Host 端程序实现过程:
1、定义为 Host:在 AndroidManifest.xml 文件中增加如下代码 <uses-feature android:name=“android.hardware.usb.host”/>
2、监听广播:监听 USB 插入与拔出的广播。 UsbManager.ACTION_USB_DEVICE_ATTACHED UsbManager.ACTION_USB_DEVICE_DETACHED
3、获取设施:通过 UsbManager 获取连接的 USB 设施(注意权限申请) UsbManage 中 getDeviceList()方法
4、打开设施:将设施打开,获取连接(UsbConnection)。
通过 UsbManage 中 openDevice(UsbDevice device)方法获取 UsbConnection
5、让 USB 设施启动配件模式:通过 AOA 协议中定义的相关控制指令。
通过 UsbConnection 中 controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)方法发送指令。
5.1 发送 51 控制请求(“获取协议”)以确定设施能否支持 Android 配件协议。假如设施 支持协议,则返回一个非零数字,代表所支持的协议版本。该控制请求为端点 0 上的请求, 具备以下特征:
image.png
5.2 假如设施返回所支持的协议版本,则向设施发送含标识字符串信息的控制请求。该信息 让设施可以确定适合配件的应使用(假如没有适合配件的应使用,则向使用户呈现一个网址)。该 控制请求为端点 0 上的请求(适使用每个字符串 ID),具备以下特征:
image.png
支持以下字符串 ID,并且每个字符串的最大值为 256 个字节(必需以零结束,以 \0 结尾)。 index 值范围以及含义如下:
image.png
5.3 发送控制请求,要求设施以配件模式启动。该控制请求为端点 0 上的请求,具备以下特 征:
image.png
完成这些步骤后,主机应等待所连接的 USB 设施在配件模式下将其自身重新接入总线,然 后重新枚举所连接的设施。该算法通过检查供应商 ID 和产品 ID 来确定设施能否支持配件 模式,假如设施成功切换到配件模式,那么供应商 ID 和产品 ID 应该是正确的(例如,与 Google 的供应商 ID 和产品 ID 而不是设施制造商的 ID 相对应)。假如 ID 正确,配件 则进而与设施建立通信。当设施成功以配件模式启动后 ProductId 会成为 0x2D00 或者 0x2D01。
? 0x2D00 有一个接口,该接口有两个批量端点,使用于输入和输出通信。
? 0x2D01 有两个接口,每个接口有两个批量端点,使用于输入和输出通信。第一个接口解决标 准通信,第二个接口则解决 ADB 通信。要用接口,请找到第一个批量输入和输出端点, 用 SET_CONFIGURATION (0x09) 设施请求将设施配置的值设为 1,而后用端点进行 通信。
6、建立通信通道:获取输入和输出的 UsbEndPoint,用 UsbConnection 的 bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)方法进行数据输入与输 出。bulkTransfer 方法使用于读、写大量数据,需要用 type 为 UsbConstants.USB_ENDPOINT_XFER_BULK 的 UsbEndPoint。
image.png
Host 端实现过程:
1、定义为 Accessory:在 AndroidManifest.xml 文件中增加如下代码
<uses-feature android:name="android.hardware.usb.accessory"/> ......<activity android:name=".activity.MainActivity"> <intent-filter><action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/></intent-filter> <meta-dataandroid:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"android:resource="@xml/accessory_filter"/> </activity>......
2、监听广播:监听配件插入与拔出的广播。 UsbManager. ACTION_USB_ACCESSORY_ATTACHED UsbManager. ACTION_USB_ACCESSORY_DETACHED
3、获取设施:通过 UsbManager 获取连接的配件设施(注意权限申请) UsbManage 中 getAccessoryList()方法。
4、打开设施:将配件打开,获取连接。
通过 UsbManage 中 openAccessory(UsbAccessory accessory)方法获取通信的文件形容符 ParcelFileDescriptor
5、建立通信通道:在不同线程中利使用上述文件符创立输入、输入 IO 流使用于读、写数据。
结束语
? AOA协议实现可以处理两台手机之间的消息通信。
? AOA 协议不适合大数据传输。尽管 USB Host、USB Accessory 模式支持多 线程并发读写,由于在 USB Host 模式一个 USB 下只有一个输入端点、一个输出端点,而 USB Accessory 模式下一个配件设施只有一个 ParcelFileDescriptor,无法用多通道进行文 件传输,单通道下用多线程并发传输和接收,会出现数据混乱而无法识别,若是单线程 传输文件则效率低下。
image.png
参考:
https://developer.android.com/reference/android/hardware/usb/UsbDeviceConnection.html
https://developer.android.com/guide/topics/connectivity/usb/index.html
https://source.android.com/devices/accessories/aoa
https://www.songma.com/p/7ec7539737ef
https://developer.android.com/guide/topics/connectivity/usb/accessory
https://developer.android.com/guide/topics/connectivity/usb/host
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android USB OTG通信