質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

1回答

2416閲覧

flutter_blueでスキャンが上手くいかない、コネクトできてもServiceが取得できない

mu-------

総合スコア9

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2020/04/29 10:37

flutterで開発を行っております。

bluetoothを使用したアプリを作成しているのですが、flutter_blueを用いた実装が全く上手く行きません。。
bluetoothを使用するのは初めてで、至らない点や知識不足な点があれば、ご指摘いただければと思います。

スマホ:Android9
flutter_blue: ^0.7.2

1、スキャンが上手くいかない

ダイソーで購入したBluetoothシャッターを使用して、ボタンを押した時に特定の動作をさせようと考えているのですが、
startscanを行っても、ほとんどの確率でダイソーシャッターのdeviceが取得できません。
なぜか、OFF→ONを行った直後にスキャンを行うと、上手く取得できることがあります。

2、Serviceが上手く取得できない
上手くスキャンができ、コネクトが上手くいった場合(なぜかスキャンが上手く行く時はコネクトが既にされています…)、Serviceを取得し、Notifyによりシャッターボタンが押された時に特定の動作をさせようと目論んでいるのですが、
ServiceのListは常にlength 0(何も取得できていない)が返ってきます。。
ダイソーのBluetoothだからServiceが無いということがあるのでしょうか…?

上記2点がいくらやっても上手くいかず、質問をするに至りました。
また、スマホ自体のBluetoothでダイソーシャッターへの接続は毎回上手くいきます。なのにアプリだとスキャンにも含まれないことがほとんどです。。
また、どうやらスマホにBluetoothでダイソーシャッターを繋いでいる時はスキャンに必ずと言っていいほど含まれません。繋がってるのに!

以下に今まで奮闘したコードを記載します。
もし少しでも気になることがありましたら、コメントいただけると幸いです。
ご回答の程、よろしくお願いします!!
(他の質問サイトでも質問させていただいています!)

dart

1  // スキャンを開始 2 try { 3 flutterBlue.isOn.then((bool isOn) { 4 if (isOn) { 5 flutterBlue.isScanning.first.then((isScanning) async { 6 if (!isScanning) { 7 await startScanning(); 8 } 9 }); 10 } else { 11 Fluttertoast.showToast(msg: 'BluetoothをONにしてください'); 12 } 13 }); 14 } on Exception catch (e) { 15 print('start scan error:$e'); 16 } 17 18 return SafeArea( 19 child: Column( 20 children: <Widget>[ 21       // ここのscanResultsになぜかダイソーシャッターが引っかからないときがある… 22 StreamBuilder<List<ScanResult>>( 23 stream: flutterBlue.scanResults, 24 builder: (context, snapshot) { 25 // コネクト可能なものに絞る 26 final scanList = snapshot.data 27 .where((scanResult) => 28 scanResult.advertisementData.connectable) 29 .toList(); 30 31 return ListView.builder( 32 shrinkWrap: true, 33 itemCount: scanList.length, 34 itemBuilder: (context, index) { 35 return Card( 36 // 既に接続しているものを取得 37 child: StreamBuilder<List<BluetoothDevice>>( 38 stream: flutterBlue.connectedDevices.asStream(), 39 initialData: [], 40 builder: (c, snapshot) { 41 42 // 接続していればtrue 43 var isConnect = false; 44 45 for (final device in snapshot.data) { 46 if (device.id.toString() == 47 scanList[index].device.id.toString()) { 48 isConnect = true; 49 50                  // ここでservicesのlengthが0になる… 51 device.services.listen( 52 (services) { 53 services.forEach( 54 (service) { 55 service.characteristics.forEach( 56 (characteristics) { 57 characteristics.setNotifyValue(true); 58 characteristics.value.listen( 59 (val) { 60 print(val); 61 }, 62 ); 63 }, 64 ); 65 }, 66 ); 67 }, 68 ); 69 } 70 } 71 72 return ListTile( 73 // 接続中かどうか 74 leading: isConnect 75 ? Icon( 76 Icons.bluetooth_connected, 77 color: Colors.blue, 78 ) 79 : const SizedBox.shrink(), 80 onTap: () async { 81 if (!isConnect) { 82 await showBluetoothConnect( 83 scanList[index].device, showVM); 84 } else { 85 await Fluttertoast.showToast(msg: '既に接続されています'); 86 } 87 }, 88 ); 89 }, 90 ), 91 ); 92 }, 93 ); 94 }, 95 ), 96 ], 97 ), 98 ); 99 } 100 101// スキャン停止 102Future<void> stopScanning() async { 103 await flutterBlue.stopScan(); 104} 105 106// スキャンスタート 107Future<void> startScanning() async { 108 await flutterBlue.startScan(timeout: const Duration(seconds: 4)); 109} 110 111// 接続 112Future<void> showBluetoothConnect(BluetoothDevice device) async { 113 try { 114 final state = await device.state.first; 115 if (state == BluetoothDeviceState.connected) { 116 await Fluttertoast.showToast(msg: '既に接続済みです'); 117 return; 118 } 119 await device.disconnect(); 120 bool isConnect; 121 await device.connect().timeout(const Duration(seconds: 5), 122 onTimeout: () async { 123 debugPrint('timeout occured'); 124 isConnect = false; 125 await Fluttertoast.showToast(msg: 'Bluetoothデバイスに接続できませんでした'); 126 await device.disconnect(); 127 }).then((data) { 128 if (isConnect == null) { 129 Fluttertoast.showToast(msg: 'Bluetoothデバイスに接続できました!'); 130 } 131 }); 132 } on Exception catch (e) { 133 await Fluttertoast.showToast(msg: 'Bluetoothデバイスに接続できませんでした'); 134 print('Bluetooth connect error:$e'); 135 } 136}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

flutter_blueを使用しなくても、ボリュームボタンが操作されていること、またキーボードとして認識されることを利用して、下記のような二つのパターンのいずれかで読み取ることができました!!

・RawKeyboardListenerを使用する
参考:https://stackoverflow.com/questions/54200938/external-keyboard-in-flutter-support
https://api.flutter.dev/flutter/widgets/RawKeyboardListener-class.html

・hardware_buttonsを使用する
参考:https://pub.dev/packages/hardware_buttons

しかし、ボタンを押すとボリュームの操作も行われてしまうため、そちらは検証しないといけません。。
現状、検索してもボリューム操作を横取りできる方法はわかっていません。

投稿2020/04/30 04:38

編集2020/04/30 04:40
mu-------

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問