style:整理udp返回数据的反序列化逻辑,使用工厂模式处理
This commit is contained in:
parent
558b9418cb
commit
f91f1714c8
File diff suppressed because one or more lines are too long
@ -1,32 +1,11 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:get/get.dart';
|
import 'dart:typed_data';
|
||||||
import 'package:protobuf/protobuf.dart';
|
|
||||||
import 'package:star_lock/app_settings/app_settings.dart';
|
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/handle/scp_message_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
|
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.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';
|
|
||||||
|
|
||||||
class ScpMessage {
|
class ScpMessage {
|
||||||
/// 分包缓冲区
|
|
||||||
// 存储每个 messageId 对应的分包数据
|
|
||||||
static Map<int, List<List<int>>> _packetBuffer = {};
|
|
||||||
|
|
||||||
ScpMessage({
|
ScpMessage({
|
||||||
this.ProtocolFlag,
|
this.ProtocolFlag,
|
||||||
this.MessageType,
|
this.MessageType,
|
||||||
@ -167,15 +146,16 @@ class ScpMessage {
|
|||||||
return bytesToHexString;
|
return bytesToHexString;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ScpMessage deserialize(List<int> bytes) {
|
static ScpMessage deserialize(Uint8List bytes) {
|
||||||
final message = ScpMessage();
|
final message = ScpMessage();
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
// Convert byte array to hex string with zero padding and without spaces
|
// Convert byte array to hex string with zero padding and without spaces
|
||||||
String hexString =
|
// String hexString =
|
||||||
bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
|
// 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)
|
// ProtocolFlag (4 bytes)
|
||||||
if (bytes.length - offset >= 4) {
|
if (bytes.length - offset >= 4) {
|
||||||
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
|
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
|
||||||
@ -264,7 +244,8 @@ class ScpMessage {
|
|||||||
// 处理其他类型的Payload
|
// 处理其他类型的Payload
|
||||||
if (message.PayloadLength != null &&
|
if (message.PayloadLength != null &&
|
||||||
bytes.length - offset >= message.PayloadLength!) {
|
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!;
|
offset += message.PayloadLength!;
|
||||||
message.Payload = _handlePayLoad(
|
message.Payload = _handlePayLoad(
|
||||||
payloadType: message.PayloadType ?? 0,
|
payloadType: message.PayloadType ?? 0,
|
||||||
@ -276,9 +257,6 @@ class ScpMessage {
|
|||||||
spTotal: message.SpTotal,
|
spTotal: message.SpTotal,
|
||||||
messageId: message.MessageId,
|
messageId: message.MessageId,
|
||||||
);
|
);
|
||||||
// if (message.Payload != null && message.Payload is List<int>) {
|
|
||||||
// message.PayloadLength = message.Payload.length;
|
|
||||||
// }
|
|
||||||
} else {
|
} else {
|
||||||
throw FormatException("Invalid Payload or PayloadLength");
|
throw FormatException("Invalid Payload or PayloadLength");
|
||||||
}
|
}
|
||||||
@ -290,7 +268,7 @@ class ScpMessage {
|
|||||||
static dynamic _handlePayLoad({
|
static dynamic _handlePayLoad({
|
||||||
required int payloadType,
|
required int payloadType,
|
||||||
required int messageType,
|
required int messageType,
|
||||||
required List<int> byte,
|
required Uint8List byte,
|
||||||
int? offset,
|
int? offset,
|
||||||
int? PayloadLength,
|
int? PayloadLength,
|
||||||
int? spTotal,
|
int? spTotal,
|
||||||
@ -298,197 +276,20 @@ class ScpMessage {
|
|||||||
int? messageId,
|
int? messageId,
|
||||||
}) {
|
}) {
|
||||||
try {
|
try {
|
||||||
switch (payloadType) {
|
// 构造工厂
|
||||||
case PayloadTypeConstant.goOnline:
|
final ScpMessageHandler handler =
|
||||||
// 上线
|
ScpMessageHandlerFactory.createHandler(payloadType);
|
||||||
LoginResponse loginResp = LoginResponse.fromBytes(byte);
|
// 处理荷载信息并返回
|
||||||
return loginResp;
|
return handler.deserializePayload(
|
||||||
case PayloadTypeConstant.heartbeat:
|
payloadType: payloadType,
|
||||||
// 心跳
|
messageType: messageType,
|
||||||
HeartbeatResponse heartbeatResponse =
|
byte: byte,
|
||||||
HeartbeatResponse.fromBytes(byte);
|
offset: offset,
|
||||||
return heartbeatResponse;
|
PayloadLength: PayloadLength,
|
||||||
case PayloadTypeConstant.echoTest:
|
spTotal: spTotal,
|
||||||
// 回声测试
|
spIndex: spIndex,
|
||||||
if (spTotal != null &&
|
messageId: messageId,
|
||||||
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;
|
|
||||||
}
|
|
||||||
} catch (e, stackTrace) {
|
} catch (e, stackTrace) {
|
||||||
// 打印异常信息
|
// 打印异常信息
|
||||||
_log(text: '❌反序列化udp数据时遇到错误----》$e');
|
_log(text: '❌反序列化udp数据时遇到错误----》$e');
|
||||||
@ -515,49 +316,4 @@ class ScpMessage {
|
|||||||
static void _log({required String text}) {
|
static void _log({required String text}) {
|
||||||
AppLog.log('=====${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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:star_lock/appRouters.dart';
|
import 'package:star_lock/appRouters.dart';
|
||||||
@ -28,4 +30,19 @@ class UdpBlePassThroughHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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}) {
|
||||||
|
final BleResp bleResp = BleResp();
|
||||||
|
bleResp.mergeFromBuffer(byte);
|
||||||
|
return bleResp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
||||||
@ -10,15 +13,11 @@ import '../../start_chart_manage.dart';
|
|||||||
class UdpEchoTestHandler extends ScpMessageBaseHandle
|
class UdpEchoTestHandler extends ScpMessageBaseHandle
|
||||||
implements ScpMessageHandler {
|
implements ScpMessageHandler {
|
||||||
@override
|
@override
|
||||||
void handleReq(ScpMessage scpMessage) {
|
void handleReq(ScpMessage scpMessage) {}
|
||||||
// TODO: 收到回声测试请求
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleResp(ScpMessage scpMessage) {
|
void handleResp(ScpMessage scpMessage) {
|
||||||
// TODO: 收到回声测试回复
|
|
||||||
final List<int> payload = scpMessage.Payload;
|
final List<int> payload = scpMessage.Payload;
|
||||||
|
|
||||||
if (payload is String) {
|
if (payload is String) {
|
||||||
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
|
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
|
||||||
} else {
|
} else {
|
||||||
@ -32,4 +31,34 @@ class UdpEchoTestHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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 (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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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';
|
import '../../start_chart_manage.dart';
|
||||||
|
|
||||||
class UdpGateWayResetHandler extends ScpMessageBaseHandle implements ScpMessageHandler {
|
class UdpGateWayResetHandler extends ScpMessageBaseHandle
|
||||||
|
implements ScpMessageHandler {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleReq(ScpMessage scpMessage) {
|
void handleReq(ScpMessage scpMessage) {
|
||||||
// TODO: 收到网关初始化请求
|
// TODO: 收到网关初始化请求
|
||||||
final GatewayResetResp gatewayResetResp = scpMessage.Payload;
|
final GatewayResetResp gatewayResetResp = scpMessage.Payload;
|
||||||
final status = gatewayResetResp.status;
|
final status = gatewayResetResp.status;
|
||||||
if (status != null && status == GatewayResetResp_StatusE.OK) {
|
if (status != null && status == GatewayResetResp_StatusE.OK) {}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -26,12 +27,33 @@ class UdpGateWayResetHandler extends ScpMessageBaseHandle implements ScpMessageH
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleInvalidReq(ScpMessage scpMessage) {
|
void handleInvalidReq(ScpMessage scpMessage) {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,14 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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_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/generic.pb.dart';
|
||||||
|
|
||||||
import '../../start_chart_manage.dart';
|
import '../../start_chart_manage.dart';
|
||||||
@ -29,4 +34,28 @@ class UdpGateWayTransferHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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 GatewayTransferReq gatewayTransferReq = GatewayTransferReq();
|
||||||
|
gatewayTransferReq.mergeFromBuffer(byte);
|
||||||
|
return gatewayTransferReq;
|
||||||
|
} else {
|
||||||
|
String payload = utf8.decode(byte);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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/constant/payload_type_constant.dart';
|
||||||
import 'package:star_lock/talk/startChart/entity/login_response.dart';
|
import 'package:star_lock/talk/startChart/entity/login_response.dart';
|
||||||
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
||||||
@ -35,4 +37,19 @@ class UdpGoOnlineHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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}) {
|
||||||
|
// 上线
|
||||||
|
LoginResponse loginResp = LoginResponse.fromBytes(byte);
|
||||||
|
return loginResp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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/constant/payload_type_constant.dart';
|
||||||
import 'package:star_lock/talk/startChart/entity/heartbeat_response.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/entity/login_response.dart';
|
||||||
@ -39,4 +41,11 @@ class UdpHeartBeatHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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}) {
|
||||||
|
// 心跳
|
||||||
|
HeartbeatResponse heartbeatResponse = HeartbeatResponse.fromBytes(byte);
|
||||||
|
return heartbeatResponse;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,10 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:star_lock/appRouters.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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) {
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,15 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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_reset.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/generic.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';
|
import '../../start_chart_manage.dart';
|
||||||
|
|
||||||
@ -22,12 +27,12 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleResp(ScpMessage scpMessage) {
|
void handleResp(ScpMessage scpMessage) {
|
||||||
// 收到同意接听回复
|
// 收到同意接听回复
|
||||||
final GenericResp genericResp = scpMessage.Payload;
|
final GenericResp genericResp = scpMessage.Payload;
|
||||||
if (checkGenericRespSuccess(genericResp)) {
|
if (checkGenericRespSuccess(genericResp)) {
|
||||||
// 延迟2秒后启动监听
|
// 延迟2秒后启动监听
|
||||||
Future.delayed(Duration(seconds: 4), () {
|
Future.delayed(Duration(seconds: 5), () {
|
||||||
// 启动通话保持定时器
|
// 启动通话保持定时器
|
||||||
_handleStartTalkPing();
|
_handleStartTalkPing();
|
||||||
// 启动发送预期数据请求
|
// 启动发送预期数据请求
|
||||||
@ -49,6 +54,30 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
|||||||
@override
|
@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 TalkAcceptReq talkAccept = TalkAcceptReq();
|
||||||
|
talkAccept.mergeFromBuffer(byte);
|
||||||
|
return talkAccept;
|
||||||
|
} else {
|
||||||
|
String payload = utf8.decode(byte);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 启动通话保持
|
// 启动通话保持
|
||||||
void _handleStartTalkPing() {
|
void _handleStartTalkPing() {
|
||||||
// 启动通话保持
|
// 启动通话保持
|
||||||
@ -85,4 +114,6 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
|||||||
// 启动发送预期数据定时器
|
// 启动发送预期数据定时器
|
||||||
startChartManage.startTalkExpectTimer();
|
startChartManage.startTalkExpectTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
|
import 'dart:convert';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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) {}
|
void _handleVideoImage(TalkData talkData) {}
|
||||||
|
|
||||||
/// 处理g711音频数据
|
/// 处理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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
|
import 'dart:convert';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
|
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
|
||||||
@ -42,4 +44,28 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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 TalkExpect talkExpect = TalkExpect();
|
||||||
|
talkExpect.mergeFromBuffer(byte);
|
||||||
|
return talkExpect;
|
||||||
|
} else {
|
||||||
|
String payload = utf8.decode(byte);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,15 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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_reset.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/generic.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';
|
import '../../start_chart_manage.dart';
|
||||||
|
|
||||||
@ -39,12 +44,32 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleInvalidReq(ScpMessage scpMessage) {
|
void handleInvalidReq(ScpMessage scpMessage) {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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/generic.pb.dart';
|
||||||
|
import 'package:star_lock/talk/startChart/proto/talk_ping.pb.dart';
|
||||||
|
|
||||||
class UdpTalkPingHandler extends ScpMessageBaseHandle
|
class UdpTalkPingHandler extends ScpMessageBaseHandle
|
||||||
implements ScpMessageHandler {
|
implements ScpMessageHandler {
|
||||||
@ -26,4 +31,28 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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 TalkPing talkPing = TalkPing();
|
||||||
|
talkPing.mergeFromBuffer(byte);
|
||||||
|
return talkPing;
|
||||||
|
} else {
|
||||||
|
String payload = utf8.decode(byte);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,15 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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_reset.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/generic.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';
|
import '../../start_chart_manage.dart';
|
||||||
|
|
||||||
@ -27,4 +32,28 @@ class UdpTalkPushHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
@override
|
@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 TalkPush talkPush = TalkPush();
|
||||||
|
talkPush.mergeFromBuffer(byte);
|
||||||
|
return talkPush;
|
||||||
|
} else {
|
||||||
|
String payload = utf8.decode(byte);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,17 +1,20 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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_reset.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/generic.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';
|
import '../../start_chart_manage.dart';
|
||||||
|
|
||||||
class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
|
class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
|
||||||
implements ScpMessageHandler {
|
implements ScpMessageHandler {
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleReq(ScpMessage scpMessage) {
|
void handleReq(ScpMessage scpMessage) {
|
||||||
// TODO: 对讲接听者转移请求
|
// TODO: 对讲接听者转移请求
|
||||||
@ -23,12 +26,32 @@ class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleInvalidReq(ScpMessage scpMessage) {
|
void handleInvalidReq(ScpMessage scpMessage) {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,15 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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/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_base_handle.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/scp_message_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_reset.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/generic.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';
|
import '../../start_chart_manage.dart';
|
||||||
|
|
||||||
@ -36,12 +41,32 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void handleInvalidReq(ScpMessage scpMessage) {
|
void handleInvalidReq(ScpMessage scpMessage) {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
import 'package:get/get.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/gateway_reset.pb.dart';
|
||||||
import 'package:star_lock/talk/startChart/proto/generic.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/proto/talk_request.pb.dart';
|
||||||
|
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
|
||||||
import 'package:star_lock/tools/storage.dart';
|
import 'package:star_lock/tools/storage.dart';
|
||||||
|
|
||||||
import '../../start_chart_manage.dart';
|
import '../../start_chart_manage.dart';
|
||||||
@ -17,6 +21,10 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
|||||||
implements ScpMessageHandler {
|
implements ScpMessageHandler {
|
||||||
@override
|
@override
|
||||||
void handleReq(ScpMessage scpMessage) {
|
void handleReq(ScpMessage scpMessage) {
|
||||||
|
if (talkStatus == TalkStatus.waitingAnswer) {
|
||||||
|
// 如果已经是等待接听了,就不在处理剩下的请求
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 收到对讲请求
|
// 收到对讲请求
|
||||||
final TalkReq talkReq = scpMessage.Payload;
|
final TalkReq talkReq = scpMessage.Payload;
|
||||||
// 回复收到对讲成功的消息
|
// 回复收到对讲成功的消息
|
||||||
@ -29,6 +37,8 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
|||||||
startChartManage.ToPeerId = scpMessage.FromPeerId!;
|
startChartManage.ToPeerId = scpMessage.FromPeerId!;
|
||||||
// 处理收到接听请求后的事件
|
// 处理收到接听请求后的事件
|
||||||
_talkRequestEvent(talkObjectName: talkReq.callerName);
|
_talkRequestEvent(talkObjectName: talkReq.callerName);
|
||||||
|
// 设置为等待接听状态
|
||||||
|
talkStatus.setWaitingAnswer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -77,4 +87,28 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
|||||||
'${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}。', platformChannelSpecifics,
|
'${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}。', platformChannelSpecifics,
|
||||||
payload: 'item x');
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:star_lock/app_settings/app_settings.dart';
|
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/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_base_handle.dart';
|
||||||
@ -27,4 +29,17 @@ class UnKnowPayloadTypeHandler extends ScpMessageBaseHandle
|
|||||||
void handleRealTimeData(ScpMessage scpMessage) {
|
void handleRealTimeData(ScpMessage scpMessage) {
|
||||||
AppLog.log('❌未知的payloadType类型---》${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类型---》');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,20 +1,28 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:audioplayers/audioplayers.dart';
|
import 'package:audioplayers/audioplayers.dart';
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
|
|
||||||
import 'package:star_lock/app_settings/app_settings.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/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/constant/udp_constant.dart';
|
||||||
import 'package:star_lock/talk/startChart/entity/scp_message.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/overtime_timer_manger.dart';
|
||||||
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.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/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_manage.dart';
|
||||||
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
|
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
|
||||||
|
|
||||||
class ScpMessageBaseHandle {
|
class ScpMessageBaseHandle {
|
||||||
final startChartManage = StartChartManage();
|
final startChartManage = StartChartManage();
|
||||||
|
|
||||||
|
/// 分包缓冲区
|
||||||
|
// 存储每个 messageId 对应的分包数据
|
||||||
|
static Map<int, List<List<int>>> _packetBuffer = {};
|
||||||
|
|
||||||
// 通话数据流的单例流数据处理类
|
// 通话数据流的单例流数据处理类
|
||||||
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
|
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
|
||||||
|
|
||||||
@ -31,7 +39,7 @@ class ScpMessageBaseHandle {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// 回复成功消息
|
// 回复成功消息
|
||||||
void replySuccessMessage(ScpMessage scpMessage){
|
void replySuccessMessage(ScpMessage scpMessage) {
|
||||||
startChartManage.sendGenericRespSuccessMessage(
|
startChartManage.sendGenericRespSuccessMessage(
|
||||||
ToPeerId: scpMessage.FromPeerId!,
|
ToPeerId: scpMessage.FromPeerId!,
|
||||||
FromPeerId: scpMessage.ToPeerId!,
|
FromPeerId: scpMessage.ToPeerId!,
|
||||||
@ -63,4 +71,53 @@ class ScpMessageBaseHandle {
|
|||||||
void stopRingtone() async {
|
void stopRingtone() async {
|
||||||
await audioManager.stopRingtone();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
||||||
|
|
||||||
abstract class ScpMessageHandler {
|
abstract class ScpMessageHandler {
|
||||||
@ -12,4 +14,16 @@ abstract class ScpMessageHandler {
|
|||||||
|
|
||||||
// 无效请求
|
// 无效请求
|
||||||
void handleInvalidReq(ScpMessage scpMessage);
|
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,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -285,8 +285,7 @@ class StartChartManage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 发送回声测试消息
|
// 发送回声测试消息
|
||||||
void sendEchoMessage({required List<int> payload}) async {
|
void sendEchoMessage({required List<int> payload,required String toPeerId}) async {
|
||||||
String toPeerId = '7SDLN3XMNAQvVAJ2yrbLFfJkKQdgfBrpa8wV7s7TXYcu';
|
|
||||||
|
|
||||||
// 计算需要分多少个包发送
|
// 计算需要分多少个包发送
|
||||||
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
|
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
|
||||||
@ -764,7 +763,7 @@ class StartChartManage {
|
|||||||
_handleUdpResultData(deserialize);
|
_handleUdpResultData(deserialize);
|
||||||
}
|
}
|
||||||
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
|
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
|
||||||
_log(text: 'Udp收到结构体数据---》$deserialize');
|
// _log(text: 'Udp收到结构体数据---》$deserialize');
|
||||||
// _log(text: 'text---》${utf8.decode(deserialize.Payload)}');
|
// _log(text: 'text---》${utf8.decode(deserialize.Payload)}');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user