diff --git a/lib/talk/startChart/command/message_command.dart b/lib/talk/startChart/command/message_command.dart index 0ea3f79c..ee17c97e 100644 --- a/lib/talk/startChart/command/message_command.dart +++ b/lib/talk/startChart/command/message_command.dart @@ -10,6 +10,7 @@ import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_accept.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_expect.pb.dart'; +import 'package:star_lock/talk/startChart/proto/talk_hangup.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_ping.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart'; @@ -209,6 +210,30 @@ class MessageCommand { return _hexToBytes(serializedBytesString); } + // 通话中挂断 + static List talkHangupMessage({ + required String FromPeerId, + required String ToPeerId, + }) { + final talkHangup = TalkHangup(); + final payload = talkHangup.writeToBuffer(); + ScpMessage message = ScpMessage( + ProtocolFlag: ProtocolFlagConstant.scp01, + MessageType: MessageTypeConstant.Req, + MessageId: 1, + SpTotal: 0, + SpIndex: 0, + FromPeerId: FromPeerId, + ToPeerId: ToPeerId, + Payload: payload, + PayloadCRC: calculationCrc(payload), + PayloadLength: payload.length, + PayloadType: PayloadTypeConstant.talkHangup, + ); + String serializedBytesString = message.serialize(); + return _hexToBytes(serializedBytesString); + } + // 音视频数据 static List talkDataMessage({ required String FromPeerId, 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 df6834a7..c88c1817 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart @@ -10,7 +10,6 @@ import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pbserver.dart'; -import '../../start_chart_manage.dart'; class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler { @@ -25,11 +24,11 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle @override void handleRealTimeData(ScpMessage scpMessage) { - print('收到音视频数据:$scpMessage'); + // print('收到音视频数据:$scpMessage'); if (scpMessage.Payload != null) { final TalkData talkData = scpMessage.Payload; // 处理音视频数据 - _handleTalkData(talkData: talkData); + // _handleTalkData(talkData: talkData); // 收到数据后调用更新,防止定时器超时 talkDataOverTimeTimerManager.receiveMessage(); } diff --git a/lib/talk/startChart/handle/impl/udp_talk_hangup_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_hangup_handler.dart index b576f81f..dc4b8964 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_hangup_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_hangup_handler.dart @@ -10,16 +10,22 @@ import '../../start_chart_manage.dart'; class UdpTalkHangUpHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - - @override void handleReq(ScpMessage scpMessage) { - // TODO: 通话中挂断请求 + // 通话中挂断请求 + print('收到通话中挂断请求'); + startChartManage.sendGenericRespSuccessMessage( + ToPeerId: scpMessage.FromPeerId!, + FromPeerId: scpMessage.ToPeerId!, + PayloadType: scpMessage.PayloadType!, + ); + talkStatus.setEnd(); } @override void handleResp(ScpMessage scpMessage) { - // TODO: 通话中挂断回复 + print('收到通话中挂断回复'); + talkStatus.setEnd(); } @override @@ -28,8 +34,7 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle } @override - void handleRealTimeData(ScpMessage scpMessage - ) { + void handleRealTimeData(ScpMessage scpMessage) { // TODO: implement handleRealTimeData } } diff --git a/lib/talk/startChart/handle/impl/udp_talk_reject_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_reject_handler.dart index d6cfe1d1..e501272a 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_reject_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_reject_handler.dart @@ -19,6 +19,7 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle void handleResp(ScpMessage scpMessage) { // 收到接听拒绝回复 talkStatus.setRejected(); + print('收到接听拒绝回复'); } @override diff --git a/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart index 0b14208c..3c69eb02 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart @@ -28,11 +28,11 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle startChartManage.FromPeerId = scpMessage.ToPeerId!; startChartManage.ToPeerId = scpMessage.FromPeerId!; // 处理收到接听请求后的事件 - // _talkRequestEvent(talkObjectName: talkReq.callerName); + _talkRequestEvent(talkObjectName: talkReq.callerName); - Future.delayed(Duration(seconds: 1), () { - startChartManage.sendTalkAcceptMessage(); - }); + // Future.delayed(Duration(seconds: 1), () { + // startChartManage.sendTalkAcceptMessage(); + // }); } @override @@ -45,14 +45,10 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle } @override - void handleInvalidReq(ScpMessage scpMessage) { - - } + void handleInvalidReq(ScpMessage scpMessage) {} @override - void handleRealTimeData(ScpMessage scpMessage) { - - } + void handleRealTimeData(ScpMessage scpMessage) {} // 来电事件的处理 void _talkRequestEvent({required String talkObjectName}) { diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index 98a8ba0c..fb1090ac 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -129,10 +129,9 @@ class StartChartManage { relayPeerId = data?.peerID ?? ''; ToPeerId = relayPeerId; _log(text: '中继信息----》${relayInfoEntity}'); - }else{ + } else { _log(text: '未查询到中继信息----》'); } - } void closeUdpSocket() { @@ -306,6 +305,15 @@ class StartChartManage { await _sendMessage(message: message); } + // 发送通话中挂断消息 + Future sendTalkHangupMessage() async { + final message = MessageCommand.talkHangupMessage( + ToPeerId: ToPeerId, + FromPeerId: FromPeerId, + ); + await _sendMessage(message: message); + } + // 重新上线 Future reStartOnlineStartChartServer() async { if (isOnlineStartChartServer) { @@ -657,9 +665,9 @@ class StartChartManage { // 处理返回数据 _handleUdpResultData(deserialize); } - // if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { - // _log(text: 'Udp收到结构体数据---》$deserialize'); - // } + if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { + _log(text: 'Udp收到结构体数据---》$deserialize'); + } } } catch (e) { _log(text: '❌ Udp result data error ----> $e'); diff --git a/lib/talk/startChart/start_chart_talk_status.dart b/lib/talk/startChart/start_chart_talk_status.dart index 2d94e242..013eac85 100644 --- a/lib/talk/startChart/start_chart_talk_status.dart +++ b/lib/talk/startChart/start_chart_talk_status.dart @@ -11,6 +11,7 @@ enum TalkStatus { notTalkData, // 暂无通话数据 notTalkPing, // 暂无通话保持 error, // 错误状态 + end, // 结束 } class StartChartTalkStatus { @@ -101,4 +102,10 @@ class StartChartTalkStatus { _setStatus(TalkStatus.error); // 可以在这里添加特定于 "error" 状态的逻辑 } + + /// 设置状态为结束 + void setEnd() { + _setStatus(TalkStatus.end); + // 可以在这里添加特定于 "error" 状态的逻辑 + } }