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

This commit is contained in:
Daisy 2024-05-07 18:08:03 +08:00
commit 1e8a1648eb
37 changed files with 1248 additions and 509 deletions

View File

@ -796,8 +796,32 @@
"购买":"Buy", "购买":"Buy",
"实名认证为付费功能,请购买后再使用":"Real-name authentication is a paid function, please use it after purchase", "实名认证为付费功能,请购买后再使用":"Real-name authentication is a paid function, please use it after purchase",
"密码不一致哦":"The passwords are inconsistent", "密码不一致哦":"The passwords are inconsistent",
"退出添加":"Quit adding",
"管理员已满":"Admin full",
"用户已满": "The user is full",
"锁上面添加指纹已满": "Add fingerprint on lock is full",
"指纹已存在": "The fingerprint already exists.",
"锁上面添加人脸已满": "Lock above add face is full",
"人脸已存在": "The face already exists",
"锁上面添加卡已满":"Lock above add card is full",
"卡已存在": "Card already exists",
"锁上面添加密码已满": "Lock above add password is full",
"密码已存在": "Password already exists",
"请输入密码": "Please enter password",
"真实姓名":"Real name", "真实姓名":"Real name",
"身份证号":"ID number", "身份证号":"ID number",
"请输入真实姓名":"Please enter your real name", "请输入真实姓名":"Please enter your real name",
"请输入身份证号":"Please enter your ID number" "请输入身份证号":"Please enter your ID number",
"点击返回设备配对":"Tap Back to device pairing",
"无法连接?尝试升级":"Can't connect?Upgrade attempted",
"固件升级提示":"Firmware upgrade prompt",
"请先获取固件文件到手机本地,再选择升级":"Please obtain the firmware file to the local phone first, and then select Upgrade",
"固件升级中":"The firmware is being upgraded",
"取消升级":"Cancel the upgrade",
"固件传输中":"Firmware in transit",
"关闭":"Shut down",
"传输中'":"In transit"
} }

View File

@ -823,8 +823,32 @@
"当前剩余数量":"当前剩余数量", "当前剩余数量":"当前剩余数量",
"购买":"购买", "购买":"购买",
"实名认证为付费功能,请购买后再使用":"实名认证为付费功能,请购买后再使用", "实名认证为付费功能,请购买后再使用":"实名认证为付费功能,请购买后再使用",
"退出添加":"退出添加",
"管理员已满":"管理员已满",
"用户已满": "用户已满",
"锁上面添加指纹已满": "锁上面添加指纹已满",
"指纹已存在": "指纹已存在",
"锁上面添加人脸已满": "锁上面添加人脸已满",
"人脸已存在": "人脸已存在",
"锁上面添加卡已满":"锁上面添加卡已满",
"卡已存在": "卡已存在",
"锁上面添加密码已满": "锁上面添加密码已满",
"密码已存在": "密码已存在",
"请输入密码": "请输入密码",
"真实姓名":"真实姓名", "真实姓名":"真实姓名",
"身份证号":"身份证号", "身份证号":"身份证号",
"请输入真实姓名":"请输入真实姓名", "请输入真实姓名":"请输入真实姓名",
"请输入身份证号":"请输入身份证号" "请输入身份证号":"请输入身份证号",
"点击返回设备配对":"点击返回设备配对",
"无法连接?尝试升级":"无法连接?尝试升级",
"固件升级提示":"固件升级提示",
"请先获取固件文件到手机本地,再选择升级":"请先获取固件文件到手机本地,再选择升级",
"固件升级中":"固件升级中",
"取消升级":"取消升级",
"固件传输中":"固件传输中",
"关闭":"关闭",
"传输中'":"传输中"
} }

View File

@ -826,8 +826,33 @@
"当前剩余数量":"当前剩余数量", "当前剩余数量":"当前剩余数量",
"购买":"购买", "购买":"购买",
"实名认证为付费功能,请购买后再使用":"实名认证为付费功能,请购买后再使用", "实名认证为付费功能,请购买后再使用":"实名认证为付费功能,请购买后再使用",
"退出添加":"退出添加",
"管理员已满":"管理员已满",
"用户已满": "用户已满",
"锁上面添加指纹已满": "锁上面添加指纹已满",
"指纹已存在": "指纹已存在",
"锁上面添加人脸已满": "锁上面添加人脸已满",
"人脸已存在": "人脸已存在",
"锁上面添加卡已满":"锁上面添加卡已满",
"卡已存在": "卡已存在",
"锁上面添加密码已满": "锁上面添加密码已满",
"密码已存在": "密码已存在",
"请输入密码": "请输入密码",
"真实姓名":"真实姓名", "真实姓名":"真实姓名",
"身份证号":"身份证号", "身份证号":"身份证号",
"请输入真实姓名":"请输入真实姓名", "请输入真实姓名":"请输入真实姓名",
"请输入身份证号":"请输入身份证号" "请输入身份证号":"请输入身份证号",
"点击返回设备配对":"点击返回设备配对",
"无法连接?尝试升级":"无法连接?尝试升级",
"固件升级提示":"固件升级提示",
"请先获取固件文件到手机本地,再选择升级":"请先获取固件文件到手机本地,再选择升级",
"固件升级中":"固件升级中",
"取消升级":"取消升级",
"固件传输中":"固件传输中",
"关闭":"关闭",
"传输中'":"传输中"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -21,6 +21,6 @@
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.0</string> <string>1.0</string>
<key>MinimumOSVersion</key> <key>MinimumOSVersion</key>
<string>11.0</string> <string>12.0</string>
</dict> </dict>
</plist> </plist>

View File

