flutter 单例

蓝牙和WiFi的一直在后台运行的函数

import 'package:clean_ai/preference_message_type/share_preferences.dart';
import 'package:clean_ai/utils/disconnect_device_bluetooth_sheet_utils.dart';
import 'package:clean_ai/void/bluetooth_scan_void.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'dart:async';
import 'package:clean_ai/getx/wifi_blue_get.dart';
import 'package:clean_ai/rpx/rpx.dart';
import 'package:clean_ai/utils/style_text_utils.dart';
import 'package:get/get.dart';
import 'package:mqtt_client/mqtt_client.dart';

import 'characteristic_connect_device/characteristic_write_notify_device_utils.dart';
import 'communication_protocols/byte_map_utils/int_byte.dart';
import 'communication_protocols/byte_map_utils/string_byte16.dart';
import 'device/device_failure_level/device_failure_sheet_utils.dart';
import 'flutter_blue/bluetooth_notify_message_parse/parse_last_value_SharedPreferences_utils.dart';
import 'flutter_blue/bluetooth_write_device_message/blue_write_utils.dart';
import 'flutter_blue/bluetooth_write_device_message/write_bluetooth_msg_ping.dart';
import 'flutter_wifi/void/wifi_sub.dart';
import 'getx/blue_device_alarm_message_getx.dart';
import 'getx/blue_device_log_getx.dart';
import 'getx/blue_get_battery_message_get.dart';
import 'getx/blue_write_agreement_getx.dart';
import 'getx/device_connect_type_wifi__blue_get.dart';
import 'getx/update_disbale_run_getx.dart';

///   一直在后台运行    单例模式
class ContinuousTaskManager {
  static final ContinuousTaskManager _instance =
      ContinuousTaskManager._internal();

  factory ContinuousTaskManager() => _instance;

  ContinuousTaskManager._internal();

  Timer? deviceConnectTimer; //1000
  Timer? parsingValueTimer; //50
  Timer? wifiConnectToConnectBlue; //5000

  StreamSubscription<List<int>>? _lastValueSubscription;
  StreamSubscription<BluetoothConnectionState>? _connectionStateSubscription;
  StreamSubscription<BluetoothAdapterState>? _adapterStateSubscription;

  GlobalWiFiBluetooth globalWiFiBluetooth = Get.put(GlobalWiFiBluetooth());
  BlueDeviceLogGet blueDeviceLogGet = Get.put(BlueDeviceLogGet());
  BlueWriteAgreement blueWriteAgreement = Get.put(BlueWriteAgreement());
  UpdateDisableRunGetX updateDisableRunGetX = Get.put(UpdateDisableRunGetX());
  BlueDeviceAlarmMessageGetX blueDeviceAlarmMessageGetX =
      Get.put(BlueDeviceAlarmMessageGetX());
  BlueGetBatteryMessageGetX blueGetBatteryMessageGetX =
      Get.put(BlueGetBatteryMessageGetX());
  DeviceConnectTypeWifiBlueGet deviceConnectTypeWifiBlueGet =
      Get.put(DeviceConnectTypeWifiBlueGet());

