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,
|
width: 1.sw,
|
||||||
height: 1.sh,
|
height: 1.sh,
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: _buildTalkView(isMpeg4: false),
|
child: _buildTalkView(isMpeg4: true),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
@ -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 {
|
||||||
|
/// 分包缓冲区
|
||||||
|
/// key:MessageId
|
||||||
|
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 [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
// 启动通话数据检查的定时器
|
// 启动通话数据检查的定时器
|
||||||
|
|||||||
@ -53,7 +53,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
|
|||||||
|
|
||||||
/// 处理h264协议的数据
|
/// 处理h264协议的数据
|
||||||
void _handleVideoH264(TalkData talkData) {
|
void _handleVideoH264(TalkData talkData) {
|
||||||
talkDataRepository.addTalkData(talkData);
|
// talkDataRepository.addTalkData(talkData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 处理图片数据
|
/// 处理图片数据
|
||||||
|
|||||||
@ -31,7 +31,6 @@ class OverTimeTimerManager {
|
|||||||
|
|
||||||
// 接收到消息时调用此方法
|
// 接收到消息时调用此方法
|
||||||
void receiveMessage() {
|
void receiveMessage() {
|
||||||
print("Received a message, resetting the timer.");
|
|
||||||
startTimer();
|
startTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user