1、概述

自Android3.1(API Level 12)版本开始,Android系统直接支持USB主机模式和从机模式,同时为能够使更广泛的设备支持USB从机模式,Google官方还提供了相应的开发库向后兼容至Android2.3.4(API Level 10)版本。至于在之前的Android版本没有直接提供USB通信支持时,我们只能使用ADB的方式来实现Android设备与其他的设备通过USB线进行通信(Android设备只能以从机的方式接入,因为之前的Android设备都不支持OTG),而这也是到目前为止Android设备与PC通过USB线进行通信的唯一方式(常见的案例有豌豆荚、360手机助手等)。

注意:以上关于Android设备支持USB主机模式和从机模式的支持方式只是软支持,另外还须有硬件支持,并且硬件对两种模式的支持具有决定性。

2、Android USB Host Mode(USB 主机模式)

之所以把Android USB Host Mode放在第一个说是因为Android设备要提供对它的支持所需要的条件最多,相信大家看了Android USB Host Mode后,大概对其他两种方式就有了个大概的估计。我们先来看看Android USB Host Mode通信方式的简单原理图:

Android USB主机模式原理图

在Android USB Host Mode中,我们的Android设备充当USB主机并为整个总线供电,接入Android设备的其他USB设备充当从机的角色。在该模式下,我们的Android设备必须支持以下条件:

1、Android系统版本3.1(API Level 12)及以上。在概述中我们也提到,自Android3.1(API Level 12)开始才提供Android USB Host Mode的支持。

2、Android设备须支持OTG功能。我们的智能手机和相机等移动设备本身是无法像PC那样直接充当USB Host为总线供电的,而OTG正是为解决此类问题而生,目前主流的Android手机和平板都已添加OTG模块。在主机模式下,我们将Android设备上的USB主机模块又称为USB嵌入式主机(Embedded Host 简称 EH)。EH无法像PC上的USB主机一样,为接入总线的未识别外围设备加载驱动程序,所以EH设备提前在系统中对其目标外围设备列表TPL(Target Peripheral List)进行了定义,在这些外围USB设备中大部分是HID设备(Human Interface Device,如游戏手柄)、BOMS设备(Bulk Only Mass Storage,如读卡器、U盘)和CDC设备(Communication Device Class,USB通信设备类,如打印机、相机),其驱动程序已存在于Android平台的系统中(Linux Kernel),Android设备可以直接与这些设备直接通信。

3、支持AOA协议。AOA协议(Android Open Accessory Protocol,Android开发配件协议)是Google公司推出的用于实现Android设备与外围设备之间进行USB通信的协议,该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于设备控制和数据采集领域提供了条件。关于AOA协议的固件源码烧写于硬件中,我们有时也把这项称作为Android设备的硬件支持。(该条件仅在接入Android设备外围设备是另一台Android设备时需要,当接入像U盘或打印机时,可不需要AOA协议的支持)

4、系统features.xml文件中提供了关于<uses-featureandroid:name="android.hardware.usb.host"/> 的定义。在使用Android USB Host Mode开发时,我们会在应用程序的AndroidMainifast.xml文件中指定<uses-featureandroid:name="android.hardware.usb.host"/> 用来对不支持Android USB Host Mode的设备进行过滤,Android系统版本3.1及以上默认支持,但是不排除设备商会对原生的Android系统进行裁剪,可能会裁剪掉features.xml文件中关于<uses-featureandroid:name="android.hardware.usb.host"/>的定义,也就是说当应用程序安装时来扫描系统的硬件支持feature时,发现没有关于<uses-featureandroid:name="android.hardware.usb.host"/>的定义,认为该设备不支持Android USB Host Mode,也就会提示你无法安装了。

3、Android USB Accessory Mode(USB 从机模式)

Android USB Accessory Mode又被称为Android USB配件模式或Android USB外设模式。在Android USB Accessory Mode中,我们的Android设备充当USB从机,而接入的外围设备充当主机并为总线供电。在该模式中,我们习惯称外围设备为Android配件,该模式主要为不具备Android USB Host Mode的Android设备提供与其他USB设备交互的功能。我们先来看看Android USB Accessory Mode通信方式的简单原理图:

Android USB从机模式原理图

从上面的原理图中我们可以看到,相比在Android USB Host Mode中,Android设备与外围设备的角色进行了互换,就像我们的Android设备以外围设备的方式接入了另外一台Android设备一样。在该模式下我们的Android设备必须支持以下条件:

1、Android系统版本2.3.4(API Level 10)及以上。在概述中我们也提到,自Android3.1(API Level 12)开始才直接提供对Android USB Accessory Mode的支持,同时Google提供的配件开发工具包ADK(Accessory Development Kit)提供了Android设备与Android配件通过USB通信的API,该ADK包能够向后兼容至Android2.3.4系统版本。(Android 3.1及以上的系统之所以能够直接支持也是因为系统直接封装了ADK的API)

2、必须支持AOA协议。在Android USB Accessory Mode中,Android设备必须支持AOA协议,因为当Android设备以从机的方式接入Android配件时,Android配件会通过AOA协议检测并初始化Android设备的USB通信的环境和启动Android设备的USB从机模式。

