fix:同步调试echo分包逻辑代码、增加同一个会话时保持messageId进行递增
This commit is contained in:
parent
094e4c1662
commit
f2ea43e4ab
BIN
assets/test.jpg
Normal file
BIN
assets/test.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 214 KiB |
@ -54,7 +54,7 @@ class _StarChartPageState extends State<StarChartPage> {
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
color: Colors.transparent,
|
||||
child: _buildTalkView(isMpeg4: false),
|
||||
child: _buildTalkView(isMpeg4: true),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
@ -219,6 +220,14 @@ class _StarLockMainPageState extends State<StarLockMainPage>
|
||||
SizedBox(
|
||||
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)
|
||||
Container()
|
||||
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
|
||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||
super.didChangeAppLifecycleState(state);
|
||||
|
||||
@ -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';
|
||||
|
||||
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({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
String serializedBytesString = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: 'hello',
|
||||
@ -41,19 +63,22 @@ class MessageCommand {
|
||||
static List<int> echoMessage({
|
||||
required String ToPeerId,
|
||||
required String FromPeerId,
|
||||
List<int>? payload,
|
||||
int? SpTotal,
|
||||
int? SpIndex,
|
||||
int? MessageId,
|
||||
}) {
|
||||
String payload = 'hello';
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: SpTotal,
|
||||
SpIndex: SpIndex,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
PayloadCRC: calculationCrc(_stringToUint8List(payload)),
|
||||
PayloadLength: payload.length,
|
||||
PayloadCRC: calculationCrcFromIntList(payload ?? []),
|
||||
PayloadLength: payload?.length ?? 0,
|
||||
PayloadType: PayloadTypeConstant.echoTest,
|
||||
);
|
||||
String serializedBytesString = message.serialize();
|
||||
@ -64,14 +89,15 @@ class MessageCommand {
|
||||
static List<int> heartbeatMessage({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
String payload = 'hello';
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -89,6 +115,7 @@ class MessageCommand {
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
required int time,
|
||||
int? MessageId,
|
||||
}) {
|
||||
// 构建荷载
|
||||
final gatewayResetReq = GatewayResetReq(
|
||||
@ -100,9 +127,9 @@ class MessageCommand {
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -118,15 +145,16 @@ class MessageCommand {
|
||||
static List<int> talkAcceptMessage({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final talkAcceptReq = TalkAcceptReq();
|
||||
final payload = talkAcceptReq.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -142,15 +170,16 @@ class MessageCommand {
|
||||
static List<int> talkRequestMessage({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final talkReq = TalkReq();
|
||||
final payload = talkReq.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -166,15 +195,16 @@ class MessageCommand {
|
||||
static List<int> talkRejectMessage({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final talkReject = TalkReject();
|
||||
final payload = talkReject.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -190,15 +220,16 @@ class MessageCommand {
|
||||
static List<int> talkPingMessage({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final talkPing = TalkPing();
|
||||
final payload = talkPing.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -214,15 +245,16 @@ class MessageCommand {
|
||||
static List<int> talkHangupMessage({
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final talkHangup = TalkHangup();
|
||||
final payload = talkHangup.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -239,14 +271,15 @@ class MessageCommand {
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
required TalkData talkData,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final payload = talkData.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.RealTimeData,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -263,14 +296,15 @@ class MessageCommand {
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
required TalkExpect talkExpect,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final payload = talkExpect.writeToBuffer();
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Req,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -287,6 +321,7 @@ class MessageCommand {
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
required int PayloadType,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final genericResp = GenericResp();
|
||||
genericResp.message = 'ok';
|
||||
@ -295,9 +330,9 @@ class MessageCommand {
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Resp,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -314,6 +349,7 @@ class MessageCommand {
|
||||
required String FromPeerId,
|
||||
required String ToPeerId,
|
||||
required int PayloadType,
|
||||
int? MessageId,
|
||||
}) {
|
||||
final genericResp = GenericResp();
|
||||
genericResp.message = 'error';
|
||||
@ -322,9 +358,9 @@ class MessageCommand {
|
||||
ScpMessage message = ScpMessage(
|
||||
ProtocolFlag: ProtocolFlagConstant.scp01,
|
||||
MessageType: MessageTypeConstant.Resp,
|
||||
MessageId: 1,
|
||||
SpTotal: 0,
|
||||
SpIndex: 0,
|
||||
MessageId: MessageId,
|
||||
SpTotal: 1,
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: payload,
|
||||
@ -351,6 +387,15 @@ class MessageCommand {
|
||||
return crc32Value;
|
||||
}
|
||||
|
||||
// 重载的方法,接受 List<int>
|
||||
static int calculationCrcFromIntList(List<int> intList) {
|
||||
// 将 List<int> 转换为 Uint8List
|
||||
final Uint8List uint8Payload = Uint8List.fromList(intList);
|
||||
|
||||
// 调用现有的 calculationCrc 方法
|
||||
return calculationCrc(uint8Payload);
|
||||
}
|
||||
|
||||
// 将字符串转换为 Uint8List
|
||||
static Uint8List _stringToUint8List(String input) {
|
||||
return Uint8List.fromList(utf8.encode(input));
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import 'dart:convert';
|
||||
import 'package:protobuf/protobuf.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/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';
|
||||
|
||||
class ScpMessage {
|
||||
/// 分包缓冲区
|
||||
/// key:MessageId
|
||||
static Map<int, List<int>> _buffer = {};
|
||||
|
||||
ScpMessage({
|
||||
this.ProtocolFlag,
|
||||
this.MessageType,
|
||||
@ -163,7 +168,9 @@ class ScpMessage {
|
||||
static ScpMessage deserialize(List<int> bytes) {
|
||||
final message = ScpMessage();
|
||||
int offset = 0;
|
||||
|
||||
_log(
|
||||
text:
|
||||
'原始字节数组: ${bytes.sublist(0, 20).map((b) => b.toRadixString(16)).join(" ")}');
|
||||
// ProtocolFlag (4 bytes)
|
||||
if (bytes.length - offset >= 4) {
|
||||
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
|
||||
@ -253,7 +260,6 @@ class ScpMessage {
|
||||
if (message.PayloadLength != null &&
|
||||
bytes.length - offset >= message.PayloadLength!) {
|
||||
final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
|
||||
// print('sublist:$sublist');
|
||||
offset += message.PayloadLength!;
|
||||
message.Payload = _handlePayLoad(
|
||||
payloadType: message.PayloadType ?? 0,
|
||||
@ -261,6 +267,9 @@ class ScpMessage {
|
||||
byte: sublist,
|
||||
offset: offset,
|
||||
PayloadLength: message.PayloadLength,
|
||||
spIndex: message.SpIndex,
|
||||
spTotal: message.SpTotal,
|
||||
messageId: message.MessageId,
|
||||
);
|
||||
} else {
|
||||
throw FormatException("Invalid Payload or PayloadLength");
|
||||
@ -269,20 +278,6 @@ class ScpMessage {
|
||||
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结构体
|
||||
static dynamic _handlePayLoad({
|
||||
required int payloadType,
|
||||
@ -290,6 +285,9 @@ class ScpMessage {
|
||||
required List<int> byte,
|
||||
int? offset,
|
||||
int? PayloadLength,
|
||||
int? spTotal,
|
||||
int? spIndex,
|
||||
int? messageId,
|
||||
}) {
|
||||
try {
|
||||
switch (payloadType) {
|
||||
@ -430,8 +428,22 @@ class ScpMessage {
|
||||
final GenericResp genericResp = GenericResp.fromBuffer(byte);
|
||||
return genericResp;
|
||||
} else if (messageType == MessageTypeConstant.RealTimeData) {
|
||||
final TalkData talkData = TalkData.fromBuffer(byte);
|
||||
return talkData;
|
||||
if (spTotal != null && spTotal > 1) {
|
||||
// 处理分包
|
||||
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 {
|
||||
String payload = utf8.decode(byte);
|
||||
return payload;
|
||||
@ -453,13 +465,57 @@ class ScpMessage {
|
||||
return payload;
|
||||
}
|
||||
} catch (e) {
|
||||
_log(text: '❌反序列化udp数据时遇到错误----》$e');
|
||||
String payload = utf8.decode(byte);
|
||||
return payload;
|
||||
// _log(text: '❌反序列化udp数据时遇到错误----》$e');
|
||||
|
||||
// // 尝试打印原始字节数组以供调试
|
||||
_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}) {
|
||||
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 [];
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,10 +26,11 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
||||
// 收到同意接听回复
|
||||
final GenericResp genericResp = scpMessage.Payload;
|
||||
if (checkGenericRespSuccess(genericResp)) {
|
||||
// 启动通话保持定时器
|
||||
_handleStartTalkPing();
|
||||
|
||||
// 延迟2秒后启动监听
|
||||
Future.delayed(Duration(seconds: 2), () {
|
||||
Future.delayed(Duration(seconds: 4), () {
|
||||
// 启动通话保持定时器
|
||||
_handleStartTalkPing();
|
||||
// 启动发送预期数据请求
|
||||
_handleStartSendTalkExpectDataRequest();
|
||||
// 启动通话数据检查的定时器
|
||||
|
||||
@ -53,7 +53,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
||||
|
||||
/// 处理h264协议的数据
|
||||
void _handleVideoH264(TalkData talkData) {
|
||||
talkDataRepository.addTalkData(talkData);
|
||||
// talkDataRepository.addTalkData(talkData);
|
||||
}
|
||||
|
||||
/// 处理图片数据
|
||||
|
||||
@ -31,7 +31,6 @@ class OverTimeTimerManager {
|
||||
|
||||
// 接收到消息时调用此方法
|
||||
void receiveMessage() {
|
||||
print("Received a message, resetting the timer.");
|
||||
startTimer();
|
||||
}
|
||||
|
||||
|
||||
@ -75,10 +75,12 @@ class StartChartManage {
|
||||
int talkDataIntervalTime = 10; // 通话数据的消息间隔(ms)
|
||||
Timer? talkDataTimer; // 发送通话数据消息定时器
|
||||
|
||||
final int _maxPayloadSize = 50 * 1024; // 分包大小
|
||||
|
||||
// 默认通话的期望数据格式
|
||||
TalkExpect defaultTalkExpect = TalkExpect(
|
||||
videoType: [TalkExpect_VideoTypeE.H264],
|
||||
audioType: [TalkExpect_AudioTypeE.G711],
|
||||
videoType: [TalkExpect_VideoTypeE.IMAGE],
|
||||
audioType: [],
|
||||
);
|
||||
|
||||
// 默认通话数据
|
||||
@ -153,14 +155,19 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
if (relayInfoEntity.relay_list != null &&
|
||||
relayInfoEntity.relay_list!.length != 0) {
|
||||
final data = relayInfoEntity.relay_list?[0];
|
||||
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
|
||||
remoteHost = parseUdpUrl['host'] ?? '';
|
||||
remotePort = parseUdpUrl['port'] ?? '';
|
||||
relayPeerId = data?.peerID ?? '';
|
||||
ToPeerId = relayPeerId;
|
||||
_log(text: '中继信息----》${relayInfoEntity}');
|
||||
relayInfoEntity.relay_list!.length > 0) {
|
||||
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
|
||||
final data = relayInfoEntity.relay_list?[i];
|
||||
if (data?.peerID != FromPeerId) {
|
||||
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
|
||||
remoteHost = parseUdpUrl['host'] ?? '';
|
||||
remotePort = parseUdpUrl['port'] ?? '';
|
||||
relayPeerId = data?.peerID ?? '';
|
||||
ToPeerId = relayPeerId;
|
||||
_log(text: '中继信息----》${relayInfoEntity}');
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
_log(text: '未查询到中继信息----》');
|
||||
}
|
||||
@ -217,6 +224,7 @@ class StartChartManage {
|
||||
final message = MessageCommand.goOnlineRelay(
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -231,6 +239,7 @@ class StartChartManage {
|
||||
final message = MessageCommand.talkRequestMessage(
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -242,6 +251,7 @@ class StartChartManage {
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
talkData: talkData,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -260,6 +270,8 @@ class StartChartManage {
|
||||
final List<int> message = MessageCommand.heartbeatMessage(
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: relayPeerId,
|
||||
MessageId:
|
||||
MessageCommand.getNextMessageId(relayPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
},
|
||||
@ -268,13 +280,42 @@ class StartChartManage {
|
||||
}
|
||||
|
||||
// 发送回声测试消息
|
||||
void sendEchoMessage() async {
|
||||
final message = MessageCommand.echoMessage(
|
||||
ToPeerId: echoPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
_log(text: '发送回声测试消息');
|
||||
void sendEchoMessage({required List<int> payload}) async {
|
||||
String toPeerId = '2vzXdjdzipJBpWpJxhiRzCFXrDKk54t3YJ7EjYPSRuij';
|
||||
|
||||
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
|
||||
for (int i = 0; i < totalPackets; i++) {
|
||||
int start = i * _maxPayloadSize;
|
||||
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,
|
||||
gatewayId: gatewayId,
|
||||
time: DateTime.now().millisecondsSinceEpoch ~/ 1000,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -294,6 +336,7 @@ class StartChartManage {
|
||||
final message = MessageCommand.talkAcceptMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
talkStatus.setWaitingAnswer();
|
||||
@ -304,6 +347,7 @@ class StartChartManage {
|
||||
final message = MessageCommand.talkRejectMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -314,6 +358,7 @@ class StartChartManage {
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
talkExpect: talkExpect,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -327,6 +372,7 @@ class StartChartManage {
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
PayloadType: PayloadType,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -340,6 +386,7 @@ class StartChartManage {
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
PayloadType: PayloadType,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -350,6 +397,7 @@ class StartChartManage {
|
||||
final message = MessageCommand.talkPingMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -359,6 +407,7 @@ class StartChartManage {
|
||||
final message = MessageCommand.talkHangupMessage(
|
||||
ToPeerId: ToPeerId,
|
||||
FromPeerId: FromPeerId,
|
||||
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
|
||||
);
|
||||
await _sendMessage(message: message);
|
||||
}
|
||||
@ -405,7 +454,7 @@ class StartChartManage {
|
||||
message, InternetAddress(remoteHost), remotePort);
|
||||
if (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);
|
||||
}
|
||||
} catch (e) {
|
||||
_log(text: '❌ 处理udp返回数据时遇到错误---> $e');
|
||||
// _log(text: '❌ 处理udp返回数据时遇到错误---> $e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user