Merge branch 'master' of gitee.com:starlock-cn/app-starlock

This commit is contained in:
Daisy 2024-05-09 11:01:43 +08:00
commit 4837cd58dd
69 changed files with 1054 additions and 346 deletions

View File

@ -809,6 +809,7 @@
"锁上面添加密码已满": "Lock above add password is full", "锁上面添加密码已满": "Lock above add password is full",
"密码已存在": "Password already exists", "密码已存在": "Password already exists",
"请输入密码": "Please enter password", "请输入密码": "Please enter password",
"暂无密码,无需重置": "No password, no need to reset",
"真实姓名":"Real name", "真实姓名":"Real name",
"身份证号":"ID number", "身份证号":"ID number",

View File

@ -836,6 +836,7 @@
"锁上面添加密码已满": "锁上面添加密码已满", "锁上面添加密码已满": "锁上面添加密码已满",
"密码已存在": "密码已存在", "密码已存在": "密码已存在",
"请输入密码": "请输入密码", "请输入密码": "请输入密码",
"暂无密码,无需重置": "暂无密码,无需重置",
"真实姓名":"真实姓名", "真实姓名":"真实姓名",
"身份证号":"身份证号", "身份证号":"身份证号",

View File

@ -839,6 +839,7 @@
"锁上面添加密码已满": "锁上面添加密码已满", "锁上面添加密码已满": "锁上面添加密码已满",
"密码已存在": "密码已存在", "密码已存在": "密码已存在",
"请输入密码": "请输入密码", "请输入密码": "请输入密码",
"暂无密码,无需重置": "暂无密码,无需重置",
"真实姓名":"真实姓名", "真实姓名":"真实姓名",
"身份证号":"身份证号", "身份证号":"身份证号",

View File

@ -306,7 +306,7 @@ SPEC CHECKSUMS:
AMapLocation: 5248aec2455ebb5d104b367813c946430a2ee033 AMapLocation: 5248aec2455ebb5d104b367813c946430a2ee033
app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc
audio_service: f509d65da41b9521a61f1c404dd58651f265a567 audio_service: f509d65da41b9521a61f1c404dd58651f265a567
audio_session: 4f3e461722055d21515cf3261b64c973c062f345 audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207
audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40
auto_orientation: 102ed811a5938d52c86520ddd7ecd3a126b5d39d auto_orientation: 102ed811a5938d52c86520ddd7ecd3a126b5d39d
camera_avfoundation: 8b8d780bcfb6a4a02b0fbe2b4bd17b5b71946e68 camera_avfoundation: 8b8d780bcfb6a4a02b0fbe2b4bd17b5b71946e68
@ -322,7 +322,7 @@ SPEC CHECKSUMS:
flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907
flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e
flutter_voice_processor: 2b89b93d69b02227ae3fd58589ee0bcfa3ca2a82 flutter_voice_processor: 2b89b93d69b02227ae3fd58589ee0bcfa3ca2a82
fluttertoast: fafc4fa4d01a6a9e4f772ecd190ffa525e9e2d9c fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265
fluwx: daa284756ce53442b3d0417ceeda66e981906811 fluwx: daa284756ce53442b3d0417ceeda66e981906811
google_maps_flutter_ios: d1318b4ff711612cab16862d7a87e31a7403d458 google_maps_flutter_ios: d1318b4ff711612cab16862d7a87e31a7403d458
GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4
@ -351,4 +351,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 317f9473a5705c6fe4d79d95e81676f248048fdc PODFILE CHECKSUM: 317f9473a5705c6fe4d79d95e81676f248048fdc
COCOAPODS: 1.12.1 COCOAPODS: 1.14.3

View File

