fix:收到蓝牙透传消息使用原有的蓝牙事件触发监听事件进行处理

This commit is contained in:
liyi 2025-01-23 14:28:36 +08:00
parent 3a36d9e76e
commit 459f94658d
3 changed files with 131 additions and 251 deletions

View File

@ -12,6 +12,8 @@ import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart';
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
import 'package:star_lock/talk/starChart/constant/talk_status.dart';
import 'package:star_lock/talk/starChart/star_chart_manage.dart';
import 'package:star_lock/tools/bugly/bugly_tool.dart';
import 'package:star_lock/tools/throttler.dart';
import 'package:star_lock/widget/permission/permission_dialog.dart';
@ -48,7 +50,7 @@ class LockDetailLogic extends BaseGetXController {
state.replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
//
if (reply is OpenDoorReply && state.ifCurrentScreen.value == true) {
if (reply is OpenDoorReply) {
_replyOpenLock(reply);
}
@ -116,6 +118,11 @@ class LockDetailLogic extends BaseGetXController {
//
getLockRecordLastUploadDataTime();
//
if (StartChartManage().talkStatus.status ==
TalkStatus.answeredSuccessfully) {
showToast('开锁成功'.tr);
}
break;
case 0x06:
//
@ -143,6 +150,12 @@ class LockDetailLogic extends BaseGetXController {
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
//
if (StartChartManage().talkStatus.status ==
TalkStatus.answeredSuccessfully) {
sendStarChartOpenLockMessage(reply);
}
break;
case 0x16:
// ...
@ -198,6 +211,43 @@ class LockDetailLogic extends BaseGetXController {
}
}
///
void sendStarChartOpenLockMessage(Reply reply) async {
/// token信息的开门信息
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> tokenData = reply.data.sublist(2, 6);
final List<String> saveStrList = changeIntListToStringList(tokenData);
Storage.setStringList(saveBlueToken, saveStrList);
final OpenLockCommand openLockCommand = OpenLockCommand(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
openMode: state.openDoorModel,
openTime: getUTCNetTime(),
onlineToken: state.lockNetToken,
token: tokenData,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
final messageDetail = openLockCommand.packageData();
// List<int>
String hexString = messageDetail
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
//
StartChartManage().sendRemoteUnLockMessage(
bluetoothDeviceName: BlueManage().connectDeviceName,
openLockCommand: messageDetail,
);
}
Future<void> loadData(
{required LockListInfoItemEntity lockListInfoItemEntity,
required bool isOnlyOneData}) async {

View File

@ -0,0 +1,80 @@
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_openLock.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/reciver_data.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart';
import 'package:star_lock/talk/starChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/starChart/entity/scp_message.dart';
import 'package:star_lock/talk/starChart/handle/scp_message_base_handle.dart';
import 'package:star_lock/talk/starChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/starChart/proto/ble_message.pbserver.dart';
import 'package:star_lock/talk/starChart/proto/gateway_reset.pb.dart';
import 'package:star_lock/talk/starChart/proto/generic.pb.dart';
import 'package:star_lock/tools/bugly/bugly_tool.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
import '../../star_chart_manage.dart';
class UdpBlePassThroughHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) {
//TODO
}
@override
void handleResp(ScpMessage scpMessage) async {
final BleResp bleResp = scpMessage.Payload;
String hexString = bleResp.structData
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('收到蓝牙透传回复:$hexString');
//
await CommandReciverManager.appDataReceive(bleResp.structData);
}
@override
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required List<int> byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final BleResp bleResp = BleResp();
bleResp.mergeFromBuffer(byte);
return bleResp;
} else if (messageType == MessageTypeConstant.Req) {
final BleReq talkExpect = BleReq();
talkExpect.mergeFromBuffer(byte);
return talkExpect;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,250 +0,0 @@
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_openLock.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/reciver_data.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/proto/ble_message.pbserver.dart';
import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/tools/bugly/bugly_tool.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
import '../../start_chart_manage.dart';
class UdpBlePassThroughHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
LockDetailLogic lockDetailLogic = Get.put(LockDetailLogic());
LockDetailState lockDetailState = Get.find<LockDetailLogic>().state;
@override
void handleReq(ScpMessage scpMessage) {
//TODO
}
@override
void handleResp(ScpMessage scpMessage) async {
final BleResp bleResp = scpMessage.Payload;
String hexString = bleResp.structData
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('收到蓝牙透传回复:$hexString');
await CommandReciverManager.appDataReceive(bleResp.structData);
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
//
if (reply is OpenDoorReply) {
AppLog.log('收到开门请求命令回复');
_replyOpenLock(reply);
}
});
}
@override
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required List<int> byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final BleResp bleResp = BleResp();
bleResp.mergeFromBuffer(byte);
return bleResp;
} else if (messageType == MessageTypeConstant.Req) {
final BleReq talkExpect = BleReq();
talkExpect.mergeFromBuffer(byte);
return talkExpect;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
//
Future<void> _replyOpenLock(Reply reply) async {
final int status = reply.data[6];
BuglyTool.uploadException(
message: '开锁结果,解析数据',
detail: '开锁结果,解析数据 _replyOpenLock:${reply.data}',
upload: true);
if (status != 6) {
final String getMobile = (await Storage.getMobile())!;
UmengCommonSdk.onEvent('open_lock', {
'lock_name': lockDetailState.keyInfos.value.lockName!,
'account':
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'date': DateTool().getNowDateWithType(1),
'open_lock_result': '${reply.data}',
});
}
switch (status) {
case 0x00:
//
// _showFullScreenOverlay(Get.context!);
lockDetailState.iSClosedUnlockSuccessfulPopup.value = true;
lockDetailLogic.cancelBlueConnetctToastTimer();
lockDetailState.closedUnlockSuccessfulTimer?.cancel();
// EasyLoading.dismiss();
// 3
lockDetailState.closedUnlockSuccessfulTimer =
Timer.periodic(3.seconds, (Timer timer) {
lockDetailState.iSClosedUnlockSuccessfulPopup.value = false;
timer.cancel();
eventBus.fire(RefreshLockDetailInfoDataEvent());
});
//
final int power = reply.data[7];
lockDetailState.electricQuantity.value = power;
//
if (lockDetailState
.keyInfos.value.lockFeature!.isSupportBackupBattery ==
1) {
final int powerStandby = reply.data[9];
lockDetailState.electricQuantityStandby.value = powerStandby;
}
//
await lockDetailLogic.uploadElectricQuantityRequest();
//
lockDetailLogic.lockReportLockSuccessfullyUploadData();
lockDetailLogic.resetOpenDoorState();
lockDetailState.animationController?.stop();
//
lockDetailLogic.getLockRecordLastUploadDataTime();
if (!EasyLoading.isShow) {
lockDetailLogic.showToast('开门成功'.tr);
}
break;
case 0x06:
//
// token后在重新发送
sendCarryTokenOpenLockMessage(reply);
break;
case 0x16:
// ...
final int isOpen = reply.data[8];
String? msg;
if (isOpen == 0) {
msg = '正在开锁中...'.tr;
} else if (isOpen == 32) {
msg = '正在闭锁中...'.tr;
}
lockDetailLogic.resetOpenDoorState();
if (msg != null) {
lockDetailLogic.showToast(msg, something: () {
lockDetailLogic.cancelBlueConnetctToastTimer();
});
}
break;
case 0x0d:
//
lockDetailLogic.showToast('钥匙无效'.tr);
lockDetailLogic.openDoorError();
break;
case 0x0b:
//
lockDetailLogic.showToast('钥匙过期'.tr);
lockDetailLogic.openDoorError();
break;
case 0x0a:
//
lockDetailLogic.showToast('钥匙不存在'.tr);
lockDetailLogic.openDoorError();
break;
case 0x0c:
//
lockDetailLogic.showToast('钥匙数量已到上限'.tr);
lockDetailLogic.openDoorError();
break;
case 0x0e:
//
lockDetailLogic.showToast('钥匙已存在'.tr);
lockDetailLogic.openDoorError();
break;
case 0x0f:
//
lockDetailLogic.showToast('用户已存在'.tr);
lockDetailLogic.openDoorError();
break;
default:
//
// AppLog.log('开锁失败');
lockDetailLogic.openDoorError();
break;
}
}
void sendCarryTokenOpenLockMessage(Reply reply) async {
/// token信息的开门信息
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> tokenData = reply.data.sublist(2, 6);
final List<String> saveStrList = changeIntListToStringList(tokenData);
Storage.setStringList(saveBlueToken, saveStrList);
final OpenLockCommand openLockCommand = OpenLockCommand(
lockID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
openMode: lockDetailState.openDoorModel,
openTime: lockDetailLogic.getUTCNetTime(),
onlineToken: lockDetailState.lockNetToken,
token: tokenData,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
final messageDetail = openLockCommand.packageData();
// List<int>
String hexString = messageDetail
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('open lock hexString: $hexString');
//
StartChartManage().sendRemoteUnLockMessage(
bluetoothDeviceName: BlueManage().connectDeviceName,
openLockCommand: messageDetail,
);
}
}