merge:合并代码
This commit is contained in:
commit
2deeef6f7a
@ -883,4 +883,7 @@
|
||||
"账号格式错误": "The account format is incorrect",
|
||||
"接收者信息为空": "The recipient information is empty",
|
||||
"请输入时间(秒)": "Please enter the time (seconds)",
|
||||
"加载数据失败": "Failed to load data",
|
||||
"重试": "Retry",
|
||||
"升级中,是否退出": "During the upgrade, whether to exit"
|
||||
}
|
||||
|
||||
@ -914,5 +914,8 @@
|
||||
"新增": "新增",
|
||||
"账号格式错误": "账号格式错误",
|
||||
"接收者信息为空": "接收者信息为空",
|
||||
"请输入时间(秒)": "请输入时间(秒)"
|
||||
"请输入时间(秒)": "请输入时间(秒)",
|
||||
"加载数据失败": "加载数据失败",
|
||||
"重试": "重试",
|
||||
"升级中,是否退出": "升级中,是否退出"
|
||||
}
|
||||
|
||||
@ -862,14 +862,12 @@
|
||||
"五": "五",
|
||||
"六": "六",
|
||||
"日": "日",
|
||||
|
||||
"无考勤记录": "无考勤记录",
|
||||
"大家干劲十足": "大家干劲十足",
|
||||
"工作时长未出炉": "工作时长未出炉",
|
||||
"国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续",
|
||||
"确认国家或地区": "确认国家或地区",
|
||||
"我知道了": "我知道了",
|
||||
|
||||
"新建短信模版": "新建短信模版",
|
||||
"新建邮件模版": "新建邮件模版",
|
||||
"自定义短信模版": "自定义短信模版",
|
||||
@ -877,10 +875,13 @@
|
||||
"名称": "名称",
|
||||
"星星锁": "星星锁",
|
||||
"为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。",
|
||||
"开启后,可通过长按锁上的设置键重新上电,用APP重新添加":"开启后,可通过长按锁上的设置键重新上电,用APP重新添加",
|
||||
"开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "开启后,可通过长按锁上的设置键重新上电,用APP重新添加",
|
||||
"已有": "已有",
|
||||
"新增": "新增",
|
||||
"账号格式错误": "账号格式错误",
|
||||
"接收者信息为空": "接收者信息为空",
|
||||
"请输入时间(秒)": "请输入时间(秒)"
|
||||
"请输入时间(秒)": "请输入时间(秒)",
|
||||
"加载数据失败": "加载数据失败",
|
||||
"重试": "重试",
|
||||
"升级中,是否退出": "升级中,是否退出"
|
||||
}
|
||||
|
||||
@ -9,12 +9,6 @@ import '../io_type.dart';
|
||||
import '../sm4Encipher/sm4.dart';
|
||||
|
||||
class GetStarLockStatuInfoCommand extends SenderProtocol {
|
||||
|
||||
String? lockID;
|
||||
String? userID;
|
||||
int? utcTimeStamp;
|
||||
int? unixTimeStamp;
|
||||
List<int>? privateKey;
|
||||
GetStarLockStatuInfoCommand({
|
||||
this.lockID,
|
||||
this.userID,
|
||||
@ -23,6 +17,12 @@ class GetStarLockStatuInfoCommand extends SenderProtocol {
|
||||
this.privateKey
|
||||
}) : super(CommandType.readStarLockStatusInfo);
|
||||
|
||||
String? lockID;
|
||||
String? userID;
|
||||
int? utcTimeStamp;
|
||||
int? unixTimeStamp;
|
||||
List<int>? privateKey;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'GetStarLockStatuInfoCommand{lockID: $lockID, '
|
||||
@ -32,24 +32,24 @@ class GetStarLockStatuInfoCommand extends SenderProtocol {
|
||||
|
||||
@override
|
||||
List<int> messageDetail() {
|
||||
List<int> data = [];
|
||||
List<int> ebcData = [];
|
||||
List<int> data = <int>[];
|
||||
List<int> ebcData = <int>[];
|
||||
|
||||
// 指令类型
|
||||
int type = commandType!.typeValue;
|
||||
double typeDouble = type / 256;
|
||||
int type1 = typeDouble.toInt();
|
||||
int type2 = type % 256;
|
||||
final int type = commandType!.typeValue;
|
||||
final double typeDouble = type / 256;
|
||||
final int type1 = typeDouble.toInt();
|
||||
final int type2 = type % 256;
|
||||
data.add(type1);
|
||||
data.add(type2);
|
||||
|
||||
// 锁id 40
|
||||
int lockIDLength = utf8.encode(lockID!).length;
|
||||
final int lockIDLength = utf8.encode(lockID!).length;
|
||||
data.addAll(utf8.encode(lockID!));
|
||||
data = getFixedLengthList(data, 40 - lockIDLength);
|
||||
|
||||
//userID 要接受钥匙的用户的useid 20
|
||||
int userIDLength = utf8.encode(userID!).length;
|
||||
final int userIDLength = utf8.encode(userID!).length;
|
||||
data.addAll(utf8.encode(userID!));
|
||||
data = getFixedLengthList(data, 20 - userIDLength);
|
||||
|
||||
@ -57,16 +57,16 @@ class GetStarLockStatuInfoCommand extends SenderProtocol {
|
||||
data.add((utcTimeStamp! & 0xff000000) >> 24);
|
||||
data.add((utcTimeStamp! & 0xff0000) >> 16);
|
||||
data.add((utcTimeStamp! & 0xff00) >> 8);
|
||||
data.add((utcTimeStamp! & 0xff));
|
||||
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));
|
||||
data.add(unixTimeStamp! & 0xff);
|
||||
|
||||
if ((data.length % 16) != 0) {
|
||||
int add = (16 - data.length % 16);
|
||||
final int add = 16 - data.length % 16;
|
||||
for (int i = 0; i < add; i++) {
|
||||
data.add(0);
|
||||
}
|
||||
@ -84,7 +84,7 @@ class GetStarLockStatuInfoReply extends Reply {
|
||||
: super.parseData(commandType, dataDetail) {
|
||||
data = dataDetail;
|
||||
|
||||
int status = data[2];
|
||||
final int status = data[2];
|
||||
errorWithStstus(status);
|
||||
}
|
||||
}
|
||||
@ -5,22 +5,22 @@ import 'package:crypto/crypto.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
int listChangInt(List<int> list){
|
||||
int dataLen = (list[0] << 8) + list[1];
|
||||
final int dataLen = (list[0] << 8) + list[1];
|
||||
return dataLen;
|
||||
}
|
||||
|
||||
List<int> intChangList(int count){
|
||||
List<int> intList = [];
|
||||
double typeDouble = count / 256;
|
||||
int type1 = typeDouble.toInt();
|
||||
int type2 = count % 256;
|
||||
final List<int> intList = <int>[];
|
||||
final double typeDouble = count / 256;
|
||||
final int type1 = typeDouble.toInt();
|
||||
final int type2 = count % 256;
|
||||
intList.add(type1);
|
||||
intList.add(type2);
|
||||
return intList;
|
||||
}
|
||||
|
||||
List<String> changeIntListToStringList(List<int> list){
|
||||
List<String> strList = [];
|
||||
final List<String> strList = <String>[];
|
||||
for(int i = 0; i<list.length; i++)
|
||||
{
|
||||
strList.add(list[i].toRadixString(16));
|
||||
@ -29,7 +29,7 @@ List<String> changeIntListToStringList(List<int> list){
|
||||
}
|
||||
|
||||
List<int> changeStringListToIntList(List<String> list){
|
||||
List<int> intList = [];
|
||||
final List<int> intList = <int>[];
|
||||
for(int i = 0; i<list.length; i++)
|
||||
{
|
||||
intList.add(_hexToInt(list[i]));
|
||||
@ -39,9 +39,9 @@ List<int> changeStringListToIntList(List<String> list){
|
||||
|
||||
int _hexToInt(String hex) {
|
||||
int val = 0;
|
||||
int len = hex.length;
|
||||
final int len = hex.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
int hexDigit = hex.codeUnitAt(i);
|
||||
final int hexDigit = hex.codeUnitAt(i);
|
||||
if (hexDigit >= 48 && hexDigit <= 57) {
|
||||
val += (hexDigit - 48) * (1 << (4 * (len - 1 - i)));
|
||||
} else if (hexDigit >= 65 && hexDigit <= 70) {
|
||||
@ -58,8 +58,8 @@ int _hexToInt(String hex) {
|
||||
}
|
||||
|
||||
String md5Crypto(List<int> data) {
|
||||
final dig = md5.convert(data);
|
||||
var keyStr = dig.toString();
|
||||
final Digest dig = md5.convert(data);
|
||||
final String keyStr = dig.toString();
|
||||
return keyStr.substring(0, 16).toLowerCase();
|
||||
}
|
||||
|
||||
@ -73,8 +73,8 @@ List<int> getFixedLengthList(List<int> data, int length) {
|
||||
|
||||
//int ---> 指定长度的hex (如指定长度为6的情况,0x000001 0x001234, 0xefab23)
|
||||
String intToFormatHex(int num, int length) {
|
||||
String hexString = num.toRadixString(16);
|
||||
String formatString = hexString.padLeft(length, "0");
|
||||
final String hexString = num.toRadixString(16);
|
||||
final String formatString = hexString.padLeft(length, "0");
|
||||
return formatString;
|
||||
}
|
||||
|
||||
@ -82,8 +82,8 @@ String uint8ToHex(Uint8List byteArr) {
|
||||
if (byteArr.isEmpty) {
|
||||
return "";
|
||||
}
|
||||
Uint8List result = Uint8List(byteArr.length << 1);
|
||||
var hexTable = [
|
||||
final Uint8List result = Uint8List(byteArr.length << 1);
|
||||
final List<String> hexTable = <String>[
|
||||
'0',
|
||||
'1',
|
||||
'2',
|
||||
@ -101,10 +101,10 @@ String uint8ToHex(Uint8List byteArr) {
|
||||
'E',
|
||||
'F'
|
||||
]; //16进制字符表
|
||||
for (var i = 0; i < byteArr.length; i++) {
|
||||
var bit = byteArr[i]; //取传入的byteArr的每一位
|
||||
var index = bit >> 4 & 15; //右移4位,取剩下四位
|
||||
var i2 = i << 1; //byteArr的每一位对应结果的两位,所以对于结果的操作位数要乘2
|
||||
for (int i = 0; i < byteArr.length; i++) {
|
||||
final int bit = byteArr[i]; //取传入的byteArr的每一位
|
||||
int index = bit >> 4 & 15; //右移4位,取剩下四位
|
||||
final int i2 = i << 1; //byteArr的每一位对应结果的两位,所以对于结果的操作位数要乘2
|
||||
result[i2] = hexTable[index].codeUnitAt(0); //左边的值取字符表,转为Unicode放进resut数组
|
||||
index = bit & 15; //取右边四位
|
||||
result[i2 + 1] =
|
||||
@ -117,8 +117,8 @@ String uint8ToHex(Uint8List byteArr) {
|
||||
|
||||
int byteInt8(List<int> dataDetail, int index) => _toInt8(dataDetail[index]);
|
||||
int _toInt8(int value) {
|
||||
var buffer = Int8List(4).buffer;
|
||||
var bData = ByteData.view(buffer);
|
||||
final ByteBuffer buffer = Int8List(4).buffer;
|
||||
final ByteData bData = ByteData.view(buffer);
|
||||
bData.setInt8(0, value);
|
||||
return bData.getInt8(0);
|
||||
}
|
||||
@ -129,15 +129,15 @@ int _byteInt16(List<int> dataDetail, int index) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int value = (dataDetail[index + 1] & 0xff) << 8 | (dataDetail[index] & 0xff);
|
||||
final int value = (dataDetail[index + 1] & 0xff) << 8 | (dataDetail[index] & 0xff);
|
||||
return _toInt16(value);
|
||||
}
|
||||
|
||||
int _toInt16(int value) {
|
||||
var buffer = Int16List(1).buffer;
|
||||
var bData = ByteData.view(buffer);
|
||||
final ByteBuffer buffer = Int16List(1).buffer;
|
||||
final ByteData bData = ByteData.view(buffer);
|
||||
bData.setInt16(0, value);
|
||||
int outputValue = bData.getInt16(0);
|
||||
final int outputValue = bData.getInt16(0);
|
||||
return outputValue;
|
||||
}
|
||||
|
||||
@ -146,50 +146,50 @@ int _byteInt32(List<int> dataDetail, int index) {
|
||||
if (checkListIndex(dataDetail, index, 4)) {
|
||||
return 0;
|
||||
}
|
||||
int value = ((0xFF & dataDetail[(index + 3)]) << 24 |
|
||||
final int value = (0xFF & dataDetail[(index + 3)]) << 24 |
|
||||
(0xFF & dataDetail[index + 2]) << 16 |
|
||||
(0xFF & dataDetail[index + 1]) << 8 |
|
||||
0xFF & dataDetail[index]);
|
||||
0xFF & dataDetail[index];
|
||||
return _toInt32(value);
|
||||
}
|
||||
|
||||
int _toInt32(int value) {
|
||||
var buffer = Int32List(2).buffer;
|
||||
var bData = ByteData.view(buffer);
|
||||
final ByteBuffer buffer = Int32List(2).buffer;
|
||||
final ByteData bData = ByteData.view(buffer);
|
||||
bData.setInt32(0, value);
|
||||
int outputValue = bData.getInt32(0);
|
||||
final int outputValue = bData.getInt32(0);
|
||||
return outputValue;
|
||||
}
|
||||
|
||||
List<int> intToInt8List(int value) => [value];
|
||||
List<int> intToInt8List(int value) => <int>[value];
|
||||
|
||||
List<int> intToByte2ListHigh(int value) => [value, value >> 8];
|
||||
List<int> intToByte2ListHigh(int value) => <int>[value, value >> 8];
|
||||
|
||||
//TODO:int->4个字节List 低字节在前,高字节在后(大端存储) 1byte = 8bit
|
||||
List<int> intToByte4ListHigh(int value) =>
|
||||
[value, value >> 8, value >> 16, value >> 24];
|
||||
<int>[value, value >> 8, value >> 16, value >> 24];
|
||||
|
||||
int byteUInt8(List<int> dataDetail, int index) => _toUInt8(dataDetail[index]);
|
||||
int _toUInt8(int value) {
|
||||
var buffer = Int8List(1).buffer;
|
||||
var bData = ByteData.view(buffer);
|
||||
final ByteBuffer buffer = Int8List(1).buffer;
|
||||
final ByteData bData = ByteData.view(buffer);
|
||||
bData.setInt8(0, value);
|
||||
return bData.getUint8(0);
|
||||
}
|
||||
|
||||
int byteUInt16(List<int> dataDetail, int index) =>
|
||||
_byteUInt16(dataDetail, index);
|
||||
_byteUInt16(List<int> dataDetail, int index) {
|
||||
int _byteUInt16(List<int> dataDetail, int index) {
|
||||
if (checkListIndex(dataDetail, index, 2)) {
|
||||
return 0;
|
||||
}
|
||||
int value = (dataDetail[index + 1]) << 8 | dataDetail[index];
|
||||
final int value = (dataDetail[index + 1]) << 8 | dataDetail[index];
|
||||
return _toUInt16(value);
|
||||
}
|
||||
|
||||
int _toUInt16(int value) {
|
||||
var buffer = Uint16List(2).buffer;
|
||||
var bData = ByteData.view(buffer);
|
||||
final ByteBuffer buffer = Uint16List(2).buffer;
|
||||
final ByteData bData = ByteData.view(buffer);
|
||||
bData.setInt16(0, value);
|
||||
return bData.getUint16(0);
|
||||
}
|
||||
@ -201,18 +201,18 @@ int _byteUInt32(List<int> dataDetail, int index) {
|
||||
if (checkListIndex(dataDetail, index, 4)) {
|
||||
return 0;
|
||||
}
|
||||
int value = ((0xFF & dataDetail[(index + 3)]) << 24 |
|
||||
final int value = (0xFF & dataDetail[(index + 3)]) << 24 |
|
||||
(0xFF & dataDetail[index + 2]) << 16 |
|
||||
(0xFF & dataDetail[index + 1]) << 8 |
|
||||
0xFF & dataDetail[index]);
|
||||
0xFF & dataDetail[index];
|
||||
return _toUInt32(value);
|
||||
}
|
||||
|
||||
int _toUInt32(int value) {
|
||||
var buffer = Int32List(2).buffer;
|
||||
var bData = ByteData.view(buffer);
|
||||
final ByteBuffer buffer = Int32List(2).buffer;
|
||||
final ByteData bData = ByteData.view(buffer);
|
||||
bData.setInt32(0, value);
|
||||
int outputValue = bData.getUint32(0);
|
||||
final int outputValue = bData.getUint32(0);
|
||||
return outputValue;
|
||||
}
|
||||
|
||||
@ -220,42 +220,42 @@ bool checkListIndex(List<int> dataDetail, int index, int offsetLength) {
|
||||
if (dataDetail == null) {
|
||||
return true;
|
||||
}
|
||||
var len = dataDetail.length;
|
||||
bool result = index + offsetLength > len;
|
||||
final int len = dataDetail.length;
|
||||
final bool result = index + offsetLength > len;
|
||||
if (result) {}
|
||||
return result;
|
||||
}
|
||||
|
||||
int checkSum(List<int> data) {
|
||||
int sum = 0;
|
||||
for (int v in data) {
|
||||
for (final int v in data) {
|
||||
sum ^= v;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
Future<List<int>> loadAssetsFile(String assetsPath) async {
|
||||
var byteData = await rootBundle.load(assetsPath);
|
||||
final ByteData byteData = await rootBundle.load(assetsPath);
|
||||
return byteData.buffer.asUint8List().toList();
|
||||
}
|
||||
|
||||
//获取截取后的数组
|
||||
List<List<T>> splitList<T>(List<T> list, int len) {
|
||||
if (len <= 1) {
|
||||
return [list];
|
||||
return <List<T>>[list];
|
||||
}
|
||||
|
||||
List<List<T>> result = [];
|
||||
final List<List<T>> result = <List<T>>[];
|
||||
int index = 1;
|
||||
|
||||
while (true) {
|
||||
if (index * len < list.length) {
|
||||
List<T> temp = list.skip((index - 1) * len).take(len).toList();
|
||||
final List<T> temp = list.skip((index - 1) * len).take(len).toList();
|
||||
result.add(temp);
|
||||
index++;
|
||||
continue;
|
||||
}
|
||||
List<T> temp = list.skip((index - 1) * len).toList();
|
||||
final List<T> temp = list.skip((index - 1) * len).toList();
|
||||
result.add(temp);
|
||||
break;
|
||||
}
|
||||
@ -263,11 +263,11 @@ List<List<T>> splitList<T>(List<T> list, int len) {
|
||||
}
|
||||
|
||||
//TODO:int->两个字节 List 高字节在前,低字节在后(小端存储) 本工程只有配置 WiFi用到的!!!!
|
||||
List<int> intToByte2ListLow(int value) => [value >> 8, value];
|
||||
List<int> intToByte2ListLow(int value) => <int>[value >> 8, value];
|
||||
|
||||
String radixHex16String(List<int> codeUnits) {
|
||||
String result = '';
|
||||
for (var value in codeUnits) {
|
||||
for (final int value in codeUnits) {
|
||||
result += value.toRadixString(16).padLeft(2, '0');
|
||||
}
|
||||
return result;
|
||||
@ -275,7 +275,7 @@ String radixHex16String(List<int> codeUnits) {
|
||||
|
||||
String radixHex16StringTo2String(List<int> codeUnits) {
|
||||
String result = '';
|
||||
codeUnits.forEach((value) {
|
||||
codeUnits.forEach((int value) {
|
||||
result += int.parse(value.toRadixString(16).padLeft(2, '0'),radix: 16).toRadixString(2);
|
||||
});
|
||||
return result;
|
||||
@ -283,7 +283,7 @@ String radixHex16StringTo2String(List<int> codeUnits) {
|
||||
|
||||
String asciiString(List<int> codeUnits) {
|
||||
String result = '';
|
||||
for (var value in codeUnits) {
|
||||
for (final int value in codeUnits) {
|
||||
result += String.fromCharCode(value);
|
||||
}
|
||||
return result;
|
||||
@ -291,7 +291,7 @@ String asciiString(List<int> codeUnits) {
|
||||
|
||||
String utf8String(List<int> codeUnits) {
|
||||
codeUnits.reversed;
|
||||
List<int> uniqueList = [];
|
||||
final List<int> uniqueList = <int>[];
|
||||
for (int i = 0; i < codeUnits.length; i++) {
|
||||
if (codeUnits[i] != 0) {
|
||||
uniqueList.add(codeUnits[i]);
|
||||
@ -302,11 +302,13 @@ String utf8String(List<int> codeUnits) {
|
||||
}
|
||||
|
||||
bool compareTwoList({List<int>? list1, List<int>? list2}) {
|
||||
if (list1!.length != list2!.length) return false;
|
||||
int ctn = list1.length;
|
||||
if (list1!.length != list2!.length) {
|
||||
return false;
|
||||
}
|
||||
final int ctn = list1.length;
|
||||
for (int i = 0; i < ctn; i++) {
|
||||
int v1 = list1[i];
|
||||
int v2 = list2[i];
|
||||
final int v1 = list1[i];
|
||||
final int v2 = list2[i];
|
||||
if (v1 != v2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -142,8 +142,7 @@ class _SendEmailNotificationPageState extends State<SendEmailNotificationPage> {
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
); }
|
||||
|
||||
Widget _buildReceiverItemWidget() {
|
||||
return Container(
|
||||
|
||||
@ -10,11 +10,14 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:star_lock/blue/blue_manage.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_getStarLockStatusInfo.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_reply.dart';
|
||||
import 'package:star_lock/blue/io_tool/io_tool.dart';
|
||||
import 'package:star_lock/blue/io_tool/manager_event_bus.dart';
|
||||
import 'package:star_lock/blue/sender_manage.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/updateLockInfo_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/version_entity.dart';
|
||||
import 'package:star_lock/network/api_repository.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
@ -36,6 +39,8 @@ class LockEscalationLogic extends BaseGetXController {
|
||||
int startSecond = 0;
|
||||
Map? headJson;
|
||||
FwVersionEntity? entity;
|
||||
String model = '';
|
||||
String currentVersion = '';
|
||||
|
||||
//手动升级
|
||||
Future<void> otaUpdate() async {
|
||||
@ -157,7 +162,10 @@ class LockEscalationLogic extends BaseGetXController {
|
||||
// 拦截返回事件
|
||||
void getBack() {
|
||||
if (state.otaUpdateIng.value) {
|
||||
closeOTADAta();
|
||||
ShowTipView().showIosTipWithContentDialog('升级中,是否退出'.tr, () {
|
||||
closeOTADAta();
|
||||
Get.back();
|
||||
});
|
||||
} else {
|
||||
Get.back();
|
||||
}
|
||||
@ -236,20 +244,11 @@ class LockEscalationLogic extends BaseGetXController {
|
||||
|
||||
//检查最新版本
|
||||
Future<void> checkUpData() async {
|
||||
final String model = CommonDataManage().currentKeyInfo.model ?? '';
|
||||
String currentVersion = CommonDataManage().currentKeyInfo.fwVersion ?? '';
|
||||
if (currentVersion.split('.').length >= 3) {
|
||||
currentVersion = currentVersion.split('.')[0] +
|
||||
'.' +
|
||||
currentVersion.split('.')[1] +
|
||||
'.' +
|
||||
currentVersion.split('.')[2];
|
||||
}
|
||||
state.showVersion.value = currentVersion;
|
||||
entity = await ApiRepository.to
|
||||
.getFwVersion(model: model, currentVersion: currentVersion);
|
||||
state.isShowUpDataBtn.value = entity?.data?.isUpdate == 1;
|
||||
state.showNewVersion.value = entity?.data?.version??'';
|
||||
state.showNewVersion.value = entity?.data?.version ?? '';
|
||||
}
|
||||
|
||||
//下载升级
|
||||
@ -264,10 +263,75 @@ class LockEscalationLogic extends BaseGetXController {
|
||||
}
|
||||
}
|
||||
|
||||
// 获取锁状态
|
||||
Future<void> getStarLockStatus() async {
|
||||
state.loading.value = true;
|
||||
showBlueConnetctToastTimer(action: () {
|
||||
state.loading.value = false;
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
IoSenderManage.senderGetStarLockStatuInfo(
|
||||
lockID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
utcTimeStamp: 0,
|
||||
unixTimeStamp: 0,
|
||||
isBeforeAddUser: false,
|
||||
privateKey: getPrivateKeyList);
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
cancelBlueConnetctToastTimer();
|
||||
state.loading.value = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 获取星锁状态
|
||||
Future<void> _replyGetStarLockStatusInfo(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
state.loading.value = false;
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
// 设备型号
|
||||
final List<int> modelList = reply.data.sublist(24, 43);
|
||||
// 设备型号
|
||||
final List<int> fwVersion = reply.data.sublist(44, 63);
|
||||
model = utf8String(modelList);
|
||||
currentVersion = utf8String(fwVersion);
|
||||
checkUpData();
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
IoSenderManage.senderGetStarLockStatuInfo(
|
||||
lockID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
utcTimeStamp: 0,
|
||||
unixTimeStamp: 0,
|
||||
isBeforeAddUser: false,
|
||||
privateKey: getPrivateKeyList,
|
||||
);
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
checkUpData();
|
||||
}
|
||||
|
||||
@override
|
||||
@ -288,9 +352,15 @@ class LockEscalationLogic extends BaseGetXController {
|
||||
processOtaUpgrade();
|
||||
} else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) {
|
||||
closeOTADAta();
|
||||
ApiRepository.to.getLockUpdateLockInfo(
|
||||
lockId: CommonDataManage().currentKeyInfo.lockId ?? 0,
|
||||
fwVersion: state.showNewVersion.value);
|
||||
showToast('固件升级完成'.tr);
|
||||
} else if (reply is GetStarLockStatuInfoReply) {
|
||||
_replyGetStarLockStatusInfo(reply);
|
||||
}
|
||||
});
|
||||
getStarLockStatus();
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -40,22 +40,65 @@ class _LockEscalationPageState extends State<LockEscalationPage> {
|
||||
}
|
||||
|
||||
Widget updateView(LockEscalationLogic logic) {
|
||||
if (logic.state.loading.value) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(top: 60.h),
|
||||
child: Align(
|
||||
alignment: Alignment.topCenter,
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'加载数据中'.tr,
|
||||
style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
|
||||
),
|
||||
SizedBox(
|
||||
height: 40.h,
|
||||
),
|
||||
CircularProgressIndicator(
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (logic.state.otaUpdateIng.value) {
|
||||
return otaUpdate(logic);
|
||||
}
|
||||
if (logic.model == '') {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(top: 60.h),
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'加载数据失败'.tr,
|
||||
style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
|
||||
),
|
||||
SizedBox(
|
||||
height: 40.h,
|
||||
),
|
||||
SubmitBtn(
|
||||
btnName: '重试'.tr,
|
||||
onClick: () {
|
||||
logic.getStarLockStatus();
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
return defaultUpdate(logic);
|
||||
}
|
||||
|
||||
//升级
|
||||
Widget defaultUpdate(LockEscalationLogic logic) {
|
||||
return Column(
|
||||
children: [
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
height: 60.h,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
'images/main/icon_main_lockSet_lockEscalation.png',
|
||||
width: 36.w,
|
||||
@ -67,7 +110,8 @@ class _LockEscalationPageState extends State<LockEscalationPage> {
|
||||
Obx(() {
|
||||
if (logic.state.isShowUpDataBtn.value) {
|
||||
return Text(
|
||||
TranslationLoader.lanKeys!.haveNewVersion!.tr + logic.state.showNewVersion.value,
|
||||
TranslationLoader.lanKeys!.haveNewVersion!.tr +
|
||||
logic.state.showNewVersion.value,
|
||||
style:
|
||||
TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
|
||||
);
|
||||
@ -133,7 +177,7 @@ class _LockEscalationPageState extends State<LockEscalationPage> {
|
||||
//ota升级
|
||||
Widget otaUpdate(LockEscalationLogic logic) {
|
||||
return Column(
|
||||
children: [
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
height: 20.h,
|
||||
),
|
||||
@ -178,7 +222,7 @@ class _LockEscalationPageState extends State<LockEscalationPage> {
|
||||
padding: EdgeInsets.symmetric(horizontal: 50.w, vertical: 15.h),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'固件传输中',
|
||||
style: TextStyle(
|
||||
|
||||
@ -4,6 +4,7 @@ class LockEscalationState {
|
||||
RxBool otaUpdateIng = false.obs;
|
||||
RxDouble otaProgress = 0.00.obs;
|
||||
RxBool isShowUpDataBtn = false.obs;
|
||||
RxString showVersion = '1.0.0'.obs;
|
||||
RxString showNewVersion = '1.0.0'.obs;
|
||||
RxString showVersion = ''.obs;
|
||||
RxString showNewVersion = ''.obs;
|
||||
RxBool loading = true.obs;
|
||||
}
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
class UpdateLockInfoEntity {
|
||||
UpdateLockInfoEntity(
|
||||
{this.errorCode, this.description, this.errorMsg, this.data});
|
||||
|
||||
UpdateLockInfoEntity.fromJson(Map<String, dynamic> json) {
|
||||
errorCode = json['errorCode'];
|
||||
description = json['description'];
|
||||
errorMsg = json['errorMsg'];
|
||||
data = json['data'];
|
||||
}
|
||||
|
||||
int? errorCode;
|
||||
String? description;
|
||||
String? errorMsg;
|
||||
dynamic 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;
|
||||
}
|
||||
}
|
||||
@ -256,4 +256,5 @@ abstract class Api {
|
||||
final String checkIpURL = '/checkIp/ip';
|
||||
final String keyNoticeTemplateURL = '/key/getNoticeTemplate'; //获取电子钥匙通知模板
|
||||
final String keyNoticeSubmitURL = '/key/noticeSubmit'; //发送短信、邮件通知
|
||||
final String lockUpdateLockInfo = '/lock/updateLockInfo'; //更新锁固件版本
|
||||
}
|
||||
|
||||
@ -2260,6 +2260,18 @@ class ApiProvider extends BaseProvider {
|
||||
}),
|
||||
isUnShowLoading: true,
|
||||
);
|
||||
|
||||
Future<Response<dynamic>> getLockUpdateLockInfo(
|
||||
int lockId,
|
||||
String fwVersion,
|
||||
) =>
|
||||
post(
|
||||
lockUpdateLockInfo.toUrl,
|
||||
jsonEncode(<String, dynamic>{
|
||||
'lockId': lockId,
|
||||
'fwVersion': fwVersion,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
extension ExtensionString on String {
|
||||
|
||||
@ -12,6 +12,7 @@ import 'package:star_lock/main/lockDetail/electronicKey/sendEmailNotification/se
|
||||
import 'package:star_lock/main/lockDetail/face/addFace/addFace_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/fingerprint/fingerprintList/fingerprint_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/basicInformation/basicInformation/KeyDetailEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/updateLockInfo_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/version_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_entity.dart';
|
||||
@ -2273,4 +2274,14 @@ class ApiRepository {
|
||||
receiverName, lockId, keyId, channelType, openDoorType, templateType);
|
||||
return SendEmailNotificationEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
// 获取电子钥匙通知模板
|
||||
Future<UpdateLockInfoEntity> getLockUpdateLockInfo({
|
||||
required int lockId,
|
||||
required String fwVersion,
|
||||
}) async {
|
||||
final Response<dynamic> res =
|
||||
await apiProvider.getLockUpdateLockInfo(lockId, fwVersion);
|
||||
return UpdateLockInfoEntity.fromJson(res.body);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user