• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android实战技巧之四十九:Usb通信之USB Host

Android实战技巧之四十九:Usb通信之USB Host

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android开发实战经典,android项目实战,android实战,android实战指南,android项目实战视频等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android实战技巧之四十九:Usb通信之USB Host


零 USB背景知识

USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一。
硬件上,它是用插头连接。一边是公头(plug),一边是母头(receptacle)。例如,PC上的插座就是母头,USB设备使用公头与PC连接。
目前USB硬件接口分三种,普通PC上使用的叫Type;原来诺基亚功能机时代的接口为Mini USB;目前Android手机使用的Micro USB。

Host
USB是由Host端控制整个总线的数据传输的。单个USB总线上,只能有一个Host。
OTG
On The Go,这是在USB2.0引入的一种mode,提出了一个新的概念叫主机协商协议(Host Negotiation Protocol),允许两个设备间商量谁去当Host。

一、Android中的USB

Android对Usb的支持是从3.1开始的,显然是加强Android平板的对外扩展能力。而对Usb使用更多的,是Android在工业中的使用。Android工业板子一般都会提供多个U口和多个串口,它们是连接外设的手段与桥梁。下面就来介绍一下Android Usb使用模式之一的USB Host。

android.hardware.usb包下提供了USB开发的相关类。
我们需要了解UsbManager、UsbDevice、UsbInterface、UsbEndpoint、UsbDeviceConnection、UsbRequest、UsbConstants。
1、UsbManager:获得Usb的状态,与连接的Usb设备通信。
2、UsbDevice:Usb设备的抽象,它包含一个或多个UsbInterface,而每个UsbInterface包含多个UsbEndpoint。Host与其通信,先打开UsbDeviceConnection,使用UsbRequest在一个端点(endpoint)发送和接收数据。
3、UsbInterface:定义了设备的功能集,一个UsbDevice包含多个UsbInterface,每个Interface都是独立的。
4、UsbEndpoint:endpoint是interface的通信通道。
5、UsbDeviceConnection:host与device建立的连接,并在endpoint传输数据。
6、UsbRequest:usb 请求包。可以在UsbDeviceConnection上同步异步传输数据。
7、UsbConstants:usb常量的定义,对应linux/usb/ch9.h

二、USB插入事件

Usb的插入和拔出是以系统广播的形式发送的,只要我们注册这个广播即可。

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter usbFilter = new IntentFilter();
        usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        registerReceiver(mUsbReceiver, usbFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mUsbReceiver);
    }

    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            tvInfo.append("BroadcastReceiver in\n");

           if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                tvInfo.append("ACTION_USB_DEVICE_ATTACHED\n");
            } else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                tvInfo.append("ACTION_USB_DEVICE_DETACHED\n");
            }
        }
    };

三、Usb插入时启动程序

有些应用场景是,Usb插入后启动特定程序处理特定问题。
我们的做法就是在Manifest中某个Activity加入Usb插入的action。

<code class=" hljs xml"> <intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED">
</action></intent-filter>
        <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usbfilter"></meta-data></code>

在usbfilter中加入厂商id和产品id的过滤,如下:

<code class=" hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%2D%2D%3E-->
<resources>
    <usb-device vendor-id="1234" product-id="5678">
</usb-device></resources></code>

结果就是,当此型号设备通过Usb连接到系统时,对应的Activity就会启动。

四、UsbManager的初始化

mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);

五、列出Usb设备

        HashMap deviceHashMap = mUsbManager.getDeviceList();
        Iterator iterator = deviceHashMap.values().iterator();
        while (iterator.hasNext()) {
            UsbDevice device = iterator.next();
            tvInfo.append("\ndevice name: "+device.getDeviceName()+"\ndevice product name:"
                    +device.getProductName()+"\nvendor id:"+device.getVendorId()+
                    "\ndevice serial: "+device.getSerialNumber());
        }

六、USB使用权限

