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 ...
随机推荐
- NOIP200701
题是这样的: 试题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再 ...
- [DLL] Dynamic link library (dll) 的编写和使用教程
前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...
- HTML5入门篇
---- HTML5简介 HTML5 是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 ...
- echshop 微信扫码支付 遇到的问题
参考的网站 (转)http://www.ecshop119.com/ecshopjc-937.html(转)http://www.6gdown.com/softedupage/58929.html ...
- poj 3783 Balls 动态规划 100层楼投鸡蛋问题
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098409.html 题目链接:poj 3783 Balls 动态规划 100层楼投鸡蛋问题 ...
- 重新开始学习c#啦,希望能坚持下去!
过了这么多年,还是感觉自己喜欢C#,喜欢编程,虽然自己什么技术也没有:做的项目也不算是项目:
- prefix和unprefix
exports._esModule = true; exports.default = { prefix: function prefix(prop){ if (prop[0] === '-'){ v ...
- H5 App如此强悍,要降薪的恐怕已不只是iOS程序员
2015年的最后几天,移动开发圈里最为火爆的话题之一无疑是“iOS程序员月薪降至12K”这则报道. 有人认为这是O2O创业遇冷所致,也有人认为这是iOS生态过于封闭致使智能硬件等新领域对iOS开发者的 ...
- c#画正弦波
/// <summary> /// 画正弦曲线 /// </summary> /// <param name="sender"></par ...
- 如何配置SSH Keys登录
SSH Keys简介: 使用SSH Keys的登录远程虚拟云主机的方式比单独使用密码登录更加安全,简单的密码很可能被暴力破解.而目前来看采用长度大于1024位的RSA加密算法,几乎是不可能被破解的.S ...