import 'dart:async'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:get/get.dart'; import 'package:meta/meta.dart'; // typedef ScanResultCallBack = Function(List devices); typedef ScanResultCallBack = void Function(List devices); /// 这个类负责开启和关闭蓝牙扫描器并输出扫描结果 class BleScanner extends GetxController { BleScanner({ required FlutterReactiveBle ble, required void Function(String message) logMessage, }) : _ble = ble, _logMessage = logMessage { rxBleScannerState.bindStream(_stateStreamController.stream); } // static BleScanner get to => Get.find(); final FlutterReactiveBle _ble; /// 输入 FlutterReactiveBle 来获取结果及功能 final void Function(String message) _logMessage; /// 输入日志函数来输出日志 final StreamController _stateStreamController = StreamController(); StreamSubscription? _subscription; /// 使用 Getx 的 Rx 来监听扫描结果 final rxBleScannerState = Rx( const BleScannerState(discoveredDevices: [], scanIsInProgress: false)); final _devices = []; /// 开始扫描蓝牙设备 void startScan(ScanResultCallBack scanResultCallBack) { _logMessage('Start ble discovery'); _devices.clear(); _subscription?.cancel(); _subscription = _ble.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 = _devices.indexWhere((d) => d.id == device.id); if (knownDeviceIndex >= 0) { _devices[knownDeviceIndex] = device; } else { _devices.add(device); } scanResultCallBack(_devices); } // _pushState(); }, onError: (Object e) => _logMessage('Device scan fails with error: $e')); // _pushState(); } /// 更新扫描结果 void _pushState() { _stateStreamController.add( BleScannerState( discoveredDevices: _devices, scanIsInProgress: _subscription != null, ), ); } /// 停止扫描蓝牙设备 Future stopScan() async { _logMessage('Stop ble discovery'); await _subscription?.cancel(); _subscription = null; _pushState(); } /// GetxController 的生命周期函数,当页面关闭时,关闭扫描器 @override Future onClose() async { rxBleScannerState.close(); await _stateStreamController.close(); super.onClose(); } } /// 这个类用来存储扫描到的蓝牙设备以及扫描器状态 @immutable class BleScannerState { const BleScannerState({ required this.discoveredDevices, required this.scanIsInProgress, }); final List discoveredDevices; final bool scanIsInProgress; } /// 这个类用来存储扫描器的过滤器 class BleScannerFilter { String? name; String? mac; List? serviceId; int? rssi; BleScannerFilter({ this.name, this.mac, this.serviceId, this.rssi, }); }