import 'dart:async'; import 'package:date_format/date_format.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_getStarLockStatusInfo.dart'; import '../../../../blue/io_protocol/io_timing.dart'; import '../../../../blue/io_reply.dart'; import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/sender_manage.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; import '../../../../tools/dateTool.dart'; import '../../../../tools/storage.dart'; import 'lockTime_state.dart'; class LockTimeLogic extends BaseGetXController { final LockTimeState state = LockTimeState(); // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { if (reply is TimingReply) { _replyTiming(reply); } // 获取锁状态 if (reply is GetStarLockStatuInfoReply) { _replyGetStarLockStatusInfo(reply); } }); } // 获取锁状态数据解析 Future _replyGetStarLockStatusInfo(Reply reply) async { final int status = reply.data[2]; switch (status) { case 0x00: //成功 cancelBlueConnetctToastTimer(); dismissEasyLoading(); // 有效时间 final List indate = reply.data.sublist(150, 154); int indateValue = (0xff & indate[0]) << 24 | (0xff & indate[1]) << 16 | (0xff & indate[2]) << 8 | (0xFF & indate[3]); // 检查时间戳是否无效或超出范围 if (indateValue == 0xffffffff || indateValue <= 0) { // 使用当前系统时间戳(秒) indateValue = DateTime.now().millisecondsSinceEpoch ~/ 1000; AppLog.log('检测到无效时间戳,使用系统时间:$indateValue'); } // 验证时间戳是否在合理范围内(例如:2000年到2100年之间) final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(indateValue * 1000); if (dateTime.year < 2000 || dateTime.year > 2100) { AppLog.log('时间戳超出合理范围: $indateValue'); indateValue = DateTime.now().millisecondsSinceEpoch ~/ 1000; } AppLog.log('====================indate:$indate indateValue:$indateValue'); state.dateTime.value = DateTool().dateToYMDHNString('$indateValue'); break; case 0x06: //需要鉴权 final List? privateKey = await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), utcTimeStamp: state.serverTime, unixTimeStamp: getLocalTime(), isBeforeAddUser: false, privateKey: getPrivateKeyList, ); break; default: //失败 break; } } // 校时数据解析 Future _replyTiming(Reply reply) async { final int status = reply.data[2]; switch (status) { case 0x00: //成功 final String dataEime = DateTool().dateToYMDHNString('${state.serverTime}'); state.dateTime.value = dataEime; state.sureBtnState.value = 0; cancelBlueConnetctToastTimer(); dismissEasyLoading(); showToast('锁时间更新成功'.tr); break; case 0x06: //无权限 // final List? privateKey = await Storage.getStringList(saveBluePrivateKey); // final List getPrivateKeyList = changeStringListToIntList(privateKey!); // // final List? token = await Storage.getStringList(saveBlueToken); // final List getTokenList = changeStringListToIntList(token!); // // final List? signKey = await Storage.getStringList(saveBlueSignKey); // final List getSignKeyList = changeStringListToIntList(signKey!); // // IoSenderManage.senderTimingCommand( // lockID:BlueManage().connectDeviceName, // userID:await Storage.getUid(), // nowTime: state.serverTime, // token:getTokenList, // needAuthor:1, // signKey:getSignKeyList, // privateKey:getPrivateKeyList, // ); break; default: break; } } // 校验时间 Future sendTiming() async { if (state.sureBtnState.value == 1) { return; } state.sureBtnState.value = 1; showEasyLoading(); showBlueConnetctToastTimer(action: () { dismissEasyLoading(); state.sureBtnState.value = 0; }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); final List? signKey = await Storage.getStringList(saveBlueSignKey); final List getSignKeyList = changeStringListToIntList(signKey!); IoSenderManage.senderTimingCommand( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), nowTime: state.serverTime, token: getTokenList, needAuthor: 1, signKey: getSignKeyList, privateKey: getPrivateKeyList, ); } else if (connectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); state.sureBtnState.value = 0; // if (state.ifCurrentScreen.value == true) { // showBlueConnetctToast(); // } } }); } // 获取锁状态 更新时间 Future getStarLockStatus() async { showEasyLoading(); showBlueConnetctToastTimer(action: () { dismissEasyLoading(); }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); IoSenderManage.senderGetStarLockStatuInfo( lockID: BlueManage().connectDeviceName, userID: await Storage.getUid(), utcTimeStamp: state.serverTime, unixTimeStamp: getLocalTime(), isBeforeAddUser: false, privateKey: getPrivateKeyList, ); } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); // if (state.ifCurrentScreen.value == true) { // showBlueConnetctToast(); // } } }); } // 从网关获取时间 Future getLockTimeFromGateway() async { final GetServerDatetimeEntity entity = await ApiRepository.to.getLockTimeFromGateway( lockId: state.lockSetInfoData.value.lockId.toString(), ); if (entity.errorCode!.codeIsSuccessful) {} } // 从服务器获取锁的时间 开锁时传入 Future getServerDatetime(bool isSendTime) async { final GetServerDatetimeEntity entity = await ApiRepository.to.getServerDatetimeData(isUnShowLoading: false); if (entity.errorCode!.codeIsSuccessful) { state.serverTime = entity.data!.date! ~/ 1000; AppLog.log('msg:${state.serverTime}'); // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}"); if (isSendTime == false) { getStarLockStatus(); } else { sendTiming(); } } } int getLocalTime() { final DateTime now = DateTime.now(); final Duration timeZoneOffset = now.timeZoneOffset; // AppLog.log('timeZoneOffset.inSeconds:$timeZoneOffset.inSeconds'); return state.serverTime + timeZoneOffset.inSeconds; } @override void onReady() { super.onReady(); _initReplySubscription(); // getLockTimeFromGateway(); getServerDatetime(false); } @override void onInit() { super.onInit(); } @override void onClose() { super.onClose(); _replySubscription.cancel(); } }