diff --git a/lib/blue/io_sender.dart b/lib/blue/io_sender.dart index cbd1c631..67a67e7b 100755 --- a/lib/blue/io_sender.dart +++ b/lib/blue/io_sender.dart @@ -1,4 +1,3 @@ - import 'package:star_lock/app_settings/app_settings.dart'; import 'io_tool/io_manager.dart'; @@ -8,12 +7,14 @@ abstract class IOData { List messageDetail(); } -abstract class SenderProtocol extends IOData { //数据块 +abstract class SenderProtocol extends IOData { + //数据块 // final int? tail = 0xFF; //用来校验包的完整性,采用 CRC 校验方法,长度为 2 个字节 SenderProtocol(this.commandType) { _commandIndex = IoManager().commandIndex; } + // var uint8View1 = Uint8List(300); CommandType? commandType; //指令类型 @@ -33,8 +34,8 @@ abstract class SenderProtocol extends IOData { //数据块 void printLog(List data) { AppLog.log( - "App -> 锁,指令类型:${commandType!.typeName} ${commandType!.typeValue == 0x3030 - ? '子命令:${data[3]}' : ''} \n参数是:\n${toString()} \n加密之前数据是:\n$data 长度是:${data.length}"); + "App -> 锁,指令类型:${commandType!.typeName} ${commandType!.typeValue == 0x3030 ? '子命令:${data[3]}' : ''} \n参数是:\n${toString()} \n加密之前数据是:\n$data 长度是:${data.length}"); + AppLog.log("子命令数据是:${data.sublist(66, 79)}"); } // 拼装数据 diff --git a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart index 17398032..dda931b0 100755 --- a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart +++ b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; 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/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/card/addICCard/addICCard_entity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; @@ -52,11 +53,11 @@ class AddICCardLogic extends BaseGetXController { switch (status) { case 0x00: //成功 - final List cardNumberList = - reply.data.sublist(reply.data.length - 2); - final String cardNumber = listChangInt(cardNumberList).toString(); - // AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber"); - state.cardNumber.value = cardNumber.toString(); + // final List cardNumberList = + // reply.data.sublist(reply.data.length - 2); + // final String cardNumber = listChangInt(cardNumberList).toString(); + // // AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber"); + // state.cardNumber.value = cardNumber.toString(); cancelBlueConnetctToastTimer(); state.ifAddState.value = true; @@ -134,6 +135,10 @@ class AddICCardLogic extends BaseGetXController { 'date': DateTool().getNowDateWithType(1), 'add_card_result': '成功', }); + AppLog.log('data:${reply.data}'); + final List cardNumberList = reply.data.sublist(6, 8); + final String cardNumber = listChangInt(cardNumberList).toString(); + state.cardNumber.value = cardNumber.toString(); switch (reply.data[5]) { case 0xff: // 注册指纹失败 diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart index c64479b0..66c5e50a 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_logic.dart @@ -47,6 +47,8 @@ class CatEyeCustomModeLogic extends BaseGetXController { } } } + await _getConfigAndGenerateBleData(); + updateCatEyeSetConfig(); return entity; } @@ -79,8 +81,7 @@ class CatEyeCustomModeLogic extends BaseGetXController { ); if (entity.errorCode!.codeIsSuccessful) { showToast('设置成功'.tr); - _getConfigAndGenerateBleData(); - updateCatEyeSetConfig(); + await getLockSettingInfoData(); } } @@ -206,14 +207,6 @@ class CatEyeCustomModeLogic extends BaseGetXController { privateKey: getPrivateKeyList, ); final packageData = command.packageData(); - - // 将 List 转换为十六进制字符串 - String hexString = packageData - .map((byte) => byte.toRadixString(16).padLeft(2, '0')) - .join(' '); - - AppLog.log('open lock hexString: $hexString'); - /// 发送星图 StartChartManage().sendBleMessage( bluetoothDeviceName: BlueManage().connectDeviceName, diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart index 1ae06b97..e4dc25a9 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_logic.dart @@ -29,7 +29,7 @@ class CatEyeSetLogic extends BaseGetXController { state.catEyeConfig.value.autoLightScreen = state.isAutoBright.value == true ? 1 : 0; state.catEyeConfig.refresh(); - updateCatEyeSetConfig(); + await getLockSettingInfoData(); } } @@ -46,7 +46,7 @@ class CatEyeSetLogic extends BaseGetXController { state.catEyeConfig.value.autoLightScreenTime = int.parse(state.selectBrightDuration.value.replaceAll('秒'.tr, '')); state.catEyeConfig.refresh(); - updateCatEyeSetConfig(); + await getLockSettingInfoData(); } } @@ -62,7 +62,7 @@ class CatEyeSetLogic extends BaseGetXController { state.catEyeConfig.value.autoLightScreen = state.isStayWarning.value == true ? 1 : 0; state.catEyeConfig.refresh(); - updateCatEyeSetConfig(); + await getLockSettingInfoData(); } } @@ -78,7 +78,7 @@ class CatEyeSetLogic extends BaseGetXController { state.catEyeConfig.value.autoLightScreen = state.isExceptionWarning.value == true ? 1 : 0; state.catEyeConfig.refresh(); - updateCatEyeSetConfig(); + await getLockSettingInfoData(); } } @@ -137,14 +137,14 @@ class CatEyeSetLogic extends BaseGetXController { XSConstantMacro.catEyeWorkModeCustom) { state.selectCatEyeWorkMode.value = '自定义模式'.tr; } - _getConfigAndGenerateBleData(); - updateCatEyeSetConfig(); } } + await _getConfigAndGenerateBleData(); + updateCatEyeSetConfig(); return entity; } - _getConfigAndGenerateBleData() { + _getConfigAndGenerateBleData() async { // 假设 state.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode 是一个整数 int originalCatEyeMode = state .lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode!; @@ -168,13 +168,19 @@ class CatEyeSetLogic extends BaseGetXController { int recordTime = _handleGetIntNumber(state.lockSetInfoData.value .lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordTime!); - int detectionDistance = _handleDetectionDistance(state - .lockSetInfoData - .value - .lockSettingInfo! - .catEyeConfig![0] - .catEyeModeConfig! - .detectionDistance!); + int detectionDistance = 0; + if (state.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0]! + .catEyeModeConfig!.detectionDistance != + null) { + detectionDistance = _handleDetectionDistance(state + .lockSetInfoData + .value + .lockSettingInfo! + .catEyeConfig![0] + .catEyeModeConfig! + .detectionDistance!); + } + int realTimeMode = state.lockSetInfoData.value.lockSettingInfo! .catEyeConfig![0].catEyeModeConfig!.realTimeMode!; @@ -254,10 +260,10 @@ class CatEyeSetLogic extends BaseGetXController { final List? publicKey = await Storage.getStringList(saveBluePublicKey); final List getPublicKeyList = changeStringListToIntList(publicKey!); - + final userId = await Storage.getUid(); final command = SetSupportFunctionsWithParametersCommand( keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), - userID: await Storage.getUid(), + userID: userId, featureBit: 64, featureParaLength: config.length, featureData: config, @@ -273,7 +279,7 @@ class CatEyeSetLogic extends BaseGetXController { .map((byte) => byte.toRadixString(16).padLeft(2, '0')) .join(' '); - AppLog.log('open lock hexString: $hexString'); + AppLog.log('发送透传猫眼设置: $hexString'); /// 发送星图 StartChartManage().sendBleMessage( @@ -344,10 +350,10 @@ class CatEyeSetLogic extends BaseGetXController { DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(recordStartTime); // 提取小时和分钟 - int hour = dateTime.hour; - int minute = dateTime.minute; +// int hour = dateTime.hour; +// int minute = dateTime.minute; - print("时: $hour, 分: $minute"); + // print("时: $hour, 分: $minute"); // 计算从当天0点开始的分钟数 int minutesSinceMidnight = dateTime.hour * 60 + dateTime.minute; diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart index 981a9d48..a3f59353 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_logic.dart @@ -1,12 +1,16 @@ 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/blue/blue_manage.dart'; +import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart'; import 'package:star_lock/blue/io_tool/io_tool.dart'; import 'package:star_lock/blue/sender_manage.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; +import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/versionUndate/versionUndate_entity.dart'; @@ -56,6 +60,8 @@ class CatEyeWorkModeLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) { showToast('设置成功'.tr); getLockSettingInfoData(); + + updateCatEyeSetConfig(); } } @@ -122,7 +128,252 @@ class CatEyeWorkModeLogic extends BaseGetXController { XSConstantMacro.catEyeWorkModeCustom) { state.boolList.value = [false, false, false, true]; } + _getConfigAndGenerateBleData(); + updateCatEyeSetConfig(); } } } + + _getConfigAndGenerateBleData() { +// 假设 state.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode 是一个整数 + int originalCatEyeMode = state + .lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode!; + int recordMode = state.lockSetInfoData.value.lockSettingInfo! + .catEyeConfig![0].catEyeModeConfig!.recordMode == + 0 + ? 1 + : 0; + + int stayWarn = state.lockSetInfoData.value.lockSettingInfo!.stayWarn!; + int abnormalWarn = + state.lockSetInfoData.value.lockSettingInfo!.abnormalWarn!; + int autoLightScreen = + state.lockSetInfoData.value.lockSettingInfo!.autoLightScreen!; + + int recordStartTime = _handleTimeToM(state.lockSetInfoData.value + .lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordStartTime!); + int recordEndTime = _handleTimeToM(state.lockSetInfoData.value + .lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordEndTime!); + + int recordTime = _handleGetIntNumber(state.lockSetInfoData.value + .lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordTime!); + + int detectionDistance = _handleDetectionDistance(state + .lockSetInfoData + .value + .lockSettingInfo! + .catEyeConfig![0] + .catEyeModeConfig! + .detectionDistance!); + int realTimeMode = state.lockSetInfoData.value.lockSettingInfo! + .catEyeConfig![0].catEyeModeConfig!.realTimeMode!; + + // 根据需要调整 catEyeMode 的值 + int adjustedCatEyeMode = + originalCatEyeMode > 0 ? originalCatEyeMode - 1 : originalCatEyeMode; + int brightScreenTime = + state.lockSetInfoData.value.lockSettingInfo!.autoLightScreenTime!; + + /// 对照星锁接口文档v0.2 的猫眼设置接口,获取出猫眼的所有设置 + state.catEyeConfig.value = CatEyeSetEntity( + catEyeMode: adjustedCatEyeMode, + // 猫眼模式 看常量表 + recordMode: recordMode, + //录像时段 0全天 1自定义时间 + recordStartTime: recordStartTime, + //自定义时间需要填:recordStartTime与recordEndTime参数 + recordEndTime: recordEndTime, + //自定义时间需要填:recordStartTime与recordEndTime参数 + realTimeMode: realTimeMode, + autoLightScreenTime: brightScreenTime, + stayWarn: stayWarn, + autoLightScreen: autoLightScreen, + // 打开自动亮屏 + abnormalWarn: abnormalWarn, + // 有人出现时录像时间 + recordTime: recordTime, + // 人体检测距离 + detectionDistance: detectionDistance, + realTimePicture: realTimeMode, + ); + state.catEyeConfig.refresh(); + } + + /// 更新锁板上的猫眼配置 + void updateCatEyeSetConfig() async { + final int operatingMode = state.catEyeConfig.value.catEyeMode ?? 1; // 自定义模式 + final int isAllDay = state.catEyeConfig.value.recordMode ?? 1; // 是否是全天 + final int startTime = + state.catEyeConfig.value.recordStartTime ?? 480; // 8:00 AM + final int endTime = + state.catEyeConfig.value.recordEndTime ?? 1080; // 6:00 PM + final int recordingTime = state.catEyeConfig.value.recordTime ?? 0; // 立即录像 + final int detectionDistance = + state.catEyeConfig.value.detectionDistance ?? 0; //0:0.8米 + final int realTimePicture = + state.catEyeConfig.value.realTimePicture ?? 0; // 实时查看 + final int automaticBrightening = + state.catEyeConfig.value.autoLightScreen ?? 1; // 打开逗留警告 + final int brightScreenTime = + state.catEyeConfig.value.autoLightScreenTime ?? 10; // 亮屏持续时间为15秒 + final int stayWarning = state.catEyeConfig.value.stayWarn ?? 1; // 打开逗留警告 + final int exceptionWarning = + state.catEyeConfig.value.abnormalWarn ?? 1; // 打开逗留警告 + + /// 生成配置,非自定义功能字段默认填充0 + final List config = generateConfig( + operatingMode: operatingMode, + isAllDay: isAllDay, + startTime: startTime, + endTime: endTime, + recordingTime: recordingTime, + detectionDistance: detectionDistance, + realTimePicture: realTimePicture, + automaticBrightening: automaticBrightening, + brightScreenTime: brightScreenTime, + stayWarning: stayWarning, + exceptionWarning: exceptionWarning, + ); + 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? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); + + final command = SetSupportFunctionsWithParametersCommand( + keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), + userID: await Storage.getUid(), + featureBit: 64, + featureParaLength: config.length, + featureData: config, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList, + ); + final packageData = command.packageData(); + + // 将 List 转换为十六进制字符串 + String hexString = packageData + .map((byte) => byte.toRadixString(16).padLeft(2, '0')) + .join(' '); + + AppLog.log('catEye set: $hexString'); + + /// 发送星图 + StartChartManage().sendBleMessage( + bluetoothDeviceName: BlueManage().connectDeviceName, + bleStructData: packageData, + ); + } + + // 根据提供的参数生成配置列表 + List generateConfig({ + required int operatingMode, + required int isAllDay, + required int startTime, + required int endTime, + required int recordingTime, + required int detectionDistance, + required int realTimePicture, + required int automaticBrightening, + required int brightScreenTime, + required int stayWarning, + required int exceptionWarning, + }) { + // 初始化一个空的列表 + List config = []; + + // 添加 operatingMode + config.add(operatingMode); + + // 如果不是自定义模式,则填充0;否则添加对应的值 + if (operatingMode != 3) { + config.addAll( + [0, 0, 0, 0, 0, 0]); // 对应 IsAllDay, StartTime, EndTime, recordingTime + } else { + config.add(isAllDay); + config.addAll(_intToBytes(startTime, 2)); // StartTime 占用2个字节 + config.addAll(_intToBytes(endTime, 2)); // EndTime 占用2个字节 + config.add(recordingTime); + } + + // 如果不是自定义模式,则 detectionDistance 和 realTimePicture 也填充0 + if (operatingMode != 3) { + config.addAll([0, 0]); + } else { + config.add(detectionDistance); + config.add(realTimePicture); + } + + // 自动亮屏、亮屏持续时间、逗留警告、异常警告 + config.add(automaticBrightening); + config.add(brightScreenTime); + config.add(stayWarning); + config.add(exceptionWarning); + + return config; + } + + // 将整数转换为指定长度的字节表示形式 + List _intToBytes(int value, int length) { + List bytes = []; + for (int i = length - 1; i >= 0; i--) { + bytes.add((value >> (8 * i)) & 0xFF); + } + return bytes; + } + + int _handleTimeToM(int recordStartTime) { +// 转换为 DateTime 对象 + DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(recordStartTime); + +// 提取小时和分钟 + int hour = dateTime.hour; + int minute = dateTime.minute; + + print("时: $hour, 分: $minute"); + +// 计算从当天0点开始的分钟数 + int minutesSinceMidnight = dateTime.hour * 60 + dateTime.minute; + return minutesSinceMidnight; + } + + int _handleGetIntNumber(String recordTime) { + if (recordTime == '不录像') { + return 0; + } + if (recordTime == '立即录像') { + return 1; + } + // 使用正则表达式匹配字符串中的数字 + RegExp regExp = RegExp(r'(\d+)秒'); + Match? match = regExp.firstMatch(recordTime); + + if (match != null && match.groupCount >= 1) { + // 提取出的数字是字符串形式,需要转换成整数 + int number = int.parse(match.group(1)!); + return number; + } else { + return 0; + } + } + + int _handleDetectionDistance(String s) { + if (s == '约0.8米') { + return 0; + } + if (s == '约1.5米') { + return 1; + } + if (s == '约3.0米') { + return 2; + } + return 0; + } } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart index 7e7973bd..5d0c150a 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; class CatEyeWorkModeState { @@ -31,4 +32,6 @@ class CatEyeWorkModeState { // var selectCatEyeWorkMode = 0.obs; //猫眼工作模式 RxList boolList = [false, false, false, false].obs; Rx catEyeConfigData = CatEyeConfig().obs; + /// 猫眼配置 + Rx catEyeConfig = CatEyeSetEntity().obs; } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart index 7ba96c46..b97df6be 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_logic.dart @@ -238,7 +238,6 @@ class VideoSlotLogic extends BaseGetXController { .map((byte) => byte.toRadixString(16).padLeft(2, '0')) .join(' '); - AppLog.log('open lock hexString: $hexString'); /// 发送星图 StartChartManage().sendBleMessage( diff --git a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart index 72525db9..fa08f628 100755 --- a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart +++ b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_logic.dart @@ -199,13 +199,6 @@ class LiveVideoLogic extends BaseGetXController { ); final packageData = command.packageData(); - // 将 List 转换为十六进制字符串 - String hexString = packageData - .map((byte) => byte.toRadixString(16).padLeft(2, '0')) - .join(' '); - - AppLog.log('open lock hexString: $hexString'); - /// 发送星图 StartChartManage().sendBleMessage( bluetoothDeviceName: BlueManage().connectDeviceName, diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 095c27ac..4ee12c03 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -1089,7 +1089,7 @@ class StartChartManage { void sendBleMessage({ required String bluetoothDeviceName, required List bleStructData, - }) { + }) async { // 组装上线消息 final message = MessageCommand.bleMessage( FromPeerId: FromPeerId, @@ -1098,7 +1098,7 @@ class StartChartManage { bluetoothDeviceName: bluetoothDeviceName, bleStructData: bleStructData, ); - _sendMessage(message: message); + await _sendMessage(message: message); } /// 销毁资源