简介

在Android实现USB连接有什么作用?USB连接有什么限制?USB连接实现的难度?

1.Android实现USB连接有什么作用?

在Android上实现USB连接的用处在于可以在搭载Android系统的手机或者开发板上控制设备。例如:Android控制USB摄像头、Android控制USB打印机、Android控制身份证读卡器......理论上只要支持USB连接的设备都可以用Android实现控制。当然这里的控制分为两种情况:

  • USB免驱设备。(驱动部分已在Android底层或Linux层实现)

  • USB指定驱动设备。(硬件厂家驱动、通用通讯协议

2.USB连接有什么限制?

对于USB设备连接来说就像客户端连接服务器,在网络连接中需要知道服务器的ip地址才能找到对应的服务器,同理在USB连接中也是需要知道对应USB设备的vendorId(设备厂商Id)和productId(设备产品Id)。在我开发过的USB的设备中发现这两个Id在同一厂商生产的相同系列的不同产品中,他们可能会重复。和网络连接不同的是,如果不知道这两个Id,也是可以连接设备,只是不知道连接的哪一个,这里的id主要是用于连接和过滤设备用的

3.USB连接实现的难度?

其实USB设备的连接比较简单,比较现在USB设备已经相当普及、不论是通过Android系统还是通过Linux系统你都可以很好的实现。可能对于平时没有在Android接触过USB通信的感觉难而已,等你看完本文后你会觉得真的很简单。而且这个是不需要root权限的,看完本文后你就可以用你Android手机实现控制一个外接摄像头,想想是不是很激动。

实现步骤

1.物理连接

如果你是在Android手机这样不支持USB连接的设备上实现,可以通过在type-c上用OTG扩展出USB母口(淘宝5元包邮),如果你实在Android开发板上实现USB连接,直连就可以,一般开发板都支持USB口。如果你想控制更多的USB设备可以通过USB扩展器实现。

2.权限配置

首先在AndroidManifest.xml中申明USB权限

 <!-- 声明使用usb --><uses-featureandroid:name="android.hardware.usb.host"android:required="true" />

然后在你操作的Activity或service中添加meta-data

 <!-- android设备的信息过滤 --><meta-dataandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/usb_xml" />

这里的usb_xml文件为res文件夹下的xml文件夹中的设备过滤文件

<?xml version="1.0" encoding="utf-8"?>
<resources><usb-device vendor-id="10473" product-id="649"/><usb-device vendor-id="1336" product-id="0" /><usb-device vendor-id="1061" product-id="33113" /><usb-device vendor-id="17224" product-id="33113" />
</resources>

这里的每一个usb-device对应一个usb设备。

3.找到指定USB设备

连接USB设备前,首先要通过vendorId和productId过滤出我们需要的设备操作对象UsbDevice

/*** 找到自定设备*/public void findUSB(int VENDORID, int PRODUCTID) {//1)创建usbManagerusbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);//2)获取到所有设备 选择出满足的设备HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();while (deviceIterator.hasNext()) {UsbDevice device = deviceIterator.next();Log.i(TAG, "vendorID--" + device.getVendorId() + "ProductId--" + device.getProductId());if (device.getVendorId() == VENDORID && device.getProductId() == PRODUCTID) {usbDevice = device; // 获取USBDevice}}}

4.查找设备接口

根据USBDevice找到指定的设备接口UsbInterface,一个设备上面一般只有一个接口,有两个端点,分别接受和发送数据

UsbInterface usbInterface = null;for (int i = 0; i < usbDevice.getInterfaceCount(); i++) {//一个设备上面一般只有一个接口,有两个端点,分别接受和发送数据usbInterface = usbDevice.getInterface(i);break;}

5.获取usb设备的通信通道

USB通信通道即和USB设备间接收和发送的通过,通过获取通道中对应的断点发送或接收数据实现控制。

 for (int i = 0; i < usbInterface.getEndpointCount(); i++) {UsbEndpoint ep = usbInterface.getEndpoint(i);switch (ep.getType()) {case UsbConstants.USB_ENDPOINT_XFER_BULK://USB端口传输if (UsbConstants.USB_DIR_OUT == ep.getDirection()) {//输出epBulkOut = ep;Log.e(TAG, "获取发送数据的端点");} else {epBulkIn = ep;Log.e(TAG, "获取接受数据的端点");}break;case UsbConstants.USB_ENDPOINT_XFER_CONTROL://控制epControl = ep;Log.e(TAG, "find the ControlEndPoint:" + "index:" + i + "," + epControl.getEndpointNumber());break;case UsbConstants.USB_ENDPOINT_XFER_INT://中断if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {//输出epIntEndpointOut = ep;Log.e(TAG, "find the InterruptEndpointOut:" + "index:" + i + "," + epIntEndpointOut.getEndpointNumber());}if (ep.getDirection() == UsbConstants.USB_DIR_IN) {epIntEndpointIn = ep;Log.e(TAG, "find the InterruptEndpointIn:" + "index:" + i + "," + epIntEndpointIn.getEndpointNumber());}break;default:break;}}

6.打开USB设备连接

在打开USB设备的时候是需要申请USB连接权限的,而且申请权限的次数是根据连接的设备来确定。也就是说需要给每个usb设备单独授权(这个也好理解,只是很多时候系统USB权限弹窗都一样,多个设备时体验不好,如果要修改我认为只能从系统层面解决)。

 if (usbManager.hasPermission(usbDevice)) {//有权限,那么打开conn = usbManager.openDevice(usbDevice);} else {usbManager.requestPermission(usbDevice, intent);if (usbManager.hasPermission(usbDevice)) { //权限获取成功conn = usbManager.openDevice(usbDevice);} else {Log.e(TAG, "没有权限");}}

7.请求接口

到此整个USB连接就已经完成了。整个连接就像Socket似的,你如果不主动释放,正常情况下他不会断开。

 if (conn.claimInterface(usbInterface, true)) {if (conn != null)// 到此你的android设备已经连上zigbee设备Log.i(TAG, "open设备成功!");final String mySerial = conn.getSerial();Log.i(TAG, "设备serial number:" + mySerial);} else {Log.i(TAG, "无法打开连接通道。");conn.close();}

8.发送数据

当USB连接完成后就可以进行数据发送了,这里发送的通常都是字节数据,设备根据他自己的方式解析数据做出对应的响应。

public void sendData(byte[] buffer) {if (conn == null || epBulkOut == null) return;if (conn.bulkTransfer(epBulkOut, buffer, buffer.length, 0) >= 0) {//0 或者正数表示成功Log.i(TAG, "发送成功");} else {Log.i(TAG, "发送失败的");}}

9.关闭USB连接

当你不用的时候一定要记得关闭连接释放资源

conn.close();

结语

对于USB连接其实就通过简单的几步就能实现USB设备与Android系统的通信,是不是很简单。我把Android系统USB通讯、Android系统串口通信、Android系统Pos打印、Android系统gpio控制、Android上USB连接Camera、Android系统上实现双屏异显等示例代码都放到github上(CSDN现在下载需要积分,暂时就不上传了),代码现在还没有整理,如有什么不合理的地方,希望大佬们指正 QQ 962851730。后续将陆续推出以上系列播客。

Android硬件控制之USB连接相关推荐

  1. Android硬件控制之POS热敏打印(支持任意图表)

    简介 在Android实现Pos打印的应用场景?实现pos打印的难度?如何用只支持黑白的热敏打印机打印出灰阶效果? 在Android实现Pos打印的应用场景? pos热敏打印机在平时生活中还是挺常见的 ...

  2. Android与PC通过USB连接通信(一)

    Android与PC通过USB连接通信(一) 原理 通过在Android设备与PC之间通过USB建立socket连接,以Android作为服务器,PC作为客户端,通过adb进行转发通信. 客户端代码及 ...

  3. WIFI 安卓Android系统手机通过USB连接电脑上网

    呵呵,wifi = 无线局域网 Wi-Fi是一种可以将个人电脑.手持设备(如PDA.手机)等终端以无线方式互相连接的技术. Wi-Fi是一个无线网路通信技术的品牌,由Wi-Fi联盟(Wi-Fi All ...

  4. Android+usb+spi,Android设备如何使用USB的硬件接口

    你知道Android设备如何使用USB的硬件接口吗?下面将由学习啦小编带大家来解答这个疑问吧,希望对大家有所收获! 如何处理硬件接口问题 最近业界的发展显示,智能手机/便携系统与自动化系统或机械系统之 ...

  5. xbox手柄usb连接linux python控制

    xbox手柄usb连接linux python控制 手柄在linux中叫joystick 首先插上手柄,打开目录/dev/input,ls看到里面以js0,js1等文件就是手柄的输入. 用这个代码. ...

  6. Android连接多个usb,Android实现USB连接

    前言 在Android开发过程中,我们有时会涉及到USB连接的问题,这里为了方便USB连接的使用,我将相关知识封装成了一个工具类-USBHelper,下面就来介绍下它的使用吧. 今天涉及的内容有: U ...

  7. Android应用.三星i9000系列(1).版本选择与USB连接电脑

    Android应用.三星i9000系列指南(1).版本选择与USB连接电脑 草木瓜 20110401 一.序 五年前的Moto E680虽然还能勉强使用,但SD卡已不灵便,触摸屏也经常罢工,     ...

  8. Android 硬件通讯之 蓝牙,USB,WIFI(一.蓝牙)

    蓝牙 蓝牙通讯分为:经典蓝牙与低功耗蓝牙 现在所说的蓝牙设备,大部分都是在说4.0设备,ble也特指4.0设备. 在4.0之前重要的版本有2.1版本-基本速率/增强数据率(BR/EDR)和3.0 高速 ...

  9. android连接usb后默认app,android – 记住USB连接,但不要启动应用程序

    我正在处理的应用程序通过USB连接成功连接设备. 但是,这会在连接USB设备时始终启动活动时产生不良影响.没有启动应用程序,我无法记住默认值.在连接上启动应用程序不是一个理想的效果.下面的小代码示例是 ...

最新文章

  1. 判断随机抽取代码_高中数学中离散型随机变量的分布列知道吗?均值与方差能干什么?...
  2. Exchange与ADFS单点登录 PART 6:Exchange声明规则配置
  3. SSM中 出现错误 Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
  4. Angular ngOnChanges hook学习笔记
  5. nagios mysql入库_使用NDOUtils将Nagios监控信息存入Mysql
  6. strus2拦截器中获取客户端ip
  7. linux内存脚本下载,linux tmpfs及消耗内存脚本
  8. 超详细深度学习debug指南,国外小哥手把手教你如何调试模型 | 附PPT
  9. live555 源代码简单分析1:主程序
  10. 计算机潮流算法一般采用,计算机潮流计算
  11. 电视剧 | 黑镜S5E3 瑞秋洁柯小艾希莉
  12. 合宙 4G模块Air720D Mini PCI-E 开发教程
  13. 解决google浏览器自动填充密码问题
  14. 获取浏览器的地理位置信息
  15. RE|Nginx-安装与配置(1)
  16. 令人十分期待的ECShopX BBC商城开放终身免费商用
  17. [转]DTV(数字电视)扫盲-DVB介绍
  18. supermap地图风格优化
  19. 计算机三级数据库要学哪些知识,计算机三级数据库怎么备考 考试内容是什么...
  20. 实验一计算机基础和网络知识,有关于计算机基础心得体会

热门文章

  1. marquee详细属性
  2. 帝国cms:评论列表模板中调用热门文章或是推荐文章的js方法
  3. 科技公司将跳过IPO直接接受机构融资
  4. 秒表Stopwatch的使用
  5. OFFICES当出现“向程序发送命令时出现问题”错误怎么解决
  6. 无线路由器TL-WR703刷Linux操作系统DD-WRT小记(by quqi99)
  7. 对话 MySQL 之父 Monty:超越 MySQL 很难,但我做到了!
  8. 别怪程序员——都是项目经理的错
  9. 经典升级,长直播 | 第 19 期高级转录组分析和R数据可视化火热报名中!!!...
  10. PHP简介以及环境的安装