2024-08-21 14:12:15 +08:00
|
|
|
|
|
2024-04-24 16:04:07 +08:00
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
import 'dart:typed_data';
|
2023-09-07 18:36:16 +08:00
|
|
|
|
|
2024-04-24 16:04:07 +08:00
|
|
|
|
import 'package:crypto/crypto.dart';
|
|
|
|
|
|
import 'package:file_picker/file_picker.dart';
|
|
|
|
|
|
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
2024-05-13 14:08:21 +08:00
|
|
|
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
2024-04-24 16:04:07 +08:00
|
|
|
|
import 'package:get/get.dart';
|
2024-05-31 14:28:52 +08:00
|
|
|
|
import 'package:http/http.dart' as http;
|
2024-04-24 16:04:07 +08:00
|
|
|
|
import 'package:star_lock/blue/blue_manage.dart';
|
2024-06-12 18:13:13 +08:00
|
|
|
|
import 'package:star_lock/blue/io_protocol/io_getStarLockStatusInfo.dart';
|
2024-04-24 16:04:07 +08:00
|
|
|
|
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';
|
2024-06-12 18:13:13 +08:00
|
|
|
|
import 'package:star_lock/blue/sender_manage.dart';
|
2024-05-31 14:28:52 +08:00
|
|
|
|
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/version_entity.dart';
|
|
|
|
|
|
import 'package:star_lock/network/api_repository.dart';
|
2023-09-07 18:36:16 +08:00
|
|
|
|
import 'package:star_lock/tools/baseGetXController.dart';
|
2024-04-24 16:04:07 +08:00
|
|
|
|
import 'package:star_lock/tools/commonDataManage.dart';
|
2024-05-13 14:08:21 +08:00
|
|
|
|
import 'package:star_lock/tools/showTipView.dart';
|
2024-04-24 16:04:07 +08:00
|
|
|
|
import 'package:star_lock/tools/storage.dart';
|
2024-05-10 12:01:22 +08:00
|
|
|
|
import 'package:star_lock/widget/permission/permission_dialog.dart';
|
2023-09-07 18:36:16 +08:00
|
|
|
|
|
2024-04-26 15:38:59 +08:00
|
|
|
|
import '../../../../app_settings/app_settings.dart';
|
2023-09-07 18:36:16 +08:00
|
|
|
|
import 'lockEscalation_state.dart';
|
|
|
|
|
|
|
2024-04-24 16:04:07 +08:00
|
|
|
|
class LockEscalationLogic extends BaseGetXController {
|
2023-09-07 18:36:16 +08:00
|
|
|
|
LockEscalationState state = LockEscalationState();
|
2024-04-24 16:04:07 +08:00
|
|
|
|
StreamSubscription<Reply>? _replySubscription;
|
|
|
|
|
|
|
|
|
|
|
|
int otaCount = 0;
|
|
|
|
|
|
int otaIndex = 0;
|
|
|
|
|
|
Uint8List? otaBin;
|
|
|
|
|
|
int startSecond = 0;
|
2024-05-31 14:28:52 +08:00
|
|
|
|
Map? headJson;
|
|
|
|
|
|
FwVersionEntity? entity;
|
2024-06-12 18:13:13 +08:00
|
|
|
|
String model = '';
|
|
|
|
|
|
String currentVersion = '';
|
2023-09-07 18:36:16 +08:00
|
|
|
|
|
2024-04-24 16:04:07 +08:00
|
|
|
|
//手动升级
|
|
|
|
|
|
Future<void> otaUpdate() async {
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final bool status = await PermissionDialog.requestStorage();
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (status != true) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final FilePickerResult? result = await FilePicker.platform.pickFiles();
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (result == null || result.files.single.path is! String) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final File file = File(result.files.single.path!);
|
|
|
|
|
|
final Uint8List data = await file.readAsBytes();
|
2024-05-31 14:28:52 +08:00
|
|
|
|
stateUpData(data);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<void> stateUpData(Uint8List data) async {
|
2024-04-25 09:39:31 +08:00
|
|
|
|
headJson = await getHeadFile(data);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (headJson is! Map) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-04-25 09:39:31 +08:00
|
|
|
|
otaBin = await checkFile(data, headJson!);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (otaBin == null) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final String md5Str = md5.convert(otaBin!).toString();
|
2024-04-25 09:39:31 +08:00
|
|
|
|
headJson!['fwMd5'] = md5Str;
|
2024-05-23 18:10:34 +08:00
|
|
|
|
ShowTipView().showIosTipWithContentDialog('未避免异常情况,请在门打开时升级'.tr, () async {
|
2024-05-31 14:28:52 +08:00
|
|
|
|
blueOTAUpgrade(headJson!, <int>[0, 0, 0, 0]);
|
2024-05-13 14:08:21 +08:00
|
|
|
|
EasyLoading.show(
|
|
|
|
|
|
status: '设备连接中...'.tr, maskType: EasyLoadingMaskType.black);
|
2024-05-31 14:28:52 +08:00
|
|
|
|
Future<void>.delayed(const Duration(seconds: 4), EasyLoading.dismiss);
|
2024-05-13 14:08:21 +08:00
|
|
|
|
});
|
2024-04-24 16:04:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//蓝牙操作 ota 升级
|
2024-07-08 17:25:26 +08:00
|
|
|
|
void blueOTAUpgrade(Map<dynamic, dynamic> data, List<int> token) {
|
2024-05-21 15:33:06 +08:00
|
|
|
|
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
2024-04-24 16:04:07 +08:00
|
|
|
|
(BluetoothConnectionState deviceConnectionState) async {
|
|
|
|
|
|
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
2024-05-31 14:28:52 +08:00
|
|
|
|
final List<String>? privateKey =
|
|
|
|
|
|
await Storage.getStringList(saveBluePrivateKey);
|
|
|
|
|
|
final List<int> getPrivateKeyList =
|
|
|
|
|
|
changeStringListToIntList(privateKey!);
|
|
|
|
|
|
final List<String>? signKey =
|
|
|
|
|
|
await Storage.getStringList(saveBlueSignKey);
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
|
|
|
|
|
final String uid = await Storage.getUid() ?? '';
|
2024-04-24 16:04:07 +08:00
|
|
|
|
BlueManage().writeCharacteristicWithResponse(OTAUpgradeCommand(
|
2024-04-25 14:23:05 +08:00
|
|
|
|
lockID: BlueManage().connectDeviceName,
|
|
|
|
|
|
userID: uid,
|
|
|
|
|
|
keyID: BlueManage().connectDeviceName,
|
2024-07-08 18:25:06 +08:00
|
|
|
|
platform: int.tryParse(data['platform'] ?? '0') ?? 0,
|
|
|
|
|
|
product: int.tryParse(data['product'] ?? '0') ?? 0,
|
2024-04-24 16:04:07 +08:00
|
|
|
|
hwVersion: data['hwVersion'],
|
|
|
|
|
|
fwVersion: data['fwVersion'],
|
|
|
|
|
|
fwSize: data['fwSize'],
|
|
|
|
|
|
fwMD5: data['fwMd5'],
|
|
|
|
|
|
needAuthor: 1,
|
2024-04-25 09:39:31 +08:00
|
|
|
|
token: token,
|
2024-04-25 14:23:05 +08:00
|
|
|
|
signKey: signKeyDataList,
|
2024-04-24 16:04:07 +08:00
|
|
|
|
privateKey: getPrivateKeyList)
|
|
|
|
|
|
.packageData());
|
|
|
|
|
|
} else if (deviceConnectionState ==
|
|
|
|
|
|
BluetoothConnectionState.disconnected) {}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//循环传输升级固件包
|
|
|
|
|
|
Future<void> processOtaUpgrade() async {
|
|
|
|
|
|
if (!state.otaUpdateIng.value) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final int length = otaBin?.length ?? 0;
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (otaCount == 0) {
|
|
|
|
|
|
//首次
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final int difference = length % 240;
|
2024-04-24 16:04:07 +08:00
|
|
|
|
otaCount = length ~/ 240 + (difference > 0 ? 1 : 0);
|
|
|
|
|
|
startSecond = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
2024-04-25 09:39:31 +08:00
|
|
|
|
startOTAData();
|
2024-04-24 16:04:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (otaCount <= otaIndex) {
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final int now = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
|
|
|
|
|
final String msg =
|
2024-04-25 14:23:05 +08:00
|
|
|
|
'传输完成 时间:${now - startSecond}秒 otaCount:$otaCount otaIndex:$otaIndex ';
|
2024-04-24 16:04:07 +08:00
|
|
|
|
closeOTADAta();
|
2024-04-26 15:38:59 +08:00
|
|
|
|
AppLog.log(msg);
|
2024-04-25 14:23:05 +08:00
|
|
|
|
// showToast(msg);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final int star = otaIndex * 240;
|
2024-04-24 16:04:07 +08:00
|
|
|
|
int end = (otaIndex + 1) * 240;
|
|
|
|
|
|
if (end > length) {
|
|
|
|
|
|
end = length;
|
|
|
|
|
|
}
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final int size = end - star;
|
|
|
|
|
|
final List<int> data = otaBin!.sublist(star, end);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
state.otaProgress.value = otaIndex / otaCount;
|
|
|
|
|
|
await BlueManage().writeCharacteristicWithResponse(
|
2024-04-25 14:23:05 +08:00
|
|
|
|
ProcessOtaUpgradeCommand(index: otaIndex, size: size, data: data)
|
2024-04-24 16:04:07 +08:00
|
|
|
|
.packageData());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//开始 ota升级
|
|
|
|
|
|
void startOTAData() {
|
|
|
|
|
|
state.otaUpdateIng.value = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//清楚 ata 安装文件
|
|
|
|
|
|
void closeOTADAta() {
|
|
|
|
|
|
state.otaUpdateIng.value = false;
|
|
|
|
|
|
state.otaProgress.value = 0;
|
|
|
|
|
|
otaIndex = 0;
|
|
|
|
|
|
otaCount = 0;
|
|
|
|
|
|
startSecond = 0;
|
|
|
|
|
|
otaBin = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 拦截返回事件
|
|
|
|
|
|
void getBack() {
|
|
|
|
|
|
if (state.otaUpdateIng.value) {
|
2024-06-12 18:13:13 +08:00
|
|
|
|
ShowTipView().showIosTipWithContentDialog('升级中,是否退出'.tr, () {
|
|
|
|
|
|
closeOTADAta();
|
|
|
|
|
|
Get.back();
|
|
|
|
|
|
});
|
2024-04-24 16:04:07 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
Get.back();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检查文件头
|
|
|
|
|
|
Future<Map?> getHeadFile(Uint8List data) async {
|
2024-04-29 17:24:58 +08:00
|
|
|
|
if (data.length <= 16) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('错误固件,请选择正确的文件'.tr);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-04-24 16:04:07 +08:00
|
|
|
|
// 检查文件头
|
2024-04-29 17:24:58 +08:00
|
|
|
|
String header;
|
|
|
|
|
|
try {
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final Uint8List list = data.sublist(0, 12);
|
|
|
|
|
|
header = utf8.decode(list);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
} catch (e) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('非SYD固件,请选择正确的文件'.tr);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (header != 'SYD-BIN-DATA') {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('非SYD固件,请选择正确的文件'.tr);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 解析元数据长度
|
2024-04-29 17:24:58 +08:00
|
|
|
|
Uint8List metaLenList;
|
|
|
|
|
|
int metaLen;
|
|
|
|
|
|
try {
|
|
|
|
|
|
metaLenList = data.sublist(12, 16);
|
|
|
|
|
|
metaLen = ByteData.sublistView(metaLenList).getUint32(0);
|
|
|
|
|
|
} catch (e) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('文件校验失败 0x01'.tr);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (metaLen < 2 || metaLen > 10240) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('文件校验失败 0x01'.tr);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 读取和解析元数据
|
2024-04-29 17:24:58 +08:00
|
|
|
|
Uint8List metaStrList;
|
|
|
|
|
|
String metaStr;
|
|
|
|
|
|
try {
|
|
|
|
|
|
metaStrList = data.sublist(16, 16 + metaLen);
|
|
|
|
|
|
metaStr = utf8.decode(metaStrList);
|
|
|
|
|
|
} catch (e) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('解析元数据失败,请选择正确的文件'.tr);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-04-26 15:38:59 +08:00
|
|
|
|
AppLog.log(metaStr);
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final meta = jsonDecode(metaStr);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
if (meta is! Map) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('解析元数据失败,请选择正确的文件'.tr);
|
2024-04-29 17:24:58 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-04-24 16:04:07 +08:00
|
|
|
|
return meta..['metaLen'] = metaLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//检测升级文件并读取 bin
|
|
|
|
|
|
Future<Uint8List?> checkFile(Uint8List data, Map meta) async {
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final num binOffset = 16 + (meta['metaLen'] ?? 0);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
// 获取固件数据部分
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final Uint8List bin = data.sublist(binOffset.toInt(), data.length);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
//md5 校验有问题,暂时不解析
|
2024-05-23 18:10:34 +08:00
|
|
|
|
final String md5Str = md5.convert(bin).toString().toUpperCase();
|
2024-05-13 14:08:21 +08:00
|
|
|
|
AppLog.log('固件 md5 检验md5:$md5Str 固件信息 md5:${meta['fwMd5']}');
|
2024-04-25 14:23:05 +08:00
|
|
|
|
if (md5Str != meta['fwMd5']) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('文件校验失败 0x02'.tr);
|
2024-04-25 14:23:05 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-04-24 16:04:07 +08:00
|
|
|
|
if (bin.length != meta['fwSize']) {
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('文件校验失败 0x03'.tr);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
return bin;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-31 14:28:52 +08:00
|
|
|
|
//检查最新版本
|
|
|
|
|
|
Future<void> checkUpData() async {
|
|
|
|
|
|
state.showVersion.value = currentVersion;
|
|
|
|
|
|
entity = await ApiRepository.to
|
|
|
|
|
|
.getFwVersion(model: model, currentVersion: currentVersion);
|
|
|
|
|
|
state.isShowUpDataBtn.value = entity?.data?.isUpdate == 1;
|
2024-06-12 18:13:13 +08:00
|
|
|
|
state.showNewVersion.value = entity?.data?.version ?? '';
|
2024-05-31 14:28:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//下载升级
|
|
|
|
|
|
Future<void> downloadTheFile() async {
|
|
|
|
|
|
if (entity?.data?.downloadUrl == null) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
final String url = entity!.data!.downloadUrl!;
|
|
|
|
|
|
final http.Response response = await http.get(Uri.parse(url));
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
|
|
|
stateUpData(response.bodyBytes);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-12 18:13:13 +08:00
|
|
|
|
// 获取锁状态
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-07 18:36:16 +08:00
|
|
|
|
@override
|
|
|
|
|
|
void onReady() {
|
|
|
|
|
|
super.onReady();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
void onInit() {
|
|
|
|
|
|
super.onInit();
|
2024-04-24 16:04:07 +08:00
|
|
|
|
_replySubscription =
|
2024-05-31 14:28:52 +08:00
|
|
|
|
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
2024-04-25 09:39:31 +08:00
|
|
|
|
if (reply is OTAUpgradeReply) {
|
|
|
|
|
|
if (reply.status == 0x00) {
|
|
|
|
|
|
//验证通过,开始发送数据包
|
2024-04-25 14:23:05 +08:00
|
|
|
|
startOTAData();
|
2024-04-25 09:39:31 +08:00
|
|
|
|
processOtaUpgrade();
|
|
|
|
|
|
} else if (reply.status == 0x06) {
|
|
|
|
|
|
blueOTAUpgrade(headJson!, reply.token);
|
|
|
|
|
|
}
|
2024-04-24 16:04:07 +08:00
|
|
|
|
} else if (reply is ProcessOtaUpgradeReply && reply.status == 0x00) {
|
|
|
|
|
|
otaIndex++;
|
|
|
|
|
|
processOtaUpgrade();
|
|
|
|
|
|
} else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) {
|
2024-06-12 18:13:13 +08:00
|
|
|
|
ApiRepository.to.getLockUpdateLockInfo(
|
|
|
|
|
|
lockId: CommonDataManage().currentKeyInfo.lockId ?? 0,
|
|
|
|
|
|
fwVersion: state.showNewVersion.value);
|
2024-06-15 16:41:31 +08:00
|
|
|
|
closeOTADAta();
|
2024-04-29 18:25:48 +08:00
|
|
|
|
showToast('固件升级完成'.tr);
|
2024-06-12 18:13:13 +08:00
|
|
|
|
} else if (reply is GetStarLockStatuInfoReply) {
|
|
|
|
|
|
_replyGetStarLockStatusInfo(reply);
|
2024-04-24 16:04:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
2024-06-12 18:13:13 +08:00
|
|
|
|
getStarLockStatus();
|
2023-09-07 18:36:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
void onClose() {
|
2024-04-24 16:04:07 +08:00
|
|
|
|
_replySubscription?.cancel();
|
2023-09-07 18:36:16 +08:00
|
|
|
|
}
|
2024-01-23 17:36:02 +08:00
|
|
|
|
}
|