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}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。