TL;DR
-
Bletiaを利用すればモダンな感じにBLEで遊べるよ!
- なんかSDK作ったりするのも楽ちんだよ!
- RxBletiaを利用すればRxJavaなAPIでBLE扱えるよ!
AndroidのBLEつらい問題
これについては先人たちが散々語ってくれているのと,僕自身もkyobashi.dexやpotatotips,情報科学若手の会といった勉強会で紹介したことがあるような気がするので割愛する.
- AndroidのBLEでCharacteristicsのRead/Writeサンプルを作ってみた - ReDo
- [kyobashi.dexでAndroidのBLEがつらい話してきた #kyobashidex - うさみみを生やせ] kyobashi-dex
- #potatotips でBLEのつらさを軽減する話してきた - うさみみを生やせ
- こわくないBLE / BLE is afraid // Speaker Deck
とりあえずつらい.
potatotipsと情報科学若手の会で紹介したBLEのつらさ解消ライブラリ「Bletia」がv2.0にあがったので改めて紹介する.
Bletia / RxBletia
BletiaBLEまわりのAPIをJDeferredのPromise
でラップしてくれるライブラリである.また,Bletia v1.xはkonashi SDK for Androidのバックエンドでも利用されている.
何が出来るか
-
readCharacteristic()
やwriteDescriptor()
などのGattへの操作をいい感じにキューイングしてくれる - Callback-baseなAPIを比較的モダンなPromiseやRxでラップしてくれる
- エラー時はマジックナンバーエラーコードではなくExceptionを返してくれる
- 各種APIは~Actionという形を取り,これらを継承することで独自のAPIを生やすことが出来る
- 例えばkonashi SDK for Androidでは
PioPinModeAction
やPioDigitalWriteAction
などのクラスを用意し,内部ではBletia#execute()
にそれらActionのインスタンスを喰わせることでkonashi専用APIを実装している -
Action
クラスの実装によってはcharacteristicやdescriptorに喰わせる値のvalidation等も仕込むことが出来る - fluxから着想を得た…が,跡形も無い
- 例えばkonashi SDK for Androidでは
もとは世に蔓延るBLEデバイスのAndroid向けSDKのバックエンドのつらい部分を全て背負うために生まれたライブラリなので,WriteCharacteristicAction
やReadCharacteristicAction
を拡張したクラスを実装することでいい感じに手を抜きつつ,しかもtestableな感じでSDKを作ることが出来るように設計されている.
名前の由来
Bletia patula | Flickr - Photo Sharing!
花言葉は「あなたを忘れない」.Promise/Rx wrapperなので丁度いい.あと,裏にはIoTというバズワードに乗っかる各社に対して「Androidのこと忘れんなよ」ってメッセージもある.某スマートグラスのAndroid SDK復活を心よりお祈り申し上げます.
利用例
たとえばRxBletiaはrx.Observable<T>
を喋れるので,Characteristicから読み取った値をRetrofitなクライアントからWeb APIに投げて,返り値をRealmに保存,みたいなことがさくさくっと書ける.
// retrolambdaな記法で書きます
// context, client, requestCharacteristicはどっかで用意してきてね
RxBletia bletia = new RxBletia(context);
bletia.connect()
.flatMap(_void -> bletia.discoverServices())
.flatMap(_void -> bletia.readCharacteristic(requestCharacteristic))
.flatMap(characteristic -> client.get(characteristic.getValue())
.subscribe(res -> {
Realm.getDefaultInstance()
.executeTransaction(realm -> {
realm.copyToRealm(res);
});
});
RxじゃないBletiaの方もPromiseを返すので,少なくともややこしいCallback Hellから逃れることは出来る.
みんなもBletia使ってつらくないAndroid用BLEアプリ書こう.PRもお待ちしております.
References
- izumin5210/Bletia
- AndroidのBLEでCharacteristicsのRead/Writeサンプルを作ってみた - ReDo
- [kyobashi.dexでAndroidのBLEがつらい話してきた #kyobashidex - うさみみを生やせ] kyobashi-dex
- #potatotips でBLEのつらさを軽減する話してきた - うさみみを生やせ
- こわくないBLE / BLE is afraid // Speaker Deck
- JDeferred