654 lines
23 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'dart:io';
import 'package:flutter/scheduler.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart';
import '../../../blue/blue_manage.dart';
2023-12-16 11:20:36 +08:00
import '../../../blue/io_protocol/io_addUser.dart';
import '../../../blue/io_protocol/io_openLock.dart';
import '../../../blue/io_protocol/io_referEventRecordTime.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';
2023-08-30 14:55:42 +08:00
import '../../../network/api_repository.dart';
import '../../../permission/permission_dialog.dart';
import '../../../tools/baseGetXController.dart';
import '../../../tools/commonDataManage.dart';
import '../../../tools/eventBusEventManage.dart';
import '../../../tools/storage.dart';
import '../../../translations/trans_lib.dart';
import '../lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart';
import 'lockDetail_state.dart';
import 'lockNetToken_entity.dart';
class LockDetailLogic extends BaseGetXController {
final LockDetailState state = LockDetailState();
// 监听设备返回的数据
void initReplySubscription() {
state.replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) async {
// Get.log("锁详情收到了蓝牙解析消息 reply:${reply.commandType}");
// 开门
if (reply is OpenDoorReply && state.ifCurrentScreen.value == true) {
_replyOpenLock(reply);
}
// 编辑锁用户
// if(reply is EditUserReply){
// _replyEditUserKey(reply);
// }
2023-10-07 18:55:59 +08:00
// 获取星锁状态信息
// if (reply is GetStarLockStatuInfoReply && state.ifCurrentScreen.value == true) {
// _replyGetStarLockStatusInfo(reply);
// }
// 开完锁之后上传记录
if (reply is SenderReferEventRecordTimeReply &&
state.ifCurrentScreen.value == true) {
_replyReferEventRecordTime(reply);
}
2023-12-16 11:20:36 +08:00
// 添加用户
// if ((reply is AddUserReply) && (state.ifCurrentScreen.value == true)) {
// _replyAddUserKey(reply);
// }
});
}
// 开门数据解析
Future<void> _replyOpenLock(Reply reply) async {
int status = reply.data[6];
switch (status) {
case 0x00:
//成功
Get.log("${reply.commandType}数据解析成功");
// _showFullScreenOverlay(Get.context!);
state.iSClosedUnlockSuccessfulPopup.value = true;
if (state.closedUnlockSuccessfulTimer != null) {
state.closedUnlockSuccessfulTimer!.cancel();
state.closedUnlockSuccessfulTimer = null;
}
// 如果没有点击关闭弹窗3秒后自动关闭
state.closedUnlockSuccessfulTimer = Timer.periodic(3.seconds, (timer) {
state.iSClosedUnlockSuccessfulPopup.value = false;
timer.cancel();
eventBus.fire(RefreshLockDetailInfoDataEvent());
});
// 电量
int power = reply.data[7];
state.electricQuantity.value = power;
cancelBlueConnetctToastTimer();
getLockRecordLastUploadDataTime();
state.openLockBtnState.value = 0;
eventBus.fire(RefreshLockDetailInfoDataEvent());
break;
case 0x06:
//无权限
Get.log("${reply.commandType}需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
2024-01-03 15:33:53 +08:00
var tokenData = reply.data.sublist(2, 6);
var saveStrList = changeIntListToStringList(tokenData);
Storage.setStringList(saveBlueToken, saveStrList);
// Get.log("openDoorToken:$tokenData");
2024-01-03 15:33:53 +08:00
IoSenderManage.senderOpenLock(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
2024-04-01 16:21:46 +08:00
openMode: state.openDoorModel,
openTime: DateTime.now().millisecondsSinceEpoch ~/ 1000,
onlineToken: state.lockNetToken,
token: tokenData,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
break;
case 0x07:
//无权限
Get.log("${reply.commandType}用户无权限");
break;
case 0x09:
// 权限校验错误
Get.log("${reply.commandType}校验错误");
2024-01-26 14:10:57 +08:00
break;
case 0x16:
// 正在开锁中...
Get.log("${reply.commandType}正在开锁中...");
state.openLockBtnState.value = 0;
eventBus.fire(RefreshLockDetailInfoDataEvent());
showToast("正在开锁中...".tr, something: () {
cancelBlueConnetctToastTimer();
});
break;
default:
//失败
print("${reply.commandType}失败");
break;
}
}
// 获取锁状态数据解析
// Future<void> _replyGetStarLockStatusInfo(Reply reply) async {
// int status = reply.data[2];
// switch (status) {
// case 0x00:
// //成功
// print("${reply.commandType}数据解析成功");
// dismissEasyLoading();
// cancelBlueConnetctToastTimer();
//
// // 厂商名称
// var vendor = reply.data.sublist(3, 23);
// // print("vendor:$vendor");
//
// // 锁设备类型
// var product = reply.data[23];
// // print("product:$product");
//
// // 产品名称
// var model = reply.data.sublist(24, 44);
// // print("model:$model");
//
// // 软件版本
// var fwVersion = reply.data.sublist(44, 64);
// // print("fwVersion:$fwVersion");
//
// // 硬件版本
// var hwVersion = reply.data.sublist(64, 84);
// // print("hwVersion:$hwVersion");
//
// // 厂商序列号
// var serialNum0 = reply.data.sublist(84, 100);
// // print("serialNum0:$serialNum0");
//
// // 成品商序列号
// var serialNum1 = reply.data.sublist(100, 116);
// // print("serialNum1:$serialNum1");
//
// // 蓝牙名称
// var btDeviceName = reply.data.sublist(116, 132);
// // print("btDeviceName:$btDeviceName");
//
// // 电池剩余电量
// var battRemCap = reply.data[132];
// // print("battRemCap:$battRemCap");
// // uploadElectricQuantityRequest(battRemCap.toString());
// // 重置次数
// var restoreCounter = reply.data.sublist(133, 135);
// // print("restoreCounter:$restoreCounter");
//
// // 重置时间
// var restoreDate = reply.data.sublist(135, 139);
// // print("restoreDate:$restoreDate");
//
// // 主控芯片型号
// var icPartNo = reply.data.sublist(139, 149);
// // print("icPartNo:$icPartNo");
//
// // 有效时间
// var indate = reply.data.sublist(149, 153);
// // print("indate:$indate");
//
// break;
// case 0x06:
// //无权限
// print("${reply.commandType}需要鉴权");
//
// break;
// case 0x07:
// //无权限
// print("${reply.commandType}用户无权限");
//
// break;
// case 0x09:
// // 权限校验错误
// print("${reply.commandType}权限校验错误");
//
// break;
// default:
// //失败
// print("${reply.commandType}失败");
//
// break;
// }
// }
2023-10-07 18:55:59 +08:00
// 根据时间查解析数据
Future<void> _replyReferEventRecordTime(Reply reply) async {
int status = reply.data[2];
switch (status) {
case 0x00:
//成功
Get.log("${reply.commandType}数据解析成功");
if (reply.data[5] > 0) {
reply.data.removeRange(0, 6);
// 把得到的数据按8位分割成数组 然后塞进一个新的数组里面
var getList = splitList(reply.data, 8);
// print("getList:$getList");
var uploadList = [];
for (int i = 0; i < getList.length; i++) {
var indexList = getList[i];
// print("indexList:$indexList");
var indexMap = {};
indexMap["seq"] = indexList[0].toString();
indexMap["user"] = indexList[3].toString();
indexMap["pwd"] = indexList[2].toString();
indexMap["success"] = "1";
indexMap["type"] = indexList[1].toString();
int value = ((0xff & indexList[(4)]) << 24 |
(0xff & indexList[5]) << 16 |
(0xff & indexList[6]) << 8 |
(0xFF & indexList[7]));
// indexMap["date"] = DateTool().dateToYMDHNSString("$value");
// print("value${DateTool().dateToYMDHNSString("$value")}");
indexMap["date"] = "${value * 1000}";
uploadList.add(indexMap);
}
lockRecordUploadData(uploadList);
// print("reply.data:${reply.data} getList:$getList}");
await BlueManage().disconnect();
}
break;
case 0x06:
//无权限
Get.log("${reply.commandType}需要鉴权");
break;
case 0x07:
//无权限
Get.log("${reply.commandType}用户无权限");
break;
case 0x09:
// 权限校验错误
Get.log("${reply.commandType}权限校验错误");
break;
default:
//失败
Get.log("${reply.commandType}失败");
break;
}
}
// // 添加用户
// Future<void> _replyAddUserKey(Reply reply) async {
// var lockId = reply.data.sublist(2, 42);
// // print("lockId:$lockId");
//
// var token = reply.data.sublist(42, 46);
// List<String> strTokenList = changeIntListToStringList(token);
// Storage.setStringList(saveBlueToken, strTokenList);
// // print("token:$token");
//
// int status = reply.data[46];
// // print("status:$status reply.data:${reply.data}");
//
// print("status:$status");
// switch (status) {
// case 0x00:
// //成功
// Get.log("添加用户数据解析成功");
// cancelBlueConnetctToastTimer();
// state.lockUserNo = reply.data[47];
// _updateLockUserNo();
//
// break;
// case 0x06:
// //无权限
// Get.log("需要鉴权");
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// IoSenderManage.senderAddUser(
// lockID: BlueManage().connectDeviceName,
// authUserID: state.senderUserId.toString(),
// keyID: state.keyInfos.value.keyId.toString(),
// userID: await Storage.getUid(),
// openMode: 1,
// keyType: 0,
// startDate: state.keyInfos.value.startDate!~/10000,
// expireDate: state.keyInfos.value.endDate!~/10000,
// role: state.keyInfos.value.keyRight == 1 ? 1 : 0,
// password: "123456",
// needAuthor: 1,
// publicKey: publicKeyDataList,
// privateKey: getPrivateKeyList,
// token: token);
// break;
// default:
// //失败
// Get.log("领锁失败");
//
// break;
// }
// }
2023-12-16 11:20:36 +08:00
// 添加用户(普通用户接收电子钥匙)
// Future<void> addUserConnectBlue() async {
// showBlueConnetctToastTimer(action: () {
// state.openLockBtnState.value = 0;
// eventBus.fire(RefreshLockDetailInfoDataEvent());
// });
//
// // var listData = AddUserCommand(
// // lockID: BlueManage().connectDeviceName,
// // authUserID: state.senderUserId.toString(),
// // keyID: state.keyInfos.value.keyId.toString(),
// // userID: await Storage.getUid(),
// // openMode: 1,
// // keyType: 0,
// // startDate: state.keyInfos.value.startDate!~/10000,
// // expireDate: state.keyInfos.value.endDate!~/10000,
// // role: state.keyInfos.value.keyRight == 1 ? 1 : 0,
// // password: "123456",
// // needAuthor: 1,
// // publicKey: publicKeyDataList,
// // privateKey: getPrivateKeyList,
// // token: getTokenList).packageData();
// BlueManage().bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (BluetoothConnectionState deviceConnectionState) async {
// if (deviceConnectionState == BluetoothConnectionState.connected) {
// // 私钥
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// var token = await Storage.getStringList(saveBlueToken);
// List<int> getTokenList = [0, 0, 0, 0];
// if (token != null) {
// getTokenList = changeStringListToIntList(token);
// }
//
// Get.log("BlueManage().connectDeviceName:${BlueManage().connectDeviceName} authUserID:${state.senderUserId.toString()} keyID:${state.keyInfos.value.keyId.toString()} userID:${await Storage.getUid()}");
// IoSenderManage.senderAddUser(
// lockID: BlueManage().connectDeviceName,
// authUserID: state.senderUserId.toString(),
// keyID: state.keyInfos.value.keyId.toString(),
// userID: await Storage.getUid(),
// openMode: 1,
// keyType: 0,
// startDate: state.keyInfos.value.startDate!~/10000,
// expireDate: state.keyInfos.value.endDate!~/10000,
// role: state.keyInfos.value.keyRight == 1 ? 1 : 0,
// password: "123456",
// needAuthor: 1,
// publicKey: publicKeyDataList,
// privateKey: getPrivateKeyList,
// token: getTokenList);
// } else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
// cancelBlueConnetctToastTimer();
// if (state.ifCurrentScreen.value == true) {
// showBlueConnetctToast();
// }
//
// state.openLockBtnState.value = 0;
// eventBus.fire(RefreshLockDetailInfoDataEvent());
// }
// });
// }
// 点击开门事件
2024-04-01 16:21:46 +08:00
Future<void> openDoorAction() async {
showBlueConnetctToastTimer(action: () {
state.openLockBtnState.value = 0;
// BlueManage().stopScan();
eventBus.fire(RefreshLockDetailInfoDataEvent());
});
2024-01-16 10:41:08 +08:00
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
2024-04-01 16:21:46 +08:00
Get.log("openMode:${state.openDoorModel}");
BlueManage().bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
IoSenderManage.senderOpenLock(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
2024-04-01 16:21:46 +08:00
openMode: state.openDoorModel,
openTime: DateTime.now().millisecondsSinceEpoch ~/ 1000,
onlineToken: state.lockNetToken,
token: getTokenList,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {
cancelBlueConnetctToastTimer();
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
state.openLockBtnState.value = 0;
eventBus.fire(RefreshLockDetailInfoDataEvent());
}
2024-01-02 18:03:50 +08:00
});
}
2024-02-01 11:22:44 +08:00
// 查询事件记录(时间查询)
Future<void> senderReferEventRecordTime(int time) async {
BlueManage().bludSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState state) async {
if (state == BluetoothConnectionState.connected) {
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
IoSenderManage.senderReferEventRecordTimeCommand(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
logsCount: 20,
// time:DateTime.now().millisecondsSinceEpoch~/1000,
time: time,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList,
);
}
2024-01-02 18:03:50 +08:00
});
}
2024-01-26 14:10:57 +08:00
// 获取手机联网token根据锁设置里面获取的开锁时是否联网来判断是否调用这个接口
void getLockNetToken() async {
LockNetTokenEntity entity = await ApiRepository.to.getLockNetToken(lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
state.lockNetToken = entity.data!.token!.toString();
Get.log("state.lockNetToken:${state.lockNetToken}");
2024-04-01 16:21:46 +08:00
openDoorAction();
}else{
showToast("获取联网token失败", something: (){
state.openLockBtnState.value = 0;
cancelBlueConnetctToastTimer();
});
}
}
2023-12-16 11:20:36 +08:00
// 普通用户接收电子钥匙之后 更新锁用户NO
// void _updateLockUserNo() async {
// LockNetTokenEntity entity = await ApiRepository.to.updateLockUserNo(
// keyId: state.keyInfos.value.keyId.toString(),
// lockUserNo: state.lockUserNo.toString()
// );
// if (entity.errorCode!.codeIsSuccessful) {
// eventBus.fire(RefreshLockDetailInfoDataEvent());
// SchedulerBinding.instance.addPostFrameCallback((_) {
// eventBus.fire(RefreshLockListInfoDataEvent());
// });
// if (state.isOpenLockNeedOnline.value == 0) {
// openDoorAction();
// } else {
// getLockNetToken();
// }
// }
// }
2023-12-16 11:20:36 +08:00
// 查询锁记录最后时间
void getLockRecordLastUploadDataTime() async {
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
.getLockRecordLastUploadDataTime(
lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
senderReferEventRecordTime(entity.data!.operateDate! ~/ 1000);
}
}
// 操作记录上传
void lockRecordUploadData(List list) async {
KeyOperationRecordEntity entity = await ApiRepository.to
.lockRecordUploadData(
lockId: state.keyInfos.value.lockId.toString(), records: list);
if (entity.errorCode!.codeIsSuccessful) {
// mockNetworkDataRequest();
if(state.keyInfos.value.keyType == XSConstantMacro.keyTypeOnce){
// 单次删除
deletKeyData();
}
}
}
// 普通用户或者授权管理员删除钥匙
void deletKeyData() async {
var entity = await ApiRepository.to.deleteElectronicKey(
keyId:state.keyInfos.value.keyId.toString(),
includeUnderlings: 0
);
if (entity.errorCode!.codeIsSuccessful) {
BlueManage().connectDeviceMacAddress = "";
SchedulerBinding.instance.addPostFrameCallback((_) {
eventBus.fire(RefreshLockListInfoDataEvent());
});
Get.back();
}
}
/// 锁设置里面开启关闭考勤刷新锁详情
void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() {
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
state.lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent =
eventBus.on<LockSetChangeSetRefreshLockDetailWithType>().listen((event) {
if (event.type == 0) {
// 0考勤
state.isAttendance.value = int.parse(event.setResult);
state.keyInfos.value.lockSetting!.attendance = int.parse(event.setResult);
} else if (event.type == 1) {
// 1 开锁时是否需联网
state.isOpenLockNeedOnline.value = int.parse(event.setResult);
state.keyInfos.value.lockSetting!.appUnlockOnline = int.parse(event.setResult);
state.lockNetToken = "";// 改变开锁时是否联网状态的时候清空token
Get.log(
"state.isOpenLockNeedOnline.value:${state.isOpenLockNeedOnline.value}");
2024-01-11 15:14:02 +08:00
} else if (event.type == 2) {
// 2 常开模式
state.isOpenPassageMode.value = int.parse(event.setResult);
state.keyInfos.value.passageMode = int.parse(event.setResult);
} else if (event.type == 3) {
// 3 修改了锁名字
state.lockAlias.value = event.setResult;
state.keyInfos.value.lockAlias = event.setResult;
Storage.setString(saveLockAlias, state.lockAlias.value);
} else if (event.type == 4) {
// 4 更新了电量
state.electricQuantity.value = int.parse(event.setResult);
state.keyInfos.value.electricQuantity = int.parse(event.setResult);
} else if (event.type == 5) {
// 5 远程开锁
state.keyInfos.value.lockSetting!.remoteUnlock =
int.parse(event.setResult);
}
CommonDataManage().currentKeyInfo = state.keyInfos.value;
eventBus.fire(RefreshLockDetailInfoDataEvent());
});
}
String getKeyStatusTextAndShow() {
String text = "";
if (state.keyInfos.value.keyStatus ==
XSConstantMacro.keyStatusWaitIneffective ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusFrozen ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusExpired ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusDeleted ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusReset) {
text = "${"你的钥匙".tr}${XSConstantMacro.getKeyStatusStr(state.keyInfos.value.keyStatus!)}";
} else {
text = state.isOpenPassageMode.value == 1
? "常开模式启动!长按闭锁".tr
: TranslationLoader.lanKeys!.clickUnlockAndHoldDownClose!.tr;
}
return text;
}
String getCurrentFormattedTime() {
// 获取当前时间
DateTime now = DateTime.now();
// 格式化日期和时间
String formattedTime = DateFormat('MM/dd HH:mm').format(now);
return formattedTime;
}
@override
Future<void> onReady() async {
super.onReady();
Get.log("LockDetailPage onReady");
await PermissionDialog.request(Permission.location);
await PermissionDialog.requestBluetooth();
}
@override
void onInit() {
super.onInit();
Get.log("LockDetailPage onInit");
}
2023-12-14 11:14:56 +08:00
@override
void onClose() {
super.onClose();
Get.log("LockDetailPage onClose");
2023-12-14 11:14:56 +08:00
}
}