fix:增加分包发送、接收分包数据后的组包逻辑、增加部分测试代码
This commit is contained in:
parent
ba47b2731b
commit
5574dc8043
@ -31,8 +31,12 @@ class StarChartLogic extends BaseGetXController {
|
||||
state.oneMinuteTime.value = 0;
|
||||
|
||||
if (state.talkStatus.value == TalkStatus.rejected.index ||
|
||||
state.talkStatus.value == TalkStatus.notTalkData.index ||
|
||||
state.talkStatus.value == TalkStatus.notTalkPing.index ||
|
||||
state.talkStatus.value == TalkStatus.end.index) {
|
||||
_cancelTimers();
|
||||
// 状态错误,返回页面
|
||||
Get.back();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -220,14 +220,17 @@ 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);
|
||||
},
|
||||
),
|
||||
// _buildImage(),
|
||||
// SubmitBtn(
|
||||
// btnName: '发送回声测试'.tr,
|
||||
// onClick: () async {
|
||||
// String assetPath = 'assets/test.jpg'; // 替换为你的图片路径
|
||||
// List<int> imageBytes = await loadAssetImageAsBytes(assetPath);
|
||||
// // state.talkData.value = imageBytes;
|
||||
// // setState(() {});
|
||||
// StartChartManage().sendEchoMessage(payload: imageBytes);
|
||||
// },
|
||||
// ),
|
||||
if (F.isLite)
|
||||
Container()
|
||||
else
|
||||
|
||||
@ -51,9 +51,9 @@ class MessageCommand {
|
||||
SpIndex: 1,
|
||||
FromPeerId: FromPeerId,
|
||||
ToPeerId: ToPeerId,
|
||||
Payload: 'hello',
|
||||
PayloadCRC: 55230,
|
||||
PayloadLength: 5,
|
||||
Payload: [0],
|
||||
PayloadCRC: 0,
|
||||
PayloadLength: 0,
|
||||
PayloadType: PayloadTypeConstant.goOnline,
|
||||
).serialize();
|
||||
return _hexToBytes(serializedBytesString);
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
import 'dart:convert';
|
||||
import 'package:get/get.dart';
|
||||
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';
|
||||
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
|
||||
import 'package:star_lock/talk/startChart/entity/login_response.dart';
|
||||
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
|
||||
import 'package:star_lock/talk/startChart/proto/ble_message.pb.dart';
|
||||
import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
|
||||
import 'package:star_lock/talk/startChart/proto/gateway_transfer.pb.dart';
|
||||
@ -168,9 +170,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(" ")}');
|
||||
// _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));
|
||||
@ -271,6 +273,9 @@ class ScpMessage {
|
||||
spTotal: message.SpTotal,
|
||||
messageId: message.MessageId,
|
||||
);
|
||||
// if (message.Payload != null && message.Payload is List<int>) {
|
||||
// message.PayloadLength = message.Payload.length;
|
||||
// }
|
||||
} else {
|
||||
throw FormatException("Invalid Payload or PayloadLength");
|
||||
}
|
||||
@ -466,11 +471,9 @@ class ScpMessage {
|
||||
return payload;
|
||||
}
|
||||
} catch (e) {
|
||||
_log(text: '❌反序列化udp数据时遇到错误----》$e');
|
||||
e.printError();
|
||||
_log(text: '❌反序列化udp数据时遇到错误----》$e,message:$messageType byte:${byte.take(20)}');
|
||||
// 尝试打印原始字节数组以供调试
|
||||
_log(
|
||||
text:
|
||||
'原始字节数组: ${byte.sublist(0, 20).map((b) => b.toRadixString(16)).join(" ")}');
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@ -495,12 +498,14 @@ class ScpMessage {
|
||||
|
||||
/// 处理分包逻辑
|
||||
/// 如果没有收到所有包则返回null
|
||||
static String? _handleFragmentedPayload({
|
||||
static dynamic _handleFragmentedPayload({
|
||||
required int messageId,
|
||||
required int spTotal,
|
||||
required int spIndex,
|
||||
required List<int> byte,
|
||||
}) {
|
||||
print(
|
||||
'_handleFragmentedPayload spTotal:$spTotal spindex:$spIndex} byte:${byte.take(20)}');
|
||||
// 初始化分包列表
|
||||
if (!_packetBuffer.containsKey(messageId)) {
|
||||
_packetBuffer[messageId] = List.filled(spTotal, []);
|
||||
@ -518,9 +523,11 @@ class ScpMessage {
|
||||
// 清除已重组的分包数据
|
||||
_packetBuffer.remove(messageId);
|
||||
|
||||
return completePayload;
|
||||
|
||||
// 解析完整的 payload
|
||||
String payload = utf8.decode(completePayload);
|
||||
return payload;
|
||||
// final TalkData talkData = TalkData.fromBuffer(completePayload);
|
||||
// String payload = utf8.decode(completePayload);
|
||||
} else {
|
||||
// 如果分包尚未接收完全,返回 null 或其他指示符
|
||||
return null;
|
||||
|
||||
@ -3,6 +3,7 @@ import 'package:get/get.dart';
|
||||
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
|
||||
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
|
||||
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
|
||||
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
|
||||
|
||||
import '../../start_chart_manage.dart';
|
||||
|
||||
@ -16,7 +17,13 @@ class UdpEchoTestHandler extends ScpMessageBaseHandle
|
||||
@override
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
// TODO: 收到回声测试回复
|
||||
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
|
||||
final List<int> payload = scpMessage.Payload;
|
||||
|
||||
talkDataRepository.addTalkData(
|
||||
TalkData(content: payload, contentType: TalkData_ContentTypeE.Image));
|
||||
if (payload is String) {
|
||||
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -26,9 +26,8 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
|
||||
// 收到同意接听回复
|
||||
final GenericResp genericResp = scpMessage.Payload;
|
||||
if (checkGenericRespSuccess(genericResp)) {
|
||||
|
||||
// 延迟2秒后启动监听
|
||||
Future.delayed(Duration(seconds: 4), () {
|
||||
Future.delayed(Duration(seconds: 3), () {
|
||||
// 启动通话保持定时器
|
||||
_handleStartTalkPing();
|
||||
// 启动发送预期数据请求
|
||||
|
||||
@ -75,7 +75,7 @@ class StartChartManage {
|
||||
int talkDataIntervalTime = 10; // 通话数据的消息间隔(ms)
|
||||
Timer? talkDataTimer; // 发送通话数据消息定时器
|
||||
|
||||
final int _maxPayloadSize = 8 * 1024; // 分包大小
|
||||
final int _maxPayloadSize = 1 * 1024; // 分包大小
|
||||
|
||||
// 默认通话的期望数据格式
|
||||
TalkExpect defaultTalkExpect = TalkExpect(
|
||||
@ -281,7 +281,7 @@ class StartChartManage {
|
||||
|
||||
// 发送回声测试消息
|
||||
void sendEchoMessage({required List<int> payload}) async {
|
||||
String toPeerId = 'G7fzJkbS5MigMqnbTCQVk7VspcDsnGeikJpQwS8fbhim';
|
||||
String toPeerId = '2vzXdjdzipJBpWpJxhiRzCFXrDKk54t3YJ7EjYPSRuij';
|
||||
|
||||
// 计算需要分多少个包发送
|
||||
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
|
||||
@ -295,6 +295,7 @@ class StartChartManage {
|
||||
// 取到分包数据
|
||||
List<int> packet = payload.sublist(start, end);
|
||||
|
||||
final messageId = MessageCommand.getNextMessageId(toPeerId, increment: false);
|
||||
// 组装分包数据
|
||||
final message = MessageCommand.echoMessage(
|
||||
ToPeerId: toPeerId,
|
||||
@ -302,13 +303,13 @@ class StartChartManage {
|
||||
payload: packet,
|
||||
SpTotal: totalPackets,
|
||||
SpIndex: i + 1,
|
||||
MessageId: MessageCommand.getNextMessageId(toPeerId, increment: false),
|
||||
MessageId: messageId,
|
||||
);
|
||||
// 发送消息
|
||||
await _sendMessage(message: message);
|
||||
_log(
|
||||
text:
|
||||
'发送回声测试分包消息=====SpTotal:$totalPackets,SpIndex:${i + 1},packet:${packet.length}');
|
||||
// _log(
|
||||
// text:
|
||||
// '发送回声测试分包消息=====messageId:$messageId,SpTotal:$totalPackets,SpIndex:${i + 1},packet:${packet.length}');
|
||||
}
|
||||
// 分包发送完了递增一下id
|
||||
MessageCommand.getNextMessageId(toPeerId);
|
||||
@ -760,7 +761,7 @@ class StartChartManage {
|
||||
_handleUdpResultData(deserialize);
|
||||
}
|
||||
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
|
||||
_log(text: 'Udp收到结构体数据---》$deserialize');
|
||||
// _log(text: 'Udp收到结构体数据---》$deserialize');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user