@ -1,7 +1,5 @@
import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluwx/fluwx.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
class AppColors { class AppColors {

View File

@ -0,0 +1,49 @@
class LockUserNoListEntity {
int? errorCode;
String? description;
String? errorMsg;
Data? data;
LockUserNoListEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
LockUserNoListEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
if (json['data'] is Map) {
data = Data.fromJson(json['data']);
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
data['data'] = this.data;
return data;
}
}
class Data {
List<int>? userNos = [];
Data({
this.userNos,
});
Data.fromJson(Map<String, dynamic> json) {
if (json['userNos'] is List) {
json['userNos'].forEach((element) {
userNos?.add(element);
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['userNos'] = userNos;
return data;
}
}

View File

@ -1,12 +1,9 @@
import 'dart:convert'; import 'dart:convert';
import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_type.dart'; import '../io_type.dart';
import 'package:crypto/crypto.dart' as crypto; import 'package:crypto/crypto.dart' as crypto;

View File

@ -1,10 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:common_utils/common_utils.dart';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -1,12 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_type.dart'; import '../io_type.dart';
import 'package:crypto/crypto.dart' as crypto; import 'package:crypto/crypto.dart' as crypto;

View File

@ -1,12 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_type.dart'; import '../io_type.dart';
import 'package:crypto/crypto.dart' as crypto; import 'package:crypto/crypto.dart' as crypto;

View File

@ -3,7 +3,6 @@ import 'dart:convert';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -3,7 +3,6 @@ import 'dart:convert';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -1,9 +1,9 @@
import 'dart:convert';
import 'package:get/get.dart'; import 'dart:convert';
import 'dart:typed_data';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';
@ -21,6 +21,15 @@ class AddUserCommand extends SenderProtocol {
int? keyType; int? keyType;
int? startDate; int? startDate;
int? expireDate; int? expireDate;
int? useCountLimit;
int? isRound;
int? weekRound;
int? startHour;
int? startMin;
int? endHour;
int? endMin;
int? role; int? role;
String? password; String? password;
int? needAuthor; int? needAuthor;
@ -37,6 +46,13 @@ class AddUserCommand extends SenderProtocol {
this.keyType, this.keyType,
this.startDate, this.startDate,
this.expireDate, this.expireDate,
this.useCountLimit,
this.isRound,
this.weekRound,
this.startHour,
this.startMin,
this.endHour,
this.endMin,
this.role, this.role,
this.password, this.password,
this.needAuthor, this.needAuthor,
@ -47,13 +63,17 @@ class AddUserCommand extends SenderProtocol {
@override @override
String toString() { String toString() {
return 'AddUserCommand{lockID: $lockID, authUserID: $authUserID, ' return 'AddUserCommand{lockID: $lockID, authUserID: $authUserID,'
'keyID: $keyID, userID: $userID, openMode: $openMode, ' 'keyID: $keyID, userID: $userID, openMode: $openMode, '
'keyType: $keyType, ' 'keyType: $keyType, '
'startDate:${DateTool().dateIntToYMDHNString(startDate)} , ' 'startDate:${DateTool().dateIntToYMDHNString(startDate)} , '
'expireDate: ${DateTool().dateIntToYMDHNString(expireDate)} , ' 'expireDate: ${DateTool().dateIntToYMDHNString(expireDate)} , '
'role: $role, password: $password, needAuthor: $needAuthor, ' 'useCountLimit: $useCountLimit, isRound: $isRound, '
'publicKey: $publicKey, privateKey: $privateKey, token: $token}'; 'weekRound: $weekRound, startHour: $startHour, '
'startMin: $startMin, endHour: $endHour, '
'endMin: $endMin, role: $role, password: $password, '
'needAuthor: $needAuthor, publicKey: $publicKey, '
'privateKey: $privateKey, token: $token}';
} }
@override @override
@ -116,6 +136,20 @@ class AddUserCommand extends SenderProtocol {
data.add((d2 & 0xff00) >> 8); data.add((d2 & 0xff00) >> 8);
data.add((d2 & 0xff)); data.add((d2 & 0xff));
//useCountLimit 2
double useCountLimitDouble = useCountLimit! / 256;
int useCountLimit1 = useCountLimitDouble.toInt();
int useCountLimit2 = useCountLimit! % 256;
data.add(useCountLimit1);
data.add(useCountLimit2);
data.add(isRound!);
data.add(weekRound!);
data.add(startHour!);
data.add(startMin!);
data.add(endHour!);
data.add(endMin!);
// role 1 010xff // role 1 010xff
data.add(role!); data.add(role!);
@ -169,7 +203,7 @@ class AddUserReply extends Reply {
AddUserReply.parseData(CommandType commandType, List<int> dataDetail) AddUserReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) { : super.parseData(commandType, dataDetail) {
data = dataDetail; data = dataDetail;
int status = data[46]; status = data[46];
errorWithStstus(status); errorWithStstus(status);
} }
} }

View File

@ -2,7 +2,6 @@
//TODO:() //TODO:()
import 'dart:convert'; import 'dart:convert';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -0,0 +1,137 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart';
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_type.dart';
import 'package:crypto/crypto.dart' as crypto;
//
class CleanUpUsersCommand extends SenderProtocol {
String? lockID;
String? authUserID;
String? keyID;
String? userID;
List<int>? userNoList;
List<int>? token;
int? needAuthor;
List<int>? publicKey;
List<int>? privateKey;
CleanUpUsersCommand({
this.lockID,
this.authUserID,
this.keyID,
this.userID,
this.needAuthor,
this.publicKey,
this.privateKey,
this.userNoList,
this.token,
}) : super(CommandType.cleanUpUsers);
@override
String toString() {
return 'CleanUpUsersCommand{lockID: $lockID, authUserID: $authUserID, '
'keyID: $keyID, userID: $userID, userNoList: $userNoList, '
'token: $token, needAuthor: $needAuthor, publicKey: $publicKey, '
'privateKey: $privateKey}';
}
@override
List<int> messageDetail() {
List<int> data = [];
List<int> ebcData = [];
//
int type = commandType!.typeValue;
double typeDouble = type / 256;
int type1 = typeDouble.toInt();
int type2 = type % 256;
data.add(type1);
data.add(type2);
// id 40
int lockIDLength = utf8.encode(lockID!).length;
data.addAll(utf8.encode(lockID!));
data = getFixedLengthList(data, 40 - lockIDLength);
//authUserID 20
int authUserIDLength = utf8.encode(authUserID!).length;
data.addAll(utf8.encode(authUserID!));
data = getFixedLengthList(data, 20 - authUserIDLength);
//KeyID 40
int keyIDLength = utf8.encode(keyID!).length;
data.addAll(utf8.encode(keyID!));
data = getFixedLengthList(data, 40 - keyIDLength);
//userID useid 20
int userIDLength = utf8.encode(userID!).length;
data.addAll(utf8.encode(userID!));
data = getFixedLengthList(data, 20 - userIDLength);
ByteData indexBytes = ByteData(2); // 2
indexBytes.setInt16(0, userNoList!.length);
List<int> indexList = indexBytes.buffer.asUint8List();
data.addAll(indexList);
data.addAll(userNoList!);
// token 4 Token 0 token失效或者第一次发送的时候token为0
data.addAll(token!);
if (needAuthor == 0) {
//AuthCodeLen 1
data.add(0);
} else {
List<int> authCodeData = [];
//authUserID
authCodeData.addAll(utf8.encode(authUserID!));
//KeyID
authCodeData.addAll(utf8.encode(keyID!));
//token 4 Token 0
authCodeData.addAll(token!);
authCodeData.addAll(publicKey!);
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData);
data.add(authCode.bytes.length);
data.addAll(authCode.bytes);
}
if ((data.length % 16) != 0) {
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 CleanUpUsersReply extends Reply {
CleanUpUsersReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
status = data[6];
errorWithStstus(status);
}
}

View File

@ -2,7 +2,6 @@
//TODO:WIFI配网 //TODO:WIFI配网
import 'dart:convert'; import 'dart:convert';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -2,7 +2,6 @@
//TODO: //TODO:
import 'dart:convert'; import 'dart:convert';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -5,7 +5,6 @@ import 'dart:convert';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -2,14 +2,7 @@
//TODO: //TODO:
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../../tools/storage.dart';
import '../blue_manage.dart';
import '../io_tool/io_manager.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sender_manage.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';

View File

@ -1,11 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/sm4Encipher/sm4.dart'; import 'package:star_lock/blue/sm4Encipher/sm4.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';

View File

@ -1,12 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data';
import 'package:get/get.dart';
import '../../tools/storage.dart';
import '../io_tool/io_manager.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sender_manage.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_type.dart'; import '../io_type.dart';

View File

@ -1,9 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
@ -14,17 +11,21 @@ class GetStarLockStatuInfoCommand extends SenderProtocol {
String? lockID; String? lockID;
String? userID; String? userID;
int? utcTimeStamp;
int? unixTimeStamp;
List<int>? privateKey; List<int>? privateKey;
GetStarLockStatuInfoCommand({ GetStarLockStatuInfoCommand({
this.lockID, this.lockID,
this.userID, this.userID,
this.utcTimeStamp,
this.unixTimeStamp,
this.privateKey this.privateKey
}) : super(CommandType.readStarLockStatusInfo); }) : super(CommandType.readStarLockStatusInfo);
@override @override
String toString() { String toString() {
return 'GetStarLockStatuInfoCommand{lockID: $lockID, ' return 'GetStarLockStatuInfoCommand{lockID: $lockID, '
'utcTimeStamp: $utcTimeStamp, unixTimeStamp: $unixTimeStamp, '
'userID: $userID, privateKey: $privateKey}'; 'userID: $userID, privateKey: $privateKey}';
} }
@ -51,6 +52,18 @@ class GetStarLockStatuInfoCommand extends SenderProtocol {
data.addAll(utf8.encode(userID!)); data.addAll(utf8.encode(userID!));
data = getFixedLengthList(data, 20 - userIDLength); data = getFixedLengthList(data, 20 - userIDLength);
// startDate 4
data.add((utcTimeStamp! & 0xff000000) >> 24);
data.add((utcTimeStamp! & 0xff0000) >> 16);
data.add((utcTimeStamp! & 0xff00) >> 8);
data.add((utcTimeStamp! & 0xff));
// endDate 4
data.add((unixTimeStamp! & 0xff000000) >> 24);
data.add((unixTimeStamp! & 0xff0000) >> 16);
data.add((unixTimeStamp! & 0xff00) >> 8);
data.add((unixTimeStamp! & 0xff));
if ((data.length % 16) != 0) { if ((data.length % 16) != 0) {
int add = (16 - data.length % 16); int add = (16 - data.length % 16);
for (int i = 0; i < add; i++) { for (int i = 0; i < add; i++) {

View File

@ -1,9 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -1,7 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -183,7 +183,7 @@ class OTAUpgradeReply extends Reply {
data = dataDetail; data = dataDetail;
token = data.sublist(2, 6); token = data.sublist(2, 6);
status = data[6]; status = data[6];
AppLog.log('--->2' + data.toString()); // AppLog.log('--->2' + data.toString());
errorWithStstus(status); errorWithStstus(status);
} }
} }

View File

@ -1,9 +1,7 @@
//TODO: //TODO:
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -2,9 +2,6 @@
//TODO: //TODO:
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -1,9 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -2,9 +2,6 @@
//TODO:() //TODO:()
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -1,10 +1,8 @@
//TODO:() //TODO:()
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -1,6 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart'; import '../../app_settings/app_settings.dart';

View File

@ -0,0 +1,110 @@
import 'dart:convert';
import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart';
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_type.dart';
import 'package:crypto/crypto.dart' as crypto;
//TODO:(线)
class SenderResetPasswordsCommand extends SenderProtocol {
String? keyID;
String? userID;
List<int>? token;
int? needAuthor;
List<int>? signKey;
List<int>? privateKey;
SenderResetPasswordsCommand({
this.keyID,
this.userID,
this.token,
this.needAuthor,
this.signKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
String toString() {
return 'SenderCustomPasswordsCommand{keyID: $keyID, userID: $userID, '
'token: $token, '
'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}';
}
@override
List<int> messageDetail() {
List<int> data = [];
List<int> subData = [];
List<int> ebcData = [];
//
data.addAll(intChangList(commandType!.typeValue));
//
data.add(19);
// keyID 40
int keyIDLength = utf8.encode(keyID!).length;
subData.addAll(utf8.encode(keyID!));
subData = getFixedLengthList(subData, 40 - keyIDLength);
//userID 20
int userIDLength = utf8.encode(userID!).length;
subData.addAll(utf8.encode(userID!));
subData = getFixedLengthList(subData, 20 - userIDLength);
// token
subData.addAll(token!);
if (needAuthor == 0) {
//AuthCodeLen 1
subData.add(0);
} else {
List<int> authCodeData = [];
//KeyID
authCodeData.addAll(utf8.encode(keyID!));
//authUserID
authCodeData.addAll(utf8.encode(userID!));
//token 4 Token 0
authCodeData.addAll(token!);
authCodeData.addAll(signKey!);
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData);
subData.add(authCode.bytes.length);
subData.addAll(authCode.bytes);
}
data.add(subData.length);
data.addAll(subData);
if ((data.length % 16) != 0) {
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 SenderResetPasswordsReply extends Reply {
SenderResetPasswordsReply.parseData(
CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
int status = data[2];
errorWithStstus(status);
}
}

View File

@ -1,9 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -1,9 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_reply.dart'; import '../io_reply.dart';
import '../io_sender.dart'; import '../io_sender.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';

View File

@ -1,9 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -1,9 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import '../../app_settings/app_settings.dart';
import '../io_tool/io_tool.dart'; import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart'; import '../sm4Encipher/sm4.dart';
import '../io_reply.dart'; import '../io_reply.dart';

View File

@ -35,7 +35,7 @@ abstract class SenderProtocol extends IOData {
void printLog(List<int> data) { void printLog(List<int> data) {
AppLog.log( AppLog.log(
"App -> 锁,指令类型:${commandType!.typeName} \n\n参数是:\n${toString()} \n\n加密之前数据是:\n$data"); "App -> 锁,指令类型:${commandType!.typeName} \n参数是:\n${toString()} \n加密之前数据是:\n$data 长度是:${data.length}");
} }
//TODO:Ï //TODO:Ï

View File

@ -7,6 +7,7 @@ enum CommandType {
openLock, // = 0x3005 openLock, // = 0x3005
readLockStatusInfo, // = 0x300A readLockStatusInfo, // = 0x300A
transferPermissions, // = 0x300B transferPermissions, // = 0x300B
cleanUpUsers, // = 0x300C
reportDoorOpenRecord, // = 0x3020 reportDoorOpenRecord, // = 0x3020
getLockPublicKey, // = 0x3090 getLockPublicKey, // = 0x3090
getLockPrivateKey, // = 0x3091 getLockPrivateKey, // = 0x3091
@ -72,6 +73,11 @@ extension ExtensionCommandType on CommandType {
type = CommandType.openLock; type = CommandType.openLock;
} }
break; break;
case 0x300C:
{
type = CommandType.cleanUpUsers;
}
break;
case 0x300A: case 0x300A:
{ {
type = CommandType.readLockStatusInfo; type = CommandType.readLockStatusInfo;
@ -154,6 +160,9 @@ extension ExtensionCommandType on CommandType {
case CommandType.openLock: case CommandType.openLock:
type = 0x3005; type = 0x3005;
break; break;
case CommandType.cleanUpUsers:
type = 0x300C;
break;
case CommandType.readLockStatusInfo: case CommandType.readLockStatusInfo:
type = 0x300A; type = 0x300A;
break; break;
@ -233,6 +242,9 @@ extension ExtensionCommandType on CommandType {
case 0x3005: case 0x3005:
t = '开门'; t = '开门';
break; break;
case 0x300C:
t = '清理用户';
break;
case 0x300A: case 0x300A:
t = '读取锁状态信息'; t = '读取锁状态信息';
break; break;

View File

@ -1,7 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_addFace.dart'; import 'package:star_lock/blue/io_protocol/io_addFace.dart';
@ -9,7 +8,6 @@ import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.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_editUser.dart';
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart'; import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.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_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
@ -24,17 +22,10 @@ import 'package:star_lock/blue/io_protocol/io_transferPermissions.dart';
import '../tools/storage.dart'; import '../tools/storage.dart';
// import 'io_protocol/io_addFingerprint.dart';
import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart'; import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart';
// import 'io_protocol/io_addICCard.dart';
import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart'; import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart';
import 'io_protocol/io_addStressFingerprint.dart';
// import 'io_protocol/io_addStressICCard.dart';
import 'io_protocol/io_addStressPassword.dart'; import 'io_protocol/io_addStressPassword.dart';
import 'io_protocol/io_addUser.dart'; import 'io_protocol/io_addUser.dart';
import 'io_protocol/io_automaticPadlock.dart';
import 'io_protocol/io_checkingCardStatus.dart'; import 'io_protocol/io_checkingCardStatus.dart';
import 'io_protocol/io_checkingUserInfoCount.dart'; import 'io_protocol/io_checkingUserInfoCount.dart';
import 'io_protocol/io_configuringWifi.dart'; import 'io_protocol/io_configuringWifi.dart';
@ -45,6 +36,7 @@ import 'io_protocol/io_getWifiList.dart';
import 'io_protocol/io_openLock.dart'; import 'io_protocol/io_openLock.dart';
import 'io_protocol/io_queryingFingerprintStatus.dart'; import 'io_protocol/io_queryingFingerprintStatus.dart';
import 'io_protocol/io_referEventRecordNumber.dart'; import 'io_protocol/io_referEventRecordNumber.dart';
import 'io_protocol/io_senderResetPasswords.dart';
import 'io_reply.dart'; import 'io_reply.dart';
import 'io_protocol/io_senderCustomPasswords.dart'; import 'io_protocol/io_senderCustomPasswords.dart';
import 'io_type.dart'; import 'io_type.dart';
@ -235,6 +227,13 @@ class CommandReciverManager {
commandType, data); commandType, data);
} }
break; break;
case 19:
{
//
reply = SenderResetPasswordsReply.parseData(
commandType, data);
}
break;
case 20: case 20:
{ {
// //

View File

@ -1,10 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/blue/sender_manage.dart'; import 'package:star_lock/blue/sender_manage.dart';
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
import 'package:star_lock/network/api_provider.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart';
import '../app_settings/app_settings.dart'; import '../app_settings/app_settings.dart';
@ -20,6 +22,7 @@ import 'io_tool/manager_event_bus.dart';
class SenderBeforeDataManage { class SenderBeforeDataManage {
static SenderBeforeDataManage? _manager; static SenderBeforeDataManage? _manager;
SenderBeforeDataManage._init(); SenderBeforeDataManage._init();
static SenderBeforeDataManage? shareManager() { static SenderBeforeDataManage? shareManager() {
@ -29,6 +32,7 @@ class SenderBeforeDataManage {
} }
factory SenderBeforeDataManage() => shareManager()!; factory SenderBeforeDataManage() => shareManager()!;
SenderBeforeDataManage? get manager => shareManager(); SenderBeforeDataManage? get manager => shareManager();
void _init() { void _init() {
@ -37,9 +41,10 @@ class SenderBeforeDataManage {
// //
StreamSubscription<Reply>? _replySubscription; StreamSubscription<Reply>? _replySubscription;
void _initReplySubscription() {
_replySubscription ??= EventBusManager().eventBus!.on<Reply>().listen((reply) async {
void _initReplySubscription() {
_replySubscription ??=
EventBusManager().eventBus!.on<Reply>().listen((reply) async {
// //
if ((reply is AddUserReply)) { if ((reply is AddUserReply)) {
_replyAddUserKey(reply); _replyAddUserKey(reply);
@ -53,12 +58,12 @@ class SenderBeforeDataManage {
switch (status) { switch (status) {
case 0x00: case 0x00:
// //
CommonDataManage().currentLockUserNo = reply.data[47]; CommonDataManage().currentLockUserNo = listChangInt(reply.data.sublist(47, 49));
CommonDataManage().currentKeyInfo.lockUserNo = CommonDataManage().currentLockUserNo; CommonDataManage().currentKeyInfo.lockUserNo = CommonDataManage().currentLockUserNo;
_updateLockUserNo(); _updateLockUserNo();
break; break;
case 0x06: case 0x06:
// //
var privateKey = await Storage.getStringList(saveBluePrivateKey); var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -84,24 +89,78 @@ class SenderBeforeDataManage {
// publicKey: publicKeyDataList, // publicKey: publicKeyDataList,
// privateKey: getPrivateKeyList, // privateKey: getPrivateKeyList,
// token: token); // token: token);
AppLog.log("startDate111:${CommonDataManage().currentKeyInfo.startDate} endDate:${CommonDataManage().currentKeyInfo.endDate}"); LockListInfoItemEntity currentKeyInfo =
CommonDataManage().currentKeyInfo;
AppLog.log(
"startDate111:${currentKeyInfo.startDate} endDate:${currentKeyInfo.endDate}");
DateTime startTime = DateTime.fromMillisecondsSinceEpoch(
currentKeyInfo.startDate! ~/ 1000);
DateTime endTime = DateTime.fromMillisecondsSinceEpoch(
currentKeyInfo.endDate! ~/ 1000);
bool isRound = currentKeyInfo.keyType == 2;
var addUserData = AddUserCommand( var addUserData = AddUserCommand(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
authUserID: CommonDataManage().currentKeyInfo.senderUserId!.toString(), authUserID: currentKeyInfo.senderUserId!.toString(),
keyID: CommonDataManage().currentKeyInfo.keyId.toString(), keyID: currentKeyInfo.keyId.toString(),
userID: await Storage.getUid(), userID: await Storage.getUid(),
openMode: 1, openMode: 1,
keyType: 0, keyType: 0,
startDate: CommonDataManage().currentKeyInfo.startDate!~/1000, startDate: currentKeyInfo.startDate! ~/ 1000,
expireDate: CommonDataManage().currentKeyInfo.endDate!~/1000, expireDate: currentKeyInfo.endDate! ~/ 1000,
role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0, useCountLimit: 0xFFFF,
// useCountLimit: 1,
isRound: isRound ? 1 : 0,
weekRound: isRound
? DateTool().accordingTheCycleIntoTheCorrespondingNumber(
currentKeyInfo.weekDays!)
: 0,
startHour: isRound ? startTime.hour : 0,
startMin: isRound ? startTime.minute : 0,
endHour: isRound ? endTime.hour : 0,
endMin: isRound ? endTime.minute : 0,
role: currentKeyInfo.keyRight == 1 ? 1 : 0,
password: "123456", password: "123456",
needAuthor: 1, needAuthor: 1,
publicKey: publicKeyDataList, publicKey: publicKeyDataList,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
token: token); token: token);
eventBus.fire(LockAddUserSucceedEvent(addUserData.packageData(), 1)); eventBus.fire(LockAddUserSucceedEvent(addUserData.packageData(), 1));
break;
case 0x0c:
// 32
var entity = await ApiRepository.to.getLockUserNoList(
lockId: CommonDataManage().currentKeyInfo.lockId!);
if (!entity.errorCode!.codeIsSuccessful &&
(entity.data?.userNos ?? []).isNotEmpty) {
return;
}
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var tokenKey = await Storage.getStringList(saveBlueToken);
List<int> tokenList = changeStringListToIntList(tokenKey!);
AppLog.log('---> ${entity.data?.userNos}');
BlueManage().bludSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected) {
IoSenderManage.senderCleanUpUsersCommand(
lockID: BlueManage().connectDeviceName,
authUserID:
CommonDataManage().currentKeyInfo.senderUserId!.toString(),
keyID: CommonDataManage().currentKeyInfo.keyId.toString(),
userID: await Storage.getUid(),
userNoList: entity.data!.userNos!,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: tokenList);
}
});
break; break;
default: default:
// //
@ -112,23 +171,38 @@ class SenderBeforeDataManage {
Future<List<int>> getAddUserKeyData() async { Future<List<int>> getAddUserKeyData() async {
var privateKey = await Storage.getStringList(saveBluePrivateKey); var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey); var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!); List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken); var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!); List<int> getTokenList = changeStringListToIntList(token!);
LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo;
DateTime startTime =
DateTime.fromMillisecondsSinceEpoch(currentKeyInfo.startDate! ~/ 1000);
DateTime endTime =
DateTime.fromMillisecondsSinceEpoch(currentKeyInfo.endDate! ~/ 1000);
bool isRound = currentKeyInfo.keyType == 2;
var addUserData = AddUserCommand( var addUserData = AddUserCommand(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
authUserID: CommonDataManage().currentKeyInfo.senderUserId!.toString(), authUserID: currentKeyInfo.senderUserId!.toString(),
keyID: CommonDataManage().currentKeyInfo.keyId.toString(), keyID: currentKeyInfo.keyId.toString(),
userID: await Storage.getUid(), userID: await Storage.getUid(),
openMode: 1, openMode: 1,
keyType: 0, keyType: 0,
startDate: CommonDataManage().currentKeyInfo.startDate!~/1000, startDate: currentKeyInfo.startDate! ~/ 1000,
expireDate: CommonDataManage().currentKeyInfo.endDate!~/1000, expireDate: currentKeyInfo.endDate! ~/ 1000,
role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0, useCountLimit: 0xFFFF,
// useCountLimit: 1,
isRound: isRound ? 1 : 0,
weekRound: isRound
? DateTool().accordingTheCycleIntoTheCorrespondingNumber(
currentKeyInfo.weekDays!)
: 0,
startHour: isRound ? startTime.hour : 0,
startMin: isRound ? startTime.minute : 0,
endHour: isRound ? endTime.hour : 0,
endMin: isRound ? endTime.minute : 0,
role: currentKeyInfo.keyRight == 1 ? 1 : 0,
password: "123456", password: "123456",
needAuthor: 1, needAuthor: 1,
publicKey: publicKeyDataList, publicKey: publicKeyDataList,
@ -141,8 +215,7 @@ class SenderBeforeDataManage {
void _updateLockUserNo() async { void _updateLockUserNo() async {
LockNetTokenEntity entity = await ApiRepository.to.updateLockUserNo( LockNetTokenEntity entity = await ApiRepository.to.updateLockUserNo(
keyId: CommonDataManage().currentKeyInfo.keyId.toString(), keyId: CommonDataManage().currentKeyInfo.keyId.toString(),
lockUserNo: CommonDataManage().currentKeyInfo.lockUserNo.toString() lockUserNo: CommonDataManage().currentKeyInfo.lockUserNo.toString());
);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
eventBus.fire(LockAddUserSucceedEvent([0], 0)); eventBus.fire(LockAddUserSucceedEvent([0], 0));
} }
@ -151,4 +224,4 @@ class SenderBeforeDataManage {
dispose() { dispose() {
_replySubscription!.cancel(); _replySubscription!.cancel();
} }
} }

View File

@ -1,10 +1,8 @@
import 'package:star_lock/blue/io_protocol/io_addFace.dart'; import 'package:star_lock/blue/io_protocol/io_addFace.dart';
// import 'package:star_lock/blue/io_protocol/io_addICCard.dart';
// import 'package:star_lock/blue/io_protocol/io_addStressICCard.dart';
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.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_deletUser.dart';
import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.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_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart'; import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
@ -15,7 +13,6 @@ import 'io_protocol/io_addFaceCancel.dart';
import 'io_protocol/io_addFingerprintCancel.dart'; import 'io_protocol/io_addFingerprintCancel.dart';
import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart'; import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart';
import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart'; import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart';
import 'io_protocol/io_addStressFingerprint.dart';
import 'io_protocol/io_addStressPassword.dart'; import 'io_protocol/io_addStressPassword.dart';
import 'io_protocol/io_addUser.dart'; import 'io_protocol/io_addUser.dart';
import 'io_protocol/io_checkingCardStatus.dart'; import 'io_protocol/io_checkingCardStatus.dart';
@ -34,6 +31,7 @@ import 'io_protocol/io_readSupportFunctionsWithParameters.dart';
import 'io_protocol/io_referEventRecordNumber.dart'; import 'io_protocol/io_referEventRecordNumber.dart';
import 'io_protocol/io_referEventRecordTime.dart'; import 'io_protocol/io_referEventRecordTime.dart';
import 'io_protocol/io_senderCustomPasswords.dart'; import 'io_protocol/io_senderCustomPasswords.dart';
import 'io_protocol/io_senderResetPasswords.dart';
import 'io_protocol/io_setSupportFunctionsNoParameters.dart'; import 'io_protocol/io_setSupportFunctionsNoParameters.dart';
import 'io_protocol/io_setSupportFunctionsWithParameters.dart'; import 'io_protocol/io_setSupportFunctionsWithParameters.dart';
import 'io_protocol/io_timing.dart'; import 'io_protocol/io_timing.dart';
@ -83,13 +81,20 @@ class IoSenderManage {
int? keyType, int? keyType,
int? startDate, int? startDate,
int? expireDate, int? expireDate,
int? useCountLimit,
int? isRound,
int? weekRound,
int? startHour,
int? startMin,
int? endHour,
int? endMin,
int? role, int? role,
String? password, String? password,
int? needAuthor, int? needAuthor,
List<int>? publicKey, List<int>? publicKey,
List<int>? privateKey, List<int>? privateKey,
List<int>? token, List<int>? token,
bool? isBeforeAddUser, bool? isBeforeAddUser,
CommandSendCallBack? callBack}) { CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData( CommandSenderManager().managerSendData(
command: AddUserCommand( command: AddUserCommand(
@ -101,13 +106,20 @@ class IoSenderManage {
keyType: keyType, keyType: keyType,
startDate: startDate, startDate: startDate,
expireDate: expireDate, expireDate: expireDate,
useCountLimit: useCountLimit,
isRound: isRound,
weekRound: weekRound,
startHour: startHour,
startMin: startMin,
endHour: endHour,
endMin: endMin,
role: role, role: role,
password: password, password: password,
needAuthor: needAuthor, needAuthor: needAuthor,
publicKey: publicKey, publicKey: publicKey,
privateKey: privateKey, privateKey: privateKey,
token: token), token: token),
isBeforeAddUser: isBeforeAddUser!, isBeforeAddUser: isBeforeAddUser ?? false,
callBack: callBack); callBack: callBack);
} }
@ -215,15 +227,19 @@ class IoSenderManage {
//todo: //todo:
static void senderGetStarLockStatuInfo( static void senderGetStarLockStatuInfo(
{String? lockID, {required String? lockID,
String? userID, required String? userID,
List<int>? privateKey, required int? utcTimeStamp,
bool? isBeforeAddUser, required int? unixTimeStamp,
required List<int>? privateKey,
required bool? isBeforeAddUser,
CommandSendCallBack? callBack}) { CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData( CommandSenderManager().managerSendData(
command: GetStarLockStatuInfoCommand( command: GetStarLockStatuInfoCommand(
lockID: lockID, lockID: lockID,
userID: userID, userID: userID,
utcTimeStamp: utcTimeStamp,
unixTimeStamp: unixTimeStamp,
privateKey: privateKey, privateKey: privateKey,
), ),
isBeforeAddUser: isBeforeAddUser!, isBeforeAddUser: isBeforeAddUser!,
@ -283,7 +299,7 @@ class IoSenderManage {
{required String? keyID, {required String? keyID,
required String? userID, required String? userID,
required int? pwdNo, required int? pwdNo,
required int? operate, required int? operate,
required int? isAdmin, required int? isAdmin,
required String? pwd, required String? pwd,
required int? useCountLimit, required int? useCountLimit,
@ -326,7 +342,7 @@ class IoSenderManage {
required int? startTime, required int? startTime,
required int? endTime, required int? endTime,
required int? needAuthor, required int? needAuthor,
required bool? isBeforeAddUser, required bool? isBeforeAddUser,
required List<int>? signKey, required List<int>? signKey,
required List<int>? privateKey, required List<int>? privateKey,
CommandSendCallBack? callBack}) { CommandSendCallBack? callBack}) {
@ -348,6 +364,29 @@ class IoSenderManage {
callBack: callBack); callBack: callBack);
} }
//todo:
static void senderResetPasswordsCommand(
{required String? keyID,
required String? userID,
required List<int>? token,
required int? needAuthor,
required bool? isBeforeAddUser,
required List<int>? signKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: SenderResetPasswordsCommand(
keyID: keyID,
userID: userID,
token: token,
needAuthor: needAuthor,
signKey: signKey,
privateKey: privateKey,
),
isBeforeAddUser: isBeforeAddUser ?? false,
callBack: callBack);
}
//todo: //todo:
// static void senderAddFingerprintCommand( // static void senderAddFingerprintCommand(
// {required String? keyID, // {required String? keyID,
@ -423,12 +462,12 @@ class IoSenderManage {
//todo: //todo:
static void senderCancelAddFingerprintCommand( static void senderCancelAddFingerprintCommand(
{required String? keyID, {required String? keyID,
required String? userID, required String? userID,
required List<int>? token, required List<int>? token,
required int? needAuthor, required int? needAuthor,
required List<int>? signKey, required List<int>? signKey,
required List<int>? privateKey, required List<int>? privateKey,
CommandSendCallBack? callBack}) { CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData( CommandSenderManager().managerSendData(
command: SenderCancelAddFingerprintCommand( command: SenderCancelAddFingerprintCommand(
keyID: keyID, keyID: keyID,
@ -516,12 +555,12 @@ class IoSenderManage {
//todo: //todo:
static void senderCancelAddCardCommand( static void senderCancelAddCardCommand(
{required String? keyID, {required String? keyID,
required String? userID, required String? userID,
required List<int>? token, required List<int>? token,
required int? needAuthor, required int? needAuthor,
required List<int>? signKey, required List<int>? signKey,
required List<int>? privateKey, required List<int>? privateKey,
CommandSendCallBack? callBack}) { CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData( CommandSenderManager().managerSendData(
command: SenderCancelAddCardCommand( command: SenderCancelAddCardCommand(
keyID: keyID, keyID: keyID,
@ -580,12 +619,12 @@ class IoSenderManage {
//todo: //todo:
static void senderCancelAddFaceCommand( static void senderCancelAddFaceCommand(
{required String? keyID, {required String? keyID,
required String? userID, required String? userID,
required List<int>? token, required List<int>? token,
required int? needAuthor, required int? needAuthor,
required List<int>? signKey, required List<int>? signKey,
required List<int>? privateKey, required List<int>? privateKey,
CommandSendCallBack? callBack}) { CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData( CommandSenderManager().managerSendData(
command: SenderCancelAddFaceCommand( command: SenderCancelAddFaceCommand(
keyID: keyID, keyID: keyID,
@ -1120,4 +1159,31 @@ class IoSenderManage {
), ),
callBack: callBack); callBack: callBack);
} }
//
static void senderCleanUpUsersCommand(
{required String? lockID,
required String? userID,
required String? keyID,
required String? authUserID,
required int? needAuthor,
required List<int>? userNoList,
required List<int>? token,
required List<int>? publicKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: CleanUpUsersCommand(
lockID: lockID,
authUserID: authUserID,
keyID: keyID,
userID: userID,
needAuthor: needAuthor,
publicKey: publicKey,
privateKey: privateKey,
userNoList: userNoList,
token: token,
),
callBack: callBack);
}
} }

View File

@ -1,18 +1,33 @@
import 'dart:async'; import 'dart:async';
import 'dart:math';
import 'package:date_format/date_format.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:rxdart/rxdart.dart'; import 'package:rxdart/rxdart.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_tool/io_tool.dart';
import 'package:star_lock/blue/sender_manage.dart';
import 'package:star_lock/debug/log.dart'; import 'package:star_lock/debug/log.dart';
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
import 'package:star_lock/tools/commonDataManage.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/storage.dart';
class DebugConsoleController { class DebugConsoleController {
final List<DebugConsoleLog> logs; final List<DebugConsoleLog> logs;
final _streamController = BehaviorSubject<List<DebugConsoleLog>>(); final _streamController = BehaviorSubject<List<DebugConsoleLog>>();
DebugConsoleController({ List<DebugConsoleLog>? logs }) : logs = logs ?? []; DebugConsoleController({List<DebugConsoleLog>? logs}) : logs = logs ?? [];
Stream<List<DebugConsoleLog>> get stream => _streamController.stream; Stream<List<DebugConsoleLog>> get stream => _streamController.stream;
void close() => _streamController.close(); void close() => _streamController.close();
void notifyUpdate() => _streamController.add(logs); void notifyUpdate() => _streamController.add(logs);
void log( void log(
@ -21,14 +36,12 @@ class DebugConsoleController {
DateTime? timestamp, DateTime? timestamp,
StackTrace? stackTrace, StackTrace? stackTrace,
}) { }) {
logs.add( logs.add(DebugConsoleLog(
DebugConsoleLog( message: message,
message: message, level: level,
level: level, timestamp: timestamp,
timestamp: timestamp, stackTrace: stackTrace,
stackTrace: stackTrace, ));
)
);
notifyUpdate(); notifyUpdate();
} }
@ -40,4 +53,106 @@ class DebugConsoleController {
logs.clear(); logs.clear();
notifyUpdate(); notifyUpdate();
} }
}
void showMore(BuildContext context) {
showBottomSheet(
context: context,
builder: (context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1, color: AppColors.btnDisableColor),
borderRadius: BorderRadius.circular(30.w),
),
height: Get.height * 0.7,
width: Get.width,
padding: EdgeInsets.all(16.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('辅助测试的按钮'),
SizedBox(
height: 25.h,
),
Expanded(
child: Wrap(
children: [
ElevatedButton(
onPressed: () {
EasyLoading.show();
randomlyCreate32Users(0, 33)
.then((value) => EasyLoading.dismiss())
.catchError(EasyLoading.dismiss);
},
child: const Text('给锁设备创建 32个用户')),
],
),
),
],
),
);
});
}
// 32
Future<void> randomlyCreate32Users(int count, int max) async {
if (count >= max) {
return;
}
BlueManage().bludSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.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> tokenList = changeStringListToIntList(token!);
LockListInfoItemEntity currentKeyInfo =
CommonDataManage().currentKeyInfo;
DateTime startTime = DateTime.fromMillisecondsSinceEpoch(
currentKeyInfo.startDate! ~/ 1000);
DateTime endTime = DateTime.fromMillisecondsSinceEpoch(
currentKeyInfo.endDate! ~/ 1000);
IoSenderManage.senderAddUser(
lockID: BlueManage().connectDeviceName,
authUserID:
CommonDataManage().currentKeyInfo.senderUserId!.toString(),
keyID: CommonDataManage().currentKeyInfo.keyId.toString(),
userID: generateRandomString(6),
openMode: 1,
keyType: 0,
startDate: CommonDataManage().currentKeyInfo.startDate! ~/ 1000,
expireDate: CommonDataManage().currentKeyInfo.endDate! ~/ 1000,
useCountLimit: 0xFFFF,
isRound: currentKeyInfo.keyType == 2 ? 1 : 0,
weekRound: DateTool().accordingTheCycleIntoTheCorrespondingNumber(
currentKeyInfo.weekDays!),
startHour: startTime.hour,
startMin: startTime.minute,
endHour: endTime.hour,
endMin: endTime.minute,
role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0,
password: "123456",
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: tokenList);
}
});
await Future.delayed(const Duration(seconds: 2));
count++;
await randomlyCreate32Users(count, max);
}
//
String generateRandomString(int length) {
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
final random = Random();
return List.generate(length, (index) => chars[random.nextInt(chars.length)])
.join();
}
}

View File

@ -199,15 +199,14 @@ class DebugConsole extends StatefulWidget {
static void listen(void Function() body, static void listen(void Function() body,
{DebugConsoleController? controller}) { {DebugConsoleController? controller}) {
controller ??= DebugConsole.instance; controller ??= DebugConsole.instance;
runZoned(body, runZoned(body, zoneSpecification: ZoneSpecification(
zoneSpecification: ZoneSpecification( handleUncaughtError: (Zone self, ZoneDelegate parent, Zone zone,
handleUncaughtError: (Zone self, ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace) {
Object error, StackTrace stackTrace) { controller!
controller!.log(error, .log(error, level: DebugConsoleLevel.error, stackTrace: stackTrace);
level: DebugConsoleLevel.error, stackTrace: stackTrace); parent.handleUncaughtError(zone, error, stackTrace);
parent.handleUncaughtError(zone, error, stackTrace); },
}, ));
));
} }
} }
@ -318,6 +317,10 @@ class _DebugConsoleState extends State<DebugConsole> {
onTap: () => widget.controller.clear(), onTap: () => widget.controller.clear(),
child: const Text('清除日志'), child: const Text('清除日志'),
), ),
PopupMenuItem(
onTap: () => widget.controller.showMore(context),
child: const Text('更多'),
),
], ],
) )
], ],

View File

@ -5,7 +5,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../../app_settings/app_colors.dart'; import '../../../../app_settings/app_colors.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/titleAppBar.dart'; import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart'; import '../../../../translations/trans_lib.dart';

View File

@ -68,7 +68,7 @@ class DoorLockLogLogic extends BaseGetXController {
case 0x00: case 0x00:
// //
int dataLength = (reply.data[5] << 8) + reply.data[6]; int dataLength = (reply.data[5] << 8) + reply.data[6];
AppLog.log("dataLength:$dataLength"); // AppLog.log("dataLength:$dataLength");
// var dataLength = reply.data[5]; // var dataLength = reply.data[5];
if (dataLength > 0) { if (dataLength > 0) {
reply.data.removeRange(0, 7); reply.data.removeRange(0, 7);

View File

@ -273,6 +273,8 @@ class AddFaceLogic extends BaseGetXController {
featureData: state.featureData.value, featureData: state.featureData.value,
addType: state.addType.value, addType: state.addType.value,
weekDay: state.weekDay.value, weekDay: state.weekDay.value,
startTime: int.parse(state.effectiveDateTime.value),
endTime: int.parse(state.failureDateTime.value),
faceRight: state.isAdministrator.value == "2" ? 1 : 0, faceRight: state.isAdministrator.value == "2" ? 1 : 0,
); );

View File

@ -12,6 +12,7 @@ class AddFaceTypeState {
var timeLimitBeginTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;// var timeLimitBeginTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;//
var timeLimitEndTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;// var timeLimitEndTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;//
var cycleBeginTime = "".obs;// var cycleBeginTime = "".obs;//
var cycleEndTime = "".obs;// var cycleEndTime = "".obs;//
var effectiveDateTime = "".obs;// var effectiveDateTime = "".obs;//

View File

@ -139,7 +139,7 @@ class _FaceDetailPageState extends State<FaceDetailPage> with RouteAware {
child: Obx(() => CommonItem( child: Obx(() => CommonItem(
leftTitel: "有效时间", leftTitel: "有效时间",
rightTitle: rightTitle:
"${DateTool().dateToHNString(state.startTime.value)}-${DateTool().dateToHNString(state.endTime.value)}", "${DateTool().dateToHNString(state.startDate.value)}-${DateTool().dateToHNString(state.endDate.value)}",
isHaveDirection: true, isHaveDirection: true,
action: () async { action: () async {
var data = await Get.toNamed( var data = await Get.toNamed(
@ -169,13 +169,13 @@ class _FaceDetailPageState extends State<FaceDetailPage> with RouteAware {
.dateToYMDHNString(state.addTime.value.toString()), .dateToYMDHNString(state.addTime.value.toString()),
)), )),
SizedBox(height: 10.h), SizedBox(height: 10.h),
Obx(() => CommonItem( // Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.stressCard!.tr, // leftTitel: TranslationLoader.lanKeys!.stressCard!.tr,
rightTitle: "", // rightTitle: "",
isTipsImg: false, // isTipsImg: false,
isHaveRightWidget: true, // isHaveRightWidget: true,
isHaveLine: true, // isHaveLine: true,
rightWidget: SizedBox(width: 60.w, height: 50.h, child: _isStressFace()))), // rightWidget: SizedBox(width: 60.w, height: 50.h, child: _isStressFace()))),
Obx(() => CommonItem( Obx(() => CommonItem(
leftTitel: "是否是管理员".tr, leftTitel: "是否是管理员".tr,
rightTitle: "", rightTitle: "",

View File

@ -39,7 +39,7 @@ class FaceDetailState {
keyType.value = faceItemData.value.faceType!; keyType.value = faceItemData.value.faceType!;
adder.value = faceItemData.value.senderUsername!; adder.value = faceItemData.value.senderUsername!;
addTime.value = faceItemData.value.createDate!; addTime.value = faceItemData.value.createDate!;
weekDay.value = faceItemData.value.cyclicConfig!; weekDay.value = faceItemData.value.weekDay!;
isStressFace.value = faceItemData.value.isCoerced! == 2 ? true : false; isStressFace.value = faceItemData.value.isCoerced! == 2 ? true : false;
isAdministrator.value = faceItemData.value.faceRight! == 1 ? true : false; isAdministrator.value = faceItemData.value.faceRight! == 1 ? true : false;
} }

View File

@ -116,7 +116,7 @@ class LockDetailLogic extends BaseGetXController {
keyID: BlueManage().connectDeviceName, keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
openMode: state.openDoorModel, openMode: state.openDoorModel,
openTime: getNetTime(), openTime: getUTCNetTime(),
onlineToken: state.lockNetToken, onlineToken: state.lockNetToken,
token: tokenData, token: tokenData,
needAuthor: 1, needAuthor: 1,
@ -357,7 +357,7 @@ class LockDetailLogic extends BaseGetXController {
keyID: BlueManage().connectDeviceName, keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
openMode: state.openDoorModel, openMode: state.openDoorModel,
openTime: getNetTime(), openTime: getUTCNetTime(),
onlineToken: state.lockNetToken, onlineToken: state.lockNetToken,
token: getTokenList, token: getTokenList,
needAuthor: 1, needAuthor: 1,
@ -411,16 +411,14 @@ class LockDetailLogic extends BaseGetXController {
// //
void getServerDatetime() async{ void getServerDatetime() async{
var entity = await ApiRepository.to.getServerDatetimeData( var entity = await ApiRepository.to.getServerDatetimeData();
lockId: state.keyInfos.value.lockId.toString(),
);
if(entity.errorCode!.codeIsSuccessful){ if(entity.errorCode!.codeIsSuccessful){
state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000; state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000;
// AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}"); // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}");
} }
} }
int getNetTime(){ int getUTCNetTime(){
return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime; return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime;
} }

View File

@ -58,6 +58,8 @@ class UploadElectricQuantityLogic extends BaseGetXController {
IoSenderManage.senderGetStarLockStatuInfo( IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
utcTimeStamp: getUTCNetTime(),
unixTimeStamp: getLocalNetTime(),
isBeforeAddUser: false, isBeforeAddUser: false,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
); );
@ -113,6 +115,8 @@ class UploadElectricQuantityLogic extends BaseGetXController {
IoSenderManage.senderGetStarLockStatuInfo( IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
utcTimeStamp: getUTCNetTime(),
unixTimeStamp: getLocalNetTime(),
isBeforeAddUser: false, isBeforeAddUser: false,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
); );
@ -123,12 +127,37 @@ class UploadElectricQuantityLogic extends BaseGetXController {
} }
} }
//
void getServerDatetime() async{
var entity = await ApiRepository.to.getServerDatetimeData();
if(entity.errorCode!.codeIsSuccessful){
state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000;
getLocalNetTime();
// AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}");
}
}
int getUTCNetTime(){
return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime;
}
int getLocalNetTime(){
DateTime utcTime = DateTime.fromMillisecondsSinceEpoch(getUTCNetTime()*1000, isUtc: true);
DateTime localTime = utcTime.toLocal();
// AppLog.log('getUTCNetTime: ${getUTCNetTime()}');
// AppLog.log('UTC time: $utcTime');
// AppLog.log('Local time: $localTime localTime.millisecondsSinceEpoch ~/ 1000:${localTime.millisecondsSinceEpoch ~/ 1000}');
return localTime.millisecondsSinceEpoch ~/ 1000;
}
@override @override
void onReady() { void onReady() {
// TODO: implement onReady // TODO: implement onReady
super.onReady(); super.onReady();
_initReplySubscription(); _initReplySubscription();
getServerDatetime();
} }
@override @override

View File

@ -7,6 +7,7 @@ class UploadElectricQuantityState {
var lockSetInfoData = LockSetInfoData().obs; var lockSetInfoData = LockSetInfoData().obs;
var lockBasicInfo = LockBasicInfo().obs; var lockBasicInfo = LockBasicInfo().obs;
var uploadElectricQuantityDate = 0.obs; var uploadElectricQuantityDate = 0.obs;
int differentialTime = 0;
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var sureBtnState = 0.obs;// 0 1 var sureBtnState = 0.obs;// 0 1

View File

@ -36,38 +36,38 @@ class LockTimeLogic extends BaseGetXController{
} }
// //
Future<void> _replyGetStarLockStatusInfo(Reply reply) async { // Future<void> _replyGetStarLockStatusInfo(Reply reply) async {
int status = reply.data[2]; // int status = reply.data[2];
switch (status) { // switch (status) {
case 0x00: // case 0x00:
// // //
cancelBlueConnetctToastTimer(); // cancelBlueConnetctToastTimer();
dismissEasyLoading(); // dismissEasyLoading();
//
// // //
var indate = reply.data.sublist(149, 153); // var indate = reply.data.sublist(149, 153);
int indateValue = ((0xff & indate[(0)]) << 24 | // int indateValue = ((0xff & indate[(0)]) << 24 |
(0xff & indate[1]) << 16 | // (0xff & indate[1]) << 16 |
(0xff & indate[2]) << 8 | // (0xff & indate[2]) << 8 |
(0xFF & indate[3])); // (0xFF & indate[3]));
state.dateTime.value = DateTool().dateToYMDHNString("$indateValue"); // state.dateTime.value = DateTool().dateToYMDHNString("$indateValue");
break; // break;
case 0x06: // case 0x06:
// // //
var privateKey = await Storage.getStringList(saveBluePrivateKey); // var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); // List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
IoSenderManage.senderGetStarLockStatuInfo( // IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName, // lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), // userID: await Storage.getUid(),
isBeforeAddUser: false, // isBeforeAddUser: false,
privateKey: getPrivateKeyList, // privateKey: getPrivateKeyList,
); // );
break; // break;
default: // default:
// // //
break; // break;
} // }
} // }
// //
Future<void> _replyTiming(Reply reply) async { Future<void> _replyTiming(Reply reply) async {
@ -75,7 +75,7 @@ class LockTimeLogic extends BaseGetXController{
switch(status){ switch(status){
case 0x00: case 0x00:
// //
String dataEime = DateTool().dateToYMDHNString("${state.dateTimestamp.value}"); String dataEime = DateTool().dateToYMDHNString("${getUTCNetTime()}");
state.dateTime.value = dataEime; state.dateTime.value = dataEime;
state.sureBtnState.value = 0; state.sureBtnState.value = 0;
@ -118,7 +118,7 @@ class LockTimeLogic extends BaseGetXController{
lockID:BlueManage().connectDeviceName, lockID:BlueManage().connectDeviceName,
userID:await Storage.getUid(), userID:await Storage.getUid(),
// nowTime:DateTime.now().millisecondsSinceEpoch~/1000, // nowTime:DateTime.now().millisecondsSinceEpoch~/1000,
nowTime: state.dateTimestamp.value, nowTime: getUTCNetTime(),
token:getTokenList, token:getTokenList,
needAuthor:1, needAuthor:1,
signKey:getSignKeyList, signKey:getSignKeyList,
@ -173,19 +173,19 @@ class LockTimeLogic extends BaseGetXController{
} }
} }
// //
void getServerDatetime(bool isSendBlue) async{ void getServerDatetime() async{
var entity = await ApiRepository.to.getServerDatetimeData( var entity = await ApiRepository.to.getServerDatetimeData();
lockId: state.lockSetInfoData.value.lockId.toString(),
);
if(entity.errorCode!.codeIsSuccessful){ if(entity.errorCode!.codeIsSuccessful){
state.dateTimestamp.value = entity.data!.date!.toString().length > 10 ? entity.data!.date!~/ 1000 : entity.data!.date!; state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000;
if(isSendBlue){ // AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}");
sendTiming();
}
} }
} }
int getUTCNetTime(){
return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime;
}
@override @override
void onReady() { void onReady() {
// TODO: implement onReady // TODO: implement onReady

View File

@ -57,7 +57,7 @@ class _LockTimePageState extends State<LockTimePage> with RouteAware{
onClick: () { onClick: () {
// logic.sendTiming(); // logic.sendTiming();
// logic.getServerDatetime(); // logic.getServerDatetime();
logic.getServerDatetime(true); logic.getServerDatetime();
}), }),
SizedBox( SizedBox(
height: 40.h, height: 40.h,

View File

@ -5,7 +5,7 @@ import '../lockSet/lockSetInfo_entity.dart';
class LockTimeState{ class LockTimeState{
var lockSetInfoData = LockSetInfoData().obs; var lockSetInfoData = LockSetInfoData().obs;
var dateTime = "".obs; var dateTime = "".obs;
var dateTimestamp = 0.obs; int differentialTime = 0;
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var sureBtnState = 0.obs;// 0() 1() var sureBtnState = 0.obs;// 0() 1()

View File

@ -157,9 +157,9 @@ class PasswordKeyDetailLogic extends BaseGetXController {
keyID:state.itemData.value.keyboardPwdId!.toString(), keyID:state.itemData.value.keyboardPwdId!.toString(),
userID:await Storage.getUid(), userID:await Storage.getUid(),
pwdNo: state.itemData.value.pwdUserNo!, pwdNo: state.itemData.value.pwdUserNo!,
pwd: state.isDeletPasswordKey.value == true ? "0" : state.inputPwdController.text, pwd: state.itemData.value.isCustom == 1 ? state.inputPwdController.text :state.isDeletPasswordKey.value == true ? "0" : state.inputPwdController.text,
useCountLimit: 0xffff, useCountLimit: 0xffff,
operate: state.isDeletPasswordKey.value == true ? 2 : 1, operate: state.itemData.value.isCustom == 1 ? state.isDeletPasswordKey.value == true ? 2 : 1 : 3,
isAdmin: state.isAdministrator.value == true ? 1 : 0, isAdmin: state.isAdministrator.value == true ? 1 : 0,
startTime:state.itemData.value.startDate! ~/ 1000, startTime:state.itemData.value.startDate! ~/ 1000,
endTime:state.itemData.value.endDate! ~/ 1000, endTime:state.itemData.value.endDate! ~/ 1000,

View File

@ -217,13 +217,7 @@ class _PasswordKeyDetailPageState extends State<PasswordKeyDetailPage> with Rout
onClick: () { onClick: () {
ShowTipView().showIosTipWithContentDialog("确定要删除吗?".tr, (){ ShowTipView().showIosTipWithContentDialog("确定要删除吗?".tr, (){
state.isDeletPasswordKey.value = true; state.isDeletPasswordKey.value = true;
if(state.itemData.value.isCustom! == 1){ logic.senderCustomPasswords();
//
logic.senderCustomPasswords();
}else{
//
logic.deletePwdRequest();
}
}); });
}), }),
], ],

View File

@ -9,6 +9,7 @@ import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../blue/blue_manage.dart'; import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_senderCustomPasswords.dart'; import '../../../../blue/io_protocol/io_senderCustomPasswords.dart';
import '../../../../blue/io_protocol/io_senderResetPasswords.dart';
import '../../../../blue/io_reply.dart'; import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/io_tool/manager_event_bus.dart';
@ -27,24 +28,24 @@ class PasswordKeyListLogic extends BaseGetXController {
// () // ()
if((reply is SenderCustomPasswordsReply) && (state.ifCurrentScreen.value == true)) { if((reply is SenderCustomPasswordsReply) && (state.ifCurrentScreen.value == true)) {
_replyAddICCardBegin(reply); _replyAddPassword(reply);
}
if(reply is SenderResetPasswordsReply){
_replyResetPassword(reply);
} }
}); });
} }
// () // ()
Future<void> _replyAddICCardBegin(Reply reply) async { Future<void> _replyAddPassword(Reply reply) async {
int status = reply.data[2]; int status = reply.data[2];
switch(status){ switch(status){
case 0x00: case 0x00:
// //
cancelBlueConnetctToastTimer(); cancelBlueConnetctToastTimer();
if(state.isDeletAll){ deletePwdRequest();
resetPasswordKeyListRequest();
}else{
deletePwdRequest();
}
break; break;
case 0x06: case 0x06:
// //
@ -54,19 +55,16 @@ class PasswordKeyListLogic extends BaseGetXController {
var signKey = await Storage.getStringList(saveBlueSignKey); var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!); List<int> signKeyDataList = changeStringListToIntList(signKey!);
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = reply.data.sublist(5, 9); var token = reply.data.sublist(5, 9);
var saveStrList = changeIntListToStringList(token); var saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList); Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderCustomPasswordsCommand( IoSenderManage.senderCustomPasswordsCommand(
keyID:state.deletKeyID, keyID:"0",
userID:(await Storage.getUid())!, userID:(await Storage.getUid())!,
pwdNo:state.pwdNo, pwdNo:state.pwdNo,
pwd:"0",//state.deletPWD, pwd:"0",//state.deletPWD,
operate: state.isDeletAll ? 3 : 2, operate: 2,
isAdmin: 0, isAdmin: 0,
useCountLimit: 0xffff, useCountLimit: 0xffff,
startTime:0x11223344, startTime:0x11223344,
@ -84,6 +82,130 @@ class PasswordKeyListLogic extends BaseGetXController {
} }
} }
//
Future<void> _replyResetPassword(Reply reply) async {
int status = reply.data[2];
switch(status){
case 0x00:
//
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
state.encrpyKey = reply.data.sublist(9, 17);
resetPasswordKeyListRequest();
break;
case 0x06:
//
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var token = reply.data.sublist(5, 9);
var saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderResetPasswordsCommand(
keyID:"0",
userID:(await Storage.getUid())!,
needAuthor: 1,
isBeforeAddUser: false,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: token);
break;
default:
//
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
break;
}
}
//
Future<void> senderCustomPasswords() async {
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderCustomPasswordsCommand(
keyID:"0",
userID:(await Storage.getUid())!,
pwdNo:state.pwdNo,
pwd:"0",//state.deletPWD,
operate: 2,
isAdmin: 0,
useCountLimit: 0xffff,
startTime:0x11223344,
endTime:0x11223344,
needAuthor: 1,
isBeforeAddUser: false,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
//
Future<void> senderResetPasswords() async {
if(state.sureBtnState.value == 1){
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderResetPasswordsCommand(
keyID:"0",
userID:(await Storage.getUid())!,
needAuthor: 1,
isBeforeAddUser: false,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
// //
Future<PasswordKeyListEntity> mockNetworkDataRequest() async { Future<PasswordKeyListEntity> mockNetworkDataRequest() async {
@ -109,8 +231,10 @@ class PasswordKeyListLogic extends BaseGetXController {
// //
Future<void> resetPasswordKeyListRequest() async { Future<void> resetPasswordKeyListRequest() async {
PasswordKeyListEntity entity = await ApiRepository.to PasswordKeyListEntity entity = await ApiRepository.to.keyboardPwdReset(
.keyboardPwdReset(state.keyInfo.value.lockId.toString()); lockId:state.keyInfo.value.lockId.toString(),
passwordKey: state.encrpyKey
);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
showToast("重置成功".tr, something: (){ showToast("重置成功".tr, something: (){
pageNo = 1; pageNo = 1;
@ -133,51 +257,6 @@ class PasswordKeyListLogic extends BaseGetXController {
} }
} }
//
Future<void> senderCustomPasswords() async {
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderCustomPasswordsCommand(
keyID:state.deletKeyID,
userID:(await Storage.getUid())!,
pwdNo:state.pwdNo,
pwd:"0",//state.deletPWD,
operate: state.isDeletAll ? 3 : 2,
isAdmin: 0,
useCountLimit: 0xffff,
startTime:0x11223344,
endTime:0x11223344,
needAuthor: 1,
isBeforeAddUser: false,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
//使 //使
String getUseDateStr(PasswordKeyListItem indexEntity) { String getUseDateStr(PasswordKeyListItem indexEntity) {
int? getPwdType = indexEntity.keyboardPwdType; int? getPwdType = indexEntity.keyboardPwdType;

View File

@ -61,14 +61,12 @@ class _PasswordKeyListPageState extends State<PasswordKeyListPage> with RouteAwa
onPressed: () async { onPressed: () async {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) { if (isDemoMode == false) {
if(state.itemDataList.isEmpty){
logic.showToast("暂无密码,无需重置".tr);
return;
}
ShowTipView().showIosTipWithContentDialog('该锁的密码都将被删除'.tr, () { ShowTipView().showIosTipWithContentDialog('该锁的密码都将被删除'.tr, () {
state.isDeletAll = true; logic.senderResetPasswords();
state.deletKeyID = "0";
state.deletUserID = "0";
// state.deletPWD = "";
state.pwdNo = 0;
logic.senderCustomPasswords();
}); });
} else { } else {
logic.showToast("演示模式".tr); logic.showToast("演示模式".tr);
@ -141,10 +139,6 @@ class _PasswordKeyListPageState extends State<PasswordKeyListPage> with RouteAwa
SlidableAction( SlidableAction(
onPressed: (BuildContext context){ onPressed: (BuildContext context){
ShowTipView().showIosTipWithContentDialog("确定要删除吗?".tr, () async { ShowTipView().showIosTipWithContentDialog("确定要删除吗?".tr, () async {
state.isDeletAll = false;
state.deletUserID = (await Storage.getUid())!;
state.deletKeyID = passwordKeyListItem.keyboardPwdId.toString();
state.deletPWD = passwordKeyListItem.keyboardPwd!;
state.itemData = passwordKeyListItem; state.itemData = passwordKeyListItem;
state.pwdNo = passwordKeyListItem.pwdUserNo!; state.pwdNo = passwordKeyListItem.pwdUserNo!;
logic.senderCustomPasswords(); logic.senderCustomPasswords();

View File

@ -13,13 +13,8 @@ class PasswordKeyListState {
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var sureBtnState = 0.obs;// 0() 1() var sureBtnState = 0.obs;// 0() 1()
//
var isDeletAll = false;
var deletKeyID = "";
var deletUserID = "DeleteAll!@#";
var deletPWD = "";
var pwdNo = 0; var pwdNo = 0;
var encrpyKey = <int>[];
PasswordKeyListState() { PasswordKeyListState() {
Map map = Get.arguments; Map map = Get.arguments;
keyInfo.value = map["keyInfo"]; keyInfo.value = map["keyInfo"];

View File

@ -309,7 +309,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
var endDate = DateTool().dateToTimestamp(state.customEndTime.value, 1); var endDate = DateTool().dateToTimestamp(state.customEndTime.value, 1);
// //
if (state.isPermanent.value == false) { if (state.isPermanent.value == false) {
if (startDate <= DateTool().dateToTimestamp(DateTool().getNowDateWithType(2), 1)) { if (startDate < DateTool().dateToTimestamp(DateTool().getNowDateWithType(2), 1)) {
showToast("生效时间要大于当前时间"); showToast("生效时间要大于当前时间");
return; return;
} }

View File

@ -25,6 +25,7 @@ import '../../../blue/io_reply.dart';
import '../../../blue/io_tool/io_tool.dart'; import '../../../blue/io_tool/io_tool.dart';
import '../../../blue/io_tool/manager_event_bus.dart'; import '../../../blue/io_tool/manager_event_bus.dart';
import '../../../blue/sender_manage.dart'; import '../../../blue/sender_manage.dart';
import '../../../network/api_repository.dart';
import '../../../tools/storage.dart'; import '../../../tools/storage.dart';
import 'nearbyLock_state.dart'; import 'nearbyLock_state.dart';
@ -232,14 +233,14 @@ class NearbyLockLogic extends BaseGetXController {
// AppLog.log("电池剩余电量 battRemCap:$battRemCap"); // AppLog.log("电池剩余电量 battRemCap:$battRemCap");
// //
var restoreCounter = reply.data.sublist(133, 135); var restoreCounter = reply.data.sublist(134, 136);
state.lockInfo["restoreCount"] = state.lockInfo["restoreCount"] =
restoreCounter[0] * 256 + restoreCounter[1]; restoreCounter[0] * 256 + restoreCounter[1];
AppLog.log( AppLog.log(
"重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}"); "重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}");
// //
var restoreDate = reply.data.sublist(135, 139); var restoreDate = reply.data.sublist(136, 140);
int restoreDateValue = ((0xff & restoreDate[(0)]) << 24 | int restoreDateValue = ((0xff & restoreDate[(0)]) << 24 |
(0xff & restoreDate[1]) << 16 | (0xff & restoreDate[1]) << 16 |
(0xff & restoreDate[2]) << 8 | (0xff & restoreDate[2]) << 8 |
@ -249,13 +250,13 @@ class NearbyLockLogic extends BaseGetXController {
AppLog.log("重置时间 restoreDateValue:$restoreDateValue"); AppLog.log("重置时间 restoreDateValue:$restoreDateValue");
// //
var icPartNo = reply.data.sublist(139, 149); var icPartNo = reply.data.sublist(140, 150);
var icPartNoStr = utf8String(icPartNo); var icPartNoStr = utf8String(icPartNo);
state.lockInfo["icPartNo"] = icPartNoStr; state.lockInfo["icPartNo"] = icPartNoStr;
AppLog.log("主控芯片型号 icPartNoStr:$icPartNoStr"); AppLog.log("主控芯片型号 icPartNoStr:$icPartNoStr");
// //
var indate = reply.data.sublist(149, 153); var indate = reply.data.sublist(150, 154);
int indateValue = ((0xff & indate[(0)]) << 24 | int indateValue = ((0xff & indate[(0)]) << 24 |
(0xff & indate[1]) << 16 | (0xff & indate[1]) << 16 |
(0xff & indate[2]) << 8 | (0xff & indate[2]) << 8 |
@ -265,12 +266,12 @@ class NearbyLockLogic extends BaseGetXController {
AppLog.log("有效时间 indateValue:$indateValue"); AppLog.log("有效时间 indateValue:$indateValue");
// mac地址 // mac地址
var macAddress = reply.data.sublist(153, 173); var macAddress = reply.data.sublist(154, 174);
var macAddressStr = utf8String(macAddress); var macAddressStr = utf8String(macAddress);
state.lockInfo["mac"] = macAddressStr; state.lockInfo["mac"] = macAddressStr;
AppLog.log("mac地址 macAddressStr:$macAddressStr"); AppLog.log("mac地址 macAddressStr:$macAddressStr");
var index = 173; var index = 174;
// //
var featureValueLength = reply.data[index]; var featureValueLength = reply.data[index];
AppLog.log("锁特征值字符串长度 featureValueLength:$featureValueLength"); AppLog.log("锁特征值字符串长度 featureValueLength:$featureValueLength");
@ -338,10 +339,11 @@ class NearbyLockLogic extends BaseGetXController {
IoSenderManage.senderGetStarLockStatuInfo( IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
utcTimeStamp: getUTCNetTime(),
unixTimeStamp: getLocalNetTime(),
isBeforeAddUser: true, isBeforeAddUser: true,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
); );
break; break;
default: default:
// //
@ -360,14 +362,12 @@ class NearbyLockLogic extends BaseGetXController {
AppLog.log("开始获取锁状态"); AppLog.log("开始获取锁状态");
var privateKey = await Storage.getStringList(saveBluePrivateKey); var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
// IoSenderManage.senderGetLockStatu(
// lockID:BlueManage().connectDeviceName,
// userID:await Storage.getUid(),
// privateKey:getPrivateKeyList,
// );
IoSenderManage.senderGetStarLockStatuInfo( IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
utcTimeStamp: getUTCNetTime(),
unixTimeStamp: getLocalNetTime(),
isBeforeAddUser: true, isBeforeAddUser: true,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
); );
@ -598,7 +598,7 @@ class NearbyLockLogic extends BaseGetXController {
Uint8List bin = data.sublist(binOffset.toInt(), data.length); Uint8List bin = data.sublist(binOffset.toInt(), data.length);
//md5 //md5
String md5Str = md5.convert(bin).toString().toUpperCase(); String md5Str = md5.convert(bin).toString().toUpperCase();
AppLog.log('---> $md5Str ${meta['fwMd5']}'); // AppLog.log('---> $md5Str ${meta['fwMd5']}');
if (md5Str != meta['fwMd5']) { if (md5Str != meta['fwMd5']) {
showToast('文件校验失败 0x02'.tr); showToast('文件校验失败 0x02'.tr);
return null; return null;
@ -610,11 +610,36 @@ class NearbyLockLogic extends BaseGetXController {
return bin; return bin;
} }
//
void getServerDatetime() async{
var entity = await ApiRepository.to.getServerDatetimeData();
if(entity.errorCode!.codeIsSuccessful){
state.differentialTime = entity.data!.date! ~/ 1000 - DateTime.now().millisecondsSinceEpoch ~/ 1000;
getLocalNetTime();
// AppLog.log("entity.data!.date! ~/ 1000:${entity.data!.date! ~/ 1000} DateTime.now().millisecondsSinceEpoch ~/ 1000:${DateTime.now().millisecondsSinceEpoch ~/ 1000} 服务器时间差:${state.differentialTime}");
}
}
int getUTCNetTime(){
return DateTime.now().millisecondsSinceEpoch ~/ 1000 + state.differentialTime;
}
int getLocalNetTime(){
DateTime utcTime = DateTime.fromMillisecondsSinceEpoch(getUTCNetTime()*1000, isUtc: true);
DateTime localTime = utcTime.toLocal();
// AppLog.log('getUTCNetTime: ${getUTCNetTime()}');
// AppLog.log('UTC time: $utcTime');
// AppLog.log('Local time: $localTime localTime.millisecondsSinceEpoch ~/ 1000:${localTime.millisecondsSinceEpoch ~/ 1000}');
return localTime.millisecondsSinceEpoch ~/ 1000;
}
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
_initReplySubscription(); _initReplySubscription();
state.ifCurrentScreen.value = true; state.ifCurrentScreen.value = true;
getServerDatetime();
startScanBlueList(); startScanBlueList();
} }

View File

@ -5,6 +5,7 @@ class NearbyLockState {
RxList<ScanResult> devices = <ScanResult>[].obs; RxList<ScanResult> devices = <ScanResult>[].obs;
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
// var sureBtnState = 0.obs;// 0 1 // var sureBtnState = 0.obs;// 0 1
int differentialTime = 0;
var selectLockName = "".obs; var selectLockName = "".obs;

View File

@ -9,6 +9,8 @@ import 'package:get/get.dart';
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
import 'package:star_lock/blue/io_protocol/io_senderCustomPasswords.dart'; import 'package:star_lock/blue/io_protocol/io_senderCustomPasswords.dart';
import 'package:star_lock/blue/io_type.dart'; import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
import 'package:star_lock/tools/commonDataManage.dart';
import '../../../blue/blue_manage.dart'; import '../../../blue/blue_manage.dart';
import '../../../blue/io_protocol/io_addUser.dart'; import '../../../blue/io_protocol/io_addUser.dart';
@ -56,7 +58,7 @@ class SaveLockLogic extends BaseGetXController {
switch (status) { switch (status) {
case 0x00: case 0x00:
// //
state.lockUserNo = reply.data[47]; state.lockUserNo = listChangInt(reply.data.sublist(47, 49));
cancelBlueConnetctToastTimer(); cancelBlueConnetctToastTimer();
bindBlueAdmin(); bindBlueAdmin();
@ -78,6 +80,13 @@ class SaveLockLogic extends BaseGetXController {
keyType: 1, keyType: 1,
startDate: DateTime.now().millisecondsSinceEpoch, startDate: DateTime.now().millisecondsSinceEpoch,
expireDate: 0x11223344, expireDate: 0x11223344,
useCountLimit: 0xFFFF,
isRound:0,
weekRound: 0,
startHour: 0,
startMin: 0,
endHour: 0,
endMin: 0,
role: 255, role: 255,
password: "123456", password: "123456",
needAuthor: 1, needAuthor: 1,
@ -207,7 +216,6 @@ class SaveLockLogic extends BaseGetXController {
if (token != null) { if (token != null) {
getTokenList = changeStringListToIntList(token); getTokenList = changeStringListToIntList(token);
} }
IoSenderManage.senderAddUser( IoSenderManage.senderAddUser(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
authUserID:await Storage.getUid(), authUserID:await Storage.getUid(),
@ -217,6 +225,13 @@ class SaveLockLogic extends BaseGetXController {
keyType:1, keyType:1,
startDate:DateTime.now().millisecondsSinceEpoch, startDate:DateTime.now().millisecondsSinceEpoch,
expireDate:0x11223344, expireDate:0x11223344,
useCountLimit: 0xFFFF,
isRound:0,
weekRound: 0,
startHour: 0,
startMin: 0,
endHour: 0,
endMin: 0,
role:255, role:255,
password:"123456", password:"123456",
needAuthor:1, needAuthor:1,

View File

@ -8,9 +8,7 @@ class SelectLockTypeLogic extends BaseGetXController {
SelectLockTypeState state = SelectLockTypeState(); SelectLockTypeState state = SelectLockTypeState();
void getServerDatetime() async{ void getServerDatetime() async{
var entity = await ApiRepository.to.getServerDatetimeData( var entity = await ApiRepository.to.getServerDatetimeData();
lockId: CommonDataManage().currentKeyInfo.lockId.toString(),
);
if(entity.errorCode!.codeIsSuccessful){ if(entity.errorCode!.codeIsSuccessful){
} }
} }

View File

@ -232,4 +232,7 @@ abstract class Api {
final String getlockCloudStorageListURL = '/lockCloudStorage/list'; // final String getlockCloudStorageListURL = '/lockCloudStorage/list'; //
final String deleteLockCloudStorageURL = '/lockCloudStorage/delete'; // final String deleteLockCloudStorageURL = '/lockCloudStorage/delete'; //
final String getUserNoList = '/key/getUserNoList'; //userNo
} }

View File

@ -810,11 +810,9 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> getServerDatetimeLoadData(String lockId) => post( Future<Response> getServerDatetimeLoadData() => post(
getServerDatetimeUrl.toUrl, getServerDatetimeUrl.toUrl,
jsonEncode({ jsonEncode({}),
'lockId': lockId,
}),
isUnShowLoading: true); isUnShowLoading: true);
// //
@ -1221,6 +1219,8 @@ class ApiProvider extends BaseProvider {
String featureData, String featureData,
String addType, String addType,
List weekDay, List weekDay,
int startTime,
int endTime,
int faceRight, int faceRight,
) => ) =>
post( post(
@ -1235,6 +1235,8 @@ class ApiProvider extends BaseProvider {
'featureData': featureData, 'featureData': featureData,
'addType': addType, 'addType': addType,
'weekDay': weekDay, 'weekDay': weekDay,
'startTime': startTime,
'endTime': endTime,
'faceRight': faceRight 'faceRight': faceRight
})); }));
@ -1610,8 +1612,12 @@ class ApiProvider extends BaseProvider {
post(getUserInfoURL.toUrl, jsonEncode({'operatorUid': operatorUid})); post(getUserInfoURL.toUrl, jsonEncode({'operatorUid': operatorUid}));
// //
Future<Response> keyboardPwdReset(String lockId) => Future<Response> keyboardPwdReset(String lockId, List passwordKey) =>
post(keyboardPwdResetURL.toUrl, jsonEncode({'lockId': lockId})); post(keyboardPwdResetURL.toUrl,
jsonEncode({
'lockId': lockId,
'passwordKey': passwordKey,
}));
//使 //使
Future<Response> sendValidationCodeAuth(String countryCode, String account, Future<Response> sendValidationCodeAuth(String countryCode, String account,
@ -2072,6 +2078,10 @@ class ApiProvider extends BaseProvider {
'certifyId': certifyId, 'certifyId': certifyId,
'keyId': keyId, 'keyId': keyId,
})); }));
// userNo
Future<Response> getLockUserNoList(int lockId) =>
post(getUserNoList.toUrl, jsonEncode({'lockId': lockId}));
} }
extension ExtensionString on String { extension ExtensionString on String {

View File

@ -1,4 +1,5 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/blue/entity/lock_user_no_list_entity.dart';
import 'package:star_lock/login/selectCountryRegion/common/countryRegionEntity.dart'; import 'package:star_lock/login/selectCountryRegion/common/countryRegionEntity.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
@ -861,10 +862,8 @@ class ApiRepository {
} }
// //
Future<GetServerDatetimeEntity> getServerDatetimeData({ Future<GetServerDatetimeEntity> getServerDatetimeData() async {
required String lockId, final res = await apiProvider.getServerDatetimeLoadData();
}) async {
final res = await apiProvider.getServerDatetimeLoadData(lockId);
return GetServerDatetimeEntity.fromJson(res.body); return GetServerDatetimeEntity.fromJson(res.body);
} }
@ -1385,9 +1384,11 @@ class ApiRepository {
required String featureData, required String featureData,
required String addType, required String addType,
required List weekDay, required List weekDay,
required int startTime,
required int endTime,
required int faceRight}) async { required int faceRight}) async {
final res = await apiProvider.addFaceData(lockId, faceName, faceNumber, final res = await apiProvider.addFaceData(lockId, faceName, faceNumber,
faceType, startDate, endDate, featureData, addType, weekDay, faceRight); faceType, startDate, endDate, featureData, addType, weekDay, startTime, endTime, faceRight);
return AddFaceEntity.fromJson(res.body); return AddFaceEntity.fromJson(res.body);
} }
@ -1651,8 +1652,11 @@ class ApiRepository {
} }
// //
Future<PasswordKeyListEntity> keyboardPwdReset(String lockId) async { Future<PasswordKeyListEntity> keyboardPwdReset({
final res = await apiProvider.keyboardPwdReset(lockId); required String lockId,
required List passwordKey
}) async {
final res = await apiProvider.keyboardPwdReset(lockId, passwordKey);
return PasswordKeyListEntity.fromJson(res.body); return PasswordKeyListEntity.fromJson(res.body);
} }
@ -2088,4 +2092,12 @@ class ApiRepository {
final res = await apiProvider.getServiceCheckCertify(certifyId, keyId); final res = await apiProvider.getServiceCheckCertify(certifyId, keyId);
return ServiceAuthResultEntity.fromJson(res.body); return ServiceAuthResultEntity.fromJson(res.body);
} }
// certifyId是否完成认证
Future<LockUserNoListEntity> getLockUserNoList({
required int lockId,
}) async {
final res = await apiProvider.getLockUserNoList(lockId);
return LockUserNoListEntity.fromJson(res.body);
}
} }

View File

@ -80,7 +80,7 @@ class DateTool {
var month = p.month == 0 ? DateTime.now().month : p.month; var month = p.month == 0 ? DateTime.now().month : p.month;
var day = p.day == 0 ? DateTime.now().day : p.day; var day = p.day == 0 ? DateTime.now().day : p.day;
var hour = p.hour == 0 ? DateTime.now().hour : p.hour; var hour = p.hour == 0 ? DateTime.now().hour : p.hour;
var minute = p.minute == 0 ? DateTime.now().minute : p.minute; var minute = p.minute;
var dateStr = ''; var dateStr = '';
switch (type) { switch (type) {