From 661ba90f085e318e624243ca775cf0434e03d3b9 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 9 Dec 2024 11:06:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=AF=B9=E8=AE=B2?= =?UTF-8?q?=E6=8E=A5=E5=90=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handle/impl/udp_talk_accept_handler.dart | 78 ++++++++++++------- .../handle/impl/udp_talk_data_handler.dart | 4 +- .../handle/impl/udp_talk_expect_handler.dart | 8 +- .../handle/impl/udp_talk_ping_handler.dart | 5 +- .../handle/impl/udp_talk_reject_handler.dart | 8 +- .../handle/impl/udp_talk_request_handler.dart | 76 +++++++++--------- lib/talk/startChart/start_chart_manage.dart | 42 ++++++++-- 7 files changed, 137 insertions(+), 84 deletions(-) diff --git a/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart index 81976361..6998b8fd 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_accept_handler.dart @@ -10,40 +10,28 @@ import '../../start_chart_manage.dart'; class UdpTalkAcceptHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - - @override void handleReq(ScpMessage scpMessage) { - // TODO: 收到同意接听请求 + print('收到同意接听请求'); + // 回复同意接听消息 + startChartManage.sendGenericRespSuccessMessage( + ToPeerId: scpMessage.FromPeerId!, + FromPeerId: scpMessage.ToPeerId!, + PayloadType: scpMessage.PayloadType!, + ); } @override void handleResp(ScpMessage scpMessage) { - // TODO: 收到同意接听回复 + // 收到同意接听回复 final GenericResp genericResp = scpMessage.Payload; if (checkGenericRespSuccess(genericResp)) { - // 同意接听 - // 回复成功消息 - startChartManage.sendGenericRespSuccessMessage( - ToPeerId: scpMessage.FromPeerId!, - FromPeerId: scpMessage.ToPeerId!, - PayloadType: scpMessage.PayloadType!, - ); - // 启动通话保持 - startChartManage.startTalkPingMessageTimer(); - // 启动通话保持监听定时器 - talkePingOverTimeTimerManager.startTimer(); - // 设置通话保持超时后的事件 - talkePingOverTimeTimerManager.setOnTimeout(() { - EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds); - }); - - // 启动对讲数据监听定时器 - talkDataOverTimeTimerManager.startTimer(); - // 设置对讲数据超时后的事件 - talkDataOverTimeTimerManager.setOnTimeout(() { - EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds); - }); + // 启动通话保持定时器 + _handleStartTalkPing(); + // 启动通话数据检查的定时器 + _handleCheckTalkDataTimer(); + // 启动发送预期数据请求 + _handleStartSendTalkExpectDataRequest(); } } @@ -53,8 +41,42 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle } @override - void handleRealTimeData(ScpMessage scpMessage - ) { + void handleRealTimeData(ScpMessage scpMessage) { // TODO: implement handleRealTimeData } + + // 启动通话保持 + void _handleStartTalkPing() { + // 启动通话保持 + startChartManage.startTalkPingMessageTimer(); + // 启动通话保持监听定时器(用来判断如果x秒内没有收到通话保持则执行的操作) + talkePingOverTimeTimerManager.startTimer(); + // 设置通话保持超时后的事件 + talkePingOverTimeTimerManager.setOnTimeout(() { + EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds); + // 停止发送通话保持的命令 + startChartManage.stopTalkPingMessageTimer(); + startChartManage.stopTalkExpectMessageTimer(); + startChartManage.changeCallingStatus(false); + }); + } + + /// 启动通话数据的检查,判断x秒内是否收到通话数据 + void _handleCheckTalkDataTimer() { + // 启动对讲数据监听定时器 + talkDataOverTimeTimerManager.startTimer(); + // 设置对讲数据超时后的事件 + talkDataOverTimeTimerManager.setOnTimeout(() { + EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds); + startChartManage.stopTalkPingMessageTimer(); + startChartManage.stopTalkExpectMessageTimer(); + startChartManage.changeCallingStatus(false); + }); + } + + /// 启动发送预期数据请求 + void _handleStartSendTalkExpectDataRequest() { + // 启动发送预期数据定时器 + startChartManage.startTalkExpectTimer(); + } } 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 44f23ce4..154bbc43 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_data_handler.dart @@ -10,8 +10,6 @@ import '../../start_chart_manage.dart'; class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - - @override void handleReq(ScpMessage scpMessage) { // TODO: 收到音视频数据请求 @@ -21,6 +19,8 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle void handleResp(ScpMessage scpMessage) { // TODO: 收到音视频数据回复 print('收到音视频数据'); + // 收到数据后调用更新,防止定时器超时 + talkDataOverTimeTimerManager.receiveMessage(); } @override diff --git a/lib/talk/startChart/handle/impl/udp_talk_expect_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_expect_handler.dart index 8c7f2543..9c7af858 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_expect_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_expect_handler.dart @@ -10,8 +10,6 @@ import '../../start_chart_manage.dart'; class UdpTalkExpectHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - - @override void handleReq(ScpMessage scpMessage) { // TODO: 收到预期音视频数据请求 @@ -19,7 +17,11 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle @override void handleResp(ScpMessage scpMessage) { - // TODO: 收到预期音视频数据回复 + // 收到预期音视频数据回复 + final GenericResp genericResp = scpMessage.Payload; + if (checkGenericRespSuccess(genericResp)) { + print('收到预期数据成功'); + } } @override diff --git a/lib/talk/startChart/handle/impl/udp_talk_ping_handler.dart b/lib/talk/startChart/handle/impl/udp_talk_ping_handler.dart index f138c6bc..f6e2eb2a 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_ping_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_ping_handler.dart @@ -14,14 +14,13 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle @override void handleResp(ScpMessage scpMessage) { - // TODO: 收到通话保持回复 + // 收到通话保持回复 final GenericResp genericResp = scpMessage.Payload; if (checkGenericRespSuccess(genericResp)) { - // 收到消息 + // 收到消息,重新触发定时器 talkePingOverTimeTimerManager.receiveMessage(); // 修改状态 startChartManage.changeCallingStatus(true); - } } 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 58eb9faa..7aa8bb32 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_reject_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_reject_handler.dart @@ -10,11 +10,6 @@ import '../../start_chart_manage.dart'; class UdpTalkRejectHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - @override - void handle(ScpMessage scpMessage) { - print('收到接听拒绝'); - } - @override void handleReq(ScpMessage scpMessage) { // TODO: 收到接听拒绝请求 @@ -22,7 +17,8 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle @override void handleResp(ScpMessage scpMessage) { - // TODO: 收到接听拒绝回复 + // 收到接听拒绝回复 + EasyLoading.showToast('对方已经拒绝接听', duration: 2000.milliseconds); } @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 dbb34da1..0647a946 100644 --- a/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/startChart/handle/impl/udp_talk_request_handler.dart @@ -15,52 +15,24 @@ import '../../start_chart_manage.dart'; class UdpTalkRequestHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - - - // 来电事件的处理 - void _talkRequestEvent() { - playRingtone(); - _showTalkRequestNotification(); - // 收到呼叫请求,跳转到接听页面 - Get.toNamed( - Routers.lockMonitoringPage, - arguments: {'lockId': '111'}, - ); - } - - // 收到来电请求时进行本地通知 - Future _showTalkRequestNotification() async { - const AndroidNotificationDetails androidPlatformChannelSpecifics = - AndroidNotificationDetails('1', 'flutter_channel', - importance: Importance.max, - priority: Priority.high, - playSound: true, - ticker: 'ticker'); - const NotificationDetails platformChannelSpecifics = - NotificationDetails(android: androidPlatformChannelSpecifics); - // 获取锁名 - String? getLockName = await Storage.getString(saveLockAlias); - final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); - // 执行本地通知 - await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr, - '${'收到来自'.tr}($getLockName)${'锁的呼叫'.tr}。', platformChannelSpecifics, - payload: 'item x'); - } - @override void handleReq(ScpMessage scpMessage) { // 收到对讲请求 - print('收到对讲请求:${scpMessage}'); final TalkReq talkReq = scpMessage.Payload; - // 回复成功消息 + // 回复收到对讲成功的消息 startChartManage.sendGenericRespSuccessMessage( ToPeerId: scpMessage.FromPeerId!, FromPeerId: scpMessage.ToPeerId!, PayloadType: scpMessage.PayloadType!, ); + startChartManage.FromPeerId = scpMessage.ToPeerId!; + startChartManage.ToPeerId = scpMessage.FromPeerId!; // 处理收到接听请求后的事件 - _talkRequestEvent(); + // _talkRequestEvent(talkObjectName: talkReq.callerName); + + Future.delayed(Duration(seconds: 1), () { + startChartManage.sendTalkAcceptMessage(); + }); } @override @@ -81,4 +53,36 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle void handleRealTimeData(ScpMessage scpMessage) { // TODO: implement handleRealTimeData } + + // 来电事件的处理 + void _talkRequestEvent({required String talkObjectName}) { + playRingtone(); + _showTalkRequestNotification(talkObjectName: talkObjectName); + // 收到呼叫请求,跳转到接听页面 + Get.toNamed( + Routers.lockMonitoringPage, + arguments: {'lockId': '111'}, + ); + } + + // 收到来电请求时进行本地通知 + Future _showTalkRequestNotification( + {required String talkObjectName}) async { + const AndroidNotificationDetails androidPlatformChannelSpecifics = + AndroidNotificationDetails('1', 'flutter_channel', + importance: Importance.max, + priority: Priority.high, + playSound: true, + ticker: 'ticker'); + const NotificationDetails platformChannelSpecifics = + NotificationDetails(android: androidPlatformChannelSpecifics); + // 获取锁名 + // String? getLockName = await Storage.getString(saveLockAlias); + final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + // 执行本地通知 + await flutterLocalNotificationsPlugin.show(0, '呼叫提醒'.tr, + '${'收到来自'.tr}($talkObjectName)${'锁的呼叫'.tr}。', platformChannelSpecifics, + payload: 'item x'); + } } diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index 530483a9..b59e9905 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -64,9 +64,16 @@ class StartChartManage { Timer? reStartOnlineStartChartServerTimer; // 重新上线定时器 int talkPingIntervalTime = 1; // 发送通话保持消息间隔(s) Timer? talkPingTimer; // 发送通话保持消息定时器 + int talkExpectIntervalTime = 1; // 发送通话预期数据的消息间隔(s) + Timer? talkExpectTimer; // 发送通话预期消息定时器 + + // 默认通话的期望数据格式 + TalkExpect defaultTalkExpect = TalkExpect( + videoType: [TalkExpect_VideoTypeE.H264], + audioType: [TalkExpect_AudioTypeE.G711], + ); String relayPeerId = ''; // 中继peerId - bool _calling = false; // 是否处于通话中 // 星图服务初始化 @@ -255,14 +262,11 @@ class StartChartManage { } // 发送期望接受消息 - void sendTalkExpectMessage() async { + void sendTalkExpectMessage({required TalkExpect talkExpect}) async { final message = MessageCommand.talkExpectMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, - talkExpect: TalkExpect( - videoType: [TalkExpect_VideoTypeE.H264], - audioType: [TalkExpect_AudioTypeE.G711], - ), + talkExpect: talkExpect, ); await _sendMessage(message: message); } @@ -707,4 +711,30 @@ class StartChartManage { talkPingTimer?.cancel(); talkPingTimer = null; // 清除定时器引用 } + + /// 通话期望数据定时器 + void startTalkExpectTimer() { + talkExpectTimer ??= Timer.periodic( + Duration( + seconds: talkExpectIntervalTime, + ), + (Timer timer) { + // 发送期望接受消息 + sendTalkExpectMessage( + talkExpect: defaultTalkExpect, + ); + }, + ); + } + + // 停止发送通话期望数据 + void stopTalkExpectMessageTimer() { + talkExpectTimer?.cancel(); + talkExpectTimer = null; // 清除定时器引用 + } + + /// 修改预期接收到的数据 + void changeTalkExpectDataType({required TalkExpect talkExpect}) { + defaultTalkExpect = talkExpect; + } }