开发者社区> 问答> 正文

Android USB host 外接HID设备应用开发?报错

Android USB host 外接HID设备驱动开发:

我的设备是Android主板外挂签名加密模块,该模块是 USB HID接口。所以要开发一个android usb host 到HID device之间的通信程序(比较简单的应用,或者类似驱动),以及与加密模块之间互动。

备注:其中的加密模块是采用DES算法。

开发涉及到的HID加密模块端的接口信息和加密流程及指令说明我方固件人员会提供。

目标开发时间:3天。

简单范例供参考:

 /**

 * 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;

    }

}

展开
收起
爱吃鱼的程序员 2020-06-10 14:15:12 1380 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你好!是标准的HID<aclass='referer'target='_blank'>@rockingMan,我们的硬件是:1)未加密数据(原笔迹手写数据)-->2)通过I2C到加密模块-->3)通过USB(HID)传到安卓设备(即与HID建立通信,安卓设备可获取加密模块数据)-->4)安卓设备获取加密数据后的处理(一路在安卓设备上解密后实现签名轨迹的同步显示,另一路保留加密准备给上位机调用)-->5)安卓再通过USBHID连接上位机(PC机,在PC机解密后显示并储存数据和轨迹)。现在只要做上述第三步的任务。谢谢HID硬件端接口信息我们提供可能写的不明白,可以电话了解:18620383898特别提示:我们的HID加密模块是用DES算法,所以开发的这个APK需要遵循DES算法的加密流程,才能与加密模块互动的(涉及操作库的建立、函数接口、密钥创建等)

    2020-06-10 14:15:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载