import 'dart:io'; 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 TemperatureHomePage extends StatefulWidget { @override State createState() => _TemperatureHomePageState(); } class _TemperatureHomePageState extends State { String connectionStatus = "disconnected"; String currentTempInCelsius = "0.0"; BluetoothDevice currentConnectedDevice; @override void dispose() { super.dispose(); currentConnectedDevice.disconnect(timeout: 15); } @override Widget build(BuildContext context) { return AppScaffold( appBarTitle: TranslationBase.of(context).temperature, showNewAppBar: true, isShowDecPage: false, 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..."; }); FlutterBluePlus.startScan(timeout: const Duration(seconds: 5), androidUsesFineLocation: false).then((value) { List blueToothDevices = []; // List blueToothDevices = value; blueToothDevices.forEach((element) async { if (element.device.localName.isNotEmpty) { if (element.device.localName.toLowerCase() == "temp") { element.device.connectionState.listen((BluetoothConnectionState state) async { 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) { currentConnectedDevice = element.device; List services = await element.device.discoverServices(); services.forEach((service) { if (service.serviceUuid.toString().toLowerCase() == BLEUtils.TEMPERATURE_SERVICE) { print(service.serviceUuid); service.characteristics.forEach((characteristic) async { if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.TEMPERATURE_CHARACTERISTIC) { print(characteristic.characteristicUuid); characteristic.onValueReceived.listen((event) { print("onValueReceived Stream"); print(event); setState(() { currentTempInCelsius = convertIntListToHex(event); String currentTempInFahrenheit = ((num.parse(currentTempInCelsius) * 1.8) + 32).toStringAsFixed(1); currentTempInCelsius = currentTempInCelsius + "\u2103" + " / " + currentTempInFahrenheit + "\u2109"; }); }); await characteristic.setNotifyValue(true); } }); return true; } }); } }); await element.device.connect(timeout: Duration(seconds: 35)); return true; } } }); }); } } String convertIntListToHex(List byteArray) { String b = (byteArray.map((x) { return x.toRadixString(16); })).join(";"); List hexString = b.split(";"); print("HexString: $hexString"); String returnString = hexString[3] + hexString[2] + hexString[1]; print("Temp Hex String: $returnString"); final number = int.parse(returnString, radix: 16); print("Temp Number: ${number * 0.01}"); return (number * 0.01).toStringAsFixed(1); } }