StackOverflow への投稿: Android 2.2 USB SW サポート
Windows で usbsnoop ツールを使用してリバース エンジニアリングしたBayer USB グルコメーターがあります。
また、usbsnoop の出力を実行時に USB デバイスからのデータ転送を開始する C コードに変換する Perl スクリプトも見つけました。
グルコメーターを (x86) ラップトップに接続し、コンパイルされた C コードを Ubuntu で実行すると、測定値がメーターから取得され、シェルに出力されます。(これらの測定値は、単に USB メーターをラップトップに接続しただけでは表示できません。つまり、ファイルを開いて必要なデータを取得することはできません。)
私はAndroidで似たようなことをしたいと思っています。グルコメーターとの通信は、Android 2.2 を実行している電話で実行されるアプリの一部になります。
これを行う方法について誰か提案がありますか?
私の完全な C コードは Google docsにあり、スニペットは以下に掲載されています。私が使用する主要なライブラリは libusb です。
USB サポートは Android 3.1 まで公式には利用できないと思います。Java libusb wrapperについての言及を見たことはありますが、日付は 2009 年であり、その使用方法を理解できませんでした。
そのため、その Java libusb ラッパーを正常に使用したアプリケーションがあるかどうか、および/または Android 2.2 で USB をサポートする最新のソリューションがあるかどうかを知りたいと思いました。
Motorola Droid を使用していますが、このハックを使用して電話を 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");