StackOverflow 的帖子:Android 2.2 USB 软件支持
我有一个Bayer USB 血糖仪,我使用Windows 中的 usbsnoop 工具对其进行了逆向工程。
我还找到了一个Perl 脚本,用于将 usbsnoop 输出转换为 C 代码,该脚本在执行时会从 USB 设备启动数据传输。
当我将血糖仪插入我的 (x86) 笔记本电脑并在 Ubuntu 上运行编译后的 C 代码时,读数会从血糖仪捕获并打印到外壳上。(这些读数仅通过简单地将 USB 仪表插入笔记本电脑是无法查看的,即,我无法通过打开文件获得所需的数据。)
我想用 Android 做类似的事情。与血糖仪的通信将成为在运行 Android 2.2 的手机上运行的应用程序的一部分。
有没有人有关于如何做到这一点的建议?
我完整的 C 代码在 Google docs 上,片段发布在下面。我使用的关键库是 libusb。
我相信 USB 支持要到 Android 3.1 才能正式提供,虽然我看到有人提到Java libusb 包装器,但它的日期是 2009 年,我还无法理解如何使用它。
所以我想知道是否有任何应用程序成功使用了 Java libusb 包装器和/或是否有更多当前的解决方案支持 Android 2.2 上的 USB 支持。
我正在使用摩托罗拉 Droid,并且已经能够使用这个 hack让手机进入 USB 主机模式。
在此先感谢您的帮助。
这是我在 Ubuntu 上运行的 C 代码片段;我编译它使用
sh> gcc driver.c -o driver -lusb
usb_init();
usb_set_debug(255);
usb_find_busses();
usb_find_devices();
...
vendor = strtol(argv[1], &endptr, 16);
product = strtol(argv[2], &endptr, 16);
dev = find_device(vendor, product);
assert(dev);
devh = usb_open(dev);
...
// the following code is autogenerated using usbsnoop2libusb
memcpy(buf, "\x00\x00\x00\x02\x52\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 0x0000040);
ret = usb_interrupt_write(devh, 0x00000001, buf, 0x0000040, 1000);
printf("137 interrupt write returned %d, bytes: ", ret);
print_bytes(buf, ret);
printf("\n");
usleep(3*1000);
ret = usb_interrupt_read(devh, 0x00000081, buf, 0x0000040, 1000);
printf("138 interrupt read returned %d, bytes: ", ret);
print_bytes(buf, ret);
printf("\n");
usleep(19*1000);
memcpy(buf, "\x00\x00\x00\x02\x53\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 0x0000040);
ret = usb_interrupt_write(devh, 0x00000001, buf, 0x0000040, 1000);
printf("139 interrupt write returned %d, bytes: ", ret);
print_bytes(buf, ret);
printf("\n");
usleep(2*1000);
ret = usb_interrupt_read(devh, 0x00000081, buf, 0x0000040, 1000);
printf("140 interrupt read returned %d, bytes: ", ret);
print_bytes(buf, ret);
printf("\n");