Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

時代は IoT(ほんまか)

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

時代はFlutter (1.0がきた)

Slide 6

Slide 6 text

Flutter × BLE

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

注意点 • デフォルトの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)

Slide 11

Slide 11 text

注意点 • デフォルトの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にするか〜

Slide 12

Slide 12 text

ちょっとまって✋ BLEやるなら脳死で21以上がいいって聞いた

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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で追加された 機能が実装されている保証はない.

Slide 16

Slide 16 text

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の コードを読まない限り推測しにくい)

Slide 17

Slide 17 text

21では動くが19では動かない例 • serviceを指定してscanをする[3] [3] https://pub.dartlang.org/documentation/flutter_blue/latest/flutter_blue/FlutterBlue/scan.html

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

21では動くが19では動かない例 • startScan21 • startScan18

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Flutter にはまだない

Slide 28

Slide 28 text

Bluetooth Low Energy Flutter ReactiveX

Slide 29

Slide 29 text

Bluetooth Low Energy Flutter ReactiveX RxBluetoothFlutter

Slide 30

Slide 30 text

小さなプロジェクトで試してみた[5] • Futureで実装されているものを全てRxのstreamに 変換. • 良かった点 • 関係するイベントが散らばらずに一つのstreamとして 表現できる. • async / await ベースではない非同期処理. • 悪かった点 • rx_dartがまだまだ未発達(RxJava2と比べると機能が少 ない) [5] https://github.com/cyder/nigiru_kun_sp/tree/master/lib/datasources/bluetooth

Slide 31

Slide 31 text

コード例(scan)

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

まとめ • FlutterでBLEを扱うときもAndroid固有の知識 が必要!(同様にしてiOSの知識も必要) • flutter_blueとrx_dartを組み合わせた ライブラリでいい感じにBLEは扱えそう! • 「FlutterでBLEをいい感じにする」には Android・iOSそれぞれの知識をもっと深めて ライブラリを作る必要がある!

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

おわり