Bletia: AndroidのBLE周りをモダンなAPIで扱う

  • 27
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

TL;DR

  • Bletiaを利用すればモダンな感じにBLEで遊べるよ!
    • なんかSDK作ったりするのも楽ちんだよ!
    • RxBletiaを利用すればRxJavaなAPIでBLE扱えるよ!

AndroidのBLEつらい問題

これについては先人たちが散々語ってくれているのと,僕自身もkyobashi.dexやpotatotips,情報科学若手の会といった勉強会で紹介したことがあるような気がするので割愛する.

とりあえずつらい.
potatotipsと情報科学若手の会で紹介したBLEのつらさ解消ライブラリ「Bletia」がv2.0にあがったので改めて紹介する.

Bletia / RxBletia

BletiaBLEまわりのAPIをJDeferredPromiseでラップしてくれるライブラリである.また,Bletia v1.xはkonashi SDK for Androidのバックエンドでも利用されている.

何が出来るか

  • readCharacteristic()writeDescriptor()などのGattへの操作をいい感じにキューイングしてくれる
  • Callback-baseなAPIを比較的モダンなPromiseやRxでラップしてくれる
  • エラー時はマジックナンバーエラーコードではなくExceptionを返してくれる
  • 各種APIは~Actionという形を取り,これらを継承することで独自のAPIを生やすことが出来る
    • 例えばkonashi SDK for AndroidではPioPinModeActionPioDigitalWriteActionなどのクラスを用意し,内部ではBletia#execute()にそれらActionのインスタンスを喰わせることでkonashi専用APIを実装している
    • Actionクラスの実装によってはcharacteristicやdescriptorに喰わせる値のvalidation等も仕込むことが出来る
    • fluxから着想を得た…が,跡形も無い :innocent:

もとは世に蔓延るBLEデバイスのAndroid向けSDKのバックエンドのつらい部分を全て背負うために生まれたライブラリなので,WriteCharacteristicActionReadCharacteristicActionを拡張したクラスを実装することでいい感じに手を抜きつつ,しかもtestableな感じでSDKを作ることが出来るように設計されている.

名前の由来

Bletiaはラン科の花らしい.こんな感じ

4641701143_f5d1785ec4_z.jpg (96.1 kB)
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