style:整理udp返回数据的反序列化逻辑,使用工厂模式处理

This commit is contained in:
liyi 2024-12-24 10:50:32 +08:00
parent 558b9418cb
commit f91f1714c8
22 changed files with 576 additions and 329 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,32 +1,11 @@
import 'dart:convert';
import 'package:get/get.dart';
import 'package:protobuf/protobuf.dart';
import 'dart:typed_data';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
import 'package:star_lock/talk/startChart/entity/login_response.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/talk/startChart/proto/ble_message.pb.dart';
import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/gateway_transfer.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/remote_unlock.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_accept.pbserver.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_expect.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_hangup.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_ping.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_push.pbserver.dart';
import 'package:star_lock/talk/startChart/proto/talk_receiver_transfer.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart';
class ScpMessage {
///
// messageId
static Map<int, List<List<int>>> _packetBuffer = {};
ScpMessage({
this.ProtocolFlag,
this.MessageType,
@ -167,15 +146,16 @@ class ScpMessage {
return bytesToHexString;
}
static ScpMessage deserialize(List<int> bytes) {
static ScpMessage deserialize(Uint8List bytes) {
final message = ScpMessage();
int offset = 0;
// Convert byte array to hex string with zero padding and without spaces
String hexString =
bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
// String hexString =
// bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
//
// // Log the hex string
// _log(text: '原始字节数组: $hexString');
// Log the hex string
_log(text: '原始字节数组: $hexString');
// ProtocolFlag (4 bytes)
if (bytes.length - offset >= 4) {
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
@ -264,7 +244,8 @@ class ScpMessage {
// Payload
if (message.PayloadLength != null &&
bytes.length - offset >= message.PayloadLength!) {
final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
final Uint8List sublist =
bytes.sublist(offset, offset + message.PayloadLength!);
offset += message.PayloadLength!;
message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0,
@ -276,9 +257,6 @@ class ScpMessage {
spTotal: message.SpTotal,
messageId: message.MessageId,
);
// if (message.Payload != null && message.Payload is List<int>) {
// message.PayloadLength = message.Payload.length;
// }
} else {
throw FormatException("Invalid Payload or PayloadLength");
}
@ -290,7 +268,7 @@ class ScpMessage {
static dynamic _handlePayLoad({
required int payloadType,
required int messageType,
required List<int> byte,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
@ -298,197 +276,20 @@ class ScpMessage {
int? messageId,
}) {
try {
switch (payloadType) {
case PayloadTypeConstant.goOnline:
// 线
LoginResponse loginResp = LoginResponse.fromBytes(byte);
return loginResp;
case PayloadTypeConstant.heartbeat:
//
HeartbeatResponse heartbeatResponse =
HeartbeatResponse.fromBytes(byte);
return heartbeatResponse;
case PayloadTypeConstant.echoTest:
//
if (spTotal != null &&
spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return _handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
// spTotal 1 byte
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.gatewayReset:
//
if (messageType == MessageTypeConstant.Resp) {
final GatewayResetResp gatewayResetResp =
GatewayResetResp.fromBuffer(byte);
return gatewayResetResp;
} else if (messageType == MessageTypeConstant.Req) {
final GatewayResetReq gatewayResetReq =
GatewayResetReq.fromBuffer(byte);
return gatewayResetReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.callRequest:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReq talkReq = TalkReq.fromBuffer(byte);
return talkReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkAccept:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkAcceptReq talkAccept = TalkAcceptReq.fromBuffer(byte);
return talkAccept;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.gatewayTransfer:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final GatewayTransferReq gatewayTransferReq =
GatewayTransferReq.fromBuffer(byte);
return gatewayTransferReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.blePassthrough:
final BleResp bleResp = BleResp.fromBuffer(byte);
return bleResp;
case PayloadTypeConstant.remoteUnlock:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final RemoteUnlockResp remoteUnlockResp =
RemoteUnlockResp.fromBuffer(byte);
return remoteUnlockResp;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkReceiverTransfer:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReceiverTransfer talkReceiverTransfer =
TalkReceiverTransfer.fromBuffer(byte);
return talkReceiverTransfer;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkPush:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkPush talkPush = TalkPush.fromBuffer(byte);
return talkPush;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkReject:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReject talkReject = TalkReject.fromBuffer(byte);
return talkReject;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkPing:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkPing talkPing = TalkPing.fromBuffer(byte);
return talkPing;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkExpect:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkExpect talkExpect = TalkExpect.fromBuffer(byte);
return talkExpect;
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkData:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) {
//
if (spTotal != null &&
spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return _handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
//
final TalkData talkData = TalkData.fromBuffer(byte);
return talkData;
}
} else {
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.talkHangup:
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) {
final TalkHangup talkHangup = TalkHangup.fromBuffer(byte);
return talkHangup;
} else {
String payload = utf8.decode(byte);
return payload;
}
default:
print('❌未知的payloadType类型,按照字符串解析');
String payload = utf8.decode(byte);
return payload;
}
//
final ScpMessageHandler handler =
ScpMessageHandlerFactory.createHandler(payloadType);
//
return handler.deserializePayload(
payloadType: payloadType,
messageType: messageType,
byte: byte,
offset: offset,
PayloadLength: PayloadLength,
spTotal: spTotal,
spIndex: spIndex,
messageId: messageId,
);
} catch (e, stackTrace) {
//
_log(text: '❌反序列化udp数据时遇到错误----》$e');
@ -515,49 +316,4 @@ class ScpMessage {
static void _log({required String text}) {
AppLog.log('=====${text}');
}
///
/// null
static dynamic _handleFragmentedPayload({
required int messageId,
required int spTotal,
required int spIndex,
required List<int> byte,
required int payloadType,
}) {
//
if (!_packetBuffer.containsKey(messageId)) {
_packetBuffer[messageId] = List.filled(spTotal, []);
}
//
if (spIndex < 1 || spIndex > spTotal) {
print('Invalid spIndex: $spIndex for messageId: $messageId');
return null;
}
//
_packetBuffer[messageId]![spIndex - 1] = byte;
//
if (_packetBuffer[messageId]!.every((packet) => packet.isNotEmpty)) {
//
List<int> completePayload = _packetBuffer[messageId]!.expand((packet) => packet).toList();
//
_packetBuffer.remove(messageId);
// payload
if (payloadType == PayloadTypeConstant.talkData) {
final TalkData talkData = TalkData.fromBuffer(completePayload);
return talkData;
} else {
String payload = utf8.decode(completePayload);
return payload;
}
} else {
// null
return null;
}
}
}

View File

@ -1,3 +1,5 @@
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
@ -28,4 +30,19 @@ class UdpBlePassThroughHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
final BleResp bleResp = BleResp();
bleResp.mergeFromBuffer(byte);
return bleResp;
}
}

View File

@ -1,3 +1,6 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
@ -10,15 +13,11 @@ import '../../start_chart_manage.dart';
class UdpEchoTestHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) {
// TODO:
}
void handleReq(ScpMessage scpMessage) {}
@override
void handleResp(ScpMessage scpMessage) {
// TODO:
final List<int> payload = scpMessage.Payload;
if (payload is String) {
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
} else {
@ -32,4 +31,34 @@ class UdpEchoTestHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
//
if (spTotal != null &&
spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
// spTotal 1 byte
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,5 +1,9 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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';
@ -7,17 +11,14 @@ import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
import '../../start_chart_manage.dart';
class UdpGateWayResetHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
class UdpGateWayResetHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) {
// TODO:
final GatewayResetResp gatewayResetResp = scpMessage.Payload;
final status = gatewayResetResp.status;
if (status != null && status == GatewayResetResp_StatusE.OK) {
}
if (status != null && status == GatewayResetResp_StatusE.OK) {}
}
@override
@ -26,12 +27,33 @@ class UdpGateWayResetHandler extends ScpMessageBaseHandle implements ScpMessageH
}
@override
void handleInvalidReq(ScpMessage scpMessage) {
}
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
//
if (messageType == MessageTypeConstant.Resp) {
final GatewayResetResp gatewayResetResp =
GatewayResetResp.fromBuffer(byte);
return gatewayResetResp;
} else if (messageType == MessageTypeConstant.Req) {
final GatewayResetReq gatewayResetReq = GatewayResetReq();
gatewayResetReq.mergeFromBuffer(byte);
return gatewayResetReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,9 +1,14 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/gateway_transfer.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import '../../start_chart_manage.dart';
@ -29,4 +34,28 @@ class UdpGateWayTransferHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final GatewayTransferReq gatewayTransferReq = GatewayTransferReq();
gatewayTransferReq.mergeFromBuffer(byte);
return gatewayTransferReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,3 +1,5 @@
import 'dart:typed_data';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/login_response.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
@ -35,4 +37,19 @@ class UdpGoOnlineHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
// 线
LoginResponse loginResp = LoginResponse.fromBytes(byte);
return loginResp;
}
}

View File

@ -1,3 +1,5 @@
import 'dart:typed_data';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
import 'package:star_lock/talk/startChart/entity/login_response.dart';
@ -39,4 +41,11 @@ class UdpHeartBeatHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload({required int payloadType, required int messageType, required Uint8List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) {
//
HeartbeatResponse heartbeatResponse = HeartbeatResponse.fromBytes(byte);
return heartbeatResponse;
}
}

View File

@ -1,6 +1,10 @@
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/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';
@ -32,4 +36,20 @@ class UdpRemoteUnLockHandler extends ScpMessageBaseHandle implements ScpMessageH
void handleRealTimeData(ScpMessage scpMessage) {
}
@override
deserializePayload({required int payloadType, required int messageType, required Uint8List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final RemoteUnlockResp remoteUnlockResp = RemoteUnlockResp();
remoteUnlockResp.mergeFromBuffer(byte);
return remoteUnlockResp;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,10 +1,15 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_accept.pb.dart';
import '../../start_chart_manage.dart';
@ -22,12 +27,12 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
}
@override
void handleResp(ScpMessage scpMessage) {
void handleResp(ScpMessage scpMessage) {
//
final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) {
// 2
Future.delayed(Duration(seconds: 4), () {
Future.delayed(Duration(seconds: 5), () {
//
_handleStartTalkPing();
//
@ -49,6 +54,30 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkAcceptReq talkAccept = TalkAcceptReq();
talkAccept.mergeFromBuffer(byte);
return talkAccept;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
//
void _handleStartTalkPing() {
//
@ -85,4 +114,6 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
//
startChartManage.startTalkExpectTimer();
}
}

View File

@ -1,7 +1,9 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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';
@ -61,5 +63,47 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
void _handleVideoImage(TalkData talkData) {}
/// g711音频数据
void _handleVideoG711(TalkData talkData) {}
void _handleVideoG711(TalkData talkData) {
talkDataRepository.addTalkData(talkData);
}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) {
//
if (spTotal != null &&
spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
//
final TalkData talkData = TalkData();
talkData.mergeFromBuffer(byte);
return talkData;
}
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,8 +1,10 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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';
@ -42,4 +44,28 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkExpect talkExpect = TalkExpect();
talkExpect.mergeFromBuffer(byte);
return talkExpect;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,10 +1,15 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_hangup.pb.dart';
import '../../start_chart_manage.dart';
@ -39,12 +44,32 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle
}
@override
void handleInvalidReq(ScpMessage scpMessage) {
}
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) {
final TalkHangup talkHangup = TalkHangup();
talkHangup.mergeFromBuffer(byte);
return talkHangup;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,8 +1,13 @@
import 'dart:convert';
import 'dart:typed_data';
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/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_ping.pb.dart';
class UdpTalkPingHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@ -26,4 +31,28 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkPing talkPing = TalkPing();
talkPing.mergeFromBuffer(byte);
return talkPing;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,10 +1,15 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_push.pb.dart';
import '../../start_chart_manage.dart';
@ -27,4 +32,28 @@ class UdpTalkPushHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkPush talkPush = TalkPush();
talkPush.mergeFromBuffer(byte);
return talkPush;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,17 +1,20 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_receiver_transfer.pb.dart';
import '../../start_chart_manage.dart';
class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) {
// TODO:
@ -23,12 +26,32 @@ class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
}
@override
void handleInvalidReq(ScpMessage scpMessage) {
}
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReceiverTransfer talkReceiverTransfer = TalkReceiverTransfer();
talkReceiverTransfer.mergeFromBuffer(byte);
return talkReceiverTransfer;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,10 +1,15 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart';
import '../../start_chart_manage.dart';
@ -36,12 +41,32 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
}
@override
void handleInvalidReq(ScpMessage scpMessage) {
}
void handleInvalidReq(ScpMessage scpMessage) {}
@override
void handleRealTimeData(ScpMessage scpMessage) {
void handleRealTimeData(ScpMessage scpMessage) {}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReject talkReject = TalkReject();
talkReject.mergeFromBuffer(byte);
return talkReject;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,3 +1,6 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
@ -9,6 +12,7 @@ import 'package:star_lock/talk/startChart/handle/scp_message_handle.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/talk/startChart/proto/talk_request.pb.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import 'package:star_lock/tools/storage.dart';
import '../../start_chart_manage.dart';
@ -17,6 +21,10 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) {
if (talkStatus == TalkStatus.waitingAnswer) {
//
return;
}
//
final TalkReq talkReq = scpMessage.Payload;
//
@ -29,6 +37,8 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
startChartManage.ToPeerId = scpMessage.FromPeerId!;
//
_talkRequestEvent(talkObjectName: talkReq.callerName);
//
talkStatus.setWaitingAnswer();
}
@override
@ -77,4 +87,28 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
'${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}', platformChannelSpecifics,
payload: 'item x');
}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.Req) {
final TalkReq talkReq = TalkReq();
talkReq.mergeFromBuffer(byte);
return talkReq;
} else {
String payload = utf8.decode(byte);
return payload;
}
}
}

View File

@ -1,3 +1,5 @@
import 'dart:typed_data';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
@ -27,4 +29,17 @@ class UnKnowPayloadTypeHandler extends ScpMessageBaseHandle
void handleRealTimeData(ScpMessage scpMessage) {
AppLog.log('❌未知的payloadType类型---》${scpMessage}');
}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
AppLog.log('❌未知的payloadType类型---》');
}
}

View File

@ -1,20 +1,28 @@
import 'dart:convert';
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/other/audio_player_manager.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/udp_constant.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/other/overtime_timer_manger.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class ScpMessageBaseHandle {
final startChartManage = StartChartManage();
///
// messageId
static Map<int, List<List<int>>> _packetBuffer = {};
//
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
@ -31,7 +39,7 @@ class ScpMessageBaseHandle {
);
//
void replySuccessMessage(ScpMessage scpMessage){
void replySuccessMessage(ScpMessage scpMessage) {
startChartManage.sendGenericRespSuccessMessage(
ToPeerId: scpMessage.FromPeerId!,
FromPeerId: scpMessage.ToPeerId!,
@ -63,4 +71,53 @@ class ScpMessageBaseHandle {
void stopRingtone() async {
await audioManager.stopRingtone();
}
///
/// null
dynamic handleFragmentedPayload({
required int messageId,
required int spTotal,
required int spIndex,
required List<int> byte,
required int payloadType,
}) {
//
if (!_packetBuffer.containsKey(messageId)) {
_packetBuffer[messageId] = List.filled(spTotal, []);
}
//
if (spIndex < 1 || spIndex > spTotal) {
print('Invalid spIndex: $spIndex for messageId: $messageId');
return null;
}
//
_packetBuffer[messageId]![spIndex - 1] = byte;
//
if (_packetBuffer[messageId]!.every((packet) => packet.isNotEmpty)) {
//
List<int> completePayload =
_packetBuffer[messageId]!.expand((packet) => packet).toList();
//
_packetBuffer.remove(messageId);
// payload
if (payloadType == PayloadTypeConstant.talkData) {
final TalkData talkData = TalkData();
talkData.mergeFromBuffer(completePayload);
return talkData;
} else if (payloadType == PayloadTypeConstant.echoTest) {
return completePayload;
} else {
String payload = utf8.decode(completePayload);
return payload;
}
} else {
// null
return null;
}
}
}

View File

@ -1,3 +1,5 @@
import 'dart:typed_data';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
abstract class ScpMessageHandler {
@ -12,4 +14,16 @@ abstract class ScpMessageHandler {
//
void handleInvalidReq(ScpMessage scpMessage);
//
dynamic deserializePayload({
required int payloadType,
required int messageType,
required Uint8List byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId,
});
}

View File

@ -285,8 +285,7 @@ class StartChartManage {
}
//
void sendEchoMessage({required List<int> payload}) async {
String toPeerId = '7SDLN3XMNAQvVAJ2yrbLFfJkKQdgfBrpa8wV7s7TXYcu';
void sendEchoMessage({required List<int> payload,required String toPeerId}) async {
//
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
@ -764,7 +763,7 @@ class StartChartManage {
_handleUdpResultData(deserialize);
}
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
_log(text: 'Udp收到结构体数据---》$deserialize');
// _log(text: 'Udp收到结构体数据---》$deserialize');
// _log(text: 'text---》${utf8.decode(deserialize.Payload)}');
}
}