fix:增加解析模拟对讲服务的数据并显示到屏幕上、增加异常类、增加发送消息前的状态判断

This commit is contained in:
liyi 2024-12-25 18:30:10 +08:00
parent cdbd0c3d03
commit f98d1ab05c
30 changed files with 239 additions and 201 deletions

View File

@ -24,7 +24,6 @@ class StarChartLogic extends BaseGetXController {
int startTime = DateTime.now().millisecondsSinceEpoch; int startTime = DateTime.now().millisecondsSinceEpoch;
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
@ -51,6 +50,8 @@ class StarChartLogic extends BaseGetXController {
_cancelTimers(); _cancelTimers();
stopProcessing(); stopProcessing();
state.listPhotoData.value = Uint8List(0); state.listPhotoData.value = Uint8List(0);
//
_stopPlayG711Data();
// //
Get.back(); Get.back();
@ -72,6 +73,10 @@ class StarChartLogic extends BaseGetXController {
case TalkData_ContentTypeE.G711: case TalkData_ContentTypeE.G711:
_playG711Data(talkData.content); _playG711Data(talkData.content);
break; break;
case TalkData_ContentTypeE.Image:
//
state.listPhotoData.value = Uint8List.fromList(talkData.content);
break;
} }
}); });
} }
@ -107,16 +112,18 @@ class StarChartLogic extends BaseGetXController {
} }
void _startCallTimer() { void _startCallTimer() {
if (state.oneMinuteTimeTimer.isActive) return;
state.oneMinuteTimeTimer.cancel(); state.oneMinuteTimeTimer.cancel();
state.oneMinuteTimeTimer = state.oneMinuteTimeTimer =
Timer.periodic(const Duration(seconds: 1), (Timer t) { Timer.periodic(const Duration(seconds: 1), (Timer t) {
state.oneMinuteTime.value++; state.oneMinuteTime.value++;
if (state.oneMinuteTime.value >= 60) { // if (state.oneMinuteTime.value >= 60) {
t.cancel(); // t.cancel();
initiateHangUpCommand(); // initiateHangUpCommand();
AppLog.log('通话时间超过60秒自动挂断'); // AppLog.log('通话时间超过60秒自动挂断');
state.oneMinuteTime.value = 0; // state.oneMinuteTime.value = 0;
} // }
}); });
} }

View File

