app-starlock/lib/blue/reciver_data.dart

802 lines
22 KiB
Dart
Executable File
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:convert';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart';
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
import 'package:star_lock/blue/io_protocol/io_addFace.dart';
import 'package:star_lock/blue/io_protocol/io_addPalmWithTimeCycleCoercion.dart';
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
import 'package:star_lock/blue/io_protocol/io_getDeviceModel.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart';
import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart';
import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart';
import 'package:star_lock/blue/io_protocol/io_referEventRecordTime.dart';
import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsNoParameters.dart';
import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart';
import 'package:star_lock/blue/io_protocol/io_timing.dart';
import 'package:star_lock/blue/io_protocol/io_voicePackageConfigure.dart';
import 'package:star_lock/blue/io_protocol/io_voicePackageConfigureProcess.dart';
import '../tools/storage.dart';
import 'io_gateway/io_gateway_getStatus.dart';
import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart';
import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart';
import 'io_protocol/io_addRemoteControlWithTimeCycleCoercion.dart';
import 'io_protocol/io_addUser.dart';
import 'io_protocol/io_configuringWifi.dart';
import 'io_protocol/io_getPrivateKey.dart';
import 'io_protocol/io_getPublicKey.dart';
import 'io_protocol/io_getStarLockStatusInfo.dart';
import 'io_protocol/io_getWifiList.dart';
import 'io_protocol/io_openLock.dart';
import 'io_protocol/io_senderCustomPasswords.dart';
import 'io_protocol/io_senderResetPasswords.dart';
import 'io_protocol/io_transferSmartLock.dart';
import 'io_protocol/io_updataLockCardList.dart';
import 'io_protocol/io_updataLockFaceList.dart';
import 'io_protocol/io_updataLockFingerprintList.dart';
import 'io_protocol/io_updataLockPalmVeinList.dart';
import 'io_protocol/io_updataLockPasswordList.dart';
import 'io_protocol/io_updataLockRemoteControlList.dart';
import 'io_protocol/io_updataLockSet.dart';
import 'io_reply.dart';
import 'io_tool/io_manager.dart';
import 'io_tool/io_tool.dart';
import 'io_tool/manager_event_bus.dart';
import 'io_type.dart';
import 'sm4Encipher/sm4.dart';
class CommandReciverManager {
static Future<void> appDataReceive(List<int> data) async {
///解析数据
if (data.isEmpty) {
return;
}
final int dataSize = data.length;
// 验证CRC校验
// if (dataSize >= 2) {
// final int calculatedCrc =
// _calculateCRC16(data.sublist(0, dataSize - 2), dataSize - 2);
// final int receivedCrc = (data[dataSize - 2] << 8) | data[dataSize - 1];
//
// if (calculatedCrc != receivedCrc) {
// throw Exception('CRC校验失败');
// return;
// }
// }
// 当小于包头加起来13个字节
if (dataSize < 13) {
return;
}
if ((data[0] == 0xEF) &&
(data[1] == 0x01) &&
(data[2] == 0xEE) &&
(data[3] == 0x02)) {
final int tmpType = data[7] & 0x0f; // 包标识
// AppLog.log('temType:$tmpType');
final int dataLen = data[8] * 256 + data[9]; // 高16位用来指示后面数据块内容的长度
final int oriLen = data[10] * 256 + data[11]; // 低16位用来指示数据加密前的原长度
// AppLog.log("dataLen:$dataLen oriLen:$oriLen");
List<int> oriDataList = <int>[];
switch (tmpType) {
case 0: //不加密
// for (var i = 0; i < oriLen ; i++) {
// oriDataList.add(data[12 + i]);
// }
oriDataList = data.sublist(12, 12 + dataLen);
AppLog.log('不加密 :$oriDataList');
break;
case 1:
//AES128
break;
case 2:
// SM4事先约定密钥
// 获取的加密数组
final List<int> getDataList = data.sublist(12, 12 + dataLen);
// 解密
// String key = SM4.createHexKey(key: IoManager().getCurrentDeviceLockId);
oriDataList = SM4.decrypt(getDataList,
key: utf8.encode(BlueManage().connectDeviceName),
mode: SM4CryptoMode.ECB);
oriDataList = oriDataList.sublist(0, oriLen);
AppLog.log('APP收到的解密后的数据:$oriDataList');
break;
case 3:
//SM4设备指定密钥
// 获取的加密数组
final List<int> getDataList = data.sublist(12, 12 + dataLen);
final List<String>? res =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(res!);
// 解密
oriDataList = SM4.decrypt(getDataList,
key: getPrivateKeyList, mode: SM4CryptoMode.ECB);
oriDataList = oriDataList.sublist(0, oriLen);
AppLog.log('APP收到的解密后的数据:$oriDataList data:$data');
break;
}
parseData(oriDataList).then((Reply? value) async {
// EasyLoading.dismiss();
await EventBusManager().eventBusFir(value);
}).catchError((Object error) {
AppLog.log('APP解析数据时发生错误: ${error.toString()}');
});
}
}
// CRC16 校验计算
static int _calculateCRC16(List<int> bytes, int len) {
int value = 0x0000;
for (int i = 0; i < len; i++) {
int tmp = _reverse8(bytes[i]);
value = ((value << 8) ^ _crcTable[(value >> 8) ^ tmp & 0xFF]) & 0xFFFF;
}
return _reverse16(value);
}
static Future<Reply?> parseData(List<int> data) async {
if (data.isNotEmpty) {
final int cmd = data[0] * 256 + data[1];
final CommandType commandType = ExtensionCommandType.getCommandType(cmd);
await IoManager().increaseCommandIndex();
// data.removeRange(0, 2);
Reply? reply;
switch (commandType) {
case CommandType.getLockPublicKey:
{
reply = GetPublicKeyReply.parseData(commandType, data);
}
break;
case CommandType.getLockPrivateKey:
{
reply = GetPrivateKeyReply.parseData(commandType, data);
}
break;
case CommandType.addUser:
{
reply = AddUserReply.parseData(commandType, data);
}
break;
case CommandType.deletUser:
{
reply = DeletUserReply.parseData(commandType, data);
}
break;
case CommandType.openLock:
{
reply = OpenDoorReply.parseData(commandType, data);
}
break;
// 弃用
// case CommandType.readLockStatusInfo:
// {
// reply = GetLockStatuReply.parseData(commandType, data);
// }
// break;
case CommandType.editUser:
{
reply = EditUserReply.parseData(commandType, data);
}
break;
case CommandType.transferSmartLock:
{
reply = TransferSmartLockReply.parseData(commandType, data);
}
break;
case CommandType.factoryDataReset:
{
reply = FactoryDataResetReply.parseData(commandType, data);
}
break;
case CommandType.calibrationTime:
{
reply = TimingReply.parseData(commandType, data);
}
break;
case CommandType.readStarLockStatusInfo:
{
reply = GetStarLockStatuInfoReply.parseData(commandType, data);
}
break;
case CommandType.startOATUpgrade:
{
reply = OTAUpgradeReply.parseData(commandType, data);
}
break;
case CommandType.confirmationOTAUpgrade:
{
reply = ConfirmationOTAUpgradeReply.parseData(commandType, data);
}
break;
case CommandType.processOTAUpgrade:
{
reply = ProcessOtaUpgradeReply.parseData(commandType, data);
}
break;
case CommandType.cleanUpUsers:
{
reply = CleanUpUsersReply.parseData(commandType, data);
}
break;
case CommandType.updataLockPasswordList:
{
reply = UpdataLockPasswordListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockCardList:
{
reply = UpdataLockCardListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockFingerprintList:
{
reply = UpdataLockFingerprintListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockFaceList:
{
reply = UpdataLockFaceListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockPalmVeinList:
{
reply = UpdataLockPalmVeinListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockRemoteControlList:
{
reply =
UpdataLockRemoteControlListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockSet:
{
reply = UpdataLockSetReply.parseData(commandType, data);
}
break;
case CommandType.gatewayConfiguringWifi:
{
reply = GatewayConfiguringWifiReply.parseData(commandType, data);
}
break;
case CommandType.gatewayConfiguringWifiResult:
{
reply =
GatewayConfiguringWifiResultReply.parseData(commandType, data);
}
break;
case CommandType.gatewayGetWifiList:
{
reply = GatewayGetWifiReply.parseData(commandType, data);
}
break;
case CommandType.gatewayGetWifiListResult:
{
reply = GatewayGetWifiListReply.parseData(commandType, data);
}
break;
case CommandType.gatewayGetStatus:
{
reply = GatewayGetStatusReply.parseData(commandType, data);
}
break;
case CommandType.getDeviceModel:
{
reply = GetDeviceModelReply.parseData(commandType, data);
}
break;
case CommandType.startVoicePackageConfigure:
{
reply = VoicePackageConfigureReply.parseData(commandType, data);
}
break;
case CommandType.voicePackageConfigureProcess:
{
reply =
VoicePackageConfigureProcessReply.parseData(commandType, data);
}
break;
case CommandType.voicePackageConfigureConfirmation:
{
reply = VoicePackageConfigureConfirmationReply.parseData(
commandType, data);
}
break;
case CommandType.generalExtendedCommond:
{
// 子命令类型
final int subType = data[3];
switch (subType) {
case 2:
{
// 修改管理员密码
reply = ChangeAdministratorPasswordReply.parseData(
commandType, data);
}
break;
case 3:
{
// 设置开锁密码
reply =
SenderCustomPasswordsReply.parseData(commandType, data);
}
break;
// case 4:
// {
// // 自动落锁开关
// reply = AutomaticPadlockReply.parseData(commandType, data);
// }
// break;
case 19:
{
// 重置开锁密码
reply =
SenderResetPasswordsReply.parseData(commandType, data);
}
break;
// case 21:
// {
// // 注册卡片开始
// reply = SenderAddICCardReply.parseData(commandType, data);
// }
// break;
case 22:
{
// 注册卡片确认
reply = SenderAddICCardConfirmationReply.parseData(
commandType, data);
}
break;
case 24:
{
// 注册卡片开始
reply = SenderAddICCardWithTimeCycleCoercionReply.parseData(
commandType, data);
}
break;
case 26:
{
// 注册遥控开始
reply = SenderAddRemoteControlWithTimeCycleCoercionReply
.parseData(commandType, data);
}
break;
case 27:
{
// 注册遥控确认
reply = SenderAddRemoteControlConfirmationReply.parseData(
commandType, data);
}
break;
case 32:
{
// 注册指纹确认
reply = SenderAddFingerprintConfirmationReply.parseData(
commandType, data);
}
break;
case 33:
{
// 注册指纹过程
reply = SenderAddFingerprintProcessReply.parseData(
commandType, data);
}
break;
case 36:
{
// 注册指纹开始(带限时、循环、胁迫...)
reply =
SenderAddFingerprintWithTimeCycleCoercionReply.parseData(
commandType, data);
}
break;
case 41:
{
// 时间条件查询事件记录
reply = SenderReferEventRecordTimeReply.parseData(
commandType, data);
}
break;
case 42:
{
// 注册掌静脉开始
reply = SenderAddPalmWithTimeCycleCoercionReply.parseData(
commandType, data);
}
break;
case 43:
{
// 注册掌静脉确认
reply = SenderAddPalmConfirmationReply.parseData(
commandType, data);
}
break;
// case 50:
// {
// // wifi配网
// reply = SenderConfiguringWifiReply.parseData(commandType, data);
// }
// break;
case 51:
{
// wifi配网结果
reply =
SenderConfiguringWifiReply.parseData(commandType, data);
}
break;
case 53:
{
// 获取wifilist
reply = SenderGetWifiReply.parseData(commandType, data);
}
break;
case 54:
{
// 门锁搜索2.4G WIFI SSID 结果
reply = SenderGetWifiListReply.parseData(commandType, data);
}
break;
case 70:
{
// 设置支持功能(不带参数)启用/禁用
reply = SetSupportFunctionsNoParametersReply.parseData(
commandType, data);
}
break;
case 71:
{
// 读取支持功能(不带参数)启用/禁用状态
reply = ReadSupportFunctionsNoParametersReply.parseData(
commandType, data);
}
break;
case 72:
{
// 设置支持功能(带参数)
reply = SetSupportFunctionsWithParametersReply.parseData(
commandType, data);
}
break;
case 73:
{
// 读取支持功能(带参数)参数
reply = ReadSupportFunctionsWithParametersReply.parseData(
commandType, data);
}
break;
case 74:
{
// 读取管理员密码
reply =
SenderReadAdminPasswordReply.parseData(commandType, data);
}
break;
case 81:
{
// 注册人脸开始
reply = SenderAddFaceReply.parseData(commandType, data);
}
break;
case 82:
{
// 注册人脸确认
reply = SenderAddFaceConfirmationReply.parseData(
commandType, data);
}
break;
case 83:
{
// 注册人脸过程
reply =
SenderAddFaceProcessReply.parseData(commandType, data);
}
break;
}
}
break;
default:
{
reply = GetStarLockStatuInfoReply.parseData(commandType, data);
}
break;
}
return reply;
}
return null;
}
// CRC16 查找表
static const List<int> _crcTable = [
0x0000,
0x1021,
0x2042,
0x3063,
0x4084,
0x50a5,
0x60c6,
0x70e7,
0x8108,
0x9129,
0xa14a,
0xb16b,
0xc18c,
0xd1ad,
0xe1ce,
0xf1ef,
0x1231,
0x0210,
0x3273,
0x2252,
0x52b5,
0x4294,
0x72f7,
0x62d6,
0x9339,
0x8318,
0xb37b,
0xa35a,
0xd3bd,
0xc39c,
0xf3ff,
0xe3de,
0x2462,
0x3443,
0x0420,
0x1401,
0x64e6,
0x74c7,
0x44a4,
0x5485,
0xa56a,
0xb54b,
0x8528,
0x9509,
0xe5ee,
0xf5cf,
0xc5ac,
0xd58d,
0x3653,
0x2672,
0x1611,
0x0630,
0x76d7,
0x66f6,
0x5695,
0x46b4,
0xb75b,
0xa77a,
0x9719,
0x8738,
0xf7df,
0xe7fe,
0xd79d,
0xc7bc,
0x48c4,
0x58e5,
0x6886,
0x78a7,
0x0840,
0x1861,
0x2802,
0x3823,
0xc9cc,
0xd9ed,
0xe98e,
0xf9af,
0x8948,
0x9969,
0xa90a,
0xb92b,
0x5af5,
0x4ad4,
0x7ab7,
0x6a96,
0x1a71,
0x0a50,
0x3a33,
0x2a12,
0xdbfd,
0xcbdc,
0xfbbf,
0xeb9e,
0x9b79,
0x8b58,
0xbb3b,
0xab1a,
0x6ca6,
0x7c87,
0x4ce4,
0x5cc5,
0x2c22,
0x3c03,
0x0c60,
0x1c41,
0xedae,
0xfd8f,
0xcdec,
0xddcd,
0xad2a,
0xbd0b,
0x8d68,
0x9d49,
0x7e97,
0x6eb6,
0x5ed5,
0x4ef4,
0x3e13,
0x2e32,
0x1e51,
0x0e70,
0xff9f,
0xefbe,
0xdfdd,
0xcffc,
0xbf1b,
0xaf3a,
0x9f59,
0x8f78,
0x9188,
0x81a9,
0xb1ca,
0xa1eb,
0xd10c,
0xc12d,
0xf14e,
0xe16f,
0x1080,
0x00a1,
0x30c2,
0x20e3,
0x5004,
0x4025,
0x7046,
0x6067,
0x83b9,
0x9398,
0xa3fb,
0xb3da,
0xc33d,
0xd31c,
0xe37f,
0xf35e,
0x02b1,
0x1290,
0x22f3,
0x32d2,
0x4235,
0x5214,
0x6277,
0x7256,
0xb5ea,
0xa5cb,
0x95a8,
0x8589,
0xf56e,
0xe54f,
0xd52c,
0xc50d,
0x34e2,
0x24c3,
0x14a0,
0x0481,
0x7466,
0x6447,
0x5424,
0x4405,
0xa7db,
0xb7fa,
0x8799,
0x97b8,
0xe75f,
0xf77e,
0xc71d,
0xd73c,
0x26d3,
0x36f2,
0x0691,
0x16b0,
0x6657,
0x7676,
0x4615,
0x5634,
0xd94c,
0xc96d,
0xf90e,
0xe92f,
0x99c8,
0x89e9,
0xb98a,
0xa9ab,
0x5844,
0x4865,
0x7806,
0x6827,
0x18c0,
0x08e1,
0x3882,
0x28a3,
0xcb7d,
0xdb5c,
0xeb3f,
0xfb1e,
0x8bf9,
0x9bd8,
0xabbb,
0xbb9a,
0x4a75,
0x5a54,
0x6a37,
0x7a16,
0x0af1,
0x1ad0,
0x2ab3,
0x3a92,
0xfd2e,
0xed0f,
0xdd6c,
0xcd4d,
0xbdaa,
0xad8b,
0x9de8,
0x8dc9,
0x7c26,
0x6c07,
0x5c64,
0x4c45,
0x3ca2,
0x2c83,
0x1ce0,
0x0cc1,
0xef1f,
0xff3e,
0xcf5d,
0xdf7c,
0xaf9b,
0xbfba,
0x8fd9,
0x9ff8,
0x6e17,
0x7e36,
0x4e55,
0x5e74,
0x2e93,
0x3eb2,
0x0ed1,
0x1ef0
];
// 8位字节反转
static int _reverse8(int data) {
int temp = 0;
for (int i = 0; i < 8; i++) {
temp |= ((data >> i) & 0x01) << (7 - i);
}
return temp;
}
// 16位字反转
static int _reverse16(int data) {
int temp = 0;
for (int i = 0; i < 16; i++) {
temp |= ((data >> i) & 0x0001) << (15 - i);
}
return temp;
}
}