FlutterでBLEを
いい感じにする

 FlutterでBLEを
いい感じにする

shibuya.apk #30 で話したものです.

A445824f9bb334ec104f5c1c7b67fee2?s=128

Kazuki Chigita

December 13, 2018
Tweet

Transcript

  1. FlutterでBLEを いい感じにする shibuya.apk #30 @chigichan24 AndroidϩϘοτ͸ɼGoogle͕࡞੒ٴͼఏڙ͍ͯ͠Δ࡞඼͔Βෳ੡·ͨ͸มߋͨ͠΋ͷͰ͋Γɼ Creative Commons 3.0 AttributionϥΠηϯεʹهࡌ͞Εͨ৚݅ʹैͬͯ࢖༻͍ͯ͠·͢ɽ

  2. $whoami • Kazuki Chigita (chigichan24) • 卒論の締切が案外早くてビビってる系大学生

  3. 時代は IoT(ほんまか)

  4. IoTにはBLEがつきもの(ほんまか)

  5. 時代はFlutter (1.0がきた)

  6. Flutter × BLE

  7. 今日話したいこと Flutter × BLE × ReactiveXの試み FlutterでBLEを触るときに Androidの視点からみる注意点

  8. 今日話したいこと Flutter × BLE × ReactiveXの試み FlutterでBLEを触るときに Androidの視点からみる注意点

  9. ライブラリ • flutter_blue[1]が安牌. • 他のライブラリは整備が追いついていない. • dart2に対応していない. • 特殊化されすぎている. [1]

    https://pub.dartlang.org/packages/flutter_blue
  10. 注意点 • デフォルトのminSdkVersion低すぎ問題 FAILURE: Build failed with an exception. *

    What went wrong: Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : uses- sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:flutter_blue] ... as the library might be using APIs not available in 16 Suggestion: use a compatible library with a minSdk of at most 16, or increase this project's minSdk version to at least 19, or use tools:overrideLibrary="com.pauldemarco.flutterblue" to force usage (may lead to runtime failures)
  11. 注意点 • デフォルトのminSdkVersion低すぎ問題 FAILURE: Build failed with an exception. *

    What went wrong: Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : uses- sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:flutter_blue] ... as the library might be using APIs not available in 16 Suggestion: use a compatible library with a minSdk of at most 16, or increase this project's minSdk version to at least 19, or use tools:overrideLibrary="com.pauldemarco.flutterblue" to force usage (may lead to runtime failures) よーしbuild.gradleのminSdkVersionを19にするか〜
  12. ちょっとまって✋ BLEやるなら脳死で21以上がいいって聞いた

  13. AndroidのBLE周りの歴史[2] • Android 4.3未満 (API Level 17) BLE未対応 • Android

    4.4 (API Level 19) BLE安定する • Android 5.0 (API Level 21) android.bluetooth.leになる • Android 6.0 (API Level 23) RuntimePermissionくる [2] BLE視点でまとめるAndroid OSの違い https://qiita.com/ozyozyo/items/351babdf2160d733a306
  14. AndroidのBLE周りの歴史[2] • Android 4.3未満 (API Level 17) BLE未対応 • Android

    4.4 (API Level 19) BLE安定する • Android 5.0 (API Level 21) android.bluetooth.leになる • Android 6.0 (API Level 23) RuntimePermissionくる [2] BLE視点でまとめるAndroid OSの違い https://qiita.com/ozyozyo/items/351babdf2160d733a306
  15. AndroidのBLE周りの歴史[2] • Android 4.3未満 (API Level 17) BLE未対応 • Android

    4.4 (API Level 19) BLE安定する • Android 5.0 (API Level 21) android.bluetooth.leになる • Android 6.0 (API Level 23) RuntimePermissionくる [2] BLE視点でまとめるAndroid OSの違い https://qiita.com/ozyozyo/items/351babdf2160d733a306 minSdkLevelを19にすると21で追加された 機能が実装されている保証はない.
  16. AndroidのBLE周りの歴史[2] • Android 4.3未満 (API Level 17) BLE未対応 • Android

    4.4 (API Level 19) BLE安定する • Android 5.0 (API Level 21) android.bluetooth.leになる • Android 6.0 (API Level 23) RuntimePermissionくる [2] BLE視点でまとめるAndroid OSの違い https://qiita.com/ozyozyo/items/351babdf2160d733a306 minSdkLevelを19にすると21で追加された 機能が実装されている保証はない. この事実はFlutter のみでコードを 書いていると気が付きにくい (APIの差異によって挙動が変わることはflutter_blueの コードを読まない限り推測しにくい)
  17. 21では動くが19では動かない例 • serviceを指定してscanをする[3] [3] https://pub.dartlang.org/documentation/flutter_blue/latest/flutter_blue/FlutterBlue/scan.html

  18. 21では動くが19では動かない例 • serviceを指定してscanをする[3] [3] https://pub.dartlang.org/documentation/flutter_blue/latest/flutter_blue/FlutterBlue/scan.html Flutter上ではこれで完結している用に見える.

  19. 21では動くが19では動かない例 • serviceを指定してscanをする[3] • 実際にはAPILevelで分岐し21以上でのみ機能する[4] [3] https://pub.dartlang.org/documentation/flutter_blue/latest/flutter_blue/FlutterBlue/scan.html Flutter上ではこれで完結している用に見える. [4] https://github.com/pauldemarco/flutter_blue/blob/master/android/src/main/java/com/

    pauldemarco/flutterblue/FlutterBluePlugin.java
  20. 21では動くが19では動かない例 • startScan21 • startScan18

  21. 21では動くが19では動かない例 • startScan21 • startScan18 128bitのuuidが使える.

  22. 21では動くが19では動かない例 • startScan21 • startScan18 128bitのuuidが使える. 128bitのuuidが使えない(16bit).

  23. 小まとめ • FlutterでBLEを扱うときもAndroid固有の知識 が必要(同様にしてiOSの知識も必要) • 可能ならAPI Levelを21以上にしたほうがBLE は事故が少ない • 「FlutterでBLEをいい感じにする」には

    Androidの歴史と細かな知識が必須
  24. 今日話したいこと Flutter × BLE × ReactiveXの試み FlutterでBLEを触るときに Androidの視点からみる注意点

  25. streamデータとReactiveXは相性がいい

  26. None
  27. Flutter にはまだない

  28. Bluetooth Low Energy Flutter ReactiveX

  29. Bluetooth Low Energy Flutter ReactiveX RxBluetoothFlutter

  30. 小さなプロジェクトで試してみた[5] • Futureで実装されているものを全てRxのstreamに 変換. • 良かった点 • 関係するイベントが散らばらずに一つのstreamとして 表現できる. •

    async / await ベースではない非同期処理. • 悪かった点 • rx_dartがまだまだ未発達(RxJava2と比べると機能が少 ない) [5] https://github.com/cyder/nigiru_kun_sp/tree/master/lib/datasources/bluetooth
  31. コード例(scan)

  32. コード例(scan) 1. streamを持ってくる.

  33. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする.

  34. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる.

  35. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる. 4. そのうち,自分たちの作ったデバイスのものだけをフィルタする.

  36. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる. 4. そのうち,自分たちの作ったデバイスのものだけをフィルタする. 5.

    見つけたデバイスに付加情報をつけて管理しやすいクラスに変換する.
  37. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる. 4. そのうち,自分たちの作ったデバイスのものだけをフィルタする. 5.

    見つけたデバイスに付加情報をつけて管理しやすいクラスに変換する. 6. 同じデバイスを何度も検出してしまう可能性があるので排除する.
  38. まとめ • FlutterでBLEを扱うときもAndroid固有の知識 が必要!(同様にしてiOSの知識も必要) • flutter_blueとrx_dartを組み合わせた ライブラリでいい感じにBLEは扱えそう! • 「FlutterでBLEをいい感じにする」には Android・iOSそれぞれの知識をもっと深めて

    ライブラリを作る必要がある!
  39. Related URLs [各言語でのBLE実装ドキュメント] • https://pub.dartlang.org/packages/flutter_blue • https://developer.android.com/guide/topics/connectivity/bluetooth-le • https://developer.apple.com/documentation/corebluetooth [各言語でのRxによるBLEのラップ例]

    • https://github.com/Polidea/RxAndroidBle • https://github.com/Polidea/RxBluetoothKit [flutter_blueについて書いた記事] • https://qiita.com/chigichan24/items/89cb686e880f0274ed1c [BLEの仕様・用語] • https://www.bluetooth.com/ja-jp/specifications/bluetooth-core-specification • https://codezine.jp/article/detail/9287
  40. おわり