  // 在这里定义持续执行的任务
  void startContinuousTask() {
    if (deviceConnectTimer != null) {
      deviceConnectTimer!.cancel();
    }
    if (_connectionStateSubscription != null) {
      _connectionStateSubscription!.cancel();
    }
    if (wifiConnectToConnectBlue != null) {
      wifiConnectToConnectBlue!.cancel();
    }
    if (_lastValueSubscription != null) {
      _lastValueSubscription!.cancel();
    }

    if (parsingValueTimer != null) {
      parsingValueTimer!.cancel();
    }

    deviceConnectTimer =
        Timer.periodic(const Duration(milliseconds: 1000), (_) {
      ///识别WiFi链接状态
      if (deviceConnectTypeWifiBlueGet.client != null &&
          deviceConnectTypeWifiBlueGet.client!.connectionStatus!.state ==
              MqttConnectionState.connected) {
        deviceConnectTypeWifiBlueGet.wifiConnectDeviceVoid(true);
        globalWiFiBluetooth.wifiDisconnectVoid(1);
        // EasyLoading.showToast("status  555");
      } else {
        deviceConnectTypeWifiBlueGet.wifiConnectDeviceVoid(false);
        globalWiFiBluetooth.wifiDisconnectVoid(2);
        // EasyLoading.showToast("status6666");
      }
      ///识别蓝牙连接状态
      if (globalWiFiBluetooth.device != null &&
          _connectionStateSubscription == null) {
        _connectionStateSubscription =
            globalWiFiBluetooth.device!.connectionState.listen((state) async {
          if (state == BluetoothConnectionState.connected) {
            deviceConnectTypeWifiBlueGet.blueConnectDeviceVoid(true);
            // EasyLoading.showToast("status  555");
          } else {
            deviceConnectTypeWifiBlueGet.blueConnectDeviceVoid(false);
            // EasyLoading.showToast("status6666");
          }
        });
      }

      ///判断是否打开手机蓝牙
      if (_adapterStateSubscription == null) {
        BluetoothScanVoid.bluetoothScanVoid(callback: () {
          _adapterStateSubscription = FlutterBluePlus.adapterState
              .listen((BluetoothAdapterState state) {
            if (state == BluetoothAdapterState.on) {
              // 蓝牙已开启,可以进行扫描、连接等操作
              deviceConnectTypeWifiBlueGet.flutterBlueStateVoid(true);
              // EasyLoading.showToast("status");
            } else {
              // 蓝牙未开启,可以提示用户打开蓝牙或执行其他操作
              deviceConnectTypeWifiBlueGet.flutterBlueStateVoid(false);
              // EasyLoading.showToast("status111");
            }
          });
        });
      }

      ///连接协议
      if ((globalWiFiBluetooth.device != null &&
              globalWiFiBluetooth.device!.isConnected &&
              globalWiFiBluetooth.characteristicWrite != null &&
              deviceConnectTypeWifiBlueGet.flutterBlueState.value) ||
          deviceConnectTypeWifiBlueGet.wifiConnectDevice.value) {
        // EasyLoading.showToast("status  555 55 33333 6");
        try {
          BlueWriteUtils.blueWriteUtils(
              WriteBluetoothMsgPing.writeBluetoothMsgPing(),
              globalWiFiBluetooth);

          // ///发送禁止协议
          // if (updateDisableRunGetX.getDisableRun.value == 1) {
          //   BlueWriteUtils.blueWriteUtils(
          //       WriteBluetoothDisableRun.writeBluetoothDisableRun(0),
          //       globalWiFiBluetooth);
          // }
        } catch (e) {
          //
        }
      }

      /// 重连
      if ((globalWiFiBluetooth.device != null &&
          globalWiFiBluetooth.device!.isDisconnected &&
          !deviceConnectTypeWifiBlueGet.wifiConnectDevice.value &&
          !globalWiFiBluetooth.timeOutStatus.value &&
          globalWiFiBluetooth.isDevicePage &&
          !blueWriteAgreement.isUpdateFirmwareAFloat.value)) {
        // isUpdateFirmwareAFloat : 判断是否在升级,在升级就不自动连接

        if (!deviceConnectTypeWifiBlueGet.flutterBlueState.value) {
          return;
        }

        //connectNum 重连次数
        if (globalWiFiBluetooth.connectNum.value < 10) {
          if (globalWiFiBluetooth.connectNum.value == 0) {
            globalWiFiBluetooth
                .connectNumVoid(globalWiFiBluetooth.connectNum.value + 1);
            reconnectDeviceUI();
          }
        }
      }

      /// 故障警告
      if (((globalWiFiBluetooth.device != null &&
                  globalWiFiBluetooth.device!.isConnected) ||
              deviceConnectTypeWifiBlueGet.wifiConnectDevice.value) &&
          !globalWiFiBluetooth.timeOutStatus.value &&
          globalWiFiBluetooth.isDevicePage &&
          !blueWriteAgreement.isUpdateFirmwareAFloat.value) {
        // blueDeviceAlarmMessageGetX.alarmStringDate.toString() == []
        if (blueDeviceAlarmMessageGetX.alarmStringDate.isNotEmpty &&
            blueDeviceAlarmMessageGetX.alarmSheet.value == 0) {
          // blueDeviceAlarmMessageGetX.alarmSheetVoid(1);
          DeviceFailureSheetUtils.deviceFailureSheetUtils(
              blueDeviceAlarmMessageGetX);
        }

        if (blueDeviceAlarmMessageGetX.alarmStringDate.isEmpty &&
            blueDeviceAlarmMessageGetX.alarmSheet.value == 1) {
          blueDeviceAlarmMessageGetX.alarmSheetVoid(2);
          Get.back();
        }
      }

      /// 连接状态下,电量的监听  充电状态下不提示
      if (((globalWiFiBluetooth.device != null &&
                  globalWiFiBluetooth.device!.isConnected &&
                  globalWiFiBluetooth.characteristicWrite != null) ||
              deviceConnectTypeWifiBlueGet.wifiConnectDevice.value) &&
          globalWiFiBluetooth.batteryCharging.value == 0) {
        //电量在10% 和 5% 都提醒一次
        if ((blueGetBatteryMessageGetX.batterySoc.value == 10 ||
                blueGetBatteryMessageGetX.batterySoc.value == 5) &&
            blueGetBatteryMessageGetX.batteryNumTips.value == 0) {
          blueGetBatteryMessageGetX.batteryNumTipsVoid(1);
          EasyLoading.dismiss();
          if (blueGetBatteryMessageGetX.batterySoc.value == 5) {
            EasyLoading.showToast("low_battery_5".tr,
                duration: const Duration(milliseconds: 3000),
                dismissOnTap: true);
          }
          if (blueGetBatteryMessageGetX.batterySoc.value == 10) {
            EasyLoading.showToast("low_battery_10".tr,
                duration: const Duration(milliseconds: 3000),
                dismissOnTap: true);
          }
        }

        if (blueGetBatteryMessageGetX.batterySoc.value != 5 &&
            blueGetBatteryMessageGetX.batterySoc.value != 10) {
          blueGetBatteryMessageGetX.batteryNumTipsVoid(0);
        }
      }
    });

    ///解析蓝牙数据
    parsingValueTimer =
        Timer.periodic(const Duration(milliseconds: 50), (callback) async {
      if (globalWiFiBluetooth.device != null &&
          globalWiFiBluetooth.device!.isConnected &&
          globalWiFiBluetooth.characteristicWrite != null) {
        // print("1111  3333event");
        if (globalWiFiBluetooth.isChangeDevice.value) {
          if (_lastValueSubscription != null) {
            _lastValueSubscription!.cancel();
          }
          _lastValueSubscription = globalWiFiBluetooth
              .characteristicNotify!.lastValueStream
              .listen((event) {
            SharePreferences.sharePreferences(
                "genkinno_flutter_blue_value_list",
                value: event);
          });
          globalWiFiBluetooth.isChangeDeviceVoid(false);
        }

        ParsingLastValueSharedPreferencesUtils.parsingLastValueUtils(
            shareKeys: "genkinno_flutter_blue_value_list");
      } else {
        if (deviceConnectTypeWifiBlueGet.wifiConnectDevice.value &&
            !deviceConnectTypeWifiBlueGet.isListenerAdded.value) {
          deviceConnectTypeWifiBlueGet.isListenerAddedVoid(true);
          WiFiSub.wifiSub(deviceConnectTypeWifiBlueGet, globalWiFiBluetooth);
          // globalWiFiBluetooth.isChangeDeviceVoid(false);
        }

        ParsingLastValueSharedPreferencesUtils.parsingLastValueUtils(
            shareKeys: "genkinno_flutter_blue_value_list");
      }
    });

    ///wifi链接成功后,蓝牙连接
    wifiConnectToConnectBlue =
        Timer.periodic(const Duration(milliseconds: 4000), (_) {
      if (!deviceConnectTypeWifiBlueGet.flutterBlueState.value) {
        return;
      }
      if (deviceConnectTypeWifiBlueGet.wifiConnectDevice.value) {
        if ((globalWiFiBluetooth.device != null &&
                globalWiFiBluetooth.device!.isDisconnected) ||
            globalWiFiBluetooth.device == null) {
          List<int> list;
          String snS =
              globalWiFiBluetooth.addNewDeviceSn.value.substring(0, 4) +
                  globalWiFiBluetooth.addNewDeviceSn.value.substring(8);
          for (ScanResult result in globalWiFiBluetooth.scanResults) {
            try {
              list = [
                ...IntByte.intByte16(
                    result.advertisementData.manufacturerData.keys.first,
                    little: false),
                ...result.advertisementData.manufacturerData.values.first
              ];
              if (StringByte16.byteString(list) == snS) {
                WriteNotifyDeviceUtils.writeNotifyUtils(
                    globalWiFiBluetooth, result.device);
              }
            } catch (e) {
              //
            }
          }
        }
      }
    });
  }