3、系统features.xml文件中提供了关于<uses-featureandroid:name="android.hardware.usb.accessory"/> 的定义。关于该条件与Android USB Host Mode中的原因一致,这里不再赘述。

同样地,在该模式下我们的Android配件也必须支持以下条件:

1、具有USB主控制的硬件电路(USB主机功能)并支持USB协议。在USB通信中总得有一方为总线供电。

2、已将AOA协议的固件源码烧写至Android配件的主芯片中。换句话说,Android配件也得支持AOA协议。

当Android设备和Android配件满足各自的条件后,那么它们之间就可以通过USB进行通信了,而通信的关键就在于AOA协议。

4、Android ADB(Android Debug Bridge)

该方式主要是为满足Android设备与PC通过USB进行通信,之前我也说过这是Android设备与PC进行USB通信的唯一方式,所以想实现Android设备与PC之间通过USB通信的同学们只有这种选择了。那么,在该方式下,我们的Android设备基本上不需要提供其他的什么条件支持,只需要打开设置中的调试模式即可。(必须打开调试模式,有闲的无聊的同学可以试试将手机上的USB调试关闭,然后你会发现PC上的豌豆荚和360手机助手这类的工具永远都连不上手机,因为关闭了手机上adbd系统服务,肯定是连不上的)。

虽然我们的Android设备不需要什么条件支持,但是我们的PC却需要以下条件:

1、正确安装了该Android设备的驱动程序(有点废话)。

2、PC上运行了封装有dbmlib库的程序,如DDMS工具、豌豆荚和360手机助手等(实际与Android设备进行通信的是adb服务进程,已封装在ddmlib库中)。

好了,有关Android USB通信的几种方式和应用场景大概地分析了一下,如有不对的地方,希望大家批评指正!

Android数据通信--USB通信的几种方式及使用场景相关推荐

  1. Android 获得 usb 权限的两种方式

    0. 前言 在做 USB OTG 通信时,第一步就是要能够获取到 usb 的使用权限,因此特地在此处介绍一下两种我用过的获取 usb 权限方式. 1. 直接在 AndroidManifest.xml ...

  2. Android的USB通信(AOA连接)

    USB 主机和配件概览 Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Android 配件协议的硬件).在 USB 配件模 ...

  3. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  4. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  5. laydate组件 无法传值_Vue组件通信的几种方式

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 组件之间的关系 如上图所示,A 和 B.B 和 C. ...

  6. QML for Android 加载图片资源的几种方式

    前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...

  7. 前端跨域通信的几种方式

    前言 前端通信类的问题,主要包括以下内容: 1.什么是同源策略及限制 同源策略是一个概念,就一句话.有什么限制,就三句话.能说出来即可. 2.前后端如何通信 如果你不准备,估计也就只能说出ajax. ...

  8. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  9. android xpath解析xml,Android 中处理 XML 的四种方式-DOM

    Android 中处理 XML 的几种方式连载中,我们就不介绍合成 XML 了,因为合成 XML 可以直接拼接字符串,虽然看起很不高大上,但却很有效.我们主要介绍如何取 XML 中的值. 适用 DOM ...

  10. Windows下进程通信的几种方式介绍

    Windows下进程通信的几种方式 一.消息通信 所谓消息通信,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送 ...

最新文章

  1. pthread异步_探索 Flutter 异步消息的实现
  2. graphpad导出图片不居中_从GraphPad Prism一键导出满足期刊要求的图表
  3. WordPress 数据库操作WPDB对象($wpdb)用法详解
  4. 用3D动画来完成的一个立体图片
  5. 计算机内码汉字,gbk内码(汉字机内码在线查询)
  6. python 期末考试复习题(带答案)
  7. 计算机一级如何添加对角线,如何在表格中添加对角线
  8. 计算机应用与基础教学计划,计算机应用基础教学计划完整版.docx
  9. 阿里云虚拟主机部署php项目分享
  10. 怎么让抖音视频当做铃声android,抖音短视频设置手机铃声教程_苹果手机怎么设置抖音手机铃声_3DM手游...
  11. 01 公众号与公众平台
  12. Flink基础系列8-Flink on yarn运行wordcount程序
  13. 伯乐发卡网系统修复版源码
  14. 如何写linux软件专利,Linux之父:软件专利和方法专利都挺扯淡
  15. Java 身份证验证(IdCardVerification)
  16. queryWrapper详解
  17. R语言学习笔记(二) 逻辑运算符
  18. 判断一句话是否中文或者英文
  19. Web前端之网页导航----126邮箱(关于position)
  20. 如何创建自定义maven archetype?

热门文章

  1. 《嵌入式 - ARM》第6章 看门狗
  2. html+css 课工场首页
  3. 新浪短网址链接生成_t.cn短网址api接口(超赞)
  4. 低电压穿越仿真分析LVRT-Simulink
  5. jvm读书笔记(面试用)
  6. 如何用python做图标_教你用Python快速生成各尺寸应用图标和截屏
  7. 使用雷达测量心率和呼吸频率项目(11)-Acconeer 探索工具
  8. VALSE2020|底层视觉与图像生成主题Workshop【笔记】
  9. JavaScript入门书籍之我见
  10. java soap 增加命名空间_webservice调用服务端数据时给soapenv:Envelope 添加自定义的命名空间...