魏少阳 08de8f1fdf 1、修复登录注册问题,统一添加隐藏显示密码按钮
2、部分协议Nember 1个字节修改2字节
3、修复无网络开锁获取token异常情况
2024-05-03 18:31:15 +08:00

592 lines
22 KiB
Dart
Raw 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: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 '../../../app_settings/app_settings.dart';
import '../../../blue/blue_manage.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';
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 {
// 开门
if (reply is OpenDoorReply && state.ifCurrentScreen.value == true) {
_replyOpenLock(reply);
}
// 编辑锁用户
// if(reply is EditUserReply){
// _replyEditUserKey(reply);
// }
// 获取星锁状态信息
// if (reply is GetStarLockStatuInfoReply && state.ifCurrentScreen.value == true) {
// _replyGetStarLockStatusInfo(reply);
// }
// 开完锁之后上传记录
if (reply is SenderReferEventRecordTimeReply &&
state.ifCurrentScreen.value == true) {
_replyReferEventRecordTime(reply);
}
// 添加用户
// 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:
//成功
// _showFullScreenOverlay(Get.context!);
cancelBlueConnetctToastTimer();
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;
// 备用电量
if(state.keyInfos.value.lockFeature!.isSupportBackupBattery == 1){
int powerStandby = reply.data[9];
state.electricQuantityStandby.value = powerStandby;
}
// 更新电量
uploadElectricQuantityRequest();
getLockRecordLastUploadDataTime();
state.openLockBtnState.value = 0;
eventBus.fire(RefreshLockDetailInfoDataEvent());
break;
case 0x06:
//无权限
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var tokenData = reply.data.sublist(2, 6);
var saveStrList = changeIntListToStringList(tokenData);
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderOpenLock(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
openMode: state.openDoorModel,
openTime: getNetTime(),
onlineToken: state.lockNetToken,
token: tokenData,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
break;
case 0x07:
//无权限
break;
case 0x16:
// 正在开锁中...
state.openLockBtnState.value = 0;
eventBus.fire(RefreshLockDetailInfoDataEvent());
showToast("正在开锁中...".tr, something: () {
cancelBlueConnetctToastTimer();
});
break;
default:
//失败
break;
}
}
// 获取锁状态数据解析
// Future<void> _replyGetStarLockStatusInfo(Reply reply) async {
// int status = reply.data[2];
// switch (status) {
// case 0x00:
// //成功
// dismissEasyLoading();
// cancelBlueConnetctToastTimer();
//
// break;
// case 0x06:
// //无权限
//
// break;
// default:
// //失败
// break;
// }
// }
// 根据时间查解析数据
Future<void> _replyReferEventRecordTime(Reply reply) async {
int status = reply.data[2];
switch (status) {
case 0x00:
//成功
int dataLength = (reply.data[5] << 8) + reply.data[6];
AppLog.log("dataLength:$dataLength");
if (dataLength > 0) {
reply.data.removeRange(0, 7);
// 把得到的数据按8位分割成数组 然后塞进一个新的数组里面
if(reply.data.length < 17){
return;
}
var getList = splitList(reply.data, 17);
// AppLog.log("getList:$getList");
var uploadList = [];
for (int i = 0; i < getList.length; i++) {
var indexList = getList[i];
// AppLog.log("indexList:$indexList");
var indexMap = {};
indexMap["type"] = indexList[0].toString();
if(indexList[0] == 2){
var passwordData = reply.data.sublist(7, 17);
var password = utf8String(passwordData);
indexMap["user"] = password.toString();
}else{
int userNo = (indexList[1]*255) + indexList[2];
indexMap["user"] = userNo.toString();
}
indexMap["success"] = "1";
int time = ((0xff & indexList[(3)]) << 24 |
(0xff & indexList[4]) << 16 |
(0xff & indexList[5]) << 8 |
(0xFF & indexList[6]));
indexMap["date"] = "${time * 1000}";
uploadList.add(indexMap);
}
lockRecordUploadData(uploadList);
if(dataLength == state.logCountPage){
senderReferEventRecordTime();
}else{
await BlueManage().disconnect();
}
}
break;
case 0x06:
//无权限
BlueManage().disconnect();
cancelBlueConnetctToastTimer();
break;
default:
BlueManage().disconnect();
cancelBlueConnetctToastTimer();
break;
}
}
// // 添加用户
// Future<void> _replyAddUserKey(Reply reply) async {
// var lockId = reply.data.sublist(2, 42);
//
// var token = reply.data.sublist(42, 46);
// List<String> strTokenList = changeIntListToStringList(token);
// Storage.setStringList(saveBlueToken, strTokenList);
//
// int status = reply.data[46];
//
// switch (status) {
// case 0x00:
// //成功
// cancelBlueConnetctToastTimer();
// state.lockUserNo = reply.data[47];
// _updateLockUserNo();
//
// break;
// case 0x06:
// //无权限
// 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:
// break;
// }
// }
// 添加用户(普通用户接收电子钥匙)
// 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);
// }
//
// 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());
// }
// });
// }
// 点击开门事件
Future<void> openDoorAction() async {
showBlueConnetctToastTimer(action: () {
state.openLockBtnState.value = 0;
// BlueManage().stopScan();
eventBus.fire(RefreshLockDetailInfoDataEvent());
});
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!);
BlueManage().bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
IoSenderManage.senderOpenLock(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
openMode: state.openDoorModel,
openTime: getNetTime(),
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());
}
});
}
// 查询事件记录(时间查询)
Future<void> senderReferEventRecordTime() async {
showBlueConnetctToastTimer(isShowBlueConnetctToast: false, action: () {
BlueManage().disconnect();
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
if (connectionState == 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: state.logCountPage,
// time:DateTime.now().millisecondsSinceEpoch~/1000,
time: state.operateDate,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList,
);
}
});
}
// 从服务器获取锁的时间 开锁时传入
void getServerDatetime() async{
var entity = await ApiRepository.to.getServerDatetimeData(
lockId: state.keyInfos.value.lockId.toString(),
);
if(entity.errorCode!.codeIsSuccessful){
state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000;
// AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}");
}
}
int getNetTime(){
return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime;
}
// 获取手机联网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();
AppLog.log("从服务器获取联网token:${state.lockNetToken}");
openDoorAction();
}else{
showToast("网络访问失败,请检查网络是否正常".tr, something: (){
state.openLockBtnState.value = 0;
state.animationController!.forward();
cancelBlueConnetctToastTimer();
state.lockNetToken = "0";
openDoorAction();
});
}
}
//电量更新请求
Future<void> uploadElectricQuantityRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.uploadElectricQuantity(
electricQuantity:state.electricQuantity.value.toString(),
electricQuantityStandby: state.electricQuantityStandby.value.toString(),
lockId: state.keyInfos.value.lockId.toString()
);
if (entity.errorCode!.codeIsSuccessful) {
SchedulerBinding.instance.addPostFrameCallback((_) {
eventBus.fire(RefreshLockListInfoDataEvent());
});
}
}
// 普通用户接收电子钥匙之后 更新锁用户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();
// }
// }
// }
// 查询锁记录最后时间
void getLockRecordLastUploadDataTime() async {
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
.getLockRecordLastUploadDataTime(
lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
state.operateDate = entity.data!.operateDate! ~/ 1000;
senderReferEventRecordTime();
}
}
// 操作记录上传
void lockRecordUploadData(List list) async {
KeyOperationRecordEntity entity = await ApiRepository.to
.lockRecordUploadData(
lockId: state.keyInfos.value.lockId.toString(), records: list);
if (entity.errorCode!.codeIsSuccessful) {
// mockNetworkDataRequest();
AppLog.log("state.keyInfos.value.keyType:${state.keyInfos.value.keyType}");
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
} 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();
getServerDatetime();
await PermissionDialog.request(Permission.location);
await PermissionDialog.requestBluetooth();
}
}