Bletia : Android의 BLE 주변을 현대 API로 처리

TL;DR



  • Bletia 을 이용하면 현대적인 느낌으로 BLE에서 놀 수 있어요!
  • 뭔가 SDK 만들거나하는 것도 편해!

  • RxBletia를 이용하면 RxJava인 API로 BLE 취급할 수 있어!


  • Android BLE 어려움 문제



    이것에 대해서는 선인들이 흩어져 말해 주고 있는 것과, 나 자신도 kyobashi.dex나 potatotips, 정보 과학 젊은이의 모임이라고 하는 공부회에서 소개한 적이 있는 것 같은 생각이 들기 때문에 할애한다.
  • 안드로이드 BLE에서 Characteristics Read/Write 샘플을 만들어 보았다 - ReDo
  • kyobashi.dex에서 안드로이드의 BLE가 어려운 이야기를 해왔다 #kyobashidex - 토끼
  • #potatotips로 BLE의 괴로움을 완화하는 이야기를 해왔다.
  • 무서운 BLE / BLE is afraid // Speaker Deck

  • 우선 힘들다.
    potatotips와 정보 과학 젊은이의 모임에서 소개한 BLE의 고드름 해소 라이브러리 「Bletia」가 v2.0에 올랐으므로 다시 소개한다.

    Bletia/RxBletia



    Bletia BLE 주변의 API를 JDeferredPromise로 래핑하는 라이브러리입니다. Bletia v1.x는 konashi SDK for Android 백엔드에서도 사용됩니다.

    무엇을 할 수 있는가


  • readCharacteristic()writeDescriptor() 등의 Gatt에의 조작을 좋은 느낌에 큐잉 해 준다
  • 콜백 기반 API를 비교적 현대적인 Promise 및 Rx로 래핑합니다
  • 오류시 매직 넘버 에러 코드가 아닌 Exception을 돌려준다
  • 각종 API는 ~Action이라고 하는 형태를 취해, 이것들을 계승하는 것으로 독자적인 API를 만들 수 있다
  • 예를 들면 konashi SDK for Android에서는 PioPinModeActionPioDigitalWriteAction 등의 클래스를 준비해, 내부에서는 Bletia#execute() 에 그러한 Action 의 인스턴스를 먹이는 것으로 konashi 전용 API 를 구현하고 있다
  • Action 클래스의 구현에 따라서는 characteristic이나 descriptor에 얽매이게 하는 값의 validation등도 넣을 수 있다
  • flux에서 착상을 얻었다…하지만, 흔적도 없다


  • 원래는 세상에 만연하는 BLE 디바이스의 Android용 SDK의 백엔드의 힘든 부분을 모두 짊어지기 위해 태어난 라이브러리이므로, WriteCharacteristicActionReadCharacteristicAction를 확장한 클래스를 구현하는 것으로 좋은 느낌에 손을 빼면서 또한 testable 느낌으로 SDK를 만들 수 있도록 설계되었습니다.

    이름의 유래



    Bletia은 런과의 꽃 같다. 이런 느낌.


    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를 사용하여 어려운 안드로이드 용 BLE 앱을 작성합시다. PR도 기다리고 있습니다.

    References


  • izumin5210/Bletia
  • 안드로이드 BLE에서 Characteristics Read/Write 샘플을 만들어 보았다 - ReDo
  • kyobashi.dex에서 안드로이드의 BLE가 어려운 이야기를 해왔다 #kyobashidex - 토끼
  • #potatotips로 BLE의 괴로움을 완화하는 이야기를 해왔다.
  • 무서운 BLE / BLE is afraid // Speaker Deck
  • JDeferred
  • 좋은 웹페이지 즐겨찾기