当前位置: 首页 > news >正文

嘉祥网站建设/济南今日头条新闻

嘉祥网站建设,济南今日头条新闻,电商推广和网络推广的策略,股票网站排名哪个好零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一。 硬件上,它是用插头连接。一边是公头(plug),一边是母头(receptacle)。例如,PC上的插座…

零 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。

预了解更多USB知识,请参考USB官网以及下面这篇文章: 
http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html

一、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的插入和拔出是以系统广播的形式发送的,只要我们注册这个广播即可。

    @Overrideprotected 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。

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

 

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

<?xml version="1.0" encoding="utf-8"?>
<resources><usb-device vendor-id="1234" product-id="5678" /> </resources>

 

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

四、UsbManager的初始化

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

五、列出Usb设备

        HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();Iterator<UsbDevice> 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() == 0x04D2if(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())) { continue; } for (int i = 0; i < usbInterface.getEndpointCount(); i++) { UsbEndpoint ep = usbInterface.getEndpoint(i); if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { mUsbEndpointIn = ep; } else { mUsbEndpointOut = ep; } } } if ((null == mUsbEndpointIn) || (null == mUsbEndpointOut)) { tvInfo.append("endpoint is null\n"); mUsbEndpointIn = null; mUsbEndpointOut = null; mUsbInterface = null; } else { tvInfo.append("\nendpoint out: " + mUsbEndpointOut + ",endpoint in: " + mUsbEndpointIn.getAddress()+"\n"); mUsbInterface = usbInterface; mUsbDeviceConnection = mUsbManager.openDevice(device); break; } } } }

发送数据如下:

result = mUsbDeviceConnection.bulkTransfer(mUsbEndpointOut, mData, (int)buffSize, 1500);//需要在另一个线程中进行

八、其他

作为一个普通的开发者,如果没有USB设备,那么调试程序是个问题。 
可以使用AdbTest程序用OTG线连接两个手机或平板试试。 
有USB设备的同事,会根据设备的通信协议规则去编码。这里面要用到byte与其他类型转换,以及十六进制的问题。 
具体问题具体分析吧。这篇文章磕磕绊绊,就先到这里了。

参考: 
1、endpoint的介绍:http://blog.chinaunix.net/uid-25314474-id-3040231.html

from:http://blog.csdn.net/lincyang/article/details/50739342

http://www.jmfq.cn/news/5016475.html

相关文章:

  • 临汾花果街网站建设/佛山网站建设技术托管
  • 佛山网站建设no.1/福州短视频seo获客
  • 网上商城网站建设规划/下载安装百度
  • 设计师素材/百度推广怎么优化关键词的质量
  • 信阳网站建设公司汉狮排名/今天大事件新闻
  • 免费源码资源/北京seo执行
  • 网站默认模板/线上营销课程
  • 戒赌网站怎么做/seo搜索引擎优化推广
  • 学校网站建设与管理办法/磁力搜索器
  • 有没有免费注册域名的网站/网络舆情分析师
  • 哈尔滨建站优化定制/如何优化培训体系
  • 有什的自学做网站/杭州seo搜索引擎优化
  • 应该选用优质的个人护理/沈阳网站推广优化
  • 怎样可以查到做网站公司/最新域名ip地址
  • 湖南省郴州市邮编/长沙好的seo外包公司
  • 做网站多少钱一张页面/网站提交收录入口
  • 中国建设银行网站宁波网点/常见的营销策略有哪些
  • wordpress 连接丢失/seo软件哪个好
  • 重庆网站推广外包企业/公司官网模板
  • 广州门户网站建设方案/网站运营需要多少钱
  • 上海闵行区今日疫情/seo搜索引擎的优化
  • 网站开发专业术语/重庆百度竞价推广
  • 如何制作网站视频的软件/谷歌ads
  • 中国人做的比较好的shopify网站/种子搜索引擎在线
  • 网站系统建站/百度广告代理商加盟
  • 注册网站免费/注册google账号
  • 官方网站侵权/免费的网站域名查询565wcc
  • 手机网站 备案/指数基金定投怎么买
  • 个人计算机做服务器建网站/apple日本网站
  • 江苏省网站备案注销/优化设计电子课本下载