正在为客户开发的X射线荧光成分分析仪(简称手持XRF分析仪 ),采用了MT6577 Android方案来开发。其中负责发送X射线的X-Ray-Tube设备是通过USB口来控制的。为了完成控制,就要求我们的Android控制板采用USB-OTG-HID方式来通信。MT6577这款双核的Andoid手机方案是支持OTG功能的。

  如何进行USB接口的HID进行开发?网站上很多文章并不完善,这方便的也介绍的不多,我看了很多资料,借助网上的一些代码,整理了以下信息,希望能给大家提供便捷

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进制

下面就是java代码了,直接贴完整代码吧
 
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
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外设通讯开发的更多相关文章

  1. 企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法

    此处以三星(系统版本4.4.2)为例,介绍下使用安卓系统自带的客户端如何设置pop/imap协议方式方法 以下我们将使用test@zhuyuming.so 为测试案例,请您操作时更换成您自己的邮箱账号 ...

  2. android安卓系统上运行jar文件

    原文链接: http://blog.sina.com.cn/s/blog_658c8cea0101mdhp.html 步骤如下: 1. 将文件打包成可执行jar文件(可在eclipse里export) ...

  3. 嵌入式系统USB CDROM虚拟光驱驱动程序开发

    带U盘功能的的USB接口设备已经越来越常见了.如果能够把产品说明书或者产品设备驱动程序做成一个USB CDROM,那该多方便.假设:你已经有了USB mass storage驱动.你的任务是在此基础上 ...

  4. Android技术宅:自制USB OTG数据线

    作为一名Android技术宅,USB OTG是你必须了解的,所谓USB OTG就是你可以利用手机或平板上用来充电.与电脑传输数据的micro USB接口来连接其他USB外设,如游戏手柄.鼠标.键盘.U ...

  5. 【转】Android Service创建USB HOST通信

    之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...

  6. Android Service创建USB HOST通信

    之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...

  7. Android USB Host 与 HID 之通讯方法

    Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...

  8. Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)

    转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...

  9. 安卓系统使用USB转串口

    概述 安卓系统支持多种 USB 外围设备,提供两种模式来支持实现 USB 外设接入系统:USB 配件模式和 USB 主机模式. 在 USB 配件模式下,接入的 USB 设备充当 USB 主机,并为 U ...

随机推荐

  1. Android四大组件之BroadcastReceiver

    什么是BroadcastReceiver? BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播. 在Android系统中,广播体现在方方面面, ...

  2. <转载>国外程序员推荐的免费编程书籍资源

    一.George Stocker 提供了一大串,分类如下: How to Design Programs: An Introduction to Computing and Programming 2 ...

  3. python 随机生成用户名、密码、手机号码

    #!C:\Python #!/usr/bin/env python #-*- coding:utf-8 -*- import string import random minlength = 6 ma ...

  4. 第十八篇、keychain保存UUID(保持唯一性,应用卸载,下载安装也不变)和获取IP地址

    .h #import <Foundation/Foundation.h> #import <Security/Security.h> /**使用**/ //-(void) se ...

  5. 多个UITableView横向切换的简单实现(有点类似网易新闻)

    实现多列表切换,位置监控,置顶等功能. 方法一: 创建一个TableView,在切换的时候请求各类目需要的数据,然后刷新列表,通过动画模拟出滑动效果. #import <UIKit/UIKit. ...

  6. C语言经典案例

    题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万 ...

  7. c#WebBrowser进阶

    WebBrowser的基本功能就是访问网页,但是由于它本身就不在主线程上面,所以程序判断它什么时候加载完成了,比较麻烦.为此我集合从网上找到的内容,做了一个例子. 其中包括了给WebBrowser设置 ...

  8. 探究为何rem在chrome浏览器上计算出错

    最近在一个项目中,测试同学提了一个bug,说手机上有个页面的某些字体显示偏大.就像这样 我用chrome浏览器在pc上测试了一下,发现pc上也有这个问题,但是用其它浏览器打开这个页面就没有发现这个问题 ...

  9. JavaScript自定义方法实现trim()、Ltrim()、Rtrim()

    去除字符串两端的空格,是字符串处理非常常用的方法如何trim() .Ltrim() .Rtrim(),可惜的是javascript中无此方法,下面有个不错的自定义教程感兴趣的朋友可以参考下 去除字符串 ...

  10. 基于C#的SolidWorks插件开发(1)--SolidWorks API接口介绍

    这是两年前毕业时写的一篇关于SolidWorks插件开发与公司PDM集成的毕业设计,最近闲来无事拿出来整理一下,大神们可以略过. 1.1   SolidWorks API接口 正确调用SolidWor ...