feat: revamp sensor add flow
This commit is contained in:
@@ -31,26 +31,61 @@ class BleProvisioner {
|
||||
|
||||
BluetoothDevice? _connectedDevice;
|
||||
|
||||
Stream<BleScanResult> scan() async* {
|
||||
await _requestScanPermissions();
|
||||
// Continuously scans for nearby ESP32 sensors, restarting after each
|
||||
// 15-second window, until the returned stream is cancelled.
|
||||
Stream<BleScanResult> scan() {
|
||||
StreamSubscription<List<ScanResult>>? resultsSub;
|
||||
StreamSubscription<bool>? stateSub;
|
||||
bool started = false;
|
||||
late StreamController<BleScanResult> controller;
|
||||
|
||||
await FlutterBluePlus.startScan(
|
||||
withServices: [Guid(_serviceUuid)],
|
||||
timeout: const Duration(seconds: 30),
|
||||
Future<void> startScan() async {
|
||||
if (controller.isClosed) return;
|
||||
started = true;
|
||||
try {
|
||||
await FlutterBluePlus.startScan(
|
||||
withServices: [Guid(_serviceUuid)],
|
||||
);
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
controller = StreamController<BleScanResult>(
|
||||
onListen: () async {
|
||||
try {
|
||||
await _requestScanPermissions();
|
||||
} catch (e) {
|
||||
controller.addError(e);
|
||||
await controller.close();
|
||||
return;
|
||||
}
|
||||
|
||||
resultsSub = FlutterBluePlus.scanResults.listen((results) {
|
||||
for (final r in results) {
|
||||
final name = r.device.platformName;
|
||||
if (name.startsWith('anchor_') && !controller.isClosed) {
|
||||
controller.add(BleScanResult(
|
||||
deviceId: r.device.remoteId.str,
|
||||
name: name,
|
||||
rssi: r.rssi,
|
||||
));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if(!FlutterBluePlus.isScanningNow) {
|
||||
await startScan();
|
||||
}
|
||||
},
|
||||
|
||||
onCancel: () {
|
||||
resultsSub?.cancel();
|
||||
stateSub?.cancel();
|
||||
FlutterBluePlus.stopScan();
|
||||
controller.close();
|
||||
},
|
||||
);
|
||||
|
||||
await for (final results in FlutterBluePlus.scanResults) {
|
||||
for (final r in results) {
|
||||
final name = r.device.platformName;
|
||||
if (name.startsWith('anchor_')) {
|
||||
yield BleScanResult(
|
||||
deviceId: r.device.remoteId.str,
|
||||
name: name,
|
||||
rssi: r.rssi,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return controller.stream;
|
||||
}
|
||||
|
||||
Future<void> stopScan() => FlutterBluePlus.stopScan();
|
||||
|
||||
Reference in New Issue
Block a user