安卓系统对USB口的使用需要得到相应的权限,而这个权限要用户亲自给才行。
首先我们会确认一下上一节中的device是否已经获得权限,如果没有就要主动申请权限:

            //先判断是否为自己的设备
            //注意:支持十进制和十六进制
            //比如:device.getProductId() == 0x04D2
            if(device.getProductId() == 1234 && device.getVendorId() == 5678) {
                if(mUsbManager.hasPermission(device)) {
                    //do your work
                } else {
                    mUsbManager.requestPermission(device,mPermissionIntent);
                }
            }

我们仍然使用广播来获得权限赋予情况。

public static final String ACTION_DEVICE_PERMISSION = "com.linc.USB_PERMISSION";

注册广播

        mPermissionIntent = PendingIntent.getBroadcast(this,0,new Intent(ACTION_DEVICE_PERMISSION),0);
        IntentFilter permissionFilter = new IntentFilter(ACTION_DEVICE_PERMISSION);
        registerReceiver(mUsbReceiver,permissionFilter);

接收器的代码:

 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            tvInfo.append("BroadcastReceiver in\n");
            if (ACTION_DEVICE_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (device != null) {
                            tvInfo.append("usb EXTRA_PERMISSION_GRANTED");
                        }
                    } else {
                        tvInfo.append("usb EXTRA_PERMISSION_GRANTED null!!!");
                    }
                }
            } 
        }
    };

七、通信

UsbDevice有了权限,下面就可以进行通信了。
这里要用到:UsbInterface、UsbEndpoint(一进一出两个endpoint,双向通信)、UsbDeviceConnection。
注意:通信的过程不能在UI线程中进行。
得到授权后,将做一些通信前的准备工作,如下:

private void initCommunication(UsbDevice device) {
        tvInfo.append("initCommunication in\n");
        if(1234 == device.getVendorId() && 5678 == device.getProductId()) {
            tvInfo.append("initCommunication in right device\n");
            int interfaceCount = device.getInterfaceCount();
            for (int interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) {
                UsbInterface usbInterface = device.getInterface(interfaceIndex);
                if ((UsbConstants.USB_CLASS_CDC_DATA != usbInterface.getInterfaceClass())
                        && (UsbConstants.USB_CLASS_COMM != usbInterface.getInterfaceClass())) {




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 9套Android实战经典项目资料分享给大家,9套android
  • Android反编译和二次打包实战
  • Android实战技巧之五十:App的系统签名
  • Android实战技巧之四十九:Usb通信之USB Host

相关文章

  • 2017-05-26Android动态部署五:如何从插件apk中启动Service
  • 2017-05-26MTK处理器手机 解锁Bootloader 教程,mtkbootloader
  • 2017-05-26使用数据源码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
  • 2017-05-26Linux下程序产生“段错误”的原因及其解决办法
  • 2017-05-26【lushengduan】02、Activity的基本认识 如何弹出一条Toast提示框,lushengduantoast
  • 2017-05-26Android新手入门2016(16)--画图
  • 2017-05-26深度剖析:Android_PullToRefresh
  • 2017-05-26二维码的扫描和生成--第三方开源--ZXing,--第三方开源--zxing
  • 2017-05-26Android Bitmap占用内存计算公式,androidbitmap
  • 2017-07-22自定义收集用户行为统计库 (非常方便 可以自己拓展)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 带新手走进神秘的HTTP协议,新手走进协议
    • Android开发艺术探索学习笔记(十一),android艺术探索
    • 安卓第十七天笔记--简易版本音乐播放器,安卓第十七天
    • 在Linux上分析死锁问题的简单方法
    • React Native 出现红屏幕报连接服务失败,reactnative
    • 对View的onMeasure()方法的进一步研究,viewonmeasure
    • Android之Pull解析XML,androidpullxml
    • android OrmLite,androidormlite
    • setOnLongClickListener中return值,onlongclicklistener
    • androidj基础:从网上下载图片,

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有