796 lines
29 KiB
Dart
Executable File
796 lines
29 KiB
Dart
Executable File
import 'dart:async';
|
||
|
||
import 'package:flutter/scheduler.dart';
|
||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:star_lock/apm/apm_helper.dart';
|
||
import 'package:star_lock/blue/io_protocol/io_getDeviceModel.dart';
|
||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
||
|
||
import '../../../../blue/blue_manage.dart';
|
||
import '../../../../blue/io_protocol/io_factoryDataReset.dart';
|
||
import '../../../../blue/io_protocol/io_setSupportFunctionsNoParameters.dart';
|
||
import '../../../../blue/io_protocol/io_updataLockSet.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/commonDataManage.dart';
|
||
import '../../../../tools/dateTool.dart';
|
||
import '../../../../tools/eventBusEventManage.dart';
|
||
import '../../../../tools/storage.dart';
|
||
import 'checkingInInfoData_entity.dart';
|
||
import 'lockSetInfo_entity.dart';
|
||
import 'lockSet_state.dart';
|
||
|
||
typedef BlockSetStateCallback = void Function();
|
||
typedef BlockSetCheckInCallback = void Function(
|
||
CheckingInInfoDataEntity checkingInInfoDataEntity);
|
||
|
||
class LockSetLogic extends BaseGetXController {
|
||
final LockSetState state = LockSetState();
|
||
|
||
// 监听蓝牙协议返回结果
|
||
late StreamSubscription<Reply> _replySubscription;
|
||
|
||
void _initReplySubscription() {
|
||
_replySubscription =
|
||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
|
||
// 删除用户
|
||
// if (reply is DeletUserReply) {
|
||
// _replyDeletUserKey(reply);
|
||
// }
|
||
|
||
// 恢复出厂设置
|
||
if (reply is FactoryDataResetReply &&
|
||
(state.ifCurrentScreen.value == true)) {
|
||
_replyFactoryDataResetKey(reply);
|
||
}
|
||
|
||
// 设置支持功能(不带参数)
|
||
if ((reply is SetSupportFunctionsNoParametersReply) &&
|
||
(state.ifCurrentScreen.value == true)) {
|
||
_replySetSupportFunctionsWithParameters(reply);
|
||
}
|
||
|
||
// 读取支持功能(不带参数)
|
||
// if ((reply is ReadSupportFunctionsNoParametersReply) && (state.settingUpSupportFeatures == 56)) {
|
||
// _readSupportFunctionsWithParametersReply(reply);
|
||
// }
|
||
|
||
// 上传数据获取锁设置
|
||
if (reply is UpdataLockSetReply &&
|
||
(state.ifCurrentScreen.value == true)) {
|
||
_replyUpdataLockSetReply(reply);
|
||
}
|
||
|
||
if (reply is GetDeviceModelReply) {
|
||
// 获取设备型号
|
||
_handlerDeviceModelReply(reply);
|
||
}
|
||
});
|
||
}
|
||
|
||
// 删除用户
|
||
// Future<void> _replyDeletUserKey(Reply reply) async {
|
||
// var tokenData = reply.data.sublist(2, 6);
|
||
// var saveStrList = changeIntListToStringList(tokenData);
|
||
// Storage.setStringList(saveBlueToken, saveStrList);
|
||
//
|
||
// int status = reply.data[6];
|
||
// switch (status) {
|
||
// case 0x00:
|
||
// //成功
|
||
// dismissEasyLoading();
|
||
// cancelBlueConnetctToastTimer();
|
||
// deletKeyData();
|
||
// 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.deletUser(
|
||
// lockID: BlueManage().connectDeviceName,
|
||
// authUserID: await Storage.getUid(),
|
||
// keyID: "1",
|
||
// delUserID: await Storage.getUid(),
|
||
// needAuthor: 1,
|
||
// publicKey: publicKeyDataList,
|
||
// privateKey: getPrivateKeyList,
|
||
// token: tokenData);
|
||
// break;
|
||
// default:
|
||
// //失败
|
||
// dismissEasyLoading();
|
||
// showToast("删除失败");
|
||
// break;
|
||
// }
|
||
// }
|
||
|
||
// 恢复出厂设置数据解析
|
||
Future<void> _replyFactoryDataResetKey(Reply reply) async {
|
||
final List<int> token = reply.data.sublist(2, 6);
|
||
final List<String> saveStrList = changeIntListToStringList(token);
|
||
Storage.setStringList(saveBlueToken, saveStrList);
|
||
|
||
final int status = reply.data[6];
|
||
switch (status) {
|
||
case 0x00:
|
||
//成功
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
deletLockInfoData();
|
||
break;
|
||
case 0x06:
|
||
//无权限
|
||
final List<String>? privateKey =
|
||
await Storage.getStringList(saveBluePrivateKey);
|
||
final List<int> getPrivateKeyList =
|
||
changeStringListToIntList(privateKey!);
|
||
|
||
final List<String>? publicKey =
|
||
await Storage.getStringList(saveBluePublicKey);
|
||
final List<int> publicKeyDataList =
|
||
changeStringListToIntList(publicKey!);
|
||
|
||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||
|
||
IoSenderManage.senderFactoryDataReset(
|
||
lockID: BlueManage().connectDeviceName,
|
||
userID: await Storage.getUid(),
|
||
keyID: '1',
|
||
needAuthor: 1,
|
||
publicKey: publicKeyDataList,
|
||
privateKey: getPrivateKeyList,
|
||
token: getTokenList);
|
||
break;
|
||
default:
|
||
//失败
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
showDeletAlertTipDialog();
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 读取支持功能带参数数据解析
|
||
// Future<void> _readSupportFunctionsWithParametersReply(Reply reply) async {
|
||
// int status = reply.data[2];
|
||
// switch (status) {
|
||
// case 0x00:
|
||
// //成功
|
||
// state.isOpenBlueBroadcast.value = reply.data[6];
|
||
// break;
|
||
// case 0x06:
|
||
// //无权限
|
||
// break;
|
||
// default:
|
||
// //失败
|
||
// break;
|
||
// }
|
||
// }
|
||
|
||
// 锁设置数据解析
|
||
Future<void> _replySetSupportFunctionsWithParameters(Reply reply) async {
|
||
final int status = reply.data[2];
|
||
switch (status) {
|
||
case 0x00:
|
||
//成功
|
||
// Toast.show(msg: "操作成功");featureEnable = state.isOpenStayWarn.value == 1 ? 0 : 1;
|
||
dismissEasyLoading();
|
||
state.sureBtnState.value = 0;
|
||
cancelBlueConnetctToastTimer();
|
||
if (state.settingUpSupportFeatures == 55) {
|
||
// APP开锁时是否需联网
|
||
// state.isOpenLockNeedOnline.value = state.isOpenLockNeedOnline.value == 1 ? 0 : 1;
|
||
// state.lockSetInfoData.value.lockSettingInfo!.appUnlockOnline = state.isOpenLockNeedOnline.value;
|
||
setLockSetOpenLockNeedOnline();
|
||
// eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSetInfoData.value.lockSettingInfo!.appUnlockOnline!));
|
||
} else if (state.settingUpSupportFeatures == 56) {
|
||
// 蓝牙广播
|
||
state.isOpenBlueBroadcast.value =
|
||
state.isOpenBlueBroadcast.value == 1 ? 0 : 1;
|
||
state.lockSetInfoData.value.lockSettingInfo!.bluetoothBroadcast =
|
||
state.isOpenBlueBroadcast.value;
|
||
} else if (state.settingUpSupportFeatures == 61) {
|
||
// 逗留警告
|
||
state.isOpenStayWarn.value = state.isOpenStayWarn.value == 1 ? 0 : 1;
|
||
state.lockSetInfoData.value.lockSettingInfo!.stayWarn =
|
||
state.isOpenStayWarn.value;
|
||
} else if (state.settingUpSupportFeatures == 62) {
|
||
// 异常警告
|
||
state.isOpenExceptionWarnings.value =
|
||
state.isOpenExceptionWarnings.value == 1 ? 0 : 1;
|
||
state.lockSetInfoData.value.lockSettingInfo!.abnormalWarn =
|
||
state.isOpenExceptionWarnings.value;
|
||
}
|
||
break;
|
||
case 0x06:
|
||
//无权限
|
||
state.sureBtnState.value = 0;
|
||
break;
|
||
default:
|
||
state.sureBtnState.value = 0;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 上传数据获取锁设置解析
|
||
Future<void> _replyUpdataLockSetReply(Reply reply) async {
|
||
final int status = reply.data[2];
|
||
switch (status) {
|
||
case 0x00:
|
||
//成功
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
|
||
_lockDataUpload(
|
||
uploadType: 1,
|
||
recordType: 0,
|
||
records: reply.data.sublist(7, reply.data.length));
|
||
break;
|
||
case 0x06:
|
||
//无权限
|
||
final List<int> token = reply.data.sublist(3, 7);
|
||
final List<String> saveStrList = changeIntListToStringList(token);
|
||
Storage.setStringList(saveBlueToken, saveStrList);
|
||
|
||
updataLockSet(token);
|
||
break;
|
||
default:
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 删除用户
|
||
// Future<void> deletUserAction() async {
|
||
// showEasyLoading();
|
||
// showBlueConnetctToastTimer(isShowBlueConnetctToast: false, action: (){
|
||
// dismissEasyLoading();
|
||
// showDeletAlertTipDialog();
|
||
// });
|
||
// BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async {
|
||
// if (connectionState == DeviceConnectionState.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 = changeStringListToIntList(token!);
|
||
//
|
||
// IoSenderManage.deletUser(
|
||
// lockID: BlueManage().connectDeviceName,
|
||
// authUserID: state.lockBasicInfo.value.senderUserId.toString(),
|
||
// keyID: state.lockBasicInfo.value.keyId.toString(),
|
||
// delUserID: await Storage.getUid(),
|
||
// // authUserID: "100001",
|
||
// // keyID: "1",
|
||
// // delUserID: "100001",
|
||
// needAuthor: 1,
|
||
// publicKey: publicKeyDataList,
|
||
// privateKey: getPrivateKeyList,
|
||
// token: getTokenList);
|
||
// } else if (connectionState == DeviceConnectionState.disconnected) {
|
||
// dismissEasyLoading();
|
||
// cancelBlueConnetctToastTimer();
|
||
// if(state.ifCurrentScreen.value == true){
|
||
// showDeletAlertTipDialog();
|
||
// }
|
||
// }
|
||
// });
|
||
// }
|
||
|
||
// 恢复出厂设置
|
||
Future<void> factoryDataResetAction() async {
|
||
showEasyLoading();
|
||
showBlueConnetctToastTimer(
|
||
isShowBlueConnetctToast: false,
|
||
action: () async {
|
||
final String getMobile = (await Storage.getMobile())!;
|
||
ApmHelper.instance.trackEvent('delet_lock', {
|
||
'lock_name': BlueManage().connectDeviceName,
|
||
'account':
|
||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||
'date': DateTool().getNowDateWithType(1),
|
||
'delet_type': 'lock',
|
||
'delet_lock_result': '删除锁超时',
|
||
});
|
||
|
||
dismissEasyLoading();
|
||
showDeletAlertTipDialog();
|
||
});
|
||
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>? publicKey =
|
||
await Storage.getStringList(saveBluePublicKey);
|
||
final List<int> publicKeyDataList =
|
||
changeStringListToIntList(publicKey!);
|
||
|
||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||
|
||
IoSenderManage.senderFactoryDataReset(
|
||
lockID: BlueManage().connectDeviceName,
|
||
userID: await Storage.getUid(),
|
||
keyID: '1',
|
||
needAuthor: 1,
|
||
publicKey: publicKeyDataList,
|
||
privateKey: getPrivateKeyList,
|
||
token: getTokenList);
|
||
} else if (connectionState == BluetoothConnectionState.disconnected) {
|
||
final String getMobile = (await Storage.getMobile())!;
|
||
ApmHelper.instance.trackEvent('delet_lock', {
|
||
'lock_name': BlueManage().connectDeviceName,
|
||
'account':
|
||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||
'date': DateTool().getNowDateWithType(1),
|
||
'delet_type': 'lock',
|
||
'delet_lock_result': '删除锁断开',
|
||
});
|
||
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
if (state.ifCurrentScreen.value == true) {
|
||
showDeletAlertTipDialog();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
// 读取支持功能-带参数
|
||
// Future<void> _readSupportFunctionsNoParameters(int type) async {
|
||
// BlueManage().bludSendData(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async {
|
||
// if (connectionState == DeviceConnectionState.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.readSupportFunctionsNoParametersCommand(
|
||
// keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||
// userID: await Storage.getUid(),
|
||
// featureBit: type,
|
||
// token: getTokenList,
|
||
// needAuthor: 1,
|
||
// publicKey: getPublicKeyList,
|
||
// privateKey: getPrivateKeyList
|
||
// );
|
||
// }
|
||
// }, isShowLoading: true);
|
||
// }
|
||
|
||
// 设置支持功能(带参数)
|
||
Future<void> sendBurglarAlarm(int type) async {
|
||
if (state.sureBtnState.value == 1) {
|
||
return;
|
||
}
|
||
state.sureBtnState.value = 1;
|
||
|
||
showEasyLoading();
|
||
showBlueConnetctToastTimer(action: () {
|
||
state.sureBtnState.value = 0;
|
||
dismissEasyLoading();
|
||
});
|
||
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>? publicKey =
|
||
await Storage.getStringList(saveBluePublicKey);
|
||
final List<int> getPublicKeyList =
|
||
changeStringListToIntList(publicKey!);
|
||
|
||
state.settingUpSupportFeatures = type;
|
||
|
||
int featureEnable = 0;
|
||
if (type == 55) {
|
||
// APP开锁时是否需联网
|
||
featureEnable = state.isOpenLockNeedOnline.value == 1 ? 0 : 1;
|
||
} else if (type == 56) {
|
||
// 蓝牙广播
|
||
featureEnable = state.isOpenBlueBroadcast.value == 1 ? 0 : 1;
|
||
} else if (type == 61) {
|
||
// 逗留警告
|
||
featureEnable = state.isOpenStayWarn.value == 1 ? 0 : 1;
|
||
} else if (type == 62) {
|
||
// 异常警告
|
||
featureEnable = state.isOpenExceptionWarnings.value == 1 ? 0 : 1;
|
||
}
|
||
IoSenderManage.setSupportFunctionsNoParametersCommand(
|
||
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||
userID: await Storage.getUid(),
|
||
featureBit: type,
|
||
featureEnable: featureEnable,
|
||
token: getTokenList,
|
||
needAuthor: 1,
|
||
publicKey: getPublicKeyList,
|
||
privateKey: getPrivateKeyList);
|
||
} else if (connectionState == BluetoothConnectionState.disconnected) {
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
state.sureBtnState.value = 0;
|
||
if (state.ifCurrentScreen.value == true) {
|
||
showBlueConnetctToast();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
// 获取锁设置信息
|
||
Future<LockSetInfoEntity> getLockSettingInfoData() async {
|
||
final LockSetInfoEntity entity =
|
||
await ApiRepository.to.getLockSettingInfoData(
|
||
lockId: state.lockId.toString(),
|
||
);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
state.lockSetInfoData.value = entity.data!;
|
||
CommonDataManage().currentLockSetInfoData = entity.data!;
|
||
|
||
state.lockSettingInfo.value =
|
||
state.lockSetInfoData.value.lockSettingInfo!;
|
||
state.lockFeature.value = state.lockSetInfoData.value.lockFeature!;
|
||
state.lockStatus.value = state.lockSetInfoData.value.lockStatus!;
|
||
state.lockBasicInfo.value = state.lockSetInfoData.value.lockBasicInfo!;
|
||
|
||
state.isAttendance.value = state.lockSettingInfo.value.attendance!;
|
||
state.isOpenLockNeedOnline.value =
|
||
state.lockSettingInfo.value.appUnlockOnline!;
|
||
|
||
state.isOpenBlueBroadcast.value =
|
||
state.lockSettingInfo.value.bluetoothBroadcast!;
|
||
state.isOpenExceptionWarnings.value =
|
||
state.lockSettingInfo.value.bluetoothBroadcast!;
|
||
state.isUnlockReminder.value =
|
||
state.lockSettingInfo.value.unlockReminder!;
|
||
}
|
||
return entity;
|
||
}
|
||
|
||
// 开启考勤获取是否有公司
|
||
Future<void> openCheckingInData(
|
||
BlockSetCheckInCallback blockSetCheckInCallback) async {
|
||
final CheckingInInfoDataEntity entity =
|
||
await ApiRepository.to.openCheckingInData(
|
||
lockId: state.lockSetInfoData.value.lockId.toString(),
|
||
);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
blockSetCheckInCallback(entity);
|
||
}
|
||
}
|
||
|
||
// 设置是否打开考勤
|
||
Future<void> setLockSetGeneralSetting() async {
|
||
final LoginEntity entity = await ApiRepository.to.setCheckInData(
|
||
lockId: state.lockSetInfoData.value.lockId!,
|
||
attendance: state.isAttendance.value == 1 ? 0 : 1,
|
||
);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
state.isAttendance.value = (state.isAttendance.value == 1 ? 0 : 1);
|
||
state.lockSettingInfo.value.attendance = state.isAttendance.value;
|
||
showToast('设置成功'.tr, something: () {
|
||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||
eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(
|
||
0, state.lockSettingInfo.value.attendance!.toString()));
|
||
});
|
||
}
|
||
}
|
||
|
||
// 设置是否打开开锁提醒
|
||
Future<void> setLockPickingReminder() async {
|
||
final LoginEntity entity =
|
||
await ApiRepository.to.setLockPickingReminderData(
|
||
lockId: state.lockSetInfoData.value.lockId!,
|
||
unlockReminder: state.isUnlockReminder.value == 1 ? 0 : 1,
|
||
);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
state.isUnlockReminder.value =
|
||
(state.isUnlockReminder.value == 1 ? 0 : 1);
|
||
state.lockSettingInfo.value.unlockReminder = state.isUnlockReminder.value;
|
||
showToast('设置成功'.tr, something: () {
|
||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||
});
|
||
}
|
||
}
|
||
|
||
// 设置是否打开开锁时是否需联网
|
||
Future<void> setLockSetOpenLockNeedOnline() async {
|
||
final LoginEntity entity = await ApiRepository.to.setOpenLockNeedOnlineData(
|
||
lockId: state.lockSetInfoData.value.lockId!,
|
||
appUnlockOnline: state.isOpenLockNeedOnline.value == 1 ? 0 : 1,
|
||
);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
state.isOpenLockNeedOnline.value =
|
||
(state.isOpenLockNeedOnline.value == 1 ? 0 : 1);
|
||
state.lockSettingInfo.value.appUnlockOnline =
|
||
state.isOpenLockNeedOnline.value;
|
||
|
||
showToast('设置成功'.tr, something: () {
|
||
eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(
|
||
1, state.lockSettingInfo.value.appUnlockOnline!.toString()));
|
||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||
});
|
||
}
|
||
}
|
||
|
||
// 下级界面修改成功后传递数据
|
||
StreamSubscription? _passCurrentLockInformationEvent;
|
||
|
||
void initLoadDataAction(BlockSetStateCallback blockSetStateCallback) {
|
||
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
|
||
_passCurrentLockInformationEvent = eventBus
|
||
.on<PassCurrentLockInformationEvent>()
|
||
.listen((PassCurrentLockInformationEvent event) {
|
||
getLockSettingInfoData();
|
||
});
|
||
}
|
||
|
||
void showDeletAlertTipDialog({String? showContent = ''}) {
|
||
final String content = showContent!.isEmpty
|
||
? "${"删除设备失败,请确保在设备附近,设备未被连接,设备已打开".tr}。${BlueManage().connectDeviceName!.contains("T9A") == true ? "如果是全自动锁,请使屏幕变亮".tr : ""}"
|
||
: showContent;
|
||
state.showTipView.showSureAlertDialog(content);
|
||
}
|
||
|
||
/// 以下为删除逻辑
|
||
void deleyLockLogicOfRoles() {
|
||
if (state.lockBasicInfo.value.isLockOwner == 1) {
|
||
// 超级管理员必须通过连接蓝牙删除q
|
||
state.showTipView
|
||
.showIosTipWithContentDialog('删除锁后,所有信息都会一起删除,确定删除锁吗?'.tr, () {
|
||
// 删除锁
|
||
state.showTipView.resetGetController();
|
||
state.showTipView.showTFViewAlertDialog(
|
||
state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
|
||
});
|
||
} else if (state.lockBasicInfo.value.keyRight == 1) {
|
||
// 授权管理员弹框提示
|
||
state.showTipView.showDeleteAdministratorIsHaveAllDataDialog(
|
||
'同时删除其发送的所有钥匙,钥匙删除后不能恢复'.tr, (bool a) {
|
||
// 授权管理员删除
|
||
state.deleteAdministratorIsHaveAllData.value = a;
|
||
deletKeyData();
|
||
});
|
||
} else {
|
||
// 普通用户直接删除
|
||
state.showTipView.showIosTipWithContentDialog('是否删除钥匙?'.tr, deletKeyData);
|
||
}
|
||
}
|
||
|
||
// 查询账户密码
|
||
Future<void> checkLoginPassword() async {
|
||
final LockListInfoEntity entity = await ApiRepository.to.checkLoginPassword(
|
||
password: state.passwordTF.text,
|
||
);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
Get.back();
|
||
factoryDataResetAction();
|
||
}
|
||
}
|
||
|
||
// 当是锁拥有者的时候,删除锁
|
||
Future<void> deletLockInfoData() async {
|
||
final LockListInfoEntity entity = await ApiRepository.to.deletOwnerLockData(
|
||
lockId: state.lockSetInfoData.value.lockId!,
|
||
);
|
||
final String getMobile = (await Storage.getMobile())!;
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
ApmHelper.instance.trackEvent('delet_lock', {
|
||
'lock_name': BlueManage().connectDeviceName,
|
||
'account':
|
||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||
'date': DateTool().getNowDateWithType(1),
|
||
'delet_type': 'lock',
|
||
'delet_lock_result': '成功',
|
||
});
|
||
|
||
BlueManage().connectDeviceMacAddress = '';
|
||
final bool isOnlyOneData = state.isOnlyOneData.value == true;
|
||
await Future<dynamic>.delayed(const Duration(milliseconds: 200))
|
||
.then((e) {
|
||
Get.close(isOnlyOneData ? 1 : 2);
|
||
});
|
||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||
});
|
||
} else {
|
||
ApmHelper.instance.trackEvent('delet_lock', {
|
||
'lock_name': BlueManage().connectDeviceName,
|
||
'account':
|
||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||
'date': DateTool().getNowDateWithType(1),
|
||
'delet_type': 'lock',
|
||
'delet_lock_result': '${entity.errorCode}--${entity.errorMsg}',
|
||
});
|
||
}
|
||
}
|
||
|
||
// 普通用户或者授权管理员删除钥匙
|
||
Future<void> deletKeyData() async {
|
||
final LockListInfoEntity entity = await ApiRepository.to.deletOwnerKeyData(
|
||
lockId: state.lockSetInfoData.value.lockId.toString(),
|
||
keyId: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||
includeUnderlings:
|
||
state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0);
|
||
final String getMobile = (await Storage.getMobile())!;
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
ApmHelper.instance.trackEvent('delet_lock', {
|
||
'lock_name': BlueManage().connectDeviceName,
|
||
'account':
|
||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||
'date': DateTool().getNowDateWithType(1),
|
||
'delet_type': 'key',
|
||
'delet_lock_result': '成功',
|
||
});
|
||
|
||
BlueManage().connectDeviceMacAddress = '';
|
||
final bool isOnlyOneData = state.isOnlyOneData.value == true;
|
||
await Future<dynamic>.delayed(const Duration(milliseconds: 200))
|
||
.then((e) {
|
||
Get.close(isOnlyOneData ? 1 : 2);
|
||
});
|
||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||
});
|
||
} else {
|
||
ApmHelper.instance.trackEvent('delet_lock', {
|
||
'lock_name': BlueManage().connectDeviceName,
|
||
'account':
|
||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||
'date': DateTool().getNowDateWithType(1),
|
||
'delet_type': 'key',
|
||
'delet_lock_result': '${entity.errorCode}--${entity.errorMsg}',
|
||
});
|
||
}
|
||
}
|
||
|
||
// 上传数据获取设置
|
||
Future<void> getUpdataLockSet() async {
|
||
// showBlueConnetctToastTimer(action: (){
|
||
// });
|
||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||
(BluetoothConnectionState connectionState) async {
|
||
if (connectionState == BluetoothConnectionState.connected) {
|
||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||
|
||
updataLockSet(getTokenList);
|
||
} else if (connectionState == BluetoothConnectionState.disconnected) {
|
||
// cancelBlueConnetctToastTimer();
|
||
// if(state.ifCurrentScreen.value == true){
|
||
// showBlueConnetctToast();
|
||
// }
|
||
}
|
||
});
|
||
}
|
||
|
||
// 公共的上传锁设置
|
||
Future<void> updataLockSet(List<int> token) async {
|
||
final List<String>? privateKey =
|
||
await Storage.getStringList(saveBluePrivateKey);
|
||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||
|
||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||
|
||
IoSenderManage.updataLockSetCommand(
|
||
lockID: BlueManage().connectDeviceName,
|
||
userID: await Storage.getUid(),
|
||
token: token,
|
||
needAuthor: 1,
|
||
signKey: signKeyDataList,
|
||
privateKey: getPrivateKeyList);
|
||
}
|
||
|
||
// 锁数据上传服务器
|
||
Future<void> _lockDataUpload(
|
||
{required int uploadType,
|
||
required int recordType,
|
||
required List records}) async {
|
||
final LoginEntity entity = await ApiRepository.to.lockDataUpload(
|
||
lockId: CommonDataManage().currentKeyInfo.lockId!,
|
||
uploadType: uploadType,
|
||
recordType: recordType,
|
||
records: records,
|
||
isUnShowLoading: true);
|
||
if (entity.errorCode!.codeIsSuccessful) {
|
||
await getLockSettingInfoData();
|
||
update();
|
||
}
|
||
}
|
||
|
||
@override
|
||
void onReady() {
|
||
super.onReady();
|
||
|
||
getUpdataLockSet();
|
||
_initReplySubscription();
|
||
sendGetDeviceModelBleMessage();
|
||
// _scanListDiscoveredDeviceSubscriptionAction();
|
||
}
|
||
|
||
@override
|
||
void onClose() {
|
||
_replySubscription.cancel();
|
||
_passCurrentLockInformationEvent!.cancel();
|
||
// _scanListDiscoveredDeviceSubscription.cancel();
|
||
}
|
||
|
||
// 发送获取型号蓝牙命令
|
||
sendGetDeviceModelBleMessage() {
|
||
showEasyLoading();
|
||
showBlueConnetctToastTimer(action: () {
|
||
dismissEasyLoading();
|
||
});
|
||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||
(BluetoothConnectionState deviceConnectionState) async {
|
||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||
BlueManage().writeCharacteristicWithResponse(
|
||
GetDeviceModelCommand(
|
||
lockID: BlueManage().connectDeviceName,
|
||
).packageData(),
|
||
);
|
||
} else if (deviceConnectionState ==
|
||
BluetoothConnectionState.disconnected) {
|
||
dismissEasyLoading();
|
||
cancelBlueConnetctToastTimer();
|
||
showBlueConnetctToast();
|
||
}
|
||
});
|
||
}
|
||
|
||
void _handlerDeviceModelReply(GetDeviceModelReply reply) async {
|
||
final int status = reply.data[2];
|
||
switch (status) {
|
||
case 0x00:
|
||
//成功
|
||
cancelBlueConnetctToastTimer();
|
||
// 3. 解析DeviceModel(40字节,索引3~42)
|
||
int startIndex = 3;
|
||
int length = 40;
|
||
List<int> deviceModelBytes =
|
||
reply.data.sublist(startIndex, startIndex + length);
|
||
|
||
String rawData = String.fromCharCodes(deviceModelBytes);
|
||
int firstNullIndex = rawData.indexOf('\u0000');
|
||
String deviceModelValue = rawData.substring(0, firstNullIndex);
|
||
print(deviceModelValue); // 输出: 2403
|
||
print('获取到 DeviceModel (原始): $deviceModelValue');
|
||
await Storage.setString(deviceModel, deviceModelValue);
|
||
break;
|
||
default:
|
||
showToast('获取设备型号失败'.tr);
|
||
break;
|
||
}
|
||
}
|
||
}
|