app-starlock/star_lock/lib/blue/reciver_data.dart

113 lines
3.8 KiB
Dart
Raw Normal View History

2023-08-08 09:42:35 +08:00
import 'io_protocol/io_addUser.dart';
2023-08-11 14:50:42 +08:00
import 'io_protocol/io_getPrivateKey.dart';
2023-08-08 09:42:35 +08:00
import 'io_protocol/io_getPublicKey.dart';
import 'io_protocol/io_openDoor.dart';
import 'io_protocol/io_reply.dart';
import 'io_protocol/io_type.dart';
import 'io_tool/io_tool.dart';
import 'io_tool/manager_event_bus.dart';
2023-08-11 14:50:42 +08:00
import 'sm4Encipher/sm4.dart';
2023-08-08 09:42:35 +08:00
class CommandReciverManager {
2023-08-09 09:32:09 +08:00
static void appDataReceive(List<int> data, String lockId) async {
2023-08-08 09:42:35 +08:00
///解析数据
2023-08-09 09:32:09 +08:00
if(data.isEmpty){
return;
2023-08-08 09:42:35 +08:00
}
int data_size = data.length;
2023-08-09 09:32:09 +08:00
// 当小于包头加起来13个字节
if(data_size < 13){
2023-08-08 09:42:35 +08:00
return;
}
2023-08-12 18:32:49 +08:00
// print("appDataReceiveData:$data");
2023-08-09 09:32:09 +08:00
if((data[0] == 0xEF)&&(data[1] == 0x01)&&(data[2] == 0xEE)&&(data[3] == 0x02)&&(data[4] == 0x11)){
var tmpType = (data[7] & 0x0f);// 包标识
print("temType:$tmpType");
var dataLen = data[8] * 256 + data[9];// 高16位用来指示后面数据块内容的长度
var oriLen = data[10] * 256 + data[11];// 低16位用来指示数据加密前的原长度
2023-08-11 14:50:42 +08:00
print("dataLen:$dataLen oriLen:$oriLen");
2023-08-09 09:32:09 +08:00
List<int> dataList = [];
List<int> oriDataList = [];
switch(tmpType){
case 0: //不加密
// for (var i = 0; i < oriLen ; i++) {
2023-08-11 14:50:42 +08:00
// oriDataList.add(data[12 + i]);
2023-08-09 09:32:09 +08:00
// }
2023-08-12 18:32:49 +08:00
oriDataList = data.sublist(12, 12 + dataLen);
2023-08-11 15:54:38 +08:00
print("不加密 oriDataList:$oriDataList");
2023-08-11 14:50:42 +08:00
break;
case 1:
//AES128
break;
case 2:
2023-08-12 18:32:49 +08:00
// SM4事先约定密钥
// 获取的加密数组
var getDataList = data.sublist(12, 12 + dataLen);
2023-08-11 14:50:42 +08:00
String key = SM4.createHexKey(key: 'TMH_c3570480da8d');
2023-08-12 18:32:49 +08:00
// 解密
oriDataList = SM4.decrypt(getDataList, key: key, mode: SM4CryptoMode.ECB);
oriDataList = oriDataList.sublist(0, oriLen);
2023-08-11 15:54:38 +08:00
print("SM4 oriDataList:$oriDataList");
2023-08-09 09:32:09 +08:00
break;
2023-08-12 18:32:49 +08:00
case 3:
//SM4设备指定密钥
2023-08-09 09:32:09 +08:00
// for (var i = 0; i < dataLen ; i++) {
// dataView[i] = uint8Recv[12 + i];
// }
// console.log("dataView.length = ", dataView.length);
// console.log("currCommStru.pairCommKey = ", currCommStru.pairCommKey);
// var commKey1 = base64js.toByteArray(currCommStru.pairCommKey);
// console.log("commKey1 = ", commKey1);
// var d_cbc = cbc.decrypt_ecb(dataView, commKey1, false, "nobase64");
// console.log("d_cbc = ", d_cbc);
// console.log("oriLen = ", oriLen);
// for (var i = 0; i < oriLen ; i++) {
// oriDataView[i] = d_cbc[i];
// }
// console.log("oriDataView = ", oriDataView);
break;
}
2023-08-11 14:50:42 +08:00
parseData(oriDataList).then((value) {
EventBusManager().eventBusFir(value);
});
2023-08-08 09:42:35 +08:00
}
2023-08-09 09:32:09 +08:00
// print('✅ 执行结束 _buffer:${_buffer.length}');
}
static Future<Reply?> parseData(List<int> data) async {
if(data.isNotEmpty){
var cmd = data[0] * 256 + data[1];
CommandType commandType = ExtensionCommandType.getCommandType(cmd);
2023-08-11 14:50:42 +08:00
// data.removeRange(0, 2);
2023-08-11 15:54:38 +08:00
print("111111data cmd:$cmd commandType:$commandType data:$data");
2023-08-09 09:32:09 +08:00
var reply;
switch(commandType) {
case CommandType.getLockPublicKey:
2023-08-08 09:42:35 +08:00
{
2023-08-09 09:32:09 +08:00
reply = GetPublicKeyReply.parseData(commandType, data);
2023-08-08 09:42:35 +08:00
}
break;
2023-08-11 14:50:42 +08:00
case CommandType.getLockPrivateKey:
{
reply = GetPrivateKeyReply.parseData(commandType, data);
}
break;
2023-08-09 09:32:09 +08:00
case CommandType.addUser:
2023-08-08 09:42:35 +08:00
{
2023-08-09 09:32:09 +08:00
reply = AddUserReply.parseData(commandType, data);
2023-08-08 09:42:35 +08:00
}
break;
2023-08-09 09:32:09 +08:00
case CommandType.openDoor:
{
reply = OpenDoorReply.parseData(commandType, data);
}
2023-08-08 09:42:35 +08:00
break;
}
2023-08-09 09:32:09 +08:00
return reply;
}
2023-08-08 09:42:35 +08:00
}
}