参照了http://blog.csdn.net/qweadf1/article/details/41646439链接中的文章,实现了Android和HID设备的收发数据。
直接上manifest文件。主要是usb.host权限,这边没有配置xml文件指定USB设备。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.com.hid" > <uses-feature android:name="android.hardware.usb.host"/> <uses-permission android:name="android.hardware.usb.host" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/> </intent-filter> </activity> </application> </manifest>
接下来主要代码
package com.com.hid; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; 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.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private static final String TAG = "USB_HOST"; private UsbManager myUsbManager; private UsbDevice myUsbDevice; private UsbInterface myInterface; private UsbDeviceConnection myDeviceConnection; private final int VendorID = 1042; private final int ProductID = 1; private TextView info; private UsbEndpoint epOut; private UsbEndpoint epIn; private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; byte[] mybuffer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mybuffer = new byte[]{(byte)0x02, (byte)0x00, (byte)0x06, (byte)0x00, (byte)0x05, (byte)0xcc, (byte)0xcc, (byte)0xcc, (byte)0xcc, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00}; Log.i("mybuffer", bytesToHexString(mybuffer)); info = (TextView) findViewById(R.id.info); myUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); enumerateDevice(); } //枚举设备 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; Toast.makeText(this, "枚举设备成功", Toast.LENGTH_SHORT).show(); Log.d(TAG, "枚举设备成功"); findInterface(); } else { // Toast.makeText(this, "Not Found VID and PID", Toast.LENGTH_SHORT).show(); Log.d(TAG, "Not Found VID and PID"); } } } else { new AlertDialog.Builder(this).setTitle("未枚举到设备!") .setMessage("请先连接设备") .setCancelable(false) .setNeutralButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //finish(); } }).show(); } } // 找到接口 private void findInterface() { if (myUsbDevice == null) { return; } Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount()); for (int i = 0; i < myUsbDevice.getInterfaceCount(); i++) { UsbInterface intf = myUsbDevice.getInterface(i); // 根据手上的设备做一些判断,其实这些信息都可以在枚举到设备时打印出来 if (intf.getInterfaceClass() == 3 && intf.getInterfaceSubclass() == 0 && intf.getInterfaceProtocol() == 0) { myInterface = intf; Log.d(TAG, "找到我的设备接口"); openDevice(); } break; } } //获取权限,打开设备 private void openDevice() { if (myInterface != null) { UsbDeviceConnection conn = null; // 在open前判断是否有连接权限;对于连接权限可以静态分配,也可以动态分配权限,可以查阅相关资料 PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); if (!myUsbManager.hasPermission(myUsbDevice)) { myUsbManager.requestPermission(myUsbDevice, pi); } if (myUsbManager.hasPermission(myUsbDevice)) { conn = myUsbManager.openDevice(myUsbDevice); } else { Toast.makeText(this, "未获得权限", Toast.LENGTH_SHORT).show(); } if (conn == null) { return; } if (conn.claimInterface(myInterface, true)) { myDeviceConnection = conn; // 到此你的android设备已经连上HID设备 Log.d(TAG, "打开设备成功"); Toast.makeText(this, "打开设备成功", Toast.LENGTH_SHORT).show(); assignEndpoint(); } else { conn.close(); } } } //拿到端点,用bulkTransfer进行数据发收 private void assignEndpoint() { if (myInterface.getEndpoint(1) != null) { epOut = myInterface.getEndpoint(1); } if (myInterface.getEndpoint(0) != null) { epIn = myInterface.getEndpoint(0); } info.setText(myUsbDevice.getDeviceName() + "\nInterfaceCount:" + myUsbDevice.getInterfaceCount() + "\nEndpointCount:" + myInterface.getEndpointCount()); Log.d(TAG, "assignEndpoint"); int re = myDeviceConnection.bulkTransfer(epOut, mybuffer, mybuffer.length, 3000); byte[] reByte = new byte[64]; int re2 = myDeviceConnection.bulkTransfer(epIn, reByte, reByte.length, 3000); Log.i("reByte", "re"+re+"re2"+ re2 + "\n" + bytesToHexString(reByte)); Toast.makeText(this, bytesToHexString(reByte), Toast.LENGTH_LONG).show(); } public static String bytesToHexString(byte[] src){ StringBuilder stringBuilder = new StringBuilder(); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
发送和接受的数据是64位的byte[]
断开设备后用releaseInterface()
和close()
关闭UsbInterface
和UsbDeviceConnection
相关推荐
接着,通过UsbDeviceConnection建立与设备的连接,并打开指定的接口。 USB HID通信遵循HID协议,数据通常是成帧的,包含报告ID和数据字段。在Android中,开发者可以通过UsbDeviceConnection的bulkTransfer()方法...
USB HID通信是一种允许设备与主机之间进行低级别输入和输出交互的协议,常见于键盘、鼠标和其他输入设备。在安卓系统中,通过USB Host功能,手机可以作为USB设备的主机,实现对USB设备的控制,例如与单片机进行数据...
本教程将探讨如何在Android设备上通过USB接口与PC进行双向通信,支持字符和文件的交互。这种通信方式常用于设备控制、数据同步或者硬件调试。 首先,理解Android USB通信的基本原理。Android系统支持USB主机(Host...
在IT领域,尤其是在移动设备和桌面系统的交互中,"PC通过USB与Android APP通信"是一个常见且重要的主题。这个过程通常涉及到多个技术层面,包括USB通信协议、Android开发者选项、APP编程接口(API)以及数据传输机制...
与之相对的是USB accessory(副模式),在这种模式下,Android设备通过USB数据线连接到另一台独立主机设备,如另一台Android设备。自Android API level 12(即Android 3.1)开始,Android系统正式支持USB Host与...
在Android平台上实现USB-HID(Human Interface Device)协议是一个复杂而有趣的任务,它涉及到设备通信、驱动程序开发以及Android系统的底层交互。USB-HID协议主要用于连接键盘、鼠标、游戏控制器等输入设备,但在...
总结,Android通过USB转串口编程实现了与传统串口设备的通信,涉及USB主机模式、USB设备管理、串口通信协议等多个技术层面。实践中,需要对硬件接口、驱动程序、Android API以及数据传输机制有深入理解。通过阅读和...
该压缩包文件主要涉及到的是Android平台上串口Socket通信与USB驱动相关的开发技术,结合JNI(Java Native Interface)来实现。以下是对这些知识点的详细说明: 1. **Android串口通信**: Android设备通常拥有串行...
在Android平台上,USB测试程序是用于验证设备与主机之间USB通信功能的重要工具。"android usb测试程序"通常包括一系列的API调用、示例代码和测试用例,以确保开发者能够正确地集成和调试Android设备的USB接口。下面...
在Android设备上,我们需要通过USB主机模式(USB Host Mode)来与扫描枪交互,因为Android设备可以作为USB主机,控制并接收来自USB设备的数据。 1. **USB主机模式配置**:Android 3.1及以上版本支持USB主机模式,...
在IT领域,尤其是在Android开发中,串口Socket通信和USB驱动是两个重要的概念,它们用于设备间的...开发者可以通过研究源码,了解如何在Android应用中实现PC与设备间的文件传输,以及如何通过JNI进行USB驱动的编程。
它允许这些设备通过USB接口与主机进行通信,无需驱动程序,因为操作系统内置了对HID类设备的支持。在Android系统中,HID设备的使用需要遵循特定的API和流程。 **二、POS(Point of Sale)设备** POS设备是指用于...
USB HID accessory模式主要用于非标准设备与Android设备之间的通信,例如游戏控制器、键盘、鼠标等。在这个demo中,我们将深入探讨USB协议、HID类设备、USB accessory模式以及如何在Android平台上实现这一模式。 ...
在Android系统中,OTG(On-The-Go)是一种功能,允许设备直接通过USB接口与其他设备进行通信,而无需依赖主机或集线器。OTG技术使得Android设备能够扮演主机的角色,连接键盘、鼠标、打印机、U盘甚至是其他Android...
2. **Android USB框架**:自Android 3.1版本起,Android引入了USB主机模式(Host Mode),使得Android设备能够作为USB主机,控制和通信USB设备。关键类包括`UsbManager`、`UsbDevice`、`UsbDeviceConnection`和`Usb...
RK3399 是一款高性能的嵌入式处理器,支持多种USB设备模式,包括USB Host和USB Device。通过内核中的USB gadget功能,RK3399 可以模拟成各种USB设备,如U盘、网络适配器、键盘等。本文主要介绍如何将 RK3399 配置为...
这个应用可能包含了USB主机库,如Android Open Accessory Development Kit (ADK),它允许开发者创建可以与USB设备通信的安卓应用。通过调用ADK相关的API,应用可以识别连接的STM32设备,发送命令,接收反馈,从而...
AOA(Android Open Accessory)协议是由Google推出的一种专门用于Android设备与外围设备间USB通信的协议,它扩展了Android设备USB接口的功能,使得Android智能设备能够更好地应用于数据采集和设备控制领域。...
开发者需要使用`UsbManager`类来管理和控制USB设备,通过请求设备权限,然后建立与设备的通信链接,接收来自设备的数据。 5. **U盘支持**: 对于游戏手柄来说,U盘支持可能涉及到存储游戏数据或更新固件。Android...
它提供了一组API,使得应用程序能够与USB设备进行通信而无需关心底层的硬件细节。libusb支持的主要功能包括设备枚举、数据传输、配置管理等。hidapi正是利用了libusb的强大功能来实现对HID设备的抽象化访问。 #### ...