fix:同步调试echo分包逻辑代码、增加同一个会话时保持messageId进行递增

This commit is contained in:
liyi 2024-12-19 14:48:19 +08:00
parent 094e4c1662
commit f2ea43e4ab
9 changed files with 263 additions and 88 deletions

BIN
assets/test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

View File

@ -54,7 +54,7 @@ class _StarChartPageState extends State<StarChartPage> {
width: 1.sw, width: 1.sw,
height: 1.sh, height: 1.sh,
color: Colors.transparent, color: Colors.transparent,
child: _buildTalkView(isMpeg4: false), child: _buildTalkView(isMpeg4: true),
), ),
), ),
); );

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/app_settings/app_colors.dart';
@ -219,6 +220,14 @@ class _StarLockMainPageState extends State<StarLockMainPage>
SizedBox( SizedBox(
height: 160.h, height: 160.h,
), ),
SubmitBtn(
btnName: '发送回声测试'.tr,
onClick: () async {
String assetPath = 'assets/test.jpg'; //
List<int> imageBytes = await loadAssetImageAsBytes(assetPath);
StartChartManage().sendEchoMessage(payload: imageBytes);
},
),
if (F.isLite) if (F.isLite)
Container() Container()
else else
@ -247,6 +256,22 @@ class _StarLockMainPageState extends State<StarLockMainPage>
}); });
} }
Future<List<int>> loadAssetImageAsBytes(String assetPath) async {
try {
//
ByteData byteData = await rootBundle.load(assetPath);
// ByteData Uint8List
Uint8List uint8List = byteData.buffer.asUint8List();
//
return uint8List.toList();
} catch (e) {
print('从资产加载图片时发生错误: $e');
rethrow;
}
}
@override @override
void didChangeAppLifecycleState(AppLifecycleState state) { void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state); super.didChangeAppLifecycleState(state);

View File

