import 'dart:async'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/ble_utils.dart'; import 'package:diplomaticquarterapp/uitl/bluetooth_off.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:permission_handler/permission_handler.dart'; class ECG_BLE extends StatefulWidget { @override State createState() => _ECG_BLEState(); } class _ECG_BLEState extends State { String connectionStatus = "disconnected"; BluetoothDevice currentConnectedDevice; BluetoothCharacteristic ecgWriteCharacteristic; StreamSubscription bleDevicesStream; @override void dispose() { super.dispose(); if (bleDevicesStream != null) bleDevicesStream.cancel(); if (currentConnectedDevice != null) currentConnectedDevice.disconnect(); } @override void initState() { super.initState(); FlutterBluePlus.setLogLevel(LogLevel.verbose, color: false); } @override Widget build(BuildContext context) { return AppScaffold( appBarTitle: "ECG", showNewAppBar: true, isShowDecPage: true, showNewAppBarTitle: true, backgroundColor: Color(0xffF8F8F8), body: SingleChildScrollView( child: StreamBuilder( stream: FlutterBluePlus.adapterState, initialData: BluetoothAdapterState.unknown, builder: (c, snapshot) { final adapterState = snapshot.data; if (adapterState == BluetoothAdapterState.on) { return Container( margin: EdgeInsets.only(top: 200.0, left: 50.0, right: 50.0), child: Column( children: [ Center( child: DefaultButton( TranslationBase.of(context).start.toUpperCase(), () { checkBLEPermissions(); }, color: CustomColors.green, ), ), SizedBox( height: 50.0, ), Text("Connection state: $connectionStatus"), SizedBox( height: 50.0, ), // Text("Current Temp: $currentTempInCelsius"), ], ), ); } else { FlutterBluePlus.stopScan(); return SizedBox(height: 300.0, child: BluetoothOffScreen(adapterState: adapterState)); } }), ), ); } void checkBLEPermissions() { [Permission.location, Permission.storage, Permission.bluetooth, Permission.bluetoothConnect, Permission.bluetoothScan].request().then((status) { startBLEConnection(); }); } void startBLEConnection() { if (FlutterBluePlus.isScanningNow == false) { setState(() { connectionStatus = "Connecting..."; }); bleDevicesStream = FlutterBluePlus.scanResults.listen((results) { List blueToothDevices = results; blueToothDevices.forEach((element) async { if (element.device.localName.isNotEmpty) { if (element.device.localName.toLowerCase() == "pm101897") { bleDevicesStream.cancel(); element.device.connectionState.listen((BluetoothConnectionState state) async { if (mounted) { setState(() { connectionStatus = state.toString(); }); } if (state == BluetoothConnectionState.disconnected) { // typically, start a periodic timer that tries to periodically reconnect. // Note: you must always re-discover services after disconnection! } if (state == BluetoothConnectionState.connected) { if (FlutterBluePlus.isScanningNow) { FlutterBluePlus.stopScan(); } currentConnectedDevice = element.device; // currentConnectedDevice.clearGattCache(); // currentConnectedDevice.requestConnectionPriority(connectionPriorityRequest: ConnectionPriority.high); // currentConnectedDevice.requestMtu(512); // currentConnectedDevice.mtu.first.then((value) { // print("MTU Size: $value"); // }); List services = await element.device.discoverServices(); services.forEach((service) { if (service.serviceUuid.toString().toLowerCase() == BLEUtils.ECG_SERVICE) { print(service.serviceUuid); service.characteristics.forEach((characteristic) async { if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.ECG_READ_CHARACTERISTIC) { print(characteristic.characteristicUuid); characteristic.onValueReceived.listen((event) { print("onValueReceived Stream"); print(event); }); if (!characteristic.isNotifying) await characteristic.setNotifyValue(true); } if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.ECG_WRITE_CHARACTERISTIC) { print("Write Characteristic: ${characteristic.characteristicUuid}"); ecgWriteCharacteristic = characteristic; await ecgWriteCharacteristic.write([0x83]); } }); return true; } }); } }); await element.device.connect(timeout: Duration(seconds: 35)); return true; } } }); }); FlutterBluePlus.startScan(timeout: const Duration(seconds: 15), androidUsesFineLocation: false).then((value) { print("Scan Finished"); }); } } }