Android(安卓)系统USB-OTG-HID外设通讯开发
正在为客户开发的X射线荧光成分分析仪(简称手持XRF分析仪 ),采用了MT6577 Android方案来开发。其中负责发送X射线的X-Ray-Tube设备是通过USB口来控制的。为了完成控制,就要求我们的Android控制板采用USB-OTG-HID方式来通信。MT6577这款双核的Andoid手机方案是支持OTG功能的。
google官方文档http://developer.android.com/guide/topics/connectivity/usb/host.html
Android系统3.1及以上版本才能支持USBHOST,这样我们才能连接HID设备进行通讯
项目新建完成之后,AndroidManifest.xml中加入以下代码
然后res下增加xml文件夹,新建device_filter.xml,并加入一下代码,这里是声明HID设备VID以及PID,注意是10进制
package com.android.missilelauncher; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbEndpoint; import android.hardware.usb.UsbInterface; import android.hardware.usb.UsbManager; import android.hardware.usb.UsbRequest; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class MissileLauncherActivity extends Activity { private static final String TAG = "MissileLauncherActivity"; private Button btsend; // 发送按钮 private UsbManager manager; // USB管理器 private UsbDevice mUsbDevice; // 找到的USB设备 private ListView lsv1; // 显示USB信息的 private UsbInterface mInterface; private UsbDeviceConnection mDeviceConnection; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.launcher); btsend = (Button) findViewById(R.id.btsend); btsend.setOnClickListener(btsendListener); lsv1 = (ListView) findViewById(R.id.lsv1); // 获取USB设备 manager = (UsbManager) getSystemService(Context.USB_SERVICE); if (manager == null) { return; } else { Log.i(TAG, "usb设备:" + String.valueOf(manager.toString())); } HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Log.i(TAG, "usb设备:" + String.valueOf(deviceList.size())); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); ArrayList<String> USBDeviceList = new ArrayList<String>(); // 存放USB设备的数量 while (deviceIterator.hasNext()) { UsbDevice device = deviceIterator.next(); USBDeviceList.add(String.valueOf(device.getVendorId())); USBDeviceList.add(String.valueOf(device.getProductId())); // 在这里添加处理设备的代码 if (device.getVendorId() == 6790 && device.getProductId() == 57360) { mUsbDevice = device; Log.i(TAG, "找到设备"); } } // 创建一个ArrayAdapter lsv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, USBDeviceList)); findIntfAndEpt(); } // 寻找接口和分配结点 private void findIntfAndEpt() { if (mUsbDevice == null) { Log.i(TAG, "没有找到设备"); return; } for (int i = 0; i < mUsbDevice.getInterfaceCount();) { // 获取设备接口,一般都是一个接口,你可以打印getInterfaceCount()方法查看接 // 口的个数,在这个接口上有两个端点,OUT 和 IN UsbInterface intf = mUsbDevice.getInterface(i); Log.d(TAG, i + " " + intf); mInterface = intf; break; } if (mInterface != null) { UsbDeviceConnection connection = null; // 判断是否有权限 if (manager.hasPermission(mUsbDevice)) { // 打开设备,获取 UsbDeviceConnection 对象,连接设备,用于后面的通讯 connection = manager.openDevice(mUsbDevice); if (connection == null) { return; } if (connection.claimInterface(mInterface, true)) { Log.i(TAG, "找到接口"); mDeviceConnection = connection; // 用UsbDeviceConnection 与 UsbInterface 进行端点设置和通讯 getEndpoint(mDeviceConnection, mInterface); } else { connection.close(); } } else { Log.i(TAG, "没有权限"); } } else { Log.i(TAG, "没有找到接口"); } } private UsbEndpoint epOut; private UsbEndpoint epIn; // 用UsbDeviceConnection 与 UsbInterface 进行端点设置和通讯 private void getEndpoint(UsbDeviceConnection connection, UsbInterface intf) { if (intf.getEndpoint(1) != null) { epOut = intf.getEndpoint(1); } if (intf.getEndpoint(0) != null) { epIn = intf.getEndpoint(0); } } private byte[] Sendbytes; // 发送信息字节 private byte[] Receiveytes; // 接收信息字节 private OnClickListener btsendListener = new OnClickListener() { int ret = -100; @Override public void onClick(View v) { String testString = "010A"; //String testString = "C783CC30"; byte[] bt = clsPublic.HexString2Bytes(testString); Sendbytes = Arrays.copyOf(bt, bt.length); // 1,发送准备命令 ret = mDeviceConnection.bulkTransfer(epOut, Sendbytes, Sendbytes.length, 5000); Log.i(TAG, "已经发送!"); // 2,接收发送成功信息 Receiveytes = new byte[32]; ret = mDeviceConnection.bulkTransfer(epIn, Receiveytes, Receiveytes.length, 10000); Log.i(TAG, "接收返回值:" + String.valueOf(ret)); if (ret != 32) { DisplayToast("接收返回值" + String.valueOf(ret)); return; } else { // 查看返回值 DisplayToast(clsPublic.Bytes2HexString(Receiveytes)); Log.i(TAG, clsPublic.Bytes2HexString(Receiveytes)); } } }; public void DisplayToast(CharSequence str) { Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG); // 设置Toast显示的位置 toast.setGravity(Gravity.TOP, 0, 200); // 显示Toast toast.show(); } }
这里还有一个需要解决的问题就是如何设置输入输出报文,函数是controlTransfer(requestType, request, value, index, buffer, length, timeout)
Android(安卓)系统USB-OTG-HID外设通讯开发的更多相关文章
- 企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法
此处以三星(系统版本4.4.2)为例,介绍下使用安卓系统自带的客户端如何设置pop/imap协议方式方法 以下我们将使用test@zhuyuming.so 为测试案例,请您操作时更换成您自己的邮箱账号 ...
- android安卓系统上运行jar文件
原文链接: http://blog.sina.com.cn/s/blog_658c8cea0101mdhp.html 步骤如下: 1. 将文件打包成可执行jar文件(可在eclipse里export) ...
- 嵌入式系统USB CDROM虚拟光驱驱动程序开发
带U盘功能的的USB接口设备已经越来越常见了.如果能够把产品说明书或者产品设备驱动程序做成一个USB CDROM,那该多方便.假设:你已经有了USB mass storage驱动.你的任务是在此基础上 ...
- Android技术宅:自制USB OTG数据线
作为一名Android技术宅,USB OTG是你必须了解的,所谓USB OTG就是你可以利用手机或平板上用来充电.与电脑传输数据的micro USB接口来连接其他USB外设,如游戏手柄.鼠标.键盘.U ...
- 【转】Android Service创建USB HOST通信
之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...
- Android Service创建USB HOST通信
之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...
- Android USB Host 与 HID 之通讯方法
Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...
- Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)
转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...
- 安卓系统使用USB转串口
概述 安卓系统支持多种 USB 外围设备,提供两种模式来支持实现 USB 外设接入系统:USB 配件模式和 USB 主机模式. 在 USB 配件模式下,接入的 USB 设备充当 USB 主机,并为 U ...
随机推荐
- SQL SERVER中的逻辑读,预读和物理读
sqlserver:数据存储方式:最小单位是页,每一页8k,sqlserver 对页的读取是具有原子性,也就是说,要么读取完整一页,要么完全不读取,不会有中间状态,而页之间的数据组织结构是B树 但是每 ...
- CSS3滤镜!!!
<!DOCTYPE html> <html> <head> <style> img { width: 33%; height: auto; float: ...
- Java实战之02Hibernate-05检索策略、检索方式
十一.Hibernate的检索策略 1.概述: 查询的时机:什么时候去查? /** * 一张表的检索策略我们称之为: * 类级别的检索策略. * 注意:只要是说类级别的检索策略,就一定不涉及关联对象. ...
- 写入.csv文件
#include "stdafx.h" #include "WriteCsv.h" CString m_strData;//写入记录的一条数据 CString ...
- 数据库不能用delete---index空间不足
只有0702表是这样的情况,0101表可以使用like和between and
- hdu 1047 Integer Inquiry(高精度数)
Problem Description Oneof the first users of BIT's new supercomputer was Chip Diller. He extended hi ...
- 深度模拟java动态代理实现机制系类之一
上一篇博客是最基本的动态代理原理的实现,因为其固定了接口,固定了代理方法,以及固定了代理的类型,接下来的博客系类将一步步渐入深度介绍java的动态代理的实现原理 ******************* ...
- php常用单词语法
header("Content-type:text/html;charset=utf-8"); 加入数组array_push($ratings_store_cop,$value); ...
- hdu 5000 Clone
dp,用dp[i][j],表示和为i的前j个维度的种类.其中arr[i],表示第i维的最大值. 则\begin{equation} dp[i][j] = \sum_{0 \leq k \leq \mi ...
- RX学习笔记:正则表达式
正则表达式 2016-07-03 正则表达式是以字符串模板的形式匹配查找字符的方式. 正则表达式是字符串模板,所以其本身是一个字符串,首尾以反斜杆 / 开始和结束. 在两反斜杆中间的字符串表示要查找的 ...