@ -16,17 +16,39 @@ 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/proto/talk_request.pb.dart';
class MessageCommand { class MessageCommand {
// ToPeerId messageId
static Map<String, int> _messageIdMap = {};
static int _maxIntValue = 9223372036854775807; // Dart int
// ID
static int getNextMessageId(String toPeerId, {bool increment = true}) {
if (_messageIdMap.containsKey(toPeerId)) {
if (increment) {
_messageIdMap[toPeerId] = _messageIdMap[toPeerId]! + 1;
// messageId int 1
if (_messageIdMap[toPeerId]! > _maxIntValue) {
_messageIdMap[toPeerId] = 1;
}
}
} else {
_messageIdMap[toPeerId] = 1;
}
return _messageIdMap[toPeerId]!;
}
/// 线 /// 线
static List<int> goOnlineRelay({ static List<int> goOnlineRelay({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
String serializedBytesString = ScpMessage( String serializedBytesString = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: 'hello', Payload: 'hello',
@ -41,19 +63,22 @@ class MessageCommand {
static List<int> echoMessage({ static List<int> echoMessage({
required String ToPeerId, required String ToPeerId,
required String FromPeerId, required String FromPeerId,
List<int>? payload,
int? SpTotal,
int? SpIndex,
int? MessageId,
}) { }) {
String payload = 'hello';
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: SpTotal,
SpIndex: 0, SpIndex: SpIndex,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
PayloadCRC: calculationCrc(_stringToUint8List(payload)), PayloadCRC: calculationCrcFromIntList(payload ?? []),
PayloadLength: payload.length, PayloadLength: payload?.length ?? 0,
PayloadType: PayloadTypeConstant.echoTest, PayloadType: PayloadTypeConstant.echoTest,
); );
String serializedBytesString = message.serialize(); String serializedBytesString = message.serialize();
@ -64,14 +89,15 @@ class MessageCommand {
static List<int> heartbeatMessage({ static List<int> heartbeatMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
String payload = 'hello'; String payload = 'hello';
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -89,6 +115,7 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required int time, required int time,
int? MessageId,
}) { }) {
// //
final gatewayResetReq = GatewayResetReq( final gatewayResetReq = GatewayResetReq(
@ -100,9 +127,9 @@ class MessageCommand {
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -118,15 +145,16 @@ class MessageCommand {
static List<int> talkAcceptMessage({ static List<int> talkAcceptMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkAcceptReq = TalkAcceptReq(); final talkAcceptReq = TalkAcceptReq();
final payload = talkAcceptReq.writeToBuffer(); final payload = talkAcceptReq.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -142,15 +170,16 @@ class MessageCommand {
static List<int> talkRequestMessage({ static List<int> talkRequestMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkReq = TalkReq(); final talkReq = TalkReq();
final payload = talkReq.writeToBuffer(); final payload = talkReq.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -166,15 +195,16 @@ class MessageCommand {
static List<int> talkRejectMessage({ static List<int> talkRejectMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkReject = TalkReject(); final talkReject = TalkReject();
final payload = talkReject.writeToBuffer(); final payload = talkReject.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -190,15 +220,16 @@ class MessageCommand {
static List<int> talkPingMessage({ static List<int> talkPingMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkPing = TalkPing(); final talkPing = TalkPing();
final payload = talkPing.writeToBuffer(); final payload = talkPing.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -214,15 +245,16 @@ class MessageCommand {
static List<int> talkHangupMessage({ static List<int> talkHangupMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkHangup = TalkHangup(); final talkHangup = TalkHangup();
final payload = talkHangup.writeToBuffer(); final payload = talkHangup.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -239,14 +271,15 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required TalkData talkData, required TalkData talkData,
int? MessageId,
}) { }) {
final payload = talkData.writeToBuffer(); final payload = talkData.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.RealTimeData, MessageType: MessageTypeConstant.RealTimeData,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -263,14 +296,15 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required TalkExpect talkExpect, required TalkExpect talkExpect,
int? MessageId,
}) { }) {
final payload = talkExpect.writeToBuffer(); final payload = talkExpect.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -287,6 +321,7 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required int PayloadType, required int PayloadType,
int? MessageId,
}) { }) {
final genericResp = GenericResp(); final genericResp = GenericResp();
genericResp.message = 'ok'; genericResp.message = 'ok';
@ -295,9 +330,9 @@ class MessageCommand {
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Resp, MessageType: MessageTypeConstant.Resp,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -314,6 +349,7 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required int PayloadType, required int PayloadType,
int? MessageId,
}) { }) {
final genericResp = GenericResp(); final genericResp = GenericResp();
genericResp.message = 'error'; genericResp.message = 'error';
@ -322,9 +358,9 @@ class MessageCommand {
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Resp, MessageType: MessageTypeConstant.Resp,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -351,6 +387,15 @@ class MessageCommand {
return crc32Value; return crc32Value;
} }
// List<int>
static int calculationCrcFromIntList(List<int> intList) {
// List<int> Uint8List
final Uint8List uint8Payload = Uint8List.fromList(intList);
// calculationCrc
return calculationCrc(uint8Payload);
}
// Uint8List // Uint8List
static Uint8List _stringToUint8List(String input) { static Uint8List _stringToUint8List(String input) {
return Uint8List.fromList(utf8.encode(input)); return Uint8List.fromList(utf8.encode(input));

View File

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
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/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
@ -20,6 +21,10 @@ 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/proto/talk_request.pb.dart';
class ScpMessage { class ScpMessage {
///
/// keyMessageId
static Map<int, List<int>> _buffer = {};
ScpMessage({ ScpMessage({
this.ProtocolFlag, this.ProtocolFlag,
this.MessageType, this.MessageType,
@ -163,7 +168,9 @@ class ScpMessage {
static ScpMessage deserialize(List<int> bytes) { static ScpMessage deserialize(List<int> bytes) {
final message = ScpMessage(); final message = ScpMessage();
int offset = 0; int offset = 0;
_log(
text:
'原始字节数组: ${bytes.sublist(0, 20).map((b) => b.toRadixString(16)).join(" ")}');
// 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));
@ -253,7 +260,6 @@ class ScpMessage {
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 sublist = bytes.sublist(offset, offset + message.PayloadLength!);
// print('sublist:$sublist');
offset += message.PayloadLength!; offset += message.PayloadLength!;
message.Payload = _handlePayLoad( message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0, payloadType: message.PayloadType ?? 0,
@ -261,6 +267,9 @@ class ScpMessage {
byte: sublist, byte: sublist,
offset: offset, offset: offset,
PayloadLength: message.PayloadLength, PayloadLength: message.PayloadLength,
spIndex: message.SpIndex,
spTotal: message.SpTotal,
messageId: message.MessageId,
); );
} else { } else {
throw FormatException("Invalid Payload or PayloadLength"); throw FormatException("Invalid Payload or PayloadLength");
@ -269,20 +278,6 @@ class ScpMessage {
return message; return message;
} }
static String bytesToHex(List<int> bytes) {
return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
}
// 16
static List<int> hexToBytes(String hexString) {
final bytes = <int>[];
for (int i = 0; i < hexString.length; i += 2) {
final hexByte = hexString.substring(i, i + 2);
bytes.add(int.parse(hexByte, radix: 16));
}
return bytes;
}
// payloadType序列化对应的payload结构体 // payloadType序列化对应的payload结构体
static dynamic _handlePayLoad({ static dynamic _handlePayLoad({
required int payloadType, required int payloadType,
@ -290,6 +285,9 @@ class ScpMessage {
required List<int> byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId,
}) { }) {
try { try {
switch (payloadType) { switch (payloadType) {
@ -430,8 +428,22 @@ class ScpMessage {
final GenericResp genericResp = GenericResp.fromBuffer(byte); final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp; return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) { } else if (messageType == MessageTypeConstant.RealTimeData) {
final TalkData talkData = TalkData.fromBuffer(byte); if (spTotal != null && spTotal > 1) {
return talkData; //
final List<int> subPackageBytes = _subPackage(
spTotal: spTotal!,
spIndex: spIndex!,
bytes: byte,
messageId: messageId!,
);
//
final TalkData talkData = TalkData.fromBuffer(subPackageBytes);
return talkData;
} else {
//
final TalkData talkData = TalkData.fromBuffer(byte);
return talkData;
}
} else { } else {
String payload = utf8.decode(byte); String payload = utf8.decode(byte);
return payload; return payload;
@ -453,13 +465,57 @@ class ScpMessage {
return payload; return payload;
} }
} catch (e) { } catch (e) {
_log(text: '❌反序列化udp数据时遇到错误----》$e'); // _log(text: '❌反序列化udp数据时遇到错误----》$e');
String payload = utf8.decode(byte);
return payload; // //
_log(
text:
'原始字节数组: ${byte.sublist(0, 20).map((b) => b.toRadixString(16)).join(" ")}');
//
// // Protobuf相关的异常
// if (e is InvalidProtocolBufferException || e is FormatException) {
// _log(
// text:
// '反序列化失败的payloadType: $payloadType, messageType: $messageType');
// }
return '';
} }
} }
static String bytesToHex(List<int> bytes) {
return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
}
// 16
static List<int> hexToBytes(String hexString) {
final bytes = <int>[];
for (int i = 0; i < hexString.length; i += 2) {
final hexByte = hexString.substring(i, i + 2);
bytes.add(int.parse(hexByte, radix: 16));
}
return bytes;
}
static void _log({required String text}) { static void _log({required String text}) {
AppLog.log('=====${text}'); AppLog.log('=====${text}');
} }
///
static List<int> _subPackage({
required int messageId,
required int spTotal,
required int spIndex,
required List<int> bytes,
}) {
if (_buffer.containsKey(messageId)) {
// key就追加
final List<int> bytesList = _buffer[messageId]!;
bytesList.addAll(bytes);
_buffer[messageId] = bytesList;
} else {
// key
_buffer.putIfAbsent(messageId, () => bytes);
}
return [];
}
} }

View File

@ -26,10 +26,11 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
// //
final GenericResp genericResp = scpMessage.Payload; final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) { if (checkGenericRespSuccess(genericResp)) {
//
_handleStartTalkPing();
// 2 // 2
Future.delayed(Duration(seconds: 2), () { Future.delayed(Duration(seconds: 4), () {
//
_handleStartTalkPing();
// //
_handleStartSendTalkExpectDataRequest(); _handleStartSendTalkExpectDataRequest();
// //

View File

@ -53,7 +53,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
/// h264协议的数据 /// h264协议的数据
void _handleVideoH264(TalkData talkData) { void _handleVideoH264(TalkData talkData) {
talkDataRepository.addTalkData(talkData); // talkDataRepository.addTalkData(talkData);
} }
/// ///

View File

@ -31,7 +31,6 @@ class OverTimeTimerManager {
// //
void receiveMessage() { void receiveMessage() {
print("Received a message, resetting the timer.");
startTimer(); startTimer();
} }

View File

@ -75,10 +75,12 @@ class StartChartManage {
int talkDataIntervalTime = 10; // (ms) int talkDataIntervalTime = 10; // (ms)
Timer? talkDataTimer; // Timer? talkDataTimer; //
final int _maxPayloadSize = 50 * 1024; //
// //
TalkExpect defaultTalkExpect = TalkExpect( TalkExpect defaultTalkExpect = TalkExpect(
videoType: [TalkExpect_VideoTypeE.H264], videoType: [TalkExpect_VideoTypeE.IMAGE],
audioType: [TalkExpect_AudioTypeE.G711], audioType: [],
); );
// //
@ -153,14 +155,19 @@ class StartChartManage {
} }
if (relayInfoEntity.relay_list != null && if (relayInfoEntity.relay_list != null &&
relayInfoEntity.relay_list!.length != 0) { relayInfoEntity.relay_list!.length > 0) {
final data = relayInfoEntity.relay_list?[0]; for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? ''); final data = relayInfoEntity.relay_list?[i];
remoteHost = parseUdpUrl['host'] ?? ''; if (data?.peerID != FromPeerId) {
remotePort = parseUdpUrl['port'] ?? ''; final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
relayPeerId = data?.peerID ?? ''; remoteHost = parseUdpUrl['host'] ?? '';
ToPeerId = relayPeerId; remotePort = parseUdpUrl['port'] ?? '';
_log(text: '中继信息----》${relayInfoEntity}'); relayPeerId = data?.peerID ?? '';
ToPeerId = relayPeerId;
_log(text: '中继信息----》${relayInfoEntity}');
break;
}
}
} else { } else {
_log(text: '未查询到中继信息----》'); _log(text: '未查询到中继信息----》');
} }
@ -217,6 +224,7 @@ class StartChartManage {
final message = MessageCommand.goOnlineRelay( final message = MessageCommand.goOnlineRelay(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -231,6 +239,7 @@ class StartChartManage {
final message = MessageCommand.talkRequestMessage( final message = MessageCommand.talkRequestMessage(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -242,6 +251,7 @@ class StartChartManage {
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
talkData: talkData, talkData: talkData,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -260,6 +270,8 @@ class StartChartManage {
final List<int> message = MessageCommand.heartbeatMessage( final List<int> message = MessageCommand.heartbeatMessage(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: relayPeerId, ToPeerId: relayPeerId,
MessageId:
MessageCommand.getNextMessageId(relayPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
}, },
@ -268,13 +280,42 @@ class StartChartManage {
} }
// //
void sendEchoMessage() async { void sendEchoMessage({required List<int> payload}) async {
final message = MessageCommand.echoMessage( String toPeerId = '2vzXdjdzipJBpWpJxhiRzCFXrDKk54t3YJ7EjYPSRuij';
ToPeerId: echoPeerId,
FromPeerId: FromPeerId, final int totalPackets = (payload.length / _maxPayloadSize).ceil();
); for (int i = 0; i < totalPackets; i++) {
await _sendMessage(message: message); int start = i * _maxPayloadSize;
_log(text: '发送回声测试消息'); int end = (i + 1) * _maxPayloadSize;
if (end > payload.length) {
end = payload.length;
}
List<int> packet = payload.sublist(start, end);
final message = MessageCommand.echoMessage(
ToPeerId: toPeerId,
FromPeerId: FromPeerId,
payload: packet,
SpTotal: totalPackets,
SpIndex: i + 1,
MessageId: MessageCommand.getNextMessageId(toPeerId, increment: false),
);
await _sendMessage(message: message);
_log(
text:
'发送回声测试消息=====SpTotal:$totalPackets,SpIndex:${i + 1},packet:${packet.length}');
}
// id
MessageCommand.getNextMessageId(toPeerId);
// final message = MessageCommand.echoMessage(
// ToPeerId: echoPeerId,
// FromPeerId: FromPeerId,
// payload: [],
// SpIndex: 0,
// SpTotal: 0,
// );
// await _sendMessage(message: message);
// _log(text: '发送回声测试消息');
} }
// //
@ -285,6 +326,7 @@ class StartChartManage {
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
gatewayId: gatewayId, gatewayId: gatewayId,
time: DateTime.now().millisecondsSinceEpoch ~/ 1000, time: DateTime.now().millisecondsSinceEpoch ~/ 1000,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -294,6 +336,7 @@ class StartChartManage {
final message = MessageCommand.talkAcceptMessage( final message = MessageCommand.talkAcceptMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
talkStatus.setWaitingAnswer(); talkStatus.setWaitingAnswer();
@ -304,6 +347,7 @@ class StartChartManage {
final message = MessageCommand.talkRejectMessage( final message = MessageCommand.talkRejectMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -314,6 +358,7 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
talkExpect: talkExpect, talkExpect: talkExpect,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -327,6 +372,7 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
PayloadType: PayloadType, PayloadType: PayloadType,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -340,6 +386,7 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
PayloadType: PayloadType, PayloadType: PayloadType,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -350,6 +397,7 @@ class StartChartManage {
final message = MessageCommand.talkPingMessage( final message = MessageCommand.talkPingMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -359,6 +407,7 @@ class StartChartManage {
final message = MessageCommand.talkHangupMessage( final message = MessageCommand.talkHangupMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -405,7 +454,7 @@ class StartChartManage {
message, InternetAddress(remoteHost), remotePort); message, InternetAddress(remoteHost), remotePort);
if (result != message.length) { if (result != message.length) {
AppLog.log('❌Udp send data error----> $result ${message.length}'); AppLog.log('❌Udp send data error----> $result ${message.length}');
_udpSocket = null; // _udpSocket = null;
} }
} }
@ -742,7 +791,7 @@ class StartChartManage {
handler.handleInvalidReq(scpMessage); handler.handleInvalidReq(scpMessage);
} }
} catch (e) { } catch (e) {
_log(text: '❌ 处理udp返回数据时遇到错误---> $e'); // _log(text: '❌ 处理udp返回数据时遇到错误---> $e');
} }
} }