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;
}
}
你好!是标准的HID<aclass='referer'target='_blank'>@rockingMan,我们的硬件是:1)未加密数据(原笔迹手写数据)-->2)通过I2C到加密模块-->3)通过USB(HID)传到安卓设备(即与HID建立通信,安卓设备可获取加密模块数据)-->4)安卓设备获取加密数据后的处理(一路在安卓设备上解密后实现签名轨迹的同步显示,另一路保留加密准备给上位机调用)-->5)安卓再通过USBHID连接上位机(PC机,在PC机解密后显示并储存数据和轨迹)。现在只要做上述第三步的任务。谢谢HID硬件端接口信息我们提供可能写的不明白,可以电话了解:18620383898特别提示:我们的HID加密模块是用DES算法,所以开发的这个APK需要遵循DES算法的加密流程,才能与加密模块互动的(涉及操作库的建立、函数接口、密钥创建等)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。