1、添加获取遥控开锁记录问题。2、添加遥控数据同步问题

This commit is contained in:
魏少阳 2024-07-23 15:02:57 +08:00
parent ee97a645f7
commit 63fa85f5fe
15 changed files with 269 additions and 16 deletions

4
.gitignore vendored
View File

@ -35,7 +35,6 @@
*.lock
# Web related
lib/generated_plugin_registrant.dart
# Symbolication related
app.*.symbols
@ -58,10 +57,9 @@ flutter_plugins/*/example/ios/Flutter/flutter_export_environment.sh
/flutter_plugins/flutter_html-2.1.5/example/ios/Runner/GeneratedPluginRegistrant.h
/flutter_plugins/flutter_html-2.1.5/example/ios/Runner/GeneratedPluginRegistrant.m
/flutter_plugins/flutter_html-2.1.5/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
/flutter_plugins/flutter_html-2.1.5/example/lib/generated_plugin_registrant.dart
https://build_sh.sh
ios/Runner.app.dSYM.zip
ios/Runner.ipa
# 忽略打包生成的文件
script/gen/*
script/gen/*

View File

@ -0,0 +1,119 @@
import 'dart:convert';
import 'package:crypto/crypto.dart' as crypto;
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_tool/io_tool.dart';
import '../io_type.dart';
import '../sm4Encipher/sm4.dart';
class UpdataLockRemoteControlListCommand extends SenderProtocol {
UpdataLockRemoteControlListCommand({
this.lockID,
this.keyID,
this.userID,
this.page,
this.countReq,
this.token,
this.needAuthor,
this.signKey,
this.privateKey
}) : super(CommandType.updataLockRemoteControlList);
String? lockID;
String? keyID;
String? userID;
int? page;
int? countReq;
List<int>? token;
int? needAuthor;
List<int>? signKey;
List<int>? privateKey;
@override
String toString() {
return 'UpdataLockCardListCommand{lockID: $lockID, keyID:$keyID userID: $userID, '
'page:$page countReq: $countReq, token: $token, '
'signKey: $signKey, privateKey: $privateKey}';
}
@override
List<int> messageDetail() {
List<int> data = [];
List<int> ebcData = [];
//
final int type = commandType!.typeValue;
final double typeDouble = type / 256;
final int type1 = typeDouble.toInt();
final int type2 = type % 256;
data.add(type1);
data.add(type2);
// id 40
final int lockIDLength = utf8.encode(lockID!).length;
data.addAll(utf8.encode(lockID!));
data = getFixedLengthList(data, 40 - lockIDLength);
//userID useid 20
final int userIDLength = utf8.encode(userID!).length;
data.addAll(utf8.encode(userID!));
data = getFixedLengthList(data, 20 - userIDLength);
// page
data.add(page!);
// countReq
data.add(countReq!);
// token 4 Token 0 token失效或者第一次发送的时候token为0
data.addAll(token!);
if(needAuthor == 0){
//AuthCodeLen 1
data.add(0);
} else {
final List<int> authCodeData = [];
//KeyID
authCodeData.addAll(utf8.encode(lockID!));
//UserID
authCodeData.addAll(utf8.encode(userID!));
//token 4 Token 0
authCodeData.addAll(token!);
authCodeData.addAll(signKey!);
// KeyIDauthUserIDmd5加密之后就是authCode
final authCode = crypto.md5.convert(authCodeData);
data.add(authCode.bytes.length);
data.addAll(authCode.bytes);
}
if ((data.length % 16) != 0) {
final int add = 16 - data.length % 16;
for (int i = 0; i < add; i++) {
data.add(0);
}
}
printLog(data);
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB);
return ebcData;
}
}
class UpdataLockRemoteControlListReply extends Reply {
UpdataLockRemoteControlListReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
final int status = data[2];
errorWithStstus(status);
}
}

View File

@ -15,6 +15,7 @@ enum CommandType {
updataLockFingerprintList, //- 0x3023
updataLockFaceList, //- 0x3024
updataLockPalmVeinList, //- 0x3025
updataLockRemoteControlList, //- 0x3026
updataLockSet, //- 0x302A
getLockPublicKey, // = 0x3090
getLockPrivateKey, // = 0x3091

View File

@ -45,6 +45,7 @@ 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';
@ -238,6 +239,11 @@ class CommandReciverManager {
reply = UpdataLockPalmVeinListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockRemoteControlList:
{
reply = UpdataLockRemoteControlListReply.parseData(commandType, data);
}
break;
case CommandType.updataLockSet:
{
reply = UpdataLockSetReply.parseData(commandType, data);

View File

@ -43,6 +43,7 @@ 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 'sender_data.dart';
@ -1414,6 +1415,31 @@ class IoSenderManage {
callBack: callBack);
}
//
static void updataLockRemoteControlListCommand(
{required String? lockID,
required String? userID,
required int? page,
required int? countReq,
required List<int>? token,
required int? needAuthor,
required List<int>? signKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: UpdataLockRemoteControlListCommand(
lockID: lockID,
userID: userID,
page:page,
countReq:countReq,
token: token,
needAuthor: needAuthor,
signKey: signKey,
privateKey: privateKey,
),
callBack: callBack);
}
//
static void updataLockSetCommand(
{required String? lockID,

View File

@ -1,4 +1,3 @@
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';

View File

@ -151,6 +151,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
fingerprintId: state.type == 3 ? state.idStr : '',
keyId: state.type == 5 ? state.idStr : '',
faceId: state.type == 4 ? state.idStr : '',
remoteId:state.type == 6 ? state.idStr : '',
pageSize:pageSize,
);
if (entity.errorCode!.codeIsSuccessful) {

View File

@ -29,6 +29,6 @@ class LockOperatingRecordState { // 记录名称
bool ifHaveNext = false; //
int logCountPage = 10; //
String idStr = ''; //
int type = 0; // 1: 2: 3: 4: 5:
int type = 0; // 1: 2: 3: 4: 5: 6:
RxString recordName = ''.obs;
}

View File

@ -28,7 +28,6 @@ class FaceUnlockLogic extends BaseGetXController {
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}
@ -58,7 +57,6 @@ class FaceUnlockLogic extends BaseGetXController {
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}
@ -72,7 +70,6 @@ class FaceUnlockLogic extends BaseGetXController {
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}

View File

@ -71,10 +71,7 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
});
// _openBottomItemSheet(state.antiMisoperationStrList.value, 1);
}),
Expanded(
child: SizedBox(
height: 30.h,
)),
Expanded(child: SizedBox(height: 30.h)),
_buildTipsView(),
SizedBox(
height: 60.h,

View File

@ -2,6 +2,7 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:star_lock/blue/io_protocol/io_updataLockRemoteControlList.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/commonDataManage.dart';
@ -53,6 +54,11 @@ class UploadDataLogic extends BaseGetXController{
_replyUpdataLockPalmVeinListReply(reply);
}
//
if (reply is UpdataLockRemoteControlListReply && (state.ifCurrentScreen.value == true)) {
_replyUpdataLockRemoteControlListReply(reply);
}
//
if (reply is UpdataLockSetReply && (state.ifCurrentScreen.value == true) && (state.ifSeletUpdataBtnState == true)) {
_replyUpdataLockSetReply(reply);
@ -291,6 +297,52 @@ class UploadDataLogic extends BaseGetXController{
}
}
//
Future<void> _replyUpdataLockRemoteControlListReply(Reply reply) async {
final int status = reply.data[2];
switch(status){
case 0x00:
//
state.indexCount.value = state.indexCount.value + 1;
dismissEasyLoading();
cancelBlueConnetctToastTimer();
final int dataLength = reply.data[8];
state.uploadRemoteControlDataList.addAll(reply.data.sublist(9, reply.data.length));
if(dataLength == 10){
// 10
state.uploadRemoteControlPage = state.uploadRemoteControlPage + 1;
final List<int> token = reply.data.sublist(3, 7);
updataLockRemoteControlList(token, state.uploadRemoteControlPage);
}else{
// // 10
// if(state.uploadPalmVeinDataList.isEmpty){
// //
// getUpdataLockSet();
// }else{
// //
_lockDataUpload(uploadType:2, recordType:7, records:state.uploadRemoteControlDataList);
// }
}
break;
case 0x06:
//
final List<int> token = reply.data.sublist(3, 7);
final List<String> saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
updataLockRemoteControlList(token, state.uploadRemoteControlPage);
break;
default:
dismissEasyLoading();
state.sureBtnState.value = 0;
state.indexCount.value = 0;
cancelBlueConnetctToastTimer();
break;
}
}
//
Future<void> _replyUpdataLockSetReply(Reply reply) async {
final int status = reply.data[2];
@ -555,6 +607,52 @@ class UploadDataLogic extends BaseGetXController{
);
}
//
Future<void> getUpdataLockRemoteControlList() async {
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.indexCount.value = 0;
state.sureBtnState.value = 0;
});
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!);
updataLockRemoteControlList(getTokenList, state.uploadRemoteControlPage);
} else if (connectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
state.indexCount.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
//
Future<void> updataLockRemoteControlList(List<int> token, int page) 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.updataLockRemoteControlListCommand(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
page: page,
countReq: state.countReq,
token: token,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList
);
}
//
Future<void> getUpdataLockSet() async {
showEasyLoading();
@ -642,7 +740,11 @@ class UploadDataLogic extends BaseGetXController{
getUpdataLockPalmVeinList();
break;
case 6:
//
//
getUpdataLockRemoteControlList();
break;
case 7:
//
getUpdataLockSet();
break;
default:

View File

@ -24,5 +24,8 @@ class UploadDataState{
int uploadPalmVeinPage = 0;//
List<int> uploadPalmVeinDataList = <int>[];//
int uploadRemoteControlPage = 0;//
List<int> uploadRemoteControlDataList = <int>[];//
List<int> uploadLockSetDataList = <int>[];//
}

View File

@ -196,9 +196,9 @@ class _RemoteControlDetailPageState extends State<RemoteControlDetailPage> with
action: () {
Get.toNamed(Routers.lockOperatingRecordPage,
arguments: <String, Object?>{
'type': 2,
'id': state.fingerprintItemData.value.cardId.toString(),
'recordName': state.fingerprintItemData.value.cardName
'type': 6,
'id': state.fingerprintItemData.value.remoteId.toString(),
'recordName': state.fingerprintItemData.value.remoteName
});
}),
// SizedBox(height: 40.h),

View File

@ -286,6 +286,7 @@ class ApiProvider extends BaseProvider {
required String fingerprintId,
required String keyId,
required String faceId,
required String remoteId,
required String pageSize}) =>
post(
keyOperationRecordURL.toUrl,
@ -301,6 +302,7 @@ class ApiProvider extends BaseProvider {
'fingerprintId': fingerprintId,
'keyId': keyId,
'faceId': faceId,
'remoteId': remoteId,
'pageSize': pageSize
}));

View File

@ -253,6 +253,7 @@ class ApiRepository {
required String fingerprintId,
required String keyId,
required String faceId,
required String remoteId,
required String pageSize,
}) async {
final res = await apiProvider.lockRecordList(
@ -267,6 +268,7 @@ class ApiRepository {
fingerprintId: fingerprintId,
keyId: keyId,
faceId: faceId,
remoteId: remoteId,
pageSize: pageSize,
);
return KeyOperationRecordEntity.fromJson(res.body);