diff --git a/assets/test.jpg b/assets/test.jpg new file mode 100644 index 00000000..f74d412c Binary files /dev/null and b/assets/test.jpg differ diff --git a/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart b/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart index 927c4e51..d264a752 100644 --- a/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart +++ b/lib/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart @@ -54,7 +54,7 @@ class _StarChartPageState extends State { width: 1.sw, height: 1.sh, color: Colors.transparent, - child: _buildTalkView(isMpeg4: false), + child: _buildTalkView(isMpeg4: true), ), ), ); diff --git a/lib/main/lockMian/lockMain/lockMain_page.dart b/lib/main/lockMian/lockMain/lockMain_page.dart index b4e92804..c6099272 100755 --- a/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/lib/main/lockMian/lockMain/lockMain_page.dart @@ -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 SizedBox( height: 160.h, ), + SubmitBtn( + btnName: '发送回声测试'.tr, + onClick: () async { + String assetPath = 'assets/test.jpg'; // 替换为你的图片路径 + List imageBytes = await loadAssetImageAsBytes(assetPath); + StartChartManage().sendEchoMessage(payload: imageBytes); + }, + ), if (F.isLite) Container() else @@ -247,6 +256,22 @@ class _StarLockMainPageState extends State }); } + Future> 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); diff --git a/lib/talk/startChart/command/message_command.dart b/lib/talk/startChart/command/message_command.dart index ee17c97e..24fc59ee 100644 --- a/lib/talk/startChart/command/message_command.dart +++ b/lib/talk/startChart/command/message_command.dart @@ -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 _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 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 echoMessage({ required String ToPeerId, required String FromPeerId, + List? 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 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 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 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 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 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 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 + static int calculationCrcFromIntList(List intList) { + // 将 List 转换为 Uint8List + final Uint8List uint8Payload = Uint8List.fromList(intList); + + // 调用现有的 calculationCrc 方法 + return calculationCrc(uint8Payload); + } + // 将字符串转换为 Uint8List static Uint8List _stringToUint8List(String input) { return Uint8List.fromList(utf8.encode(input)); diff --git a/lib/talk/startChart/entity/scp_message.dart b/lib/talk/startChart/entity/scp_message.dart index 361b89f4..a4ccb79d 100644 --- a/lib/talk/startChart/entity/scp_message.dart +++ b/lib/talk/startChart/entity/scp_message.dart @@ -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> _buffer = {}; + ScpMessage({ this.ProtocolFlag, this.MessageType, @@ -163,7 +168,9 @@ class ScpMessage { static ScpMessage deserialize(List 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 bytes) { - return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(''); - } - - // 辅助函数:将16进制字符串转换为字节数组 - static List hexToBytes(String hexString) { - final bytes = []; - 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 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 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 bytes) { + return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(''); + } + + // 辅助函数:将16进制字符串转换为字节数组 + static List hexToBytes(String hexString) { + final bytes = []; + 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 _subPackage({ + required int messageId, + required int spTotal, + required int spIndex, + required List bytes, + }) { + if (_buffer.containsKey(messageId)) { + // 存在这个key就追加 + final List bytesList = _buffer[messageId]!; + bytesList.addAll(bytes); + _buffer[messageId] = bytesList; + } else { + // 如果不存在这个key,就新增进去 + _buffer.putIfAbsent(messageId, () => bytes); + } + return []; + } } diff --git a/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart index 3fae7d0a..68a6d3ba 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart @@ -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(); // 启动通话数据检查的定时器 diff --git a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart index 3e172271..c852f214 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart @@ -53,7 +53,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle /// 处理h264协议的数据 void _handleVideoH264(TalkData talkData) { - talkDataRepository.addTalkData(talkData); + // talkDataRepository.addTalkData(talkData); } /// 处理图片数据 diff --git a/lib/talk/startChart/handle/other/overtime_timer_manger.dart b/lib/talk/startChart/handle/other/overtime_timer_manger.dart index f92990a6..c813dcaf 100644 --- a/lib/talk/startChart/handle/other/overtime_timer_manger.dart +++ b/lib/talk/startChart/handle/other/overtime_timer_manger.dart @@ -31,7 +31,6 @@ class OverTimeTimerManager { // 接收到消息时调用此方法 void receiveMessage() { - print("Received a message, resetting the timer."); startTimer(); } diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index a238a9b6..7e33a9dd 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -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 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 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 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'); } }