Closed3
WebUSB APIを使ってANT+デバイスと通信するライブラリを作ってみた話
ANT+をJavaScriptで扱うための有名所ライブラリとしては Loghorn/ant-plus が有名。(実はcommitしてたりする)
Loghorn/ant-plus
はNodeJS + libusbが必要で、Electronなどデスクトップアプリにしか使えないのがネック。
シンプルにWebアプリからANT+デバイスに接続する方法が無かった。じゃあ作るしかない。
NodeJS + libusbではなく、WebUSB APIを使うアプローチを試みてみた。
完成したものがコチラになります。
立ちはだかった壁1: パケットの取り扱い
Buffer は DataView に置き換えような
デバイスから受け取ったパケットを Longhorn (libusb) 版では Bufferとして扱っている。
WebではNodeJSのClassであるBufferを扱えないので、DataView に込めて扱うことにした。
Before
After
躓きポイントとしてリトルエンディアンの取り扱いを挙げておく。
DataViewと向き合う機会が普段ないので大変勉強になった。
- Buffer はリトルエンディアンを専用のメソッドで取り扱う
例:Buffer.readUInt16LE(n)
- 対して DataView ではオプションでリトルエンディアンの取り扱いを宣言する
例:DataView.getUint16(n, boolean)
立ちはだかった壁2: WebUSBにはread pollingが無い!!
欲しいものは自分で取りに行こうね
libusb版のEndpointでは対象デバイスからパケットを継続して受け取れる様にEventEmitterを継承している。
node-usb
に startPollというpolling用の関数が用意されてるんですね。
ところがWebUSBではEndpointはEventEmitterを継承しておらず、自前でloopさせて device.transferIn
でパケットを取りに行く必要がある。
くー。
Before
After
このスクラップは5ヶ月前にクローズされました