android USB通讯开发
来源:互联网 发布:散列算法md5破解 编辑:程序博客网 时间:2024/04/27 16:29
转载自:http://www.cnblogs.com/doorsky/p/4388849.html
前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小.
比较好的文章是:
Android USB Host与HID通讯
Android Service创建USB HOST通信
其中代码之处有些地方需要注意的, 特此注明一下:
/** * USB HOST 连接 HID * @author IVAN * */public class MainActivity extends Activity { private static final String TAG = "USB_HOST"; private UsbManager myUsbManager; private UsbDevice myUsbDevice; private UsbInterface myInterface; private UsbDeviceConnection myDeviceConnection; private final int VendorID = 8457; //这里要改成自己的硬件ID private final int ProductID = 30264; private TextView info; private UsbEndpoint epOut; private UsbEndpoint epIn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); info = (TextView) findViewById(R.id.info); // 获取UsbManager myUsbManager = (UsbManager) getSystemService(USB_SERVICE); enumerateDevice(); findInterface(); openDevice(); assignEndpoint(); } /** * 分配端点,IN | OUT,即输入输出;此处我直接用1为OUT端点,0为IN,当然你也可以通过判断 */
//USB_ENDPOINT_XFER_BULK
/*
#define USB_ENDPOINT_XFER_CONTROL 0 --控制传输
#define USB_ENDPOINT_XFER_ISOC 1 --等时传输
#define USB_ENDPOINT_XFER_BULK 2 --块传输
#define USB_ENDPOINT_XFER_INT 3 --中断传输
* */
private void assignEndpoint() {
if (myInterface != null) { //这一句不加的话 很容易报错 导致很多人在各大论坛问:为什么报错呀
//这里的代码替换了一下 按自己硬件属性判断吧
for (int i = 0; i < myInterface.getEndpointCount(); i++) {
UsbEndpoint ep = myInterface.getEndpoint(i);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
epOut = ep;
} else {
epIn = ep;
}
}
}
}
Log.d(TAG, getString(R.string.text)); } /** * 打开设备 */ private void openDevice() { if (myInterface != null) { UsbDeviceConnection conn = null; // 在open前判断是否有连接权限;对于连接权限可以静态分配,也可以动态分配权限,可以查阅相关资料 if (myUsbManager.hasPermission(myUsbDevice)) { conn = myUsbManager.openDevice(myUsbDevice); } if (conn == null) { return; } if (conn.claimInterface(myInterface, true)) { myDeviceConnection = conn; // 到此你的android设备已经连上HID设备 Log.d(TAG, "打开设备成功"); } else { conn.close(); } } } /** * 找设备接口 */ private void findInterface() { if (myUsbDevice != null) { Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount()); for (int i = 0; i < myUsbDevice.getInterfaceCount(); i++) { UsbInterface intf = myUsbDevice.getInterface(i); // 根据手上的设备做一些判断,其实这些信息都可以在枚举到设备时打印出来 if (intf.getInterfaceClass() == 8 && intf.getInterfaceSubclass() == 6 && intf.getInterfaceProtocol() == 80) { myInterface = intf; Log.d(TAG, "找到我的设备接口"); } break; } } } /** * 枚举设备 */ private void enumerateDevice() { if (myUsbManager == null) return; HashMap<String, UsbDevice> deviceList = myUsbManager.getDeviceList(); if (!deviceList.isEmpty()) { // deviceList不为空 StringBuffer sb = new StringBuffer(); for (UsbDevice device : deviceList.values()) { sb.append(device.toString()); sb.append("\n"); info.setText(sb); // 输出设备信息 Log.d(TAG, "DeviceInfo: " + device.getVendorId() + " , " + device.getProductId()); // 枚举到设备 if (device.getVendorId() == VendorID && device.getProductId() == ProductID) { myUsbDevice = device; Log.d(TAG, "枚举设备成功"); } } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }}
获取数据的代码:
ncount = myDeviceConnection.bulkTransfer(epIn, buffer, buffer.length, 100);
这里注意数据读取的长度, 这个对某些硬件来说非常重要, 有的硬件小了或者大了立马死机重启, 要么就是一直返回-1
这个数据的长度需要根据硬件属性来,
有一种办法是通过int inMax = epIn.getMaxPacketSize()来获取;
还有一种办法是通过windows下面的hid程序探测设备的数据长度;
至于读不到硬件的问题 我觉得以下办法不会有帮助了, 要么是硬件不支持, android4.0以上 貌似都包含了以下的文件信息了
将android.hardware.usb.host.xml文件放到/system/etc/permissions下;第二处是在同目录下的handheld_core_hardware.xml里面添加一句<feature name="android.hardware.usb.host">
- android USB通讯开发
- Android USB通讯(完整版)
- Android USB通讯
- Android(安卓)系统USB-OTG-HID外设通讯开发
- Android(安卓)系统USB-OTG-HID外设通讯开发
- Android USB Host(Android USB 主机通讯)
- Android USB Host(Android USB 主机通讯)
- MacOSX开发之USB通讯
- Android设备的USB通讯
- Android USB 通讯相关的
- USB开发基础--了解USB的通讯过程
- USB开发基础--了解USB的通讯过程
- 【Android】【USB】USB相关开发
- Android与PC通过USB通讯
- android usb与自定义HID设备通讯
- Android USB Host与HID通讯
- Android USB Host与HID通讯
- Android与PC通过USB通讯
- 优化分析:移动应用最重要的指标
- 对于背景图等过大图片的处理
- 【Java】【Flume】Flume-NG启动过程源码分析(二)
- Android5.0 新特性学习总结
- 调用命令行的函数
- android USB通讯开发
- java网络编程(一):java传统的阻塞IO以及多线程解决方案
- 使用spring容器时,服务器不能顺利启动信息: Initializing Spring root WebApplicationContext log4j:WARN No appenders cou
- 简历筛选标准
- 调用接口返回失败时的必要操作
- 数据库基本语句
- 多进程通讯
- cookie 和session 的区别详解
- 详解shape标签