  //重连弹窗
  reconnectDeviceUI() {
    EasyLoading.dismiss();
    Timer.periodic(const Duration(milliseconds: 3000), (timer) {
      //退出页面了,关闭重连弹窗    不在Device页面或者通过wifi链接进来的
      if (!globalWiFiBluetooth.isDevicePage ||
          deviceConnectTypeWifiBlueGet.wifiConnectDevice.value ||
          !deviceConnectTypeWifiBlueGet.flutterBlueState.value) {
        globalWiFiBluetooth.connectNumVoid(0);
        timer.cancel();
        Get.back();
        return;
      }
      //连接成功,关闭重连弹窗
      if (globalWiFiBluetooth.device != null &&
          globalWiFiBluetooth.device!.isConnected) {
        timer.cancel();
        globalWiFiBluetooth.connectNumVoid(0);
        Get.back();
        return;
      }

      //重连操作
      if ((globalWiFiBluetooth.device != null &&
              globalWiFiBluetooth.device!.isDisconnected &&
              !deviceConnectTypeWifiBlueGet.wifiConnectDevice.value) &&
          globalWiFiBluetooth.connectNum.value < 10) {
        globalWiFiBluetooth
            .connectNumVoid(globalWiFiBluetooth.connectNum.value + 1);
        if (globalWiFiBluetooth.connectNum.value >= 10) {
          //重连次数够了
          timer.cancel();
          Get.back();
          globalWiFiBluetooth.connectNumVoid(0);
          globalWiFiBluetooth.isDevicePageVoid(false);
          DisconnectDeviceBluetoothSheetUtils.updatedDialogSheetSuccessUI();
        } else {
          try {
            globalWiFiBluetooth.device!
                .connect(timeout: const Duration(milliseconds: 2500))
                .then((onValue) async {
              //重连成功
              if (globalWiFiBluetooth.device != null &&
                  globalWiFiBluetooth.device!.isConnected) {
                timer.cancel();
                Get.back();
                globalWiFiBluetooth.connectNumVoid(0);
                WriteNotifyDeviceUtils.writeNotifyUtils(
                    globalWiFiBluetooth, globalWiFiBluetooth.device!);
              }
            });
          } catch (e) {
            //
          }
        }
      }
    });

    return Get.dialog(
      Column(
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.min,
        children: [
          Container(
            decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(10.rpx)),
            // width: 125.rpx,
            clipBehavior: Clip.antiAlias,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                SizedBox(
                  height: 20.rpx,
                ),
                Container(
                  margin: EdgeInsets.only(
                      right: 25.rpx, left: 25.rpx, bottom: 10.rpx),
                  width: 50.rpx,
                  height: 50.rpx,
                  child: Stack(
                    alignment: Alignment.center,
                    children: [
                      SizedBox(
                        width: 50.rpx,
                        height: 50.rpx,
                        child: const CircularProgressIndicator(
                          color: Colors.black,
                        ),
                      ),
                      Obx(() => Text(
                            "${globalWiFiBluetooth.connectNum.value}",
                            style: StyleTextUtils.textStyle262626(
                                fontWeight: FontWeight.w700, fontSize: 20.rpx),
                          ))
                    ],
                  ),
                ),
                Container(
                  margin: EdgeInsets.only(
                      right: 25.rpx, left: 25.rpx, bottom: 10.rpx),
                  child: Text(
                    "device_reconnecting".tr,
                    style: StyleTextUtils.textStyle262626(),
                  ),
                ),
                SizedBox(
                  height: 5.rpx,
                )
              ],
            ),
          )
        ],
      ),
      barrierDismissible: false,
    );
  }

  // 停止持续执行的任务
  void stopContinuousTask() {
    // 在这里停止你的持续执行的任务
    if (deviceConnectTimer != null) {
      deviceConnectTimer!.cancel();
    }
    if (wifiConnectToConnectBlue != null) {
      wifiConnectToConnectBlue!.cancel();
    }
    if (_lastValueSubscription != null) {
      _lastValueSubscription!.cancel();
    }
    if (_connectionStateSubscription != null) {
      _connectionStateSubscription!.cancel();
    }
    if (_adapterStateSubscription != null) {
      _adapterStateSubscription!.cancel();
    }
    if (parsingValueTimer != null) {
      parsingValueTimer!.cancel();
    }
  }
}

///   一直在后台运行    线程模式
// void backgroundTask(SendPort sendPort) {
//   Timer.periodic(const Duration(seconds: 5), (Timer t) {
//     // 这里是后台任务的逻辑,可以是任何你需要执行的任务
//     sendPort.send("Background task is running...");
//   });
// }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值