256 lines
8.9 KiB
Dart
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if (reply is TimingReply) {
_replyTiming(reply);
}
// 获取锁状态
if (reply is GetStarLockStatuInfoReply) {
_replyGetStarLockStatusInfo(reply);
}
});
}
// 获取锁状态数据解析
Future<void> _replyGetStarLockStatusInfo(Reply reply) async {
final int status = reply.data[2];
switch (status) {
case 0x00:
//成功
cancelBlueConnetctToastTimer();
dismissEasyLoading();
// 有效时间
final List<int> 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<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> 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<void> _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<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
// final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// final List<String>? token = await Storage.getStringList(saveBlueToken);
// final List<int> getTokenList = changeStringListToIntList(token!);
//
// final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
// final List<int> 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<void> 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<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<int> 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<void> getStarLockStatus() async {
showEasyLoading();
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> 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<void> getLockTimeFromGateway() async {
final GetServerDatetimeEntity entity = await ApiRepository.to.getLockTimeFromGateway(
lockId: state.lockSetInfoData.value.lockId.toString(),
);
if (entity.errorCode!.codeIsSuccessful) {}
}
// 从服务器获取锁的时间 开锁时传入
Future<void> 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();
}
}