31
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Bluetooth Low EnergyAdvent Calendar 2015

Day 13

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

Posted at

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

31
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?