230 lines
8.0 KiB
Dart
230 lines
8.0 KiB
Dart
import 'dart:async';
|
||
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
|
||
import 'package:star_lock/blue/sender_manage.dart';
|
||
|
||
import '../app_settings/app_settings.dart';
|
||
import 'io_tool/io_tool.dart';
|
||
import 'io_tool/manager_event_bus.dart';
|
||
|
||
typedef ScanResultCallBack = void Function(List<DiscoveredDevice> devices);
|
||
|
||
class BlueManage {
|
||
FlutterReactiveBle? _flutterReactiveBle;
|
||
List<DiscoveredDevice> _scanDevices = [];
|
||
QualifiedCharacteristic? qualifiedCharacteristic;
|
||
DiscoveredCharacteristic? getDiscoveredCharacteristic;
|
||
Uuid serviceId = Uuid.parse('0000FFF0-0000-1000-8000-00805F9B34FB');
|
||
final int _limitLen = 20;
|
||
final int _sleepTimes = AppPlatform.isAndroid ? 6 : 0;
|
||
|
||
static BlueManage? _manager;
|
||
BlueManage._init();
|
||
|
||
static BlueManage? shareManager() {
|
||
_manager ??= BlueManage._init();
|
||
_manager!._initBlue();
|
||
return _manager;
|
||
}
|
||
|
||
factory BlueManage() => shareManager()!;
|
||
BlueManage? get manager => shareManager();
|
||
|
||
void _initBlue() {
|
||
_flutterReactiveBle = FlutterReactiveBle();
|
||
}
|
||
|
||
/// 开始扫描蓝牙设备
|
||
void startScan(ScanResultCallBack scanResultCallBack) {
|
||
_scanDevices.clear();
|
||
_flutterReactiveBle!.scanForDevices(withServices: []).listen((device) {
|
||
// 判断名字为空的直接剔除
|
||
if (device.name.isEmpty) {
|
||
return;
|
||
}
|
||
|
||
if (((device.serviceUuids.isNotEmpty ? device.serviceUuids[0] : "")
|
||
.toString()
|
||
.contains("758824")) &&
|
||
(device.rssi >= -100)) {
|
||
// print("11111111111111111:${device}");
|
||
final knownDeviceIndex =
|
||
_scanDevices.indexWhere((d) => d.id == device.id);
|
||
|
||
if (knownDeviceIndex >= 0) {
|
||
_scanDevices[knownDeviceIndex] = device;
|
||
} else {
|
||
_scanDevices.add(device);
|
||
}
|
||
// EventBusManager().eventBusFir(_scanDevices);
|
||
scanResultCallBack(_scanDevices);
|
||
}
|
||
// _pushState();
|
||
}, onError: (Object e) {
|
||
print('Device scan fails with error: $e');
|
||
});
|
||
}
|
||
|
||
/// 连接监听状态
|
||
Future<void> connect(String deviceMAC) async {
|
||
print("connect:$deviceMAC");
|
||
_flutterReactiveBle!.connectToDevice(id: deviceMAC).listen(
|
||
(connectionStateUpdate) {
|
||
print(
|
||
'ConnectionState for device $deviceMAC : ${connectionStateUpdate.connectionState}');
|
||
// EventBusManager().eventBusFir(connectionStateUpdate);
|
||
if (connectionStateUpdate.connectionState ==
|
||
DeviceConnectionState.connected) {
|
||
// getPublicKey(update.deviceId);
|
||
// 如果状态是连接的开始发现服务
|
||
discoverServices(deviceMAC);
|
||
}
|
||
}, onError: (Object e) {
|
||
print('Connecting to device $deviceMAC resulted in error $e');
|
||
});
|
||
}
|
||
|
||
Future<void> disconnect(String deviceMAC) async {
|
||
try {
|
||
print('disconnecting to device: $deviceMAC');
|
||
} on Exception catch (e, _) {
|
||
print("Error disconnecting from a device: $e");
|
||
} finally {
|
||
EventBusManager().eventBusFir(ConnectionStateUpdate(
|
||
deviceId: deviceMAC,
|
||
connectionState: DeviceConnectionState.disconnected,
|
||
failure: null,
|
||
));
|
||
}
|
||
}
|
||
|
||
// 扫描服务,并过滤服务
|
||
Future<List<DiscoveredService>> discoverServices(String deviceId) async {
|
||
try {
|
||
print('Start discovering services for: $deviceId');
|
||
List<DiscoveredService> result =
|
||
await _flutterReactiveBle!.discoverServices(deviceId);
|
||
print("mmmmmmmmm$result");
|
||
if (result.isNotEmpty) {
|
||
for (var i = 0; i < result.length; i++) {
|
||
DiscoveredService discoveredService = result[i];
|
||
print(
|
||
"objectdiscoveredService.serviceId.toString() ${discoveredService.serviceId.toString()}");
|
||
if (discoveredService.serviceId.toString() == "fff0") {
|
||
// getDiscoveredService = discoveredService;
|
||
for (var j = 0; j < discoveredService.characteristics.length; j++) {
|
||
DiscoveredCharacteristic discoveredCharacteristic =
|
||
discoveredService.characteristics[j];
|
||
|
||
// print("hhhhhhhhhh${result[i].characteristicIds[j].toString()}");
|
||
if (discoveredCharacteristic.characteristicId.toString() ==
|
||
"fff1") {
|
||
// 订阅用
|
||
getDiscoveredCharacteristic = discoveredCharacteristic;
|
||
// print("1111111111111111characteristicId:${result[i].characteristicIds[j].toString()} serviceId:${result[i].serviceId} deviceId:$deviceId");
|
||
}
|
||
if (discoveredCharacteristic.characteristicId.toString() ==
|
||
"fff2") {
|
||
print(
|
||
"1111111111111111characteristicId:${discoveredCharacteristic.characteristicId} serviceId:${serviceId} deviceId:$deviceId");
|
||
qualifiedCharacteristic = QualifiedCharacteristic(
|
||
characteristicId: discoveredCharacteristic.characteristicId,
|
||
serviceId: serviceId,
|
||
deviceId: deviceId);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
subScribeToCharacteristic(QualifiedCharacteristic(
|
||
characteristicId: getDiscoveredCharacteristic!.characteristicId,
|
||
serviceId: Uuid.parse("fff0"),
|
||
deviceId: deviceId));
|
||
print('Discovering services finished');
|
||
|
||
EventBusManager().eventBusFir(qualifiedCharacteristic);
|
||
return result;
|
||
} on Exception catch (e) {
|
||
print('Error occurred when discovering services: $e');
|
||
rethrow;
|
||
}
|
||
}
|
||
|
||
// 听上报来的数据,参数来自前面扫描到的结果
|
||
subScribeToCharacteristic(QualifiedCharacteristic characteristic) {
|
||
print(
|
||
'Subscribing to characteristicId: ${characteristic.characteristicId} serviceId:${characteristic.serviceId} deviceId:${characteristic.deviceId}');
|
||
_flutterReactiveBle!.subscribeToCharacteristic(characteristic).listen(
|
||
(data) {
|
||
// code to handle incoming data
|
||
print(
|
||
"subscribeToCharacteristic: deviceId = ${characteristic.deviceId} characteristicId =${characteristic.characteristicId}---上报来的数据data = $data");
|
||
}, onError: (dynamic error) {
|
||
print("subscribeToCharacteristic error:$error");
|
||
});
|
||
// return _ble.subscribeToCharacteristic(characteristic);
|
||
}
|
||
|
||
// 写入
|
||
Future<void> writeCharacteristicWithResponse(
|
||
QualifiedCharacteristic characteristic, List<int> value) async {
|
||
print(
|
||
'Write with characteristicId:${characteristic.characteristicId} serviceId:${characteristic.serviceId} deviceId:${characteristic.deviceId} value : $value');
|
||
|
||
try {
|
||
List<int> valueList = value;
|
||
|
||
List subData = splitList(valueList, _limitLen);
|
||
print('得到的分割数据:$subData');
|
||
|
||
for (int i = 0; i < subData.length; i++) {
|
||
await _flutterReactiveBle!
|
||
.writeCharacteristicWithResponse(characteristic, value: subData[i])
|
||
.then((value) async {
|
||
await Future.delayed(const Duration(milliseconds: 1))
|
||
.then((value) async {
|
||
print('成功了么');
|
||
});
|
||
});
|
||
}
|
||
} on Exception catch (e, s) {
|
||
print(
|
||
'Error occurred when writing: $e',
|
||
);
|
||
// ignore: avoid_print
|
||
print(s);
|
||
rethrow;
|
||
}
|
||
}
|
||
|
||
// 读取
|
||
Future<List<int>> 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;
|
||
}
|
||
}
|
||
|
||
Future<void> writeCharacteristicWithoutResponse(
|
||
QualifiedCharacteristic characteristic, List<int> value) async {
|
||
try {
|
||
await _flutterReactiveBle!
|
||
.writeCharacteristicWithoutResponse(characteristic, value: value);
|
||
} on Exception catch (e, s) {
|
||
// ignore: avoid_print
|
||
print(s);
|
||
rethrow;
|
||
}
|
||
}
|
||
}
|