From a1a0ce76dc56afd7282c95856c6a79d260c4aa21 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 9 Apr 2024 11:57:54 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=E7=A6=81=E7=94=A8=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart index 48ac85f3..3764d36f 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart @@ -13,7 +13,7 @@ class MinePersonInfoLogic extends GetConnect { Future getUserInfoRequest() async { MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo(""); if (entity.errorCode!.codeIsSuccessful) { - print('到了这里么'); + // print('到了这里么'); state.mineInfoData.value = entity.data!; } } From 09ba3d51afa6664bc09e4e07ceb0e37aefd4d2c9 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 9 Apr 2024 15:49:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E5=BC=80=E9=94=81?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=87=8F=E5=B0=91=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=EF=BC=8C=E5=87=8F=E5=B0=91=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E5=8F=91=E9=80=81=E8=AF=B7=E6=B1=82=EF=BC=8C=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E6=97=A0=E7=94=A8log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/blue/blue_manage.dart | 306 ++++++++++++++++++---------- 1 file changed, 195 insertions(+), 111 deletions(-) diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 9404e3b9..4e4313df 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter_easyloading/flutter_easyloading.dart'; + // import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:get/get.dart'; @@ -20,15 +21,19 @@ class BlueManage { // 用来写入的服务id final Guid _serviceIdConnect = Guid("fff0"); + // 用来写入的服务id final Guid _serviceIdWrite = Guid('0000FFF0-0000-1000-8000-00805F9B34FB'); + // 用来订阅的特征id final Guid _characteristicIdSubscription = Guid("fff1"); + // 用来写入的特征id final Guid _characteristicIdWrite = Guid("fff2"); // 监听发送事件 StreamSubscription? _sendStreamSubscription; + // 监听蓝牙扫描的事件 // StreamSubscription? _scanSubscription; // 监听蓝牙连接的事件 @@ -42,12 +47,16 @@ class BlueManage { // 当前连接设备的名字 String connectDeviceName = ""; + // 当前连接设备的mac地址 String connectDeviceMacAddress = ""; + // 当前连接的设备 BluetoothDevice? bluetoothConnectDevice; + // 当前扫描到结果要连接设备 ScanResult? scanResult; + // 监听蓝牙连接状态 BluetoothConnectionState? bluetoothConnectionState = BluetoothConnectionState.disconnected; @@ -55,7 +64,8 @@ class BlueManage { StreamSubscription? _adapterStateStateSubscription; static BlueManage? _manager; - BlueManage._init(){ + + BlueManage._init() { _initBlue(); } @@ -66,9 +76,10 @@ class BlueManage { } factory BlueManage() => shareManager()!; + BlueManage? get manager => shareManager(); - void _initBlue(){ + void _initBlue() { Get.log("蓝牙功能初始化监听"); _initSendStreamSubscription(); _initAdapterStateStateSubscription(); @@ -90,42 +101,42 @@ class BlueManage { } // void _initListenscanResults() { - // var subscription = FlutterBluePlus.scanResults.listen((results) { - // scanDevices.clear(); - // for (var scanResult in results) { - // // 判断名字为空的直接剔除 - // // if (scanResult.device.advName.isEmpty) { - // // return; - // // } - // print("scanResult.device.advName:${scanResult.device.advName}" - // " scanResult.advertisementData.serviceUuids:${scanResult.advertisementData.serviceUuids}" - // " rssi:${scanResult.rssi}"); - // if (((scanResult.advertisementData.serviceUuids.isNotEmpty ? scanResult.advertisementData.serviceUuids[0] : "").toString().contains("758824")) && (scanResult.rssi >= -100)) { - // // 查询id相同的元素 - // final knownDeviceIndex = scanDevices.indexWhere((d) => d.advertisementData.advName == scanResult.advertisementData.advName); - // // 不存在的时候返回-1 - // if (knownDeviceIndex >= 0) { - // scanDevices[knownDeviceIndex] = scanResult; - // } else { - // scanDevices.add(scanResult); - // } - // } - // } - // EventBusManager().eventBusFir(scanDevices); - // // FlutterBluePlus.stopScan(); - // }, onError: (e) { - // print("Scan Error:$e", ); - // }); - // - // FlutterBluePlus.cancelWhenScanComplete(subscription); + // var subscription = FlutterBluePlus.scanResults.listen((results) { + // scanDevices.clear(); + // for (var scanResult in results) { + // // 判断名字为空的直接剔除 + // // if (scanResult.device.advName.isEmpty) { + // // return; + // // } + // print("scanResult.device.advName:${scanResult.device.advName}" + // " scanResult.advertisementData.serviceUuids:${scanResult.advertisementData.serviceUuids}" + // " rssi:${scanResult.rssi}"); + // if (((scanResult.advertisementData.serviceUuids.isNotEmpty ? scanResult.advertisementData.serviceUuids[0] : "").toString().contains("758824")) && (scanResult.rssi >= -100)) { + // // 查询id相同的元素 + // final knownDeviceIndex = scanDevices.indexWhere((d) => d.advertisementData.advName == scanResult.advertisementData.advName); + // // 不存在的时候返回-1 + // if (knownDeviceIndex >= 0) { + // scanDevices[knownDeviceIndex] = scanResult; + // } else { + // scanDevices.add(scanResult); + // } + // } + // } + // EventBusManager().eventBusFir(scanDevices); + // // FlutterBluePlus.stopScan(); + // }, onError: (e) { + // print("Scan Error:$e", ); + // }); + // + // FlutterBluePlus.cancelWhenScanComplete(subscription); - // FlutterBluePlus.isScanning.listen((state) { - // if (state) { - // print('Scanning'); - // } else { - // print('Not scanning'); - // } - // }); + // FlutterBluePlus.isScanning.listen((state) { + // if (state) { + // print('Scanning'); + // } else { + // print('Not scanning'); + // } + // }); // } void _initListenConnectionState() { @@ -163,27 +174,27 @@ class BlueManage { }); } - /// 开始扫描蓝牙设备 - Future startScan(int timeout, ScanDevicesCallBack scanDevicesCallBack, {List? idList}) async { + /// 开始指定设备名称的扫描蓝牙设备 + Future startScanSingle(String deviceName, int timeout, ScanDevicesCallBack scanDevicesCallBack) async { FlutterBluePlus.isSupported.then((isAvailable) async { if (isAvailable) { - if (_adapterState == BluetoothAdapterState.on) { - try { - FlutterBluePlus.startScan(timeout: Duration(seconds: timeout)); - - var subscription = FlutterBluePlus.scanResults.listen((results) { - scanDevices.clear(); + if (_adapterState == BluetoothAdapterState.on) { + try { + FlutterBluePlus.startScan(timeout: Duration(seconds: timeout)); + Completer completer = Completer(); + var subscription = FlutterBluePlus.scanResults.listen((results) { + bool isExit = results.any((element) => element.device.platformName == deviceName); + if (isExit) { for (var scanResult in results) { - // 判断名字为空的直接剔除 - // if (scanResult.device.advName.isEmpty) { - // return; - // } - // Get.log("scanResult.device.advName:${scanResult.device.advName}" - // " scanResult.advertisementData.serviceUuids:${scanResult.advertisementData.serviceUuids}" - // " rssi:${scanResult.rssi}"); - if (((scanResult.advertisementData.serviceUuids.isNotEmpty ? scanResult.advertisementData.serviceUuids[0] : "").toString().contains("758824")) && (scanResult.rssi >= -100)) { + if (((scanResult.advertisementData.serviceUuids.isNotEmpty + ? scanResult.advertisementData.serviceUuids[0] + : "") + .toString() + .contains("758824")) && + (scanResult.rssi >= -100)) { // 查询id相同的元素 - final knownDeviceIndex = scanDevices.indexWhere((d) => d.advertisementData.advName == scanResult.advertisementData.advName); + final knownDeviceIndex = scanDevices + .indexWhere((d) => d.advertisementData.advName == scanResult.advertisementData.advName); // 不存在的时候返回-1 if (knownDeviceIndex >= 0) { scanDevices[knownDeviceIndex] = scanResult; @@ -192,26 +203,93 @@ class BlueManage { } } } - scanDevicesCallBack(scanDevices); - // EventBusManager().eventBusFir(scanDevices); - // FlutterBluePlus.stopScan(); - }, onError: (e) { - Get.log("Scan Error:$e", ); - }); - - FlutterBluePlus.cancelWhenScanComplete(subscription); - } catch (e) { - Get.log("扫描失败"); - } - } else { - try { - if (Platform.isAndroid) { - await FlutterBluePlus.turnOn(); + completer.complete(); } - } catch (e) { - Get.log("Error Turning On:"); + }, onError: (e) { + Get.log( + "Scan Error:$e", + ); + }); + FlutterBluePlus.cancelWhenScanComplete(subscription); + await completer.future; + scanDevicesCallBack(scanDevices); + subscription.cancel(); + } catch (e) { + Get.log("扫描失败"); + } + } else { + try { + if (Platform.isAndroid) { + await FlutterBluePlus.turnOn(); } - }; + } catch (e) { + Get.log("Error Turning On:"); + } + } + } else { + Get.log("开始扫描 蓝牙不可用,不能进行蓝牙操作"); + } + }); + } + + /// 开始扫描蓝牙设备 + Future startScan(int timeout, ScanDevicesCallBack scanDevicesCallBack, {List? idList}) async { + FlutterBluePlus.isSupported.then((isAvailable) async { + if (isAvailable) { + if (_adapterState == BluetoothAdapterState.on) { + try { + FlutterBluePlus.startScan(timeout: Duration(seconds: timeout)); + + var subscription = FlutterBluePlus.scanResults.listen((results) { + scanDevices.clear(); + for (var scanResult in results) { + // 判断名字为空的直接剔除 + // if (scanResult.device.advName.isEmpty) { + // return; + // } + // Get.log("scanResult.device.advName:${scanResult.device.advName}" + // " scanResult.advertisementData.serviceUuids:${scanResult.advertisementData.serviceUuids}" + // " rssi:${scanResult.rssi}"); + if (((scanResult.advertisementData.serviceUuids.isNotEmpty + ? scanResult.advertisementData.serviceUuids[0] + : "") + .toString() + .contains("758824")) && + (scanResult.rssi >= -100)) { + // 查询id相同的元素 + final knownDeviceIndex = scanDevices + .indexWhere((d) => d.advertisementData.advName == scanResult.advertisementData.advName); + // 不存在的时候返回-1 + if (knownDeviceIndex >= 0) { + scanDevices[knownDeviceIndex] = scanResult; + } else { + scanDevices.add(scanResult); + } + } + } + scanDevicesCallBack(scanDevices); + // EventBusManager().eventBusFir(scanDevices); + // FlutterBluePlus.stopScan(); + }, onError: (e) { + Get.log( + "Scan Error:$e", + ); + }); + + FlutterBluePlus.cancelWhenScanComplete(subscription); + } catch (e) { + Get.log("扫描失败"); + } + } else { + try { + if (Platform.isAndroid) { + await FlutterBluePlus.turnOn(); + } + } catch (e) { + Get.log("Error Turning On:"); + } + } + ; } else { Get.log("开始扫描 蓝牙不可用,不能进行蓝牙操作"); } @@ -219,13 +297,14 @@ class BlueManage { } /// 调用发送数据 - Future bludSendData(String deviceName, ConnectStateCallBack stateCallBack, {bool isAddEquipment = false}) async { + Future bludSendData(String deviceName, ConnectStateCallBack stateCallBack, + {bool isAddEquipment = false}) async { FlutterBluePlus.isSupported.then((isAvailable) async { if (isAvailable) { if (_adapterState == BluetoothAdapterState.on) { // 蓝牙已开启,可以进行蓝牙操作 - if(bluetoothConnectionState != BluetoothConnectionState.connected){ - _connect(deviceName, (state){ + if (bluetoothConnectionState != BluetoothConnectionState.connected) { + _connect(deviceName, (state) { // if(bluetoothConnectionState != BluetoothConnectionState.connected){ // stateCallBack(bluetoothConnectionState!); // }else{ @@ -233,7 +312,7 @@ class BlueManage { // } stateCallBack(bluetoothConnectionState!); }, isAddEquipment: isAddEquipment); - }else{ + } else { stateCallBack(bluetoothConnectionState!); } } else { @@ -244,7 +323,8 @@ class BlueManage { } catch (e) { Get.log("Error Turning On:"); } - }; + } + ; } else { Get.log("开始扫描 蓝牙不可用,不能进行蓝牙操作"); } @@ -252,21 +332,26 @@ class BlueManage { } /// 连接 - Future _connect(String deviceName, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { + Future _connect(String deviceName, ConnectStateCallBack connectStateCallBack, + {bool isAddEquipment = false}) async { connectDeviceName = deviceName; List devicesList = scanDevices; - if(isAddEquipment == false){ - startScan(10, (List scanDevices){ + //判断列表里面有设备则不开启扫描 + bool isExistDevice = scanDevices.any((element) => element.device.platformName == connectDeviceName); + if (isAddEquipment == false && isExistDevice == false) { + startScanSingle(deviceName, 10, (List scanDevices) { Get.log("扫描到的设备:$scanDevices"); devicesList = scanDevices; _connectDevice(devicesList, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); }); - }else{ + } else { _connectDevice(devicesList, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); } } - Future _connectDevice( List devicesList, String deviceName, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { + Future _connectDevice( + List devicesList, String deviceName, ConnectStateCallBack connectStateCallBack, + {bool isAddEquipment = false}) async { // 判断数组列表里面是否有这个设备 Get.log("devicesList:$devicesList"); final knownDeviceIndex = devicesList.indexWhere((d) => d.advertisementData.advName == deviceName); @@ -292,7 +377,7 @@ class BlueManage { await stopScan(); if ((scanResult!.advertisementData.serviceUuids[0].toString()[31] == "0") && isAddEquipment == false) { - connectStateCallBack(BluetoothConnectionState.disconnected!); + connectStateCallBack(BluetoothConnectionState.disconnected); EasyLoading.showToast("该锁已被重置", duration: 2000.milliseconds); return; } @@ -315,7 +400,7 @@ class BlueManage { if (attempt >= maxAttempts) { Get.log('Failed to connect after $maxAttempts attempts.'); - connectStateCallBack(BluetoothConnectionState.disconnected!); + connectStateCallBack(BluetoothConnectionState.disconnected); } // await bluetoothConnectDevice!.connect(); @@ -323,20 +408,20 @@ class BlueManage { if (bluetoothConnectionState == BluetoothConnectionState.connected) { try { bluetoothConnectDevice!.discoverServices().then((services) { - Get.log("333333333"); + // Get.log("333333333"); for (BluetoothService service in services) { // Get.log("11111service.remoteId:${service.remoteId}" // " service.uuid:${service.uuid}" // " service.characteristics:${service.characteristics}" // " service.includedServices:${service.includedServices}"); - if(service.uuid == _serviceIdConnect){ + if (service.uuid == _serviceIdConnect) { for (BluetoothCharacteristic characteristic in service.characteristics) { // Get.log("22222characteristic.remoteId:${characteristic.remoteId}" // " characteristic.uuid:${characteristic.uuid}" // " characteristic.secondaryServiceUuid:${characteristic.secondaryServiceUuid}" // " characteristic.characteristicUuid:${characteristic.characteristicUuid}"); if (characteristic.characteristicUuid == _characteristicIdSubscription) { - Get.log("44444444"); + // Get.log("44444444"); _subScribeToCharacteristic(characteristic); Get.log('Discovering services finished'); bluetoothConnectionState = BluetoothConnectionState.connected; @@ -358,16 +443,18 @@ class BlueManage { // 听上报来的数据,参数来自前面扫描到的结果 var allData = []; + // 保存上一次的数据,用来判断是否收到重复的数据 var lastTimeData = []; int? dataLen; + _subScribeToCharacteristic(BluetoothCharacteristic characteristic) async { final subscription = characteristic.onValueReceived.listen((data) { Get.log("启动对特性的通知。当特性的值发生变化时,设备会发送一个通知"); Get.log("订阅获取的数据:$data"); - if(data == lastTimeData || data.isEmpty){ + if (data == lastTimeData || data.isEmpty) { return; - }else{ + } else { lastTimeData = data; } // code to handle incoming data @@ -463,8 +550,7 @@ class BlueManage { // " service.characteristics:${service.characteristics}\n\n" // " service.includedServices:${service.includedServices}"); if (service.uuid == _serviceIdConnect) { - for (BluetoothCharacteristic characteristic in service - .characteristics) { + for (BluetoothCharacteristic characteristic in service.characteristics) { // print("44444 characteristic.remoteId:${characteristic.remoteId}" // " characteristic.uuid:${characteristic.uuid}\n\n" // " characteristic.secondaryServiceUuid:${characteristic @@ -475,13 +561,11 @@ class BlueManage { try { List valueList = value; List subData = splitList(valueList, _mtuSize!); - Get.log( - 'writeCharacteristicWithResponse 得到的分割数据:$subData'); + Get.log('writeCharacteristicWithResponse 得到的分割数据:$subData'); for (int i = 0; i < subData.length; i++) { await characteristic.write(subData[i]).then((value) async { - await Future.delayed(const Duration(milliseconds: 1)).then(( - value) async { + await Future.delayed(const Duration(milliseconds: 1)).then((value) async { Get.log('分包发送成功了'); }); }); @@ -522,17 +606,17 @@ class BlueManage { // 读取 // Future> _readCharacteristic(QualifiedCharacteristic characteristic) async { - // try { - // final result = - // await _flutterReactiveBle!.readCharacteristic(characteristic); - // print("readListresult$result"); - // return result; - // } on Exception catch (e, s) { - // print( - // 'Error occurred when reading ${characteristic.characteristicId} : $e', - // ); - // rethrow; - // } + // try { + // final result = + // await _flutterReactiveBle!.readCharacteristic(characteristic); + // print("readListresult$result"); + // return result; + // } on Exception catch (e, s) { + // print( + // 'Error occurred when reading ${characteristic.characteristicId} : $e', + // ); + // rethrow; + // } // } // Future writeCharacteristicWithoutResponse( @@ -560,11 +644,11 @@ class BlueManage { Future disconnect() async { try { // if(bluetoothConnectDevice != null && bluetoothConnectDevice!.connectionState == BluetoothConnectionState.connected){ - connectDeviceMacAddress = ""; - if(bluetoothConnectionState == BluetoothConnectionState.connected){ - await bluetoothConnectDevice!.disconnect(); - Get.log("断开连接成功"); - } + connectDeviceMacAddress = ""; + if (bluetoothConnectionState == BluetoothConnectionState.connected) { + await bluetoothConnectDevice!.disconnect(); + Get.log("断开连接成功"); + } // } } on Exception catch (e, _) { Get.log("Error disconnecting from a device: $e"); From e9a90f7011d07287f076b396743214a17fb22ca1 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 9 Apr 2024 16:29:18 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0android=20=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/android/app/src/main/AndroidManifest.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/star_lock/android/app/src/main/AndroidManifest.xml b/star_lock/android/app/src/main/AndroidManifest.xml index 8ebd4ddc..0dd26360 100644 --- a/star_lock/android/app/src/main/AndroidManifest.xml +++ b/star_lock/android/app/src/main/AndroidManifest.xml @@ -34,6 +34,13 @@ + + + + + + +