Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

FlutterでBLEを
いい感じにする

582 views

Published on

shibuya.apk #30の資料です

Published in: Technology
  • Be the first to comment

FlutterでBLEを
いい感じにする

  1. 1. FlutterでBLEを いい感じにする shibuya.apk #30 @chigichan24 Androidロボットは,Googleが作成及び提供している作品から複製または変更したものであり, Creative Commons 3.0 Attributionライセンスに記載された条件に従って使用しています.
  2. 2. $whoami • Kazuki Chigita (chigichan24) • 卒論の締切が案外早くてビビってる系大学生
  3. 3. 時代は IoT(ほんまか)
  4. 4. IoTにはBLEがつきもの(ほんまか)
  5. 5. 時代はFlutter (1.0がきた)
  6. 6. Flutter × BLE
  7. 7. 今日話したいこと Flutter × BLE × ReactiveXの試み FlutterでBLEを触るときに Androidの視点からみる注意点
  8. 8. 今日話したいこと Flutter × BLE × ReactiveXの試み FlutterでBLEを触るときに Androidの視点からみる注意点
  9. 9. ライブラリ • flutter_blue[1]が安牌. • 他のライブラリは整備が追いついていない. • dart2に対応していない. • 特殊化されすぎている. [1] https://pub.dartlang.org/packages/flutter_blue
  10. 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. 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. 12. 👮ちょっとまって✋ BLEやるなら脳死で21以上がいいって聞いた
  13. 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. 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. 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. 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. 17. 21では動くが19では動かない例 • serviceを指定してscanをする[3] [3] https://pub.dartlang.org/documentation/flutter_blue/latest/flutter_blue/FlutterBlue/scan.html
  18. 18. 21では動くが19では動かない例 • serviceを指定してscanをする[3] [3] https://pub.dartlang.org/documentation/flutter_blue/latest/flutter_blue/FlutterBlue/scan.html Flutter上ではこれで完結している用に見える.
  19. 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. 20. 21では動くが19では動かない例 • startScan21 • startScan18
  21. 21. 21では動くが19では動かない例 • startScan21 • startScan18 128bitのuuidが使える.
  22. 22. 21では動くが19では動かない例 • startScan21 • startScan18 128bitのuuidが使える. 128bitのuuidが使えない(16bit).
  23. 23. 小まとめ • FlutterでBLEを扱うときもAndroid固有の知識 が必要(同様にしてiOSの知識も必要) • 可能ならAPI Levelを21以上にしたほうがBLE は事故が少ない • 「FlutterでBLEをいい感じにする」には Androidの歴史と細かな知識が必須
  24. 24. 今日話したいこと Flutter × BLE × ReactiveXの試み FlutterでBLEを触るときに Androidの視点からみる注意点
  25. 25. streamデータとReactiveXは相性がいい
  26. 26. Flutter にはまだない
  27. 27. Bluetooth Low Energy FlutterReactiveX
  28. 28. Bluetooth Low Energy FlutterReactiveX RxBluetoothFlutter
  29. 29. 小さなプロジェクトで試してみた[5] • Futureで実装されているものを全てRxのstreamに 変換. • 良かった点 • 関係するイベントが散らばらずに一つのstreamとして 表現できる. • async / await ベースではない非同期処理. • 悪かった点 • rx_dartがまだまだ未発達(RxJava2と比べると機能が少 ない) [5] https://github.com/cyder/nigiru_kun_sp/tree/master/lib/datasources/bluetooth
  30. 30. コード例(scan)
  31. 31. コード例(scan) 1. streamを持ってくる.
  32. 32. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする.
  33. 33. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる.
  34. 34. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる. 4. そのうち,自分たちの作ったデバイスのものだけをフィルタする.
  35. 35. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる. 4. そのうち,自分たちの作ったデバイスのものだけをフィルタする. 5. 見つけたデバイスに付加情報をつけて管理しやすいクラスに変換する.
  36. 36. コード例(scan) 1. streamを持ってくる. 2. 接続可能なものでフィルタする. 3. 検出されたもののserviceのuuidをみてみる. 4. そのうち,自分たちの作ったデバイスのものだけをフィルタする. 5. 見つけたデバイスに付加情報をつけて管理しやすいクラスに変換する. 6. 同じデバイスを何度も検出してしまう可能性があるので排除する.
  37. 37. まとめ • FlutterでBLEを扱うときもAndroid固有の知識 が必要!(同様にしてiOSの知識も必要) • flutter_blueとrx_dartを組み合わせた ライブラリでいい感じにBLEは扱えそう! • 「FlutterでBLEをいい感じにする」には Android・iOSそれぞれの知識をもっと深めて ライブラリを作る必要がある!
  38. 38. 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
  39. 39. おわり

×