fix:增加分包发送、接收分包数据后的组包逻辑、增加部分测试代码

This commit is contained in:
liyi 2024-12-20 14:38:52 +08:00
parent ba47b2731b
commit 5574dc8043
7 changed files with 52 additions and 31 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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();
//

View File

@ -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) {