`
bell0901
  • 浏览: 28593 次
社区版块
存档分类
最新评论

Android USB Host与HID设备通信

HID 
阅读更多

    参照了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 

 

分享到:
评论

相关推荐

    android usb host通信

    接着,通过UsbDeviceConnection建立与设备的连接,并打开指定的接口。 USB HID通信遵循HID协议,数据通常是成帧的,包含报告ID和数据字段。在Android中,开发者可以通过UsbDeviceConnection的bulkTransfer()方法...

    安卓 usb hid通信demo

    USB HID通信是一种允许设备与主机之间进行低级别输入和输出交互的协议,常见于键盘、鼠标和其他输入设备。在安卓系统中,通过USB Host功能,手机可以作为USB设备的主机,实现对USB设备的控制,例如与单片机进行数据...

    Android通过USB与PC端双向通信【支持字符、文件】

    本教程将探讨如何在Android设备上通过USB接口与PC进行双向通信,支持字符和文件的交互。这种通信方式常用于设备控制、数据同步或者硬件调试。 首先,理解Android USB通信的基本原理。Android系统支持USB主机(Host...

    PC 通过USB 与android APP 通信

    在IT领域,尤其是在移动设备和桌面系统的交互中,"PC通过USB与Android APP通信"是一个常见且重要的主题。这个过程通常涉及到多个技术层面,包括USB通信协议、Android开发者选项、APP编程接口(API)以及数据传输机制...

    Android USB host简介,中文文档

    与之相对的是USB accessory(副模式),在这种模式下,Android设备通过USB数据线连接到另一台独立主机设备,如另一台Android设备。自Android API level 12(即Android 3.1)开始,Android系统正式支持USB Host与...

    Android 中USB-HID协议实现

    在Android平台上实现USB-HID(Human Interface Device)协议是一个复杂而有趣的任务,它涉及到设备通信、驱动程序开发以及Android系统的底层交互。USB-HID协议主要用于连接键盘、鼠标、游戏控制器等输入设备,但在...

    Android USB转串口编程

    总结,Android通过USB转串口编程实现了与传统串口设备的通信,涉及USB主机模式、USB设备管理、串口通信协议等多个技术层面。实践中,需要对硬件接口、驱动程序、Android API以及数据传输机制有深入理解。通过阅读和...

    安卓串口Socket通讯USB驱动jni相关-可以接收单片机发送的usbhid信息并显示在android手机上.zip

    该压缩包文件主要涉及到的是Android平台上串口Socket通信与USB驱动相关的开发技术,结合JNI(Java Native Interface)来实现。以下是对这些知识点的详细说明: 1. **Android串口通信**: Android设备通常拥有串行...

    android usb测试程序

    在Android平台上,USB测试程序是用于验证设备与主机之间USB通信功能的重要工具。"android usb测试程序"通常包括一系列的API调用、示例代码和测试用例,以确保开发者能够正确地集成和调试Android设备的USB接口。下面...

    Android 获取USB扫描枪扫描数据(无界面)

    在Android设备上,我们需要通过USB主机模式(USB Host Mode)来与扫描枪交互,因为Android设备可以作为USB主机,控制并接收来自USB设备的数据。 1. **USB主机模式配置**:Android 3.1及以上版本支持USB主机模式,...

    安卓串口Socket通讯USB驱动jni相关-PC与AndroidUSB数据通讯可以方便的穿文件到手机也可以从手机获取文件.rar

    在IT领域,尤其是在Android开发中,串口Socket通信和USB驱动是两个重要的概念,它们用于设备间的...开发者可以通过研究源码,了解如何在Android应用中实现PC与设备间的文件传输,以及如何通过JNI进行USB驱动的编程。

    HIDPOS-Android

    它允许这些设备通过USB接口与主机进行通信,无需驱动程序,因为操作系统内置了对HID类设备的支持。在Android系统中,HID设备的使用需要遵循特定的API和流程。 **二、POS(Point of Sale)设备** POS设备是指用于...

    usb accessory usb从属demo

    USB HID accessory模式主要用于非标准设备与Android设备之间的通信,例如游戏控制器、键盘、鼠标等。在这个demo中,我们将深入探讨USB协议、HID类设备、USB accessory模式以及如何在Android平台上实现这一模式。 ...

    Android设备间通过OTG-USB连接dome

    在Android系统中,OTG(On-The-Go)是一种功能,允许设备直接通过USB接口与其他设备进行通信,而无需依赖主机或集线器。OTG技术使得Android设备能够扮演主机的角色,连接键盘、鼠标、打印机、U盘甚至是其他Android...

    安卓USB通信,可对接不同的usb硬件设备,供参考

    2. **Android USB框架**:自Android 3.1版本起,Android引入了USB主机模式(Host Mode),使得Android设备能够作为USB主机,控制和通信USB设备。关键类包括`UsbManager`、`UsbDevice`、`UsbDeviceConnection`和`Usb...

    stm32 usb控制安卓手机 安卓手机控制单片机

    这个应用可能包含了USB主机库,如Android Open Accessory Development Kit (ADK),它允许开发者创建可以与USB设备通信的安卓应用。通过调用ADK相关的API,应用可以识别连接的STM32设备,发送命令,接收反馈,从而...

    基于AOA协议实现Android设备的USB通信

    AOA(Android Open Accessory)协议是由Google推出的一种专门用于Android设备与外围设备间USB通信的协议,它扩展了Android设备USB接口的功能,使得Android智能设备能够更好地应用于数据采集和设备控制领域。...

    RK3399 HID gadget 配置为键盘

    RK3399 是一款高性能的嵌入式处理器,支持多种USB设备模式,包括USB Host和USB Device。通过内核中的USB gadget功能,RK3399 可以模拟成各种USB设备,如U盘、网络适配器、键盘等。本文主要介绍如何将 RK3399 配置为...

    android的游戏手柄开发测试代码

    开发者需要使用`UsbManager`类来管理和控制USB设备,通过请求设备权限,然后建立与设备的通信链接,接收来自设备的数据。 5. **U盘支持**: 对于游戏手柄来说,U盘支持可能涉及到存储游戏数据或更新固件。Android...

    hidapi 移植

    它提供了一组API,使得应用程序能够与USB设备进行通信而无需关心底层的硬件细节。libusb支持的主要功能包括设备枚举、数据传输、配置管理等。hidapi正是利用了libusb的强大功能来实现对HID设备的抽象化访问。 #### ...

Global site tag (gtag.js) - Google Analytics