RustからBLEを扱うためのライブラリ(Windows10用)を調べています。
Windows10向けBLE実装の現状
winrt-rs
昨年末に調べた時はwinrt-rust v0.6一択の状況でした。今年に入ってこのrust向けwinrtの実装に変化がありました。
crates.ioのwinrtを見ると、普通にv0.7系がリリースされているように見えますが、実はv0.7から開発元が変わっていて
- contextfreeのwinrt-rustはv0.6でおしまい
- v0.7からはMicrosoftが実装を進めている
という状況になっています。
そしてMicrosoftが実装したv0.7はv0.6と互換性がなく、そのまま置き換えることができません。残念です。
BLEまわりを少しだけ触ってみた感じですが、v0.6からv0.7になり
- winrt側のAPIがComPtrに包まれなくなった(そのまま出てくる)
- BluetoothLEDevice2とかBluetoothLEDevice3などを生成しなくて各種APIが使えるようになった(BluetoothLEDeviceからそのまま呼び出せる)
- イベントハンドラの引数型が変更になった
注:winrt-rsでのBluetoothLEDevice2や3については、以前に書いた記事にまとめてあります。
v0.6時代には実質的に使えなかったAPI(APIの引数に必要な型をRust側で生成する方法が存在しないもの)がどうなっているのかは未調査です。追って調査したいと思っています。
btleplug
そして今年はクロスプラットフォームを謳うBLEライブラリ、btleplugが登場しました。
このbtleplugは、Windows, MacOS, Linuxに対応しています。
使用できる機能は現段階では各OSで違いますが、同期のRead/Write程度であればどのOSでも動くようです。
Windows向けの下回りはwinrt-rs v0.6でした。
とりあえずWindowsの下回りをwinrt-rs v0.7に対応させるプルリクを投げてみました。 マージされるかどうかはよくわかりません。 マージされましたバンザイ。
上のwinrt-rsの所では詳しく書きませんでしたが、winrt-rs v0.6とv0.7のBLEまわりの違いについて誰かの何かの参考になれば嬉しいです。
APIはRumbleに合わせていて、そのAPI体系を他のプラットフォーム上でも実現する形になっています。
元々のRumbleのAPI由来なのですが、Notifyハンドラあたりの扱いがイマイチよくわからない作りになっていて使いにくい雰囲気を受けました。
そのうち発展して使いやすくなっていくことを期待していたのですが、残念ながらbtleplugの開発者が保守にあまり興味を持っていない様子なので、なんだか先行き不透明です。
(いきなり)まとめ
2020年12月現在、Windows上でRustを使ってBLEを扱える簡単便利なライブラリは未だ存在しないようです。
クロスプラットフォームを考えないのであれば、winrt-rs経由で使うのが一番素直なのかもしれません。
今後の充実に期待したいです。