@ -145,7 +145,8 @@ class BlueManage {
_connectionStateSubscription?.cancel(); _connectionStateSubscription?.cancel();
_connectionStateSubscription = null; _connectionStateSubscription = null;
_connectionStateSubscription = bluetoothConnectDevice!.connectionState.listen((state) async { _connectionStateSubscription =
bluetoothConnectDevice!.connectionState.listen((state) async {
bluetoothConnectionState = state; bluetoothConnectionState = state;
// AppLog.log("蓝牙连接状态:$state"); // AppLog.log("蓝牙连接状态:$state");
}); });
@ -214,7 +215,9 @@ class BlueManage {
completer.complete(); completer.complete();
} }
}, onError: (e) { }, onError: (e) {
AppLog.log("扫描失败:$e",); AppLog.log(
"扫描失败:$e",
);
}); });
FlutterBluePlus.cancelWhenScanComplete(subscription); FlutterBluePlus.cancelWhenScanComplete(subscription);
await completer.future; await completer.future;
@ -281,7 +284,9 @@ class BlueManage {
// EventBusManager().eventBusFir(scanDevices); // EventBusManager().eventBusFir(scanDevices);
// FlutterBluePlus.stopScan(); // FlutterBluePlus.stopScan();
}, onError: (e) { }, onError: (e) {
AppLog.log("扫描失败:$e",); AppLog.log(
"扫描失败:$e",
);
}); });
FlutterBluePlus.cancelWhenScanComplete(subscription); FlutterBluePlus.cancelWhenScanComplete(subscription);
@ -304,7 +309,9 @@ class BlueManage {
} }
/// List senderData, /// List senderData,
Future<void> bludSendData(String deviceName, ConnectStateCallBack stateCallBack, {bool isAddEquipment = false}) async { Future<void> bludSendData(
String deviceName, ConnectStateCallBack stateCallBack,
{bool isAddEquipment = false}) async {
FlutterBluePlus.isSupported.then((isAvailable) async { FlutterBluePlus.isSupported.then((isAvailable) async {
if (isAvailable) { if (isAvailable) {
if (_adapterState == BluetoothAdapterState.on) { if (_adapterState == BluetoothAdapterState.on) {
@ -336,21 +343,13 @@ class BlueManage {
{bool isAddEquipment = false}) async { {bool isAddEquipment = false}) async {
connectDeviceName = deviceName; connectDeviceName = deviceName;
List<ScanResult> devicesList = scanDevices; List<ScanResult> devicesList = scanDevices;
// if (isAddEquipment == false) {
bool isExistDevice = scanDevices.any((element) => //使
element.device.platformName == connectDeviceName || startScan(10, (List<ScanResult> scanDevices) {
element.advertisementData.advName == connectDeviceName);
if (isAddEquipment == false && isExistDevice == false) {
// AppLog.log("需要开启扫描");
// startScan(10, (scanDevices){
startScanSingle(deviceName, 10, (List<ScanResult> scanDevices) {
// AppLog.log("扫描到的设备:$scanDevices");
devicesList = scanDevices;
_connectDevice(devicesList, deviceName, connectStateCallBack, _connectDevice(devicesList, deviceName, connectStateCallBack,
isAddEquipment: isAddEquipment); isAddEquipment: isAddEquipment);
}); });
} else { } else {
// AppLog.log("不需要开启扫描");
_connectDevice(devicesList, deviceName, connectStateCallBack, _connectDevice(devicesList, deviceName, connectStateCallBack,
isAddEquipment: isAddEquipment); isAddEquipment: isAddEquipment);
} }
@ -364,6 +363,7 @@ class BlueManage {
final knownDeviceIndex = devicesList.indexWhere((d) => final knownDeviceIndex = devicesList.indexWhere((d) =>
(d.device.platformName == deviceName) || (d.device.platformName == deviceName) ||
(d.advertisementData.advName == deviceName)); (d.advertisementData.advName == deviceName));
if (knownDeviceIndex >= 0) { if (knownDeviceIndex >= 0) {
// //
connectDeviceMacAddress = connectDeviceMacAddress =
@ -375,6 +375,7 @@ class BlueManage {
// AppLog.log('bluetoothConnectDevice: $bluetoothConnectDevice'); // AppLog.log('bluetoothConnectDevice: $bluetoothConnectDevice');
scanResult = devicesList[knownDeviceIndex]; scanResult = devicesList[knownDeviceIndex];
_initGetMtuSubscription(); _initGetMtuSubscription();
_initListenConnectionState(); _initListenConnectionState();
} }
@ -446,7 +447,8 @@ class BlueManage {
} on Exception catch (e) { } on Exception catch (e) {
bluetoothConnectionState = BluetoothConnectionState.disconnected; bluetoothConnectionState = BluetoothConnectionState.disconnected;
connectStateCallBack(bluetoothConnectionState!); connectStateCallBack(bluetoothConnectionState!);
AppLog.log('发现设备时失败 e:$e bluetoothConnectionState:$bluetoothConnectionState'); AppLog.log(
'发现设备时失败 e:$e bluetoothConnectionState:$bluetoothConnectionState');
rethrow; rethrow;
} }
} }
@ -461,7 +463,7 @@ class BlueManage {
_subScribeToCharacteristic(BluetoothCharacteristic characteristic) async { _subScribeToCharacteristic(BluetoothCharacteristic characteristic) async {
final subscription = characteristic.onValueReceived.listen((data) { final subscription = characteristic.onValueReceived.listen((data) {
// AppLog.log("订阅获取的数据:$data"); AppLog.log("订阅获取的数据:$data");
if (data == lastTimeData || data.isEmpty) { if (data == lastTimeData || data.isEmpty) {
return; return;
} else { } else {
@ -477,7 +479,7 @@ class BlueManage {
// //
dataLen = data[8] * 256 + data[9]; // 16 dataLen = data[8] * 256 + data[9]; // 16
// AppLog.log("dataLen1111:$dataLen getDataLength:${data.length} data:$data"); // AppLog.log("dataLen1111:$dataLen getDataLength:${data.length} data:$data");
if (dataLen! + 12 > data.length) { if (dataLen! + 14 > data.length) {
// //
allData.addAll(data); allData.addAll(data);
} else { } else {
@ -492,7 +494,7 @@ class BlueManage {
// //
allData.addAll(data); allData.addAll(data);
// var len = allData[8] * 256 + allData[9]; // var len = allData[8] * 256 + allData[9];
// AppLog.log("dataLen3333:$dataLen allData.length:${allData.length} allData:$allData"); AppLog.log("dataLen3333:$dataLen allData.length:${allData.length} allData:$allData");
if ((dataLen! + 14) <= allData.length) { if ((dataLen! + 14) <= allData.length) {
// //
CommandReciverManager.appDataReceive(allData); CommandReciverManager.appDataReceive(allData);
@ -555,15 +557,16 @@ class BlueManage {
// //
Future<void> writeCharacteristicWithResponse(List<int> value) async { Future<void> writeCharacteristicWithResponse(List<int> value) async {
List<BluetoothService> services =
List<BluetoothService> services = await bluetoothConnectDevice!.discoverServices(); await bluetoothConnectDevice!.discoverServices();
for (BluetoothService service in services) { for (BluetoothService service in services) {
// AppLog.log("33333 service.remoteId:${service.remoteId}" // AppLog.log("33333 service.remoteId:${service.remoteId}"
// " service.uuid:${service.uuid}\n\n" // " service.uuid:${service.uuid}\n\n"
// " service.characteristics:${service.characteristics}\n\n" // " service.characteristics:${service.characteristics}\n\n"
// " service.includedServices:${service.includedServices}"); // " service.includedServices:${service.includedServices}");
if (service.uuid == _serviceIdConnect) { if (service.uuid == _serviceIdConnect) {
for (BluetoothCharacteristic characteristic in service.characteristics) { for (BluetoothCharacteristic characteristic
in service.characteristics) {
// AppLog.log("44444 characteristic.remoteId:${characteristic.remoteId}" // AppLog.log("44444 characteristic.remoteId:${characteristic.remoteId}"
// " characteristic.uuid:${characteristic.uuid}\n\n" // " characteristic.uuid:${characteristic.uuid}\n\n"
// " characteristic.secondaryServiceUuid:${characteristic // " characteristic.secondaryServiceUuid:${characteristic
@ -578,7 +581,9 @@ class BlueManage {
for (int i = 0; i < subData.length; i++) { for (int i = 0; i < subData.length; i++) {
if (characteristic.properties.writeWithoutResponse) { if (characteristic.properties.writeWithoutResponse) {
// 使WRITE_NO_RESPONSE属性写入值 // 使WRITE_NO_RESPONSE属性写入值
await characteristic.write(subData[i],withoutResponse: true).then((value) async { await characteristic
.write(subData[i], withoutResponse: true)
.then((value) async {
// await Future.delayed(const Duration(milliseconds: 1)).then(( // await Future.delayed(const Duration(milliseconds: 1)).then((
// value) async { // value) async {
// AppLog.log('分包发送成功了'); // AppLog.log('分包发送成功了');
@ -594,7 +599,8 @@ class BlueManage {
}); });
} else { } else {
// //
throw Exception('This characteristic does not support writing.'); throw Exception(
'This characteristic does not support writing.');
} }
} }
} on Exception catch (e, s) { } on Exception catch (e, s) {

View File

@ -0,0 +1,98 @@
import 'dart:convert';
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;
///TODO:
class SenderCancelAddCardCommand extends SenderProtocol {
String? keyID;
String? userID;
List<int>? token;
int? needAuthor;
List<int>? signKey;
List<int>? privateKey;
SenderCancelAddCardCommand({
this.keyID,
this.userID,
this.token,
this.needAuthor,
this.signKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
String toString() {
return 'SenderAddFingerprintWithTimeCycleCoercionCommand{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(25);
// 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);
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;
}
}

View File

@ -65,8 +65,8 @@ class SenderAddFaceCommand extends SenderProtocol {
'weekRound: $weekRound, ' 'weekRound: $weekRound, '
'startDate: ${DateTool().dateIntToYMDHNString(startDate)}, ' 'startDate: ${DateTool().dateIntToYMDHNString(startDate)}, '
'endDate: ${DateTool().dateIntToYMDHNString(endDate)}, ' 'endDate: ${DateTool().dateIntToYMDHNString(endDate)}, '
'startTime: ${DateTool().dateToYMDHNString(startTime)}, ' 'startTime: $startTime, '
'endTime: ${DateTool().dateToYMDHNString(endTime)}, ' 'endTime: $startTime, '
'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}'; 'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}';
} }
@ -77,13 +77,8 @@ class SenderAddFaceCommand extends SenderProtocol {
List<int> ebcData = []; 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);
data.addAll(intChangList(commandType!.typeValue)); data.addAll(intChangList(commandType!.typeValue));
// AppLog.log("intChangList(commandType!.typeValue):${intChangList(commandType!.typeValue)}");
// //
data.add(81); data.add(81);
@ -92,38 +87,45 @@ class SenderAddFaceCommand extends SenderProtocol {
int keyIDLength = utf8.encode(keyID!).length; int keyIDLength = utf8.encode(keyID!).length;
subData.addAll(utf8.encode(keyID!)); subData.addAll(utf8.encode(keyID!));
subData = getFixedLengthList(subData, 40 - keyIDLength); subData = getFixedLengthList(subData, 40 - keyIDLength);
// AppLog.log("keyID:$keyID utf8.encode(keyID!):${utf8.encode(keyID!)}");
//userID 20 //userID 20
int userIDLength = utf8.encode(userID!).length; int userIDLength = utf8.encode(userID!).length;
subData.addAll(utf8.encode(userID!)); subData.addAll(utf8.encode(userID!));
subData = getFixedLengthList(subData, 20 - userIDLength); subData = getFixedLengthList(subData, 20 - userIDLength);
// AppLog.log("userID:$userID utf8.encode(userID!):${utf8.encode(userID!)}");
// faceNo // faceNo
subData.addAll(intChangList(faceNo!)); subData.addAll(intChangList(faceNo!));
AppLog.log("faceNo:$faceNo intChangList(faceNo!):${intChangList(faceNo!)}"); // AppLog.log("faceNo:$faceNo intChangList(faceNo!):${intChangList(faceNo!)}");
// UseCountLimit // UseCountLimit
subData.addAll(intChangList(useCountLimit!)); subData.addAll(intChangList(useCountLimit!));
// AppLog.log("useCountLimit:$useCountLimit intChangList(useCountLimit!):${intChangList(useCountLimit!)}");
// Operate 0: 1 2: 3 // Operate 0: 1 2: 3
subData.add(operate!); subData.add(operate!);
AppLog.log("addFingerprint operate:$operate"); // AppLog.log("addFingerprint operate:$operate");
// isAdmin // isAdmin
subData.add(isAdmin!); subData.add(isAdmin!);
AppLog.log("addFingerprint isAdmin:$isAdmin"); // AppLog.log("addFingerprint isAdmin:$isAdmin");
// isForce // isForce
subData.add(isForce!); subData.add(isForce!);
// AppLog.log("addFingerprint isForce:$isForce");
// token // token
subData.addAll(token!); subData.addAll(token!);
// AppLog.log("addFingerprint token:$token");
// isRound // isRound
subData.add(isRound!); subData.add(isRound!);
// AppLog.log("addFingerprint isRound:$isRound");
// weekRound // weekRound
subData.add(weekRound!); subData.add(weekRound!);
// AppLog.log("addFingerprint weekRound:$weekRound");
// startDate 4 // startDate 4
subData.add((startDate! & 0xff000000) >> 24); subData.add((startDate! & 0xff000000) >> 24);
@ -136,7 +138,7 @@ class SenderAddFaceCommand extends SenderProtocol {
subData.add((endDate! & 0xff0000) >> 16); subData.add((endDate! & 0xff0000) >> 16);
subData.add((endDate! & 0xff00) >> 8); subData.add((endDate! & 0xff00) >> 8);
subData.add((endDate! & 0xff)); subData.add((endDate! & 0xff));
AppLog.log("addFingerprint startDate:${DateTool().dateToYMDHNString(startDate.toString())} endDate:${DateTool().dateToYMDHNString(endDate.toString())}"); // AppLog.log("addFingerprint startDate:${DateTool().dateToYMDHNString(startDate.toString())} endDate:${DateTool().dateToYMDHNString(endDate.toString())}");
// startTime 4 // startTime 4
List<int> startTimeList = [0,0,0,0]; List<int> startTimeList = [0,0,0,0];

View File

@ -0,0 +1,98 @@
import 'dart:convert';
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;
///TODO:
class SenderCancelAddFaceCommand extends SenderProtocol {
String? keyID;
String? userID;
List<int>? token;
int? needAuthor;
List<int>? signKey;
List<int>? privateKey;
SenderCancelAddFaceCommand({
this.keyID,
this.userID,
this.token,
this.needAuthor,
this.signKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
String toString() {
return 'SenderAddFingerprintWithTimeCycleCoercionCommand{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(86);
// 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);
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;
}
}

View File

@ -0,0 +1,98 @@
import 'dart:convert';
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;
///TODO:
class SenderCancelAddFingerprintCommand extends SenderProtocol {
String? keyID;
String? userID;
List<int>? token;
int? needAuthor;
List<int>? signKey;
List<int>? privateKey;
SenderCancelAddFingerprintCommand({
this.keyID,
this.userID,
this.token,
this.needAuthor,
this.signKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
String toString() {
return 'SenderAddFingerprintWithTimeCycleCoercionCommand{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(37);
// 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);
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;
}
}

View File

@ -56,7 +56,6 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol {
this.privateKey, this.privateKey,
}) : super(CommandType.generalExtendedCommond); }) : super(CommandType.generalExtendedCommond);
@override @override
String toString() { String toString() {
return 'SenderAddFingerprintWithTimeCycleCoercionCommand{keyID: $keyID, ' return 'SenderAddFingerprintWithTimeCycleCoercionCommand{keyID: $keyID, '
@ -65,8 +64,8 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol {
'weekRound: $weekRound, ' 'weekRound: $weekRound, '
'startDate:${DateTool().dateIntToYMDHNString(startDate)}, ' 'startDate:${DateTool().dateIntToYMDHNString(startDate)}, '
'endDate: ${DateTool().dateIntToYMDHNString(endDate)}, ' 'endDate: ${DateTool().dateIntToYMDHNString(endDate)}, '
'startTime: ${DateTool().dateToYMDHNString(startTime)}, ' 'startTime: $startTime, '
'endTime: ${DateTool().dateToYMDHNString(endTime)}, ' 'endTime: $endTime, '
'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}'; 'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}';
} }
@ -77,12 +76,6 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol {
List<int> ebcData = []; 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);
data.addAll(intChangList(commandType!.typeValue)); data.addAll(intChangList(commandType!.typeValue));
// //
@ -100,18 +93,18 @@ class SenderAddFingerprintWithTimeCycleCoercionCommand extends SenderProtocol {
// fingerNo // fingerNo
subData.addAll(intChangList(fingerNo!)); subData.addAll(intChangList(fingerNo!));
AppLog.log("fingerNo:$fingerNo intChangList(fingerNo!):${intChangList(fingerNo!)}"); // AppLog.log("fingerNo:$fingerNo intChangList(fingerNo!):${intChangList(fingerNo!)}");
// UseCountLimit // UseCountLimit
subData.addAll(intChangList(useCountLimit!)); subData.addAll(intChangList(useCountLimit!));
// Operate 0: 1 2: 3 // Operate 0: 1 2: 3
subData.add(operate!); subData.add(operate!);
AppLog.log("addFingerprint operate:$operate"); // AppLog.log("addFingerprint operate:$operate");
// isAdmin // isAdmin
subData.add(isAdmin!); subData.add(isAdmin!);
AppLog.log("addFingerprint isAdmin:$isAdmin"); // AppLog.log("addFingerprint isAdmin:$isAdmin");
// isForce // isForce
subData.add(isForce!); subData.add(isForce!);

View File

@ -65,8 +65,8 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol {
'weekRound: $weekRound, ' 'weekRound: $weekRound, '
'startDate: ${DateTool().dateIntToYMDHNString(startDate)}, ' 'startDate: ${DateTool().dateIntToYMDHNString(startDate)}, '
'endDate: ${DateTool().dateIntToYMDHNString(endDate)}, ' 'endDate: ${DateTool().dateIntToYMDHNString(endDate)}, '
'startTime: ${DateTool().dateToYMDHNString(startTime)}, ' 'startTime: $startTime,'
'endTime: ${DateTool().dateToYMDHNString(endTime)}, ' 'endTime: $endTime, '
'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}'; 'needAuthor: $needAuthor, signKey: $signKey, privateKey: $privateKey}';
} }
@ -77,12 +77,6 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol {
List<int> ebcData = []; 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);
data.addAll(intChangList(commandType!.typeValue)); data.addAll(intChangList(commandType!.typeValue));
// //
@ -106,15 +100,15 @@ class SenderAddICCardWithTimeCycleCoercionCommand extends SenderProtocol {
// Operate 0: 1 2: 3 // Operate 0: 1 2: 3
subData.add(operate!); subData.add(operate!);
AppLog.log("addCard operate:$operate"); // AppLog.log("addCard operate:$operate");
// isAdmin // isAdmin
subData.add(isAdmin!); subData.add(isAdmin!);
AppLog.log("addCard isAdmin:$isAdmin"); // AppLog.log("addCard isAdmin:$isAdmin");
// isForce // isForce
subData.add(isForce!); subData.add(isForce!);
AppLog.log("addCard isForce:$isForce"); // AppLog.log("addCard isForce:$isForce");
// token // token
subData.addAll(token!); subData.addAll(token!);

View File

@ -26,6 +26,7 @@ class OTAUpgradeCommand extends SenderProtocol {
List<int>? signKey; List<int>? signKey;
List<int>? privateKey; List<int>? privateKey;
List<int>? token; List<int>? token;
bool encrypt;
OTAUpgradeCommand( OTAUpgradeCommand(
{this.lockID, {this.lockID,
@ -40,10 +41,10 @@ class OTAUpgradeCommand extends SenderProtocol {
this.needAuthor, this.needAuthor,
this.signKey, this.signKey,
this.privateKey, this.privateKey,
this.token}) this.token,
this.encrypt = true})
: super(CommandType.startOATUpgrade); : super(CommandType.startOATUpgrade);
@override @override
String toString() { String toString() {
return 'OTAUpgradeCommand{lockID: $lockID, userID: $userID, ' return 'OTAUpgradeCommand{lockID: $lockID, userID: $userID, '
@ -53,6 +54,15 @@ class OTAUpgradeCommand extends SenderProtocol {
'privateKey: $privateKey, token: $token}'; 'privateKey: $privateKey, token: $token}';
} }
@override
int identifierValue() {
if (encrypt) {
return super.identifierValue();
} else {
return 0x20;
}
}
@override @override
List<int> messageDetail() { List<int> messageDetail() {
List<int> data = []; List<int> data = [];
@ -66,21 +76,18 @@ class OTAUpgradeCommand extends SenderProtocol {
data.add(type1); data.add(type1);
data.add(type2); data.add(type2);
AppLog.log('---> 指令 : $type1 $type2' );
// id 40 // id 40
int lockIDLength = utf8.encode(lockID!).length; int lockIDLength = utf8.encode(lockID!).length;
data.addAll(utf8.encode(lockID!)); data.addAll(utf8.encode(lockID!));
data = getFixedLengthList(data, 40 - lockIDLength); data = getFixedLengthList(data, 40 - lockIDLength);
AppLog.log('---> 锁id :${utf8.encode(lockID!)}');
//userID 20 //userID 20
int userIDLength = utf8.encode(userID!).length; int userIDLength = utf8.encode(userID!).length;
data.addAll(utf8.encode(userID!)); data.addAll(utf8.encode(userID!));
data = getFixedLengthList(data, 20 - userIDLength); data = getFixedLengthList(data, 20 - userIDLength);
AppLog.log('---> userID :${utf8.encode(userID!)}');
//platform 2 //platform 2
int platform0 = (platform! & 0xFF00) >> 8; int platform0 = (platform! & 0xFF00) >> 8;
@ -88,36 +95,31 @@ class OTAUpgradeCommand extends SenderProtocol {
data.add(platform0); data.add(platform0);
data.add(platform1); data.add(platform1);
AppLog.log('---> platform : $platform0 $platform1');
//product 2 //product 2
// int product0 = (product! & 0xFF00) >> 8; // int product0 = (product! & 0xFF00) >> 8;
// int product1 = product! & 0xFF; // int product1 = product! & 0xFF;
// data.add(product0); // data.add(product0);
// data.add(product1); // data.add(product1);
data.addAll([0,1]);// 01 data.addAll([0, 1]); // 01
AppLog.log('---> platform : ${[0,1]}');
//HwVersion 20 //HwVersion 20
int hwVersionLength = utf8.encode(hwVersion!).length; int hwVersionLength = utf8.encode(hwVersion!).length;
data.addAll(utf8.encode(hwVersion!)); data.addAll(utf8.encode(hwVersion!));
data = getFixedLengthList(data, 20 - hwVersionLength); data = getFixedLengthList(data, 20 - hwVersionLength);
//FwVersion 20 //FwVersion 20
int fwVersionLength = utf8.encode(fwVersion!).length; int fwVersionLength = utf8.encode(fwVersion!).length;
data.addAll(utf8.encode(fwVersion!)); data.addAll(utf8.encode(fwVersion!));
data = getFixedLengthList(data, 20 - fwVersionLength); data = getFixedLengthList(data, 20 - fwVersionLength);
//fwSize 4 //fwSize 4
ByteData bytes = ByteData(4); // 4 ByteData bytes = ByteData(4); // 4
bytes.setInt32(0, fwSize!); bytes.setInt32(0, fwSize!);
List<int> byteList = bytes.buffer.asUint8List(); List<int> byteList = bytes.buffer.asUint8List();
data.addAll(byteList); data.addAll(byteList);
// 16 // 16
Uint8List result = Uint8List(16); Uint8List result = Uint8List(16);
// 4 // 4
@ -142,11 +144,9 @@ class OTAUpgradeCommand extends SenderProtocol {
authCodeData.addAll(utf8.encode(userID!)); authCodeData.addAll(utf8.encode(userID!));
//token 4 Token 0 //token 4 Token 0
authCodeData.addAll(token!); authCodeData.addAll(token??[]);
authCodeData.addAll(signKey!); authCodeData.addAll(signKey??[]);
AppLog.log('---> ${utf8.encode(keyID!)} ${utf8.encode(userID!)} $token $signKey');
// KeyIDauthUserIDmd5加密之后就是authCode // KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData); var authCode = crypto.md5.convert(authCodeData);
@ -161,11 +161,17 @@ class OTAUpgradeCommand extends SenderProtocol {
data.add(0); data.add(0);
} }
} }
printLog(data); printLog(data);
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); if (encrypt) {
return ebcData;
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB);
return ebcData;
} else {
data.add(0);
return data;
}
} }
} }

View File

@ -33,8 +33,9 @@ abstract class SenderProtocol extends IOData {
_commandIndex = IoManager().commandIndex; _commandIndex = IoManager().commandIndex;
} }
void printLog(List<int> data){ void printLog(List<int> data) {
AppLog.log("App -> 锁,指令类型:${commandType!.typeName} \n\n参数是:\n${toString()} \n\n加密之前数据是:\n$data"); AppLog.log(
"App -> 锁,指令类型:${commandType!.typeName} \n\n参数是:\n${toString()} \n\n加密之前数据是:\n$data");
} }
//TODO:Ï //TODO:Ï
@ -58,7 +59,8 @@ abstract class SenderProtocol extends IOData {
// //
// 4 4 1 01AES1282SM43SM4 // 4 4 1 01AES1282SM43SM4
commandList.add(commandType!.identifierValue); int value = identifierValue();
commandList.add(value);
// //
int dataLen = dataSourceLength(); int dataLen = dataSourceLength();
@ -84,6 +86,10 @@ abstract class SenderProtocol extends IOData {
return commandList; return commandList;
} }
//
// 4 4 1 01AES1282SM43SM4
int identifierValue() => commandType!.identifierValue;
//TODO: //TODO:
int dataSourceLength() => commandData!.length; int dataSourceLength() => commandData!.length;

View File

@ -7,6 +7,7 @@ import 'package:star_lock/blue/sender_manage.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart';
import '../app_settings/app_settings.dart';
import '../main/lockDetail/lockDetail/lockNetToken_entity.dart'; import '../main/lockDetail/lockDetail/lockNetToken_entity.dart';
import '../network/api_repository.dart'; import '../network/api_repository.dart';
import '../tools/commonDataManage.dart'; import '../tools/commonDataManage.dart';
@ -83,6 +84,8 @@ class SenderBeforeDataManage {
// publicKey: publicKeyDataList, // publicKey: publicKeyDataList,
// privateKey: getPrivateKeyList, // privateKey: getPrivateKeyList,
// token: token); // token: token);
AppLog.log("startDate111:${CommonDataManage().currentKeyInfo.startDate} endDate:${CommonDataManage().currentKeyInfo.endDate}");
var addUserData = AddUserCommand( var addUserData = AddUserCommand(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
authUserID: CommonDataManage().currentKeyInfo.senderUserId!.toString(), authUserID: CommonDataManage().currentKeyInfo.senderUserId!.toString(),
@ -90,8 +93,8 @@ class SenderBeforeDataManage {
userID: await Storage.getUid(), userID: await Storage.getUid(),
openMode: 1, openMode: 1,
keyType: 0, keyType: 0,
startDate: CommonDataManage().currentKeyInfo.startDate!~/10000, startDate: CommonDataManage().currentKeyInfo.startDate!~/1000,
expireDate: CommonDataManage().currentKeyInfo.endDate!~/10000, expireDate: CommonDataManage().currentKeyInfo.endDate!~/1000,
role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0, role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0,
password: "123456", password: "123456",
needAuthor: 1, needAuthor: 1,
@ -123,8 +126,8 @@ class SenderBeforeDataManage {
userID: await Storage.getUid(), userID: await Storage.getUid(),
openMode: 1, openMode: 1,
keyType: 0, keyType: 0,
startDate: CommonDataManage().currentKeyInfo.startDate!~/10000, startDate: CommonDataManage().currentKeyInfo.startDate!~/1000,
expireDate: CommonDataManage().currentKeyInfo.endDate!~/10000, expireDate: CommonDataManage().currentKeyInfo.endDate!~/1000,
role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0, role: CommonDataManage().currentKeyInfo.keyRight == 1 ? 1 : 0,
password: "123456", password: "123456",
needAuthor: 1, needAuthor: 1,

View File

@ -10,6 +10,9 @@ 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';
import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart';
import 'io_protocol/io_addCardCancel.dart';
import 'io_protocol/io_addFaceCancel.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_addStressFingerprint.dart';
@ -417,6 +420,27 @@ class IoSenderManage {
callBack: callBack); callBack: callBack);
} }
//todo:
static void senderCancelAddFingerprintCommand(
{required String? keyID,
required String? userID,
required List<int>? token,
required int? needAuthor,
required List<int>? signKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: SenderCancelAddFingerprintCommand(
keyID: keyID,
userID: userID,
token: token,
needAuthor: needAuthor,
signKey: signKey,
privateKey: privateKey,
),
callBack: callBack);
}
//todo: //todo:
// static void senderAddICCardCommand( // static void senderAddICCardCommand(
// {required String? keyID, // {required String? keyID,
@ -489,6 +513,27 @@ class IoSenderManage {
callBack: callBack); callBack: callBack);
} }
//todo:
static void senderCancelAddCardCommand(
{required String? keyID,
required String? userID,
required List<int>? token,
required int? needAuthor,
required List<int>? signKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: SenderCancelAddCardCommand(
keyID: keyID,
userID: userID,
token: token,
needAuthor: needAuthor,
signKey: signKey,
privateKey: privateKey,
),
callBack: callBack);
}
//todo: //todo:
static void senderAddFaceCommand( static void senderAddFaceCommand(
{required String? keyID, {required String? keyID,
@ -532,6 +577,27 @@ class IoSenderManage {
callBack: callBack); callBack: callBack);
} }
//todo:
static void senderCancelAddFaceCommand(
{required String? keyID,
required String? userID,
required List<int>? token,
required int? needAuthor,
required List<int>? signKey,
required List<int>? privateKey,
CommandSendCallBack? callBack}) {
CommandSenderManager().managerSendData(
command: SenderCancelAddFaceCommand(
keyID: keyID,
userID: userID,
token: token,
needAuthor: needAuthor,
signKey: signKey,
privateKey: privateKey,
),
callBack: callBack);
}
//todo: //todo:
static void senderTimingCommand( static void senderTimingCommand(
{required String? lockID, {required String? lockID,

View File

@ -20,9 +20,7 @@ FutureOr<void> main() async {
// //
await _initTranslation(); await _initTranslation();
DebugConsole.listen(() { runApp(const MyApp());
runApp(const MyApp());
});
if (AppPlatform.isAndroid) { if (AppPlatform.isAndroid) {
SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle systemUiOverlayStyle =

View File

@ -49,8 +49,8 @@ class AddCardTypeLogic extends BaseGetXController{
showToast("失效时间要大于生效时间".tr); showToast("失效时间要大于生效时间".tr);
return; return;
} }
AppLog.log("state.timeLimitBeginTime.value:${state.timeLimitBeginTime.value} startDate:$startDate"); // AppLog.log("state.timeLimitBeginTime.value:${state.timeLimitBeginTime.value} startDate:$startDate");
AppLog.log("state.timeLimitEndTime.value:${state.timeLimitEndTime.value} endDate:$endDate"); // AppLog.log("state.timeLimitEndTime.value:${state.timeLimitEndTime.value} endDate:$endDate");
} else if (state.selectType.value == "2") { } else if (state.selectType.value == "2") {
if (state.cycleBeginTime.value.isEmpty) { if (state.cycleBeginTime.value.isEmpty) {
showToast("请选择有效期".tr); showToast("请选择有效期".tr);

View File

@ -36,11 +36,6 @@ class AddICCardLogic extends BaseGetXController{
if(reply is SenderAddICCardConfirmationReply) { if(reply is SenderAddICCardConfirmationReply) {
_replyAddICCardConfirmation(reply); _replyAddICCardConfirmation(reply);
} }
//
// if(reply is SenderAddStressICCardReply) {
// _replyAddICStressCard(reply);
// }
}); });
} }
@ -55,6 +50,8 @@ class AddICCardLogic extends BaseGetXController{
// AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber"); // AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber");
state.cardNumber.value = cardNumber.toString(); state.cardNumber.value = cardNumber.toString();
cancelBlueConnetctToastTimer(); cancelBlueConnetctToastTimer();
state.ifAddState.value = true;
state.ifConnectScuess.value = true; state.ifConnectScuess.value = true;
break; break;
case 0x06: case 0x06:
@ -95,35 +92,49 @@ class AddICCardLogic extends BaseGetXController{
break; break;
default: default:
// //
state.ifAddState.value = false;
break; break;
} }
} }
Future<void> _replyAddICCardConfirmation(Reply reply) async { Future<void> _replyAddICCardConfirmation(Reply reply) async {
int status = reply.data[2]; int status = reply.data[2];
state.ifAddState.value = false;
switch(status){ switch(status){
case 0x00: case 0x00:
// //
// if(state.cardNumber.value == (reply.data[6]).toString()){ //
// return; switch(reply.data[5]){
// }else{ case 0xff:
// state.cardNumber.value = (reply.data[6]).toString(); //
// } showToast("退出添加".tr);
// if(state.isCoerced.value == "1"){ Get.close(1);
// break;
int addResultStatus = reply.data[5]; case 0xFE:
if(addResultStatus == 0){ //
// showToast("管理员已满".tr);
Get.close(1);
break;
case 0xFD:
//
showToast("用户已满".tr);
Get.close(1);
break;
case 0xFC:
//
showToast("锁上面添加卡已满".tr);
Get.close(1);
break;
case 0xFB:
//
showToast("卡已存在".tr);
break;
default:
//
//
addICCardData(); addICCardData();
}else if(addResultStatus == 255){ break;
// 255 退 }
Get.close(2);
}
// }else{
// //
// addICCardData();
// }
break; break;
default: default:
// //
@ -131,63 +142,6 @@ class AddICCardLogic extends BaseGetXController{
} }
} }
// Future<void> _replyAddICStressCard(Reply reply) async {
// int status = reply.data[2];
//
// switch(status){
// case 0x00:
// //
// AppLog.log("${reply.commandType!.typeValue} 数据解析成功");
// addICCardData();
// break;
// case 0x06:
// //
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var signKey = await Storage.getStringList(saveBlueSignKey);
// List<int> getSignKeyList = changeStringListToIntList(signKey!);
//
// var token = reply.data.sublist(5, 9);
// var saveStrList = changeIntListToStringList(token);
// Storage.setStringList(saveBlueToken, saveStrList);
//
// AppLog.log("state.isAdministrator.value:${state.isAdministrator.value}");
// IoSenderManage.senderAddStressICCardCommand(
// keyID:"1",
// userID:await Storage.getUid(),
// icCardNo:state.isAdministrator.value == "2" ? 254 : 1,
// cardType:1,
// useCountLimit:1,
// startTime:int.parse(state.startDate.value)~/1000,
// endTime:int.parse(state.endDate.value)~/1000,
// needAuthor:1,
// publicKey:publicKeyDataList,
// privateKey:getPrivateKeyList,
// token: token,
// signKey: getSignKeyList,
// );
// break;
// case 0x07:
// //
// AppLog.log("${reply.commandType!.typeValue} 用户无权限");
//
// break;
// case 0x09:
// //
// AppLog.log("${reply.commandType!.typeValue} 权限校验错误");
//
// break;
// default:
// //
// AppLog.log("${reply.commandType!.typeValue} 失败");
// break;
// }
// }
// //
Future<void> senderAddICCard() async { Future<void> senderAddICCard() async {
showBlueConnetctToastTimer(action: (){ showBlueConnetctToastTimer(action: (){
@ -237,39 +191,36 @@ class AddICCardLogic extends BaseGetXController{
}); });
} }
// //
// Future<void> senderAddStressICCard() async { Future<void> senderCancelAddCardCommand() async {
// BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
// if (deviceConnectionState == BluetoothConnectionState.connected){ if (deviceConnectionState == BluetoothConnectionState.connected){
// var publicKey = await Storage.getStringList(saveBluePublicKey); var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!); List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var privateKey = await Storage.getStringList(saveBluePrivateKey); var signKey = await Storage.getStringList(saveBlueSignKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); List<int> signKeyDataList = changeStringListToIntList(signKey!);
//
// var signKey = await Storage.getStringList(saveBlueSignKey); var token = await Storage.getStringList(saveBlueToken);
// List<int> getSignKeyList = changeStringListToIntList(signKey!); List<int> getTokenList = changeStringListToIntList(token!);
//
// var token = await Storage.getStringList(saveBlueToken); IoSenderManage.senderCancelAddCardCommand(
// List<int> getTokenList = changeStringListToIntList(token!); keyID:"1",
// userID:await Storage.getUid(),
// IoSenderManage.senderAddStressICCardCommand( needAuthor:1,
// keyID:"1", signKey:signKeyDataList,
// userID:await Storage.getUid(), privateKey:getPrivateKeyList,
// icCardNo:state.isAdministrator.value == "2" ? 254 : 1, token: getTokenList,
// cardType:1, );
// useCountLimit:1, }else if (deviceConnectionState == BluetoothConnectionState.disconnected){
// startTime:int.parse(state.startDate.value)~/1000, if(state.ifCurrentScreen.value == true){
// endTime:int.parse(state.endDate.value)~/1000, showBlueConnetctToast();
// needAuthor:1, }
// publicKey:publicKeyDataList, cancelBlueConnetctToastTimer();
// privateKey:getPrivateKeyList, Get.close(1);
// token: getTokenList, }
// signKey: getSignKeyList, });
// ); }
// }
// });
// }
void addICCardData() async { void addICCardData() async {
var entity = await ApiRepository.to.addICCardData( var entity = await ApiRepository.to.addICCardData(

View File

@ -100,6 +100,10 @@ class _AddICCardPageState extends State<AddICCardPage> with RouteAware {
super.didPop(); super.didPop();
logic.cancelBlueConnetctToastTimer(); logic.cancelBlueConnetctToastTimer();
state.ifCurrentScreen.value = false; state.ifCurrentScreen.value = false;
if(state.ifAddState.value){
logic.senderCancelAddCardCommand();
}
} }
/// ///

View File

@ -4,6 +4,7 @@ import 'package:get/get.dart';
class AddICCardState{ class AddICCardState{
var ifConnectScuess = false.obs; var ifConnectScuess = false.obs;
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var ifAddState = false.obs;//
var addFingerprintProcessNumber = 0.obs; var addFingerprintProcessNumber = 0.obs;
final lockId = 0.obs; final lockId = 0.obs;

View File

@ -47,6 +47,8 @@ class AddFaceLogic extends BaseGetXController {
switch (status) { switch (status) {
case 0x00: case 0x00:
// //
state.ifAddState.value = true;
cancelBlueConnetctToastTimer();
// //
state.maxRegCount.value = reply.data[11]; state.maxRegCount.value = reply.data[11];
@ -86,7 +88,10 @@ class AddFaceLogic extends BaseGetXController {
break; break;
default: default:
// //
state.ifAddState.value = false;
showToast("添加人脸失败", something: (){
Get.back();
});
break; break;
} }
} }
@ -96,24 +101,59 @@ class AddFaceLogic extends BaseGetXController {
switch (status) { switch (status) {
case 0x00: case 0x00:
// switch(reply.data[5]){
if (reply.data[5] == 255) { case 0xff:
// //
showToast("添加失败"); showToast("退出添加".tr);
Get.close(2); state.ifAddState.value = false;
} else { Get.close(1);
// state.addFaceProcessNumber.value++; break;
case 0xFE:
//
showToast("管理员已满".tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFD:
//
showToast("用户已满".tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFC:
//
showToast("锁上面添加人脸已满".tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFB:
//
showToast("人脸已存在".tr);
state.ifAddState.value = false;
break;
default:
//
// //
state.regIndex.value = reply.data[6]; state.regIndex.value = reply.data[6];
// AppLog.log("注册人脸过程state.regIndex.value:${state.regIndex.value}"); // AppLog.log("注册人脸过程state.regIndex.value:${state.regIndex.value}");
break;
} }
break;
case 0x06:
//
//
// if (reply.data[5] == 255) {
// //
// showToast("添加失败");
// Get.close(2);
// } else {
// // state.addFaceProcessNumber.value++;
// //
// state.regIndex.value = reply.data[6];
// // AppLog.log("注册人脸过程state.regIndex.value:${state.regIndex.value}");
// }
break; break;
default: default:
// //
state.ifAddState.value = false;
break; break;
} }
} }
@ -132,14 +172,12 @@ class AddFaceLogic extends BaseGetXController {
} else { } else {
state.faceNumber.value = faceNumber; state.faceNumber.value = faceNumber;
} }
state.ifAddState.value = false;
addFaceData(); addFaceData();
break;
case 0x06:
//
break; break;
default: default:
// //
state.ifAddState.value = false;
break; break;
} }
} }
@ -192,6 +230,37 @@ class AddFaceLogic extends BaseGetXController {
}); });
} }
//
Future<void> senderCancelAddFaceCommand() async {
BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var signKey = await Storage.getStringList(saveBlueSignKey);
List<int> signKeyDataList = changeStringListToIntList(signKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderCancelAddFaceCommand(
keyID:"1",
userID:await Storage.getUid(),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
);
}else if (deviceConnectionState == BluetoothConnectionState.disconnected){
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
cancelBlueConnetctToastTimer();
Get.close(1);
}
});
}
// //
void addFaceData() async { void addFaceData() async {
var entity = await ApiRepository.to.addFaceData( var entity = await ApiRepository.to.addFaceData(

View File

@ -126,6 +126,10 @@ class _AddFacePageState extends State<AddFacePage> with RouteAware {
super.didPop(); super.didPop();
logic.cancelBlueConnetctToastTimer(); logic.cancelBlueConnetctToastTimer();
state.ifCurrentScreen.value = false; state.ifCurrentScreen.value = false;
if(state.ifAddState.value){
logic.senderCancelAddFaceCommand();
}
} }
/// ///

View File

@ -2,6 +2,7 @@ import 'package:get/get.dart';
class AddFaceState { class AddFaceState {
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var ifAddState = false.obs;//
var ifConnectScuess = false.obs; var ifConnectScuess = false.obs;
var maxRegCount = 0.obs; // var maxRegCount = 0.obs; //

View File

@ -1,3 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';

View File

@ -39,11 +39,6 @@ class AddFingerprintLogic extends BaseGetXController {
if(reply is SenderAddFingerprintConfirmationReply) { if(reply is SenderAddFingerprintConfirmationReply) {
_replyAddFingerprintConfirmation(reply); _replyAddFingerprintConfirmation(reply);
} }
//
// if(reply is SenderAddStressFingerprintReply) {
// _replyAddStressFingerprint(reply);
// }
}); });
} }
@ -54,6 +49,8 @@ class AddFingerprintLogic extends BaseGetXController {
case 0x00: case 0x00:
// //
state.ifConnectScuess.value = true; state.ifConnectScuess.value = true;
state.ifAddState.value = true;
cancelBlueConnetctToastTimer();
// //
state.maxRegCount.value = reply.data[11]; state.maxRegCount.value = reply.data[11];
@ -92,20 +89,9 @@ class AddFingerprintLogic extends BaseGetXController {
token: token, token: token,
); );
break; break;
case 0x07:
//
showToast("添加指纹失败", something: (){
Get.back();
});
break;
case 0x09:
//
showToast("添加指纹失败", something: (){
Get.back();
});
break;
default: default:
// //
state.ifAddState.value = false;
showToast("添加指纹失败", something: (){ showToast("添加指纹失败", something: (){
Get.back(); Get.back();
}); });
@ -119,23 +105,47 @@ class AddFingerprintLogic extends BaseGetXController {
switch(status){ switch(status){
case 0x00: case 0x00:
// //
if(reply.data[5] == 255){ switch(reply.data[5]){
// case 0xff:
showToast("添加失败"); //
Get.close(2); showToast("退出添加".tr);
}else{ state.ifAddState.value = false;
// state.addFingerprintProcessNumber.value++; Get.close(1);
break;
// case 0xFE:
state.regIndex.value = reply.data[6]; //
AppLog.log("当前注册数 state.regIndex.value:${state.regIndex.value}"); showToast("管理员已满".tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFD:
//
showToast("用户已满".tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFC:
//
showToast("锁上面添加指纹已满".tr);
state.ifAddState.value = false;
Get.close(1);
break;
case 0xFB:
//
showToast("指纹已存在".tr);
state.ifAddState.value = false;
break;
default:
//
//
state.regIndex.value = reply.data[6];
// AppLog.log("当前注册数 state.regIndex.value:${state.regIndex.value}");
break;
} }
break; break;
case 0x06:
//
break;
default: default:
// //
state.ifAddState.value = false;
break; break;
} }
} }
@ -156,71 +166,20 @@ class AddFingerprintLogic extends BaseGetXController {
} }
// if(state.isCoerced.value == "1"){ // if(state.isCoerced.value == "1"){
// //
addFingerprintsData(); state.ifAddState.value = false;
addFingerprintsData();
// }else{ // }else{
// // // //
// senderAddStressFingerprint(); // senderAddStressFingerprint();
// } // }
break; break;
case 0x06:
//
break;
default: default:
// //
state.ifAddState.value = false;
break; break;
} }
} }
// Future<void> _replyAddStressFingerprint(Reply reply) async {
// int status = reply.data[2];
//
// switch(status){
// case 0x00:
// //
// addFingerprintsData();
// break;
// case 0x06:
// //
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// var signKey = await Storage.getStringList(saveBlueSignKey);
// List<int> getSignKeyList = changeStringListToIntList(signKey!);
//
// var token = reply.data.sublist(5, 9);
// var saveStrList = changeIntListToStringList(token);
// Storage.setStringList(saveBlueToken, saveStrList);
//
// IoSenderManage.senderAddStressFingerprintCommand(
// keyID:"1",
// userID:await Storage.getUid(),
// fingerNo:state.isAdministrator.value == "2" ? 254 : 1,
// fingerType:1,
// useCountLimit:1,
// startTime:int.parse(state.startDate.value)~/1000,
// endTime:int.parse(state.endDate.value)~/1000,
// needAuthor:1,
// publicKey:publicKeyDataList,
// privateKey:getPrivateKeyList,
// token: token,
// signKey: getSignKeyList
// );
// break;
// case 0x07:
// //
// break;
// case 0x09:
// //
// break;
// default:
// //
// break;
// }
// }
// //
Future<void> senderAddFingerprint() async { Future<void> senderAddFingerprint() async {
showBlueConnetctToastTimer(action: (){ showBlueConnetctToastTimer(action: (){
@ -228,8 +187,6 @@ class AddFingerprintLogic extends BaseGetXController {
}); });
BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){ if (deviceConnectionState == BluetoothConnectionState.connected){
cancelBlueConnetctToastTimer();
var privateKey = await Storage.getStringList(saveBluePrivateKey); var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -266,79 +223,38 @@ class AddFingerprintLogic extends BaseGetXController {
Get.close(1); Get.close(1);
} }
}); });
// BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
// if (deviceConnectionState == BluetoothConnectionState.connected){
// cancelBlueConnetctToastTimer();
// // var publicKey = await Storage.getStringList(saveBluePublicKey);
// // List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var signKey = await Storage.getStringList(saveBlueSignKey);
// List<int> signKeyDataList = changeStringListToIntList(signKey!);
//
// var token = await Storage.getStringList(saveBlueToken);
// List<int> getTokenList = changeStringListToIntList(token!);
//
// IoSenderManage.senderAddFingerprintCommand(
// keyID:"1",
// userID:await Storage.getUid(),
// fingerNo:state.isAdministrator.value == "2" ? 254 : 1,
// useCountLimit:0xff,
// // startTime:0x11223344,
// // endTime:0x11223344,
// startTime:int.parse(state.startDate.value)~/1000,
// endTime:int.parse(state.endDate.value)~/1000,
// needAuthor:1,
// signKey:signKeyDataList,
// privateKey:getPrivateKeyList,
// token: getTokenList,
// );
// }else if (deviceConnectionState == BluetoothConnectionState.disconnected){
// if(state.ifCurrentScreen.value == true){
// showBlueConnetctToast();
// }
// cancelBlueConnetctToastTimer();
// Get.close(1);
// }
// });
} }
// //
// Future<void> senderAddStressFingerprint() async { Future<void> senderCancelAddFingerprintCommand() async {
// BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
// if (deviceConnectionState == BluetoothConnectionState.connected){ if (deviceConnectionState == BluetoothConnectionState.connected){
// var publicKey = await Storage.getStringList(saveBluePublicKey); var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!); List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var privateKey = await Storage.getStringList(saveBluePrivateKey); var signKey = await Storage.getStringList(saveBlueSignKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); List<int> signKeyDataList = changeStringListToIntList(signKey!);
//
// var signKey = await Storage.getStringList(saveBlueSignKey); var token = await Storage.getStringList(saveBlueToken);
// List<int> getSignKeyList = changeStringListToIntList(signKey!); List<int> getTokenList = changeStringListToIntList(token!);
//
// var token = await Storage.getStringList(saveBlueToken); IoSenderManage.senderCancelAddFingerprintCommand(
// List<int> getTokenList = changeStringListToIntList(token!); keyID:"1",
// userID:await Storage.getUid(),
// IoSenderManage.senderAddStressFingerprintCommand( needAuthor:1,
// keyID:"1", signKey:signKeyDataList,
// userID:await Storage.getUid(), privateKey:getPrivateKeyList,
// fingerNo:state.isAdministrator.value == "2" ? 254 : 1, token: getTokenList,
// fingerType:1, );
// useCountLimit:1, }else if (deviceConnectionState == BluetoothConnectionState.disconnected){
// startTime:int.parse(state.startDate.value)~/1000, if(state.ifCurrentScreen.value == true){
// endTime:int.parse(state.endDate.value)~/1000, showBlueConnetctToast();
// needAuthor:1, }
// publicKey:publicKeyDataList, cancelBlueConnetctToastTimer();
// privateKey:getPrivateKeyList, Get.close(1);
// token: getTokenList, }
// signKey: getSignKeyList });
// ); }
// }
// });
// }
// //
void addFingerprintsData() async{ void addFingerprintsData() async{

View File

@ -171,6 +171,10 @@ class _AddFingerprintPageState extends State<AddFingerprintPage> with RouteAware
super.didPop(); super.didPop();
logic.cancelBlueConnetctToastTimer(); logic.cancelBlueConnetctToastTimer();
state.ifCurrentScreen.value = false; state.ifCurrentScreen.value = false;
if(state.ifAddState.value){
logic.senderCancelAddFingerprintCommand();
}
} }
/// ///

View File

@ -3,6 +3,7 @@ import 'package:get/get.dart';
class AddFingerprintState{ class AddFingerprintState{
var ifCurrentScreen = true.obs; // , var ifCurrentScreen = true.obs; // ,
var ifAddState = false.obs;//
var ifConnectScuess = false.obs; var ifConnectScuess = false.obs;
var maxRegCount = 0.obs;// var maxRegCount = 0.obs;//

View File

@ -142,7 +142,7 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
ShowTipView().showIosTipWithContentDialog("确定要删除吗?".tr, () async { ShowTipView().showIosTipWithContentDialog("确定要删除吗?".tr, () async {
state.isDeletAll = false; state.isDeletAll = false;
state.deletKeyID = fingerprintItemData.fingerprintId.toString(); state.deletKeyID = fingerprintItemData.fingerprintId.toString();
state.deletFingerNo = int.parse(fingerprintItemData.faceNumber!); state.deletFingerNo = int.parse(fingerprintItemData.fingerprintNumber!);
logic.senderAddFingerprint(); logic.senderAddFingerprint();
}); });
}, },

View File

@ -130,17 +130,11 @@ class LockSetLogic extends BaseGetXController {
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
token: getTokenList); token: getTokenList);
break; break;
case 0x07:
//
dismissEasyLoading();
break;
case 0x09:
//
dismissEasyLoading();
break;
default: default:
// //
dismissEasyLoading(); dismissEasyLoading();
cancelBlueConnetctToastTimer();
showDeletAlertTipDialog();
break; break;
} }
} }

View File

@ -85,11 +85,14 @@ class RemoteUnlockingLogic extends BaseGetXController {
dismissEasyLoading(); dismissEasyLoading();
remoteUnlockingOpenOrClose(); remoteUnlockingOpenOrClose();
break; break;
case 0x06: // case 0x06:
// // //
//
break; // break;
default: default:
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
break; break;
} }
} }

View File

@ -183,11 +183,11 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
Future<void> checkKeyboardpwdNameRequest() async { Future<void> checkKeyboardpwdNameRequest() async {
if (state.nameController.text.isEmpty) { if (state.nameController.text.isEmpty) {
showToast("请输入姓名"); showToast("请输入姓名".tr);
return; return;
} }
if (state.pwdController.text.isEmpty) { if (state.pwdController.text.isEmpty) {
showToast("请输入密码"); showToast("请输入密码".tr);
return; return;
} }
var entity = await ApiRepository.to.checkKeyboardpwdName( var entity = await ApiRepository.to.checkKeyboardpwdName(
@ -212,13 +212,46 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
switch (status) { switch (status) {
case 0x00: case 0x00:
// //
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0; state.sureBtnState.value = 0;
state.pwdNumber.value = listChangInt(reply.data.sublist(9, 11)); state.pwdNumber.value = listChangInt(reply.data.sublist(9, 11));
// AppLog.log("密码编号:${state.pwdNumber.value}"); // AppLog.log("密码编号:${state.pwdNumber.value}");
dismissEasyLoading(); switch(reply.data[11]){
cancelBlueConnetctToastTimer(); case 0:
addKeyboardPwdRequest(); //
addKeyboardPwdRequest();
break;
case 0xff:
//
showToast("退出添加".tr);
Get.close(1);
break;
case 0xFE:
//
showToast("管理员已满".tr);
Get.close(1);
break;
case 0xFD:
//
showToast("用户已满".tr);
Get.close(1);
break;
case 0xFC:
//
showToast("锁上面添加密码已满".tr);
Get.close(1);
break;
case 0xFB:
//
showToast("密码已存在".tr);
break;
default:
//
break;
}
break; break;
case 0x06: case 0x06:
// //
@ -276,12 +309,12 @@ 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(3), 1)) { if (startDate <= DateTool().dateToTimestamp(DateTool().getNowDateWithType(2), 1)) {
showToast("生效时间不能小于当前时间"); showToast("生效时间要大于当前时间");
return; return;
} }
if (endDate < startDate) { if (endDate <= startDate) {
showToast("失效时间需大于生效时间"); showToast("失效时间需大于生效时间");
return; return;
} }

View File

@ -1,10 +1,20 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/blue/io_protocol/io_getPrivateKey.dart'; import 'package:star_lock/blue/io_protocol/io_getPrivateKey.dart';
import 'package:star_lock/blue/io_protocol/io_getPublicKey.dart'; import 'package:star_lock/blue/io_protocol/io_getPublicKey.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/mine/addLock/nearbyLock/nearbyLock_page.dart';
import 'package:star_lock/permission/permission_dialog.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import '../../../appRouters.dart'; import '../../../appRouters.dart';
@ -21,6 +31,15 @@ import 'nearbyLock_state.dart';
class NearbyLockLogic extends BaseGetXController { class NearbyLockLogic extends BaseGetXController {
final NearbyLockState state = NearbyLockState(); final NearbyLockState state = NearbyLockState();
int otaCount = 0;
int otaIndex = 0;
Uint8List? otaBin;
int startSecond = 0;
Map? headJson;
String? deviceName;
StreamSubscription<Reply>? _replySubscription;
// //
void connect(String deviceName) { void connect(String deviceName) {
showTitleEasyLoading("获取锁信息 1/3"); showTitleEasyLoading("获取锁信息 1/3");
@ -30,11 +49,12 @@ class NearbyLockLogic extends BaseGetXController {
// state.sureBtnState.value = 1; // state.sureBtnState.value = 1;
// showEasyLoading(); // showEasyLoading();
showBlueConnetctToastTimer(action: (){ showBlueConnetctToastTimer(action: () {
dismissEasyLoading(); dismissEasyLoading();
// state.sureBtnState.value = 0; // state.sureBtnState.value = 0;
}); });
BlueManage().bludSendData(deviceName, (BluetoothConnectionState state) async { BlueManage().bludSendData(deviceName,
(BluetoothConnectionState state) async {
AppLog.log("点击要添加的设备了"); AppLog.log("点击要添加的设备了");
if (state == BluetoothConnectionState.connected) { if (state == BluetoothConnectionState.connected) {
AppLog.log("开始获取公钥"); AppLog.log("开始获取公钥");
@ -45,12 +65,11 @@ class NearbyLockLogic extends BaseGetXController {
}, isAddEquipment: true); }, isAddEquipment: true);
} }
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() { void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) { _replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
if (reply is GetPublicKeyReply) { if (reply is GetPublicKeyReply) {
_replyGetPublicKey(reply); _replyGetPublicKey(reply);
} }
if (reply is GetPrivateKeyReply) { if (reply is GetPrivateKeyReply) {
@ -61,6 +80,23 @@ class NearbyLockLogic extends BaseGetXController {
if (reply is GetStarLockStatuInfoReply) { if (reply is GetStarLockStatuInfoReply) {
_replyGetStarLockStatusInfo(reply); _replyGetStarLockStatusInfo(reply);
} }
if (reply is OTAUpgradeReply) {
if (reply.status == 0x00) {
//
dismissEasyLoading();
startOTAData();
processOtaUpgrade();
} else if (reply.status == 0x06) {
blueOTAUpgrade(headJson!, reply.token);
}
} else if (reply is ProcessOtaUpgradeReply && reply.status == 0x00) {
otaIndex++;
processOtaUpgrade();
} else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) {
showToast('固件升级完成'.tr);
closeOTADAta();
}
}); });
} }
@ -197,8 +233,10 @@ class NearbyLockLogic extends BaseGetXController {
// //
var restoreCounter = reply.data.sublist(133, 135); var restoreCounter = reply.data.sublist(133, 135);
state.lockInfo["restoreCount"] = restoreCounter[0] * 256 + restoreCounter[1]; state.lockInfo["restoreCount"] =
AppLog.log("重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}"); restoreCounter[0] * 256 + restoreCounter[1];
AppLog.log(
"重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}");
// //
var restoreDate = reply.data.sublist(135, 139); var restoreDate = reply.data.sublist(135, 139);
@ -312,21 +350,6 @@ class NearbyLockLogic extends BaseGetXController {
} }
} }
// List charListChangeIntList(List<int> featureValue){
// // 16
// String featureValueStr = asciiString(featureValue);
// // 162 0 57 60
// String featureValueTwoStr = int.parse(featureValueStr,radix: 16).toRadixString(2);
// List<int> featureValueTwoList = [];
// for(int i = 0;i<featureValueTwoStr.length;i++){
// featureValueTwoList.add(int.parse(featureValueTwoStr[i]));
// }
// //
// featureValueTwoList = featureValueTwoList.reversed.toList();
// List allFeatureValueTwoList = getFixedLengthList(featureValueTwoList, 60 - featureValueTwoList.length);
// return allFeatureValueTwoList;
// }
// //
Future<void> _getStarLockStatus() async { Future<void> _getStarLockStatus() async {
// //
@ -334,39 +357,26 @@ class NearbyLockLogic extends BaseGetXController {
// if (state == BluetoothConnectionState.connected) { // if (state == BluetoothConnectionState.connected) {
// dismissEasyLoading(); // dismissEasyLoading();
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( // IoSenderManage.senderGetLockStatu(
// lockID:BlueManage().connectDeviceName, // lockID:BlueManage().connectDeviceName,
// userID:await Storage.getUid(), // userID:await Storage.getUid(),
// privateKey:getPrivateKeyList, // privateKey:getPrivateKeyList,
// ); // );
IoSenderManage.senderGetStarLockStatuInfo( IoSenderManage.senderGetStarLockStatuInfo(
lockID: BlueManage().connectDeviceName, lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(), userID: await Storage.getUid(),
isBeforeAddUser: true, isBeforeAddUser: true,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
); );
// } else if (state == BluetoothConnectionState.disconnected) { // } else if (state == BluetoothConnectionState.disconnected) {
// dismissEasyLoading(); // dismissEasyLoading();
// } // }
// }, isAddEquipment: true); // }, isAddEquipment: true);
} }
// late StreamSubscription<List<ScanResult>>_scanListDiscoveredDeviceSubscription;
// void _scanListDiscoveredDeviceSubscriptionAction() {
// _scanListDiscoveredDeviceSubscription = EventBusManager().eventBus!.on<List<ScanResult>>().listen((List<ScanResult> list) {
// state.devices.clear();
// for (int i = 0; i < list.length; i++) {
// ScanResult device = list[i];
// if (((device.advertisementData.serviceUuids.isNotEmpty ? device.advertisementData.serviceUuids[0] : "").toString()[31] != "1")) {
// state.devices.add(list[i]);
// }
// }
// });
// }
void startScanBlueList() { void startScanBlueList() {
BlueManage().startScan(2000, (List<ScanResult> list) { BlueManage().startScan(2000, (List<ScanResult> list) {
state.devices.clear(); state.devices.clear();
@ -388,30 +398,234 @@ class NearbyLockLogic extends BaseGetXController {
BlueManage().stopScan(); BlueManage().stopScan();
} }
// , ota
void oTAUpgrade(String deviceName) {
showTitleEasyLoading("连接设备中...");
this.deviceName = deviceName;
BlueManage().bludSendData(deviceName,
(BluetoothConnectionState state) async {
AppLog.log("连接设备");
if (state == BluetoothConnectionState.connected) {
AppLog.log("连接成功");
dismissEasyLoading();
otaUpdate();
} else if (state == BluetoothConnectionState.disconnected) {
AppLog.log("连接失败");
dismissEasyLoading();
}
}, isAddEquipment: true);
}
//
Future<void> otaUpdate() async {
var status = await PermissionDialog.request(
Permission.storage, '需要访问读写权限才能使用手动升级固件'.tr);
if (status != true) {
return;
}
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result == null || result.files.single.path is! String) {
return;
}
File file = File(result.files.single.path!);
Uint8List data = await file.readAsBytes();
headJson = await getHeadFile(data);
if (headJson is! Map) {
return;
}
otaBin = await checkFile(data, headJson!);
if (otaBin == null) {
return;
}
String md5Str = md5.convert(otaBin!).toString();
headJson!['fwMd5'] = md5Str;
blueOTAUpgrade(headJson!, [0, 0, 0, 0]);
}
// ota
void blueOTAUpgrade(Map data, List<int> token) {
if (deviceName == null) {
AppLog.log('blueOTAUpgrade:设备名字为 null');
return;
}
BlueManage().bludSendData(deviceName!,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
String uid = await Storage.getUid() ?? '';
BlueManage().writeCharacteristicWithResponse(OTAUpgradeCommand(
lockID: deviceName,
userID: uid,
keyID: deviceName,
platform: int.tryParse(data['platform']) ?? 0,
product: int.tryParse(data['product']) ?? 0,
hwVersion: data['hwVersion'],
fwVersion: data['fwVersion'],
fwSize: data['fwSize'],
fwMD5: data['fwMd5'],
needAuthor: 1,
token: token,
encrypt: false,
).packageData());
showTitleEasyLoading("连接设备中...");
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {}
},isAddEquipment: true);
}
//
Future<void> processOtaUpgrade() async {
if (!state.otaUpdateIng.value) {
return;
}
int length = otaBin?.length ?? 0;
if (otaCount == 0) {
//
int difference = length % 240;
otaCount = length ~/ 240 + (difference > 0 ? 1 : 0);
startSecond = DateTime.now().millisecondsSinceEpoch ~/ 1000;
}
if (otaCount <= otaIndex) {
int now = DateTime.now().millisecondsSinceEpoch ~/ 1000;
String msg =
'传输完成 时间:${now - startSecond}秒 otaCount:$otaCount otaIndex:$otaIndex ';
closeOTADAta();
AppLog.log(msg);
// showToast(msg);
return;
}
int star = otaIndex * 240;
int end = (otaIndex + 1) * 240;
if (end > length) {
end = length;
}
int size = end - star;
List<int> data = otaBin!.sublist(star, end);
state.otaProgress.value = otaIndex / otaCount;
await BlueManage().writeCharacteristicWithResponse(
ProcessOtaUpgradeCommand(index: otaIndex, size: size, data: data)
.packageData());
}
// ota升级
void startOTAData() {
state.otaUpdateIng.value = true;
state.oTAProgressDialog = true;
Get.dialog(
OTAProgressDialog(
logic: this,
),
barrierDismissible: false)
.then((value) => state.oTAProgressDialog = false);
}
// ata
void closeOTADAta() {
if (state.oTAProgressDialog) {
Get.back();
}
state.otaUpdateIng.value = false;
state.otaProgress.value = 0;
otaIndex = 0;
otaCount = 0;
startSecond = 0;
otaBin = null;
}
//
void getBack() {
if (state.otaUpdateIng.value) {
closeOTADAta();
} else {
Get.back();
}
}
//
Future<Map?> getHeadFile(Uint8List data) async {
if (data.length <= 16) {
showToast('错误固件,请选择正确的文件'.tr);
return null;
}
//
String header;
try {
header = utf8.decode(data.sublist(0, 12));
} catch (e) {
showToast('非SYD固件请选择正确的文件'.tr);
return null;
}
if (header != 'SYD-BIN-DATA') {
showToast('非SYD固件请选择正确的文件'.tr);
return null;
}
//
Uint8List metaLenList;
int metaLen;
try {
metaLenList = data.sublist(12, 16);
metaLen = ByteData.sublistView(metaLenList).getUint32(0);
} catch (e) {
showToast('文件校验失败 0x01'.tr);
return null;
}
if (metaLen < 2 || metaLen > 10240) {
showToast('文件校验失败 0x01'.tr);
return null;
}
//
Uint8List metaStrList;
String metaStr;
try {
metaStrList = data.sublist(16, 16 + metaLen);
metaStr = utf8.decode(metaStrList);
} catch (e) {
showToast('解析元数据失败,请选择正确的文件'.tr);
return null;
}
AppLog.log(metaStr);
var meta = jsonDecode(metaStr);
if (meta is! Map) {
showToast('解析元数据失败,请选择正确的文件'.tr);
return null;
}
return meta..['metaLen'] = metaLen;
}
// bin
Future<Uint8List?> checkFile(Uint8List data, Map meta) async {
num binOffset = 16 + (meta['metaLen'] ?? 0);
//
Uint8List bin = data.sublist(binOffset.toInt(), data.length);
//md5
String md5Str = md5.convert(bin).toString().toUpperCase();
AppLog.log('---> $md5Str ${meta['fwMd5']}');
if (md5Str != meta['fwMd5']) {
showToast('文件校验失败 0x02'.tr);
return null;
}
if (bin.length != meta['fwSize']) {
showToast('文件校验失败 0x03'.tr);
return null;
}
return bin;
}
@override @override
void onReady() { void onReady() {
// TODO: implement onReady
super.onReady(); super.onReady();
_initReplySubscription(); _initReplySubscription();
// _scanListDiscoveredDeviceSubscriptionAction();
state.ifCurrentScreen.value = true; state.ifCurrentScreen.value = true;
startScanBlueList(); startScanBlueList();
} }
@override @override
void onInit() { void onInit() {
// TODO: implement onInit
super.onInit(); super.onInit();
} }
@override @override
void onClose() { void onClose() {
// TODO: implement onClose
super.onClose(); super.onClose();
_replySubscription.cancel(); _replySubscription?.cancel();
// _scanListDiscoveredDeviceSubscription.cancel();
} }
} }

View File

@ -23,12 +23,6 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
final logic = Get.put(NearbyLockLogic()); final logic = Get.put(NearbyLockLogic());
final state = Get.find<NearbyLockLogic>().state; final state = Get.find<NearbyLockLogic>().state;
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -60,32 +54,62 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
]), ]),
), ),
body: Obx(() { body: Obx(() {
return ListView.separated( return listView();
itemCount: state.devices.length,
itemBuilder: (c, index) {
return nearbyLockItem(
'images/icon_lockGroup_item.png', state.devices[index], () {
// Navigator.pushNamed(context, Routers.lockAddressPage);
// logic.getPublicKey(state.devices[index].serviceUuids[0].toString());
state.selectLockName.value =
state.devices[index].advertisementData.advName;
logic.connect(state.devices[index].advertisementData.advName);
// Get.toNamed(Routers.lockAddressGaoDePage);
});
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
height: 1,
color: AppColors.greyLineColor,
indent: 20.w,
endIndent: 0,
);
},
);
}), }),
); );
} }
Widget listView() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: ListView.separated(
itemCount: state.devices.length,
itemBuilder: (c, index) {
return nearbyLockItem(
'images/icon_lockGroup_item.png', state.devices[index], () {
String advName = state.devices[index].advertisementData.advName;
state.selectLockName.value = advName;
if (state.otaState.value) {
logic.oTAUpgrade(advName);
} else {
logic.connect(advName);
}
});
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
height: 1,
color: AppColors.greyLineColor,
indent: 20.w,
endIndent: 0,
);
},
),
),
Padding(
padding: EdgeInsets.only(left: 15.w, bottom: 10.h),
child: TextButton(
onPressed: () async {
bool skip = false;
if (!state.otaState.value) {
skip = await Get.dialog(
const _TipDialog(),
);
}
state.otaState.value = skip;
},
child: Text(
state.otaState.value ? '点击返回设备配对'.tr : '无法连接?尝试升级'.tr,
style: TextStyle(fontSize: 22.sp),
),
),
),
],
);
}
Widget nearbyLockItem( Widget nearbyLockItem(
String lockTypeIcon, ScanResult scanResult, Function() action) { String lockTypeIcon, ScanResult scanResult, Function() action) {
return GestureDetector( return GestureDetector(
@ -97,7 +121,6 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
? action ? action
: null, : null,
child: Column( child: Column(
// mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container( Container(
height: 89.h, height: 89.h,
@ -141,9 +164,12 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
), ),
Expanded(child: SizedBox(width: 20.w)), Expanded(child: SizedBox(width: 20.w)),
Image.asset( Image.asset(
'images/main/icon_main_addLock.png', state.otaState.value
? 'images/ota_upgrade_icon.png'
: 'images/main/icon_main_addLock.png',
width: 36.w, width: 36.w,
height: 36.w, height: 36.w,
color: AppColors.mainColor,
), ),
SizedBox(width: 30.w), SizedBox(width: 30.w),
], ],
@ -156,7 +182,6 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
@override @override
void didChangeDependencies() { void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies(); super.didChangeDependencies();
/// ///
@ -165,7 +190,6 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
@override @override
void dispose() { void dispose() {
// TODO: implement dispose
/// ///
AppRouteObserver().routeObserver.unsubscribe(this); AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose(); super.dispose();
@ -183,11 +207,9 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
super.didPop(); super.didPop();
EasyLoading.isShow ? EasyLoading.dismiss() : null; EasyLoading.isShow ? EasyLoading.dismiss() : null;
state.ifCurrentScreen.value = false; state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer(); logic.cancelBlueConnetctToastTimer();
logic.stopScanBlueList(); logic.stopScanBlueList();
BlueManage().disconnect();
} }
/// ///
@ -203,10 +225,88 @@ class _NearbyLockPageState extends State<NearbyLockPage> with RouteAware {
@override @override
void didPushNext() { void didPushNext() {
super.didPushNext(); super.didPushNext();
if (!logic.state.otaState.value) {
state.ifCurrentScreen.value = false; state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer(); logic.cancelBlueConnetctToastTimer();
logic.stopScanBlueList(); logic.stopScanBlueList();
BlueManage().disconnect(); }
}
}
class _TipDialog extends StatelessWidget {
const _TipDialog({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return CupertinoAlertDialog(
title: Text(
'固件升级提示'.tr,
),
content: Text('请先获取固件文件到手机本地,再选择升级'.tr),
actions: [
TextButton(
onPressed: () {
Get.back();
},
child: Text(
'取消'.tr,
style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor),
),
),
TextButton(
onPressed: () async {
Get.back(result: true);
},
child: Text(
'确定'.tr,
style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor),
),
),
],
);
}
}
class OTAProgressDialog extends StatelessWidget {
NearbyLockLogic logic;
OTAProgressDialog({required this.logic, Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Obx(() {
return CupertinoAlertDialog(
title: Text(
'固件升级中'.tr,
),
content: Row(
children: [
Text(
'传输中'.tr,
style: TextStyle(fontSize: 22.sp, color: AppColors.mainColor),
),
SizedBox(
width: 15.w,
),
Expanded(
child: LinearProgressIndicator(
value: logic.state.otaProgress.value,
color: AppColors.mainColor,
)),
],
),
actions: [
TextButton(
onPressed: () {
logic.closeOTADAta();
},
child: Text(
'取消升级'.tr,
style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor),
),
),
],
);
});
} }
} }

View File

@ -1,9 +1,7 @@
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
class NearbyLockState { 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
@ -16,4 +14,8 @@ class NearbyLockState {
var featureSettingValue = ''; var featureSettingValue = '';
var featureSettingParams = []; var featureSettingParams = [];
var otaState = false.obs; //ota
var otaUpdateIng = false.obs;
var otaProgress = 0.00.obs;
bool oTAProgressDialog = false;
} }

View File

@ -96,10 +96,6 @@ class SaveLockLogic extends BaseGetXController {
// //
Future<void> _replySenderCustomPasswords(Reply reply) async { Future<void> _replySenderCustomPasswords(Reply reply) async {
var token = reply.data.sublist(5, 9);
var saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
int status = reply.data[2]; int status = reply.data[2];
switch (status) { switch (status) {
@ -116,6 +112,10 @@ class SaveLockLogic 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 token = reply.data.sublist(5, 9);
var saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderCustomPasswordsCommand( IoSenderManage.senderCustomPasswordsCommand(
keyID: "1", keyID: "1",
userID: await Storage.getUid(), userID: await Storage.getUid(),

View File

@ -102,7 +102,7 @@ dependencies:
url_launcher: ^6.1.10 url_launcher: ^6.1.10
#蓝牙 #蓝牙
# flutter_reactive_ble: ^5.1.1 # flutter_reactive_ble: ^5.1.1
flutter_blue_plus: ^1.31.16 flutter_blue_plus: 1.31.16
# #
event_bus: ^2.0.0 event_bus: ^2.0.0
#菊花 #菊花