@ -38,7 +38,6 @@ class _StarChartPageState extends State<StarChartPage> {
super.initState(); super.initState();
initAsync(); initAsync();
// _getTVDataRefreshUIAction();
} }
Future<void> initAsync() async { Future<void> initAsync() async {
@ -265,52 +264,12 @@ class _StarChartPageState extends State<StarChartPage> {
} }
} }
// void _getTVDataRefreshUIAction() { String listToHexString(List<int> intList) {
// // state.getTVDataRefreshUIEvent = eventBus //
// // .on<GetTVDataRefreshUI>() List<String> hexList = intList.map((num) => num.toRadixString(16)).toList();
// // .listen((GetTVDataRefreshUI event) async { //
// // if (event.tvList.isNotEmpty && event.tvList.length > 100) { return hexList.join('');
// // final Uint8List imageData = Uint8List.fromList(event.tvList); }
// // if (!listEquals(state.listPhotoData.value, imageData)) {
// // state.listPhotoData.value = imageData;
// // state.shouldUpdateUI.value = true;
// // if (state.shouldUpdateUI.value) {
// // setState(() {});
// // state.shouldUpdateUI.value = false;
// // }
// // }
// // }
// // });
// state.talkDataRepository.talkDataStream.listen((talkData) {
// final contentType = talkData.contentType;
// //
// switch (contentType) {
// case TalkData_ContentTypeE.Image:
// state.listPhotoData.value = Uint8List.fromList(talkData.content);
// if (talkData.content.isNotEmpty && talkData.content.length > 100) {
// //
// final Uint8List imageData = Uint8List.fromList(talkData.content);
// if (!listEquals(state.listPhotoData.value, imageData)) {
// //
// state.listPhotoData.value = imageData;
// // trueUI
// state.shouldUpdateUI.value = true;
// // WidgetsBinding.instance.addPostFrameCallback((_) {
// // setState方法之前检查标志true时才更新UI
// if (state.shouldUpdateUI.value) {
// setState(() {
// // UI
// });
// // UI后将标志重新设置为false
// state.shouldUpdateUI.value = false;
// }
// // });
// }
// }
// break;
// }
// });
// }
@override @override
void dispose() { void dispose() {
@ -324,58 +283,67 @@ class _StarChartPageState extends State<StarChartPage> {
} }
Widget _buildMpeg4TalkView() { Widget _buildMpeg4TalkView() {
return Stack( return Obx(
children: <Widget>[ () => Stack(
Image.memory( children: <Widget>[
state.listPhotoData.value, state.listPhotoData.value.isNotEmpty
gaplessPlayback: true, ? Image.memory(
width: 1.sw, state.listPhotoData.value,
height: 1.sh, gaplessPlayback: true,
fit: BoxFit.cover, width: 1.sw,
filterQuality: FilterQuality.high, height: 1.sh,
errorBuilder: fit: BoxFit.cover,
(BuildContext context, Object error, StackTrace? stackTrace) { filterQuality: FilterQuality.high,
return Container(color: Colors.transparent); errorBuilder: (BuildContext context, Object error,
}, StackTrace? stackTrace) {
), return Container(color: Colors.transparent);
Positioned( },
top: ScreenUtil().statusBarHeight + 30.h, )
width: 1.sw, : Image.asset(
child: Obx(() { 'images/main/monitorBg.png',
final String sec = width: 1.sw,
(state.oneMinuteTime.value % 60).toString().padLeft(2, '0'); height: 1.sh,
final String min = fit: BoxFit.cover,
(state.oneMinuteTime.value ~/ 60).toString().padLeft(2, '0'); ),
return Row( Positioned(
mainAxisAlignment: MainAxisAlignment.center, top: ScreenUtil().statusBarHeight + 30.h,
children: <Widget>[ width: 1.sw,
Text('$min:$sec', child: Obx(() {
style: TextStyle(fontSize: 26.sp, color: Colors.white)), final String sec =
], (state.oneMinuteTime.value % 60).toString().padLeft(2, '0');
); final String min =
}), (state.oneMinuteTime.value ~/ 60).toString().padLeft(2, '0');
), return Row(
Positioned( mainAxisAlignment: MainAxisAlignment.center,
bottom: 10.w, children: <Widget>[
child: Container( Text('$min:$sec',
width: 1.sw - 30.w * 2, style: TextStyle(fontSize: 26.sp, color: Colors.white)),
margin: EdgeInsets.all(30.w), ],
decoration: BoxDecoration( );
color: const Color(0xC83C3F41), }),
borderRadius: BorderRadius.circular(20.h), ),
), Positioned(
child: Column( bottom: 10.w,
children: <Widget>[ child: Container(
SizedBox(height: 20.h), width: 1.sw - 30.w * 2,
buildTopButtons(), margin: EdgeInsets.all(30.w),
SizedBox(height: 20.h), decoration: BoxDecoration(
buildBottomButtons(), color: const Color(0xC83C3F41),
SizedBox(height: 20.h), borderRadius: BorderRadius.circular(20.h),
], ),
child: Column(
children: <Widget>[
SizedBox(height: 20.h),
buildTopButtons(),
SizedBox(height: 20.h),
buildBottomButtons(),
SizedBox(height: 20.h),
],
),
), ),
), ),
), ],
], ),
); );
} }

View File

@ -56,6 +56,9 @@ class StarChartState {
RxInt talkStatus = 0.obs; // RxInt talkStatus = 0.obs; //
// StartChartTalkStatus
StartChartTalkStatus talkStatusInstance = StartChartTalkStatus.instance;
// //
final TalkDataRepository talkDataRepository = TalkDataRepository.instance; final TalkDataRepository talkDataRepository = TalkDataRepository.instance;

View File

@ -0,0 +1,3 @@
class ExceptionConstant{
static const String relay = 'relay';
}

View File

@ -1,10 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/exception/start_chart_message_exception.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart';
class ScpMessage { class ScpMessage {
ScpMessage({ ScpMessage({
this.ProtocolFlag, this.ProtocolFlag,
@ -149,12 +149,13 @@ class ScpMessage {
static ScpMessage deserialize(Uint8List bytes) { static ScpMessage deserialize(Uint8List bytes) {
final message = ScpMessage(); final message = ScpMessage();
int offset = 0; int offset = 0;
// Convert byte array to hex string with zero padding and without spaces
// String hexString = // String hexString =
// bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(); // bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
// // // _log(text: 'result bytes hex: ${hexString}');
// // Log the hex string // _log(
// _log(text: '原始字节数组: $hexString'); // text:
// '\n result bytes hex: ${hexString} \n payload hex: ${hexString.substring(194)}');
// ProtocolFlag (4 bytes) // ProtocolFlag (4 bytes)
if (bytes.length - offset >= 4) { if (bytes.length - offset >= 4) {
@ -244,8 +245,7 @@ class ScpMessage {
// Payload // Payload
if (message.PayloadLength != null && if (message.PayloadLength != null &&
bytes.length - offset >= message.PayloadLength!) { bytes.length - offset >= message.PayloadLength!) {
final Uint8List sublist = final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
bytes.sublist(offset, offset + message.PayloadLength!);
offset += message.PayloadLength!; offset += message.PayloadLength!;
message.Payload = _handlePayLoad( message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0, payloadType: message.PayloadType ?? 0,
@ -268,7 +268,7 @@ class ScpMessage {
static dynamic _handlePayLoad({ static dynamic _handlePayLoad({
required int payloadType, required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,
@ -280,7 +280,7 @@ class ScpMessage {
final ScpMessageHandler handler = final ScpMessageHandler handler =
ScpMessageHandlerFactory.createHandler(payloadType); ScpMessageHandlerFactory.createHandler(payloadType);
// //
return handler.deserializePayload( final payload = handler.deserializePayload(
payloadType: payloadType, payloadType: payloadType,
messageType: messageType, messageType: messageType,
byte: byte, byte: byte,
@ -290,12 +290,9 @@ class ScpMessage {
spIndex: spIndex, spIndex: spIndex,
messageId: messageId, messageId: messageId,
); );
return payload;
} catch (e, stackTrace) { } catch (e, stackTrace) {
// throw StartChartMessageException('❌反序列化udp数据时遇到错误----》$e \n$stackTrace');
_log(text: '❌反序列化udp数据时遇到错误----》$e');
//
_log(text: '堆栈跟踪:\n$stackTrace');
return '';
} }
} }

View File

@ -0,0 +1,10 @@
class StartChartMessageException implements Exception {
final String message;
StartChartMessageException(this.message);
@override
String toString() {
return 'StartChartMessageException{message: $message}';
}
}

View File

@ -0,0 +1,10 @@
class StartChartTalkStatusException implements Exception {
final String message;
StartChartTalkStatusException(this.message);
@override
String toString() {
return 'StartChartTalkStatusException{message: $message}';
}
}

View File

@ -35,7 +35,7 @@ class UdpBlePassThroughHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -36,7 +36,7 @@ class UdpEchoTestHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -36,7 +36,7 @@ class UdpGateWayResetHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -39,7 +39,7 @@ class UdpGateWayTransferHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -42,7 +42,7 @@ class UdpGoOnlineHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -43,7 +43,7 @@ class UdpHeartBeatHandler extends ScpMessageBaseHandle
void handleRealTimeData(ScpMessage scpMessage) {} void handleRealTimeData(ScpMessage scpMessage) {}
@override @override
deserializePayload({required int payloadType, required int messageType, required Uint8List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) { deserializePayload({required int payloadType, required int messageType, required List<int> byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) {
// //
HeartbeatResponse heartbeatResponse = HeartbeatResponse.fromBytes(byte); HeartbeatResponse heartbeatResponse = HeartbeatResponse.fromBytes(byte);
return heartbeatResponse; return heartbeatResponse;

View File

@ -38,7 +38,7 @@ class UdpRemoteUnLockHandler extends ScpMessageBaseHandle implements ScpMessageH
} }
@override @override
deserializePayload({required int payloadType, required int messageType, required Uint8List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) { deserializePayload({required int payloadType, required int messageType, required List<int> byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) {
if (messageType == MessageTypeConstant.Resp) { if (messageType == MessageTypeConstant.Resp) {
final GenericResp genericResp = GenericResp(); final GenericResp genericResp = GenericResp();
genericResp.mergeFromBuffer(byte); genericResp.mergeFromBuffer(byte);

View File

@ -44,7 +44,7 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
stopRingtone(); stopRingtone();
// //
talkStatus.setAnsweredSuccessfully(); talkStatus.setAnsweredSuccessfully();
talkStatus.setDuringCall(); talkStatus.setWaitingData();
} }
} }
@ -58,7 +58,7 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -30,10 +30,45 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
talkDataOverTimeTimerManager.receiveMessage(); talkDataOverTimeTimerManager.receiveMessage();
if (scpMessage.Payload != null) { if (scpMessage.Payload != null) {
final TalkData talkData = scpMessage.Payload; final TalkData talkData = scpMessage.Payload;
print('talkData: ${listToHexString(talkData.content)}');
// //
_handleTalkData(talkData: talkData); _handleTalkData(talkData: talkData);
//
talkStatus.setDuringCall();
}
}
@override
deserializePayload(
{required int payloadType,
required int messageType,
required List<int> byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId}) {
if (messageType == MessageTypeConstant.RealTimeData) {
print(
'收到音视频数据:${byte.length} messageId:$messageId spTotal:$spTotal spIndex:$spIndex PayloadLength:$PayloadLength');
//
if (spTotal != null &&
spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
//
final TalkData talkData = TalkData();
talkData.mergeFromBuffer(byte);
return talkData;
}
} }
} }
@ -69,7 +104,15 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
} }
/// ///
void _handleVideoImage(TalkData talkData) {} void _handleVideoImage(TalkData talkData) {
final List<Uint8List> processCompletePayload =
_processCompletePayload(Uint8List.fromList(talkData.content));
//
processCompletePayload.forEach((element) {
talkData.content = element;
talkDataRepository.addTalkData(talkData);
});
}
/// g711音频数据 /// g711音频数据
void _handleVideoG711(TalkData talkData) { void _handleVideoG711(TalkData talkData) {
@ -84,36 +127,36 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
} }
} }
@override ///
deserializePayload( List<Uint8List> _processCompletePayload(Uint8List payload) {
{required int payloadType, //
required int messageType, List<Uint8List> frames = [];
required Uint8List byte,
int? offset, // (0xFFD8 , 0xFFD9 )
int? PayloadLength, int startIdx = payload.indexOf(0xFF);
int? spTotal, while (startIdx != -1 && startIdx + 1 < payload.length) {
int? spIndex, if (payload[startIdx + 1] == 0xD8) {
int? messageId}) { // 0xFFD8
if (messageType == MessageTypeConstant.RealTimeData) { int endIdx = startIdx + 2;
// while (endIdx < payload.length - 1) {
if (spTotal != null && endIdx = payload.indexOf(0xFF, endIdx);
spTotal > 1 && if (endIdx == -1) break;
messageId != null && if (endIdx + 1 < payload.length && payload[endIdx + 1] == 0xD9) {
spIndex != null) { // 0xFFD9
// Uint8List frame = payload.sublist(startIdx, endIdx + 2);
return handleFragmentedPayload( frames.add(frame);
messageId: messageId, startIdx = endIdx + 2; //
spTotal: spTotal, break;
spIndex: spIndex, } else {
byte: byte, endIdx += 1; //
payloadType: payloadType, }
); }
} else { } else {
// startIdx = payload.indexOf(0xFF, startIdx + 1); //
final TalkData talkData = TalkData();
talkData.mergeFromBuffer(byte);
return talkData;
} }
} }
//
return frames;
} }
} }

View File

@ -49,7 +49,7 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -53,7 +53,7 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -36,7 +36,7 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -37,7 +37,7 @@ class UdpTalkPushHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -35,7 +35,7 @@ class UdpTalkReceiverTransferHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -50,7 +50,7 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -95,7 +95,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -34,7 +34,7 @@ class UnKnowPayloadTypeHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data';
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
@ -19,6 +20,7 @@ import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class ScpMessageBaseHandle { class ScpMessageBaseHandle {
final startChartManage = StartChartManage(); final startChartManage = StartChartManage();
final List<int> _buffer = [];
/// ///
// messageId // messageId
@ -33,12 +35,12 @@ class ScpMessageBaseHandle {
// //
final talkePingOverTimeTimerManager = OverTimeTimerManager( final talkePingOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 15, timeoutInSeconds: 55,
); );
// //
final talkDataOverTimeTimerManager = OverTimeTimerManager( final talkDataOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 13, timeoutInSeconds: 53,
); );
// //
@ -86,7 +88,7 @@ class ScpMessageBaseHandle {
}) { }) {
// //
String key = '$messageId-$payloadType'; String key = '$messageId-$payloadType';
if (!_packetBuffer.containsKey(messageId)) { if (!_packetBuffer.containsKey(key)) {
_packetBuffer[key] = List.filled(spTotal, []); _packetBuffer[key] = List.filled(spTotal, []);
_startTimer(key); _startTimer(key);
} }
@ -104,24 +106,17 @@ class ScpMessageBaseHandle {
// //
if (_packetBuffer[key]!.every((packet) => packet.isNotEmpty)) { if (_packetBuffer[key]!.every((packet) => packet.isNotEmpty)) {
// //
List<int> completePayload = Uint8List completePayload = Uint8List.fromList(
_packetBuffer[key]!.expand((packet) => packet).toList(); _packetBuffer[key]!.expand((packet) => packet).toList());
// //
_clearPacketData(key); _clearPacketData(key);
// payload // 使TalkData
if (payloadType == PayloadTypeConstant.talkData) { if (payloadType == PayloadTypeConstant.talkData) {
final TalkData talkData = TalkData(); final talkData = TalkData();
talkData.mergeFromBuffer(completePayload); talkData.mergeFromBuffer(completePayload);
return talkData; return talkData;
} }
// if (payloadType == PayloadTypeConstant.echoTest) {
// return completePayload;
// } else {
// String payload = utf8.decode(completePayload);
// return payload;
// }
} else { } else {
// null // null
return null; return null;

View File

@ -19,7 +19,7 @@ abstract class ScpMessageHandler {
dynamic deserializePayload({ dynamic deserializePayload({
required int payloadType, required int payloadType,
required int messageType, required int messageType,
required Uint8List byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -17,7 +17,7 @@ import 'talk_data.pbenum.dart';
export 'talk_data.pbenum.dart'; export 'talk_data.pbenum.dart';
/// 使Req /// 使(Req/Resp)(RealTimeData)
/// Ping /// Ping
class TalkData extends $pb.GeneratedMessage { class TalkData extends $pb.GeneratedMessage {
factory TalkData({ factory TalkData({
@ -78,6 +78,7 @@ class TalkData extends $pb.GeneratedMessage {
@$pb.TagNumber(1) @$pb.TagNumber(1)
void clearContentType() => clearField(1); void clearContentType() => clearField(1);
/// PCM的字节H264的字节
@$pb.TagNumber(2) @$pb.TagNumber(2)
$core.List<$core.int> get content => $_getN(1); $core.List<$core.int> get content => $_getN(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)

View File

@ -3,7 +3,7 @@ syntax = "proto3";
package main; package main;
option go_package = "./spb/talk"; option go_package = "./spb/talk";
// 使Req // 使(Req/Resp)(RealTimeData)
// Ping // Ping
message TalkData { message TalkData {
// H264G711 // H264G711
@ -13,10 +13,10 @@ message TalkData {
G711 = 2; G711 = 2;
}; };
ContentTypeE ContentType = 1; ContentTypeE ContentType = 1;
// PCM的字节H264的字节
bytes Content = 2; bytes Content = 2;
// 0ms21000ms // 0ms21000ms
// //
// //
uint32 DurationMs = 3; uint32 DurationMs = 3;
} }

View File

@ -21,6 +21,7 @@ import 'package:star_lock/talk/startChart/entity/relay_info_entity.dart';
import 'package:star_lock/talk/startChart/entity/report_information_data.dart'; import 'package:star_lock/talk/startChart/entity/report_information_data.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/entity/star_chart_register_node_entity.dart'; import 'package:star_lock/talk/startChart/entity/star_chart_register_node_entity.dart';
import 'package:star_lock/talk/startChart/exception/start_chart_message_exception.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
@ -363,10 +364,6 @@ class StartChartManage {
// //
void sendTalkExpectMessage({required TalkExpect talkExpect}) async { void sendTalkExpectMessage({required TalkExpect talkExpect}) async {
if (talkStatus.status != TalkStatus.duringCall) {
_log(text: '当前未处于接听状态, 无法发送期望接受数据消息');
return;
}
final message = MessageCommand.talkExpectMessage( final message = MessageCommand.talkExpectMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
@ -407,10 +404,6 @@ class StartChartManage {
// //
Future<void> sendTalkPingMessage( Future<void> sendTalkPingMessage(
{required String ToPeerId, required String FromPeerId}) async { {required String ToPeerId, required String FromPeerId}) async {
if (talkStatus.status != TalkStatus.duringCall) {
_log(text: '当前未处于接听状态, 无法发送通话保持消息');
return;
}
final message = MessageCommand.talkPingMessage( final message = MessageCommand.talkPingMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
@ -474,7 +467,8 @@ class StartChartManage {
var result = await _udpSocket?.send( var result = await _udpSocket?.send(
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}'); throw StartChartMessageException(
'❌Udp send data error----> $result ${message.length}');
// _udpSocket = null; // _udpSocket = null;
} }
} }
@ -663,7 +657,7 @@ class StartChartManage {
.signPKCS1v15Bytes(signData, fastRsa.Hash.SHA256, pemPrivateKey); .signPKCS1v15Bytes(signData, fastRsa.Hash.SHA256, pemPrivateKey);
resultSign = hex.encode(result); resultSign = hex.encode(result);
} catch (e) { } catch (e) {
_log(text: '❌--->上报信息生成签名时出现错误: $e'); throw StartChartMessageException('❌--->上报信息生成签名时出现错误: $e');
e.printError(); e.printError();
} }
return resultSign ?? ''; return resultSign ?? '';
@ -785,14 +779,14 @@ class StartChartManage {
} }
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
if (deserialize.Payload != null) { if (deserialize.Payload != null) {
_log(text: 'Udp收到结构体数据---》$deserialize'); // _log(text: 'Udp收到结构体数据---》$deserialize');
} }
// _log(text: 'text---》${utf8.decode(deserialize.Payload)}'); // _log(text: 'text---》${utf8.decode(deserialize.Payload)}');
} }
} }
} catch (e, stackTrace) { } catch (e, stackTrace) {
_log(text: '❌ Udp result data error ----> $e'); throw StartChartMessageException(
_log(text: '堆栈跟踪:\n$stackTrace'); '❌ Udp result data error ----> $e\n,$stackTrace');
} }
} }
}); });
@ -815,7 +809,7 @@ class StartChartManage {
handler.handleInvalidReq(scpMessage); handler.handleInvalidReq(scpMessage);
} }
} catch (e, stackTrace) { } catch (e, stackTrace) {
_log(text: '❌ 处理udp返回数据时遇到错误---> $e\n,$stackTrace'); throw StartChartMessageException('❌ 处理udp返回数据时遇到错误---> $e\n,$stackTrace');
} }
} }

View File

@ -64,6 +64,13 @@ class StartChartTalkStatus {
// "waitingAnswer" // "waitingAnswer"
} }
///
void setWaitingData() {
_setStatus(TalkStatus.waitingData);
// "waitingAnswer"
}
/// ///
void setDuringCall() { void setDuringCall() {
_setStatus(TalkStatus.duringCall); _setStatus(TalkStatus.duringCall);