3

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");
4

1 回答 1

0

我患有糖尿病,正在使用 Glucometer Deluxe 软件,这是我的 Windows XP 机器上的一个 java 程序。该软件缺乏许多功能,例如能够调整葡萄糖与时间图上的垂直刻度,它固定在600,这太高了。它还为图形提供背景色,使黑白激光打印输出难以阅读。此外,它的读数打印输出非常冗长,需要很多页浪费纸张,简单的电子表格格式会更好。

一般来说,Android 的编程是用 Java 完成的。在我看来,在提供的 Glucometer Deluxe 软件上使用 JAD Java 反编译器http://en.wikipedia.org/wiki/JAD_%28JAva_Decompiler%29可能是破解代码的一种方法。这并不容易。

如果这可行,您还可以改进用于 PC 等的 Java 程序,并使其在 Android 上运行。

cdh@cdhconsult.com

于 2011-07-23T19:10:10.107 回答