From aae65dbfad89883cf1dfb876db889b95b1bdc8f1 Mon Sep 17 00:00:00 2001 From: sky_min Date: Wed, 10 Dec 2025 17:48:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=AF=B9=E8=AE=B2=E5=92=8C?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockDetail/lockDetail_logic.dart | 4 +- .../handle/impl/udp_talk_hangup_handler.dart | 4 ++ lib/talk/starChart/star_chart_manage.dart | 37 ++++++++++++------- .../image_transmission_logic.dart | 3 ++ .../native/talk_view_native_decode_page.dart | 4 +- .../native/talk_view_native_decode_state.dart | 2 +- 6 files changed, 35 insertions(+), 19 deletions(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index e7bcae34..dd1d4866 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -926,8 +926,8 @@ class LockDetailLogic extends BaseGetXController { } // 重置丢包率监控 // PacketLossStatistics().reset(); - // 发送监控id - StartChartManage().startCallRequestMessageTimer(ToPeerId: network!.peerId ?? ''); + // 发送监控id - 监控模式不设置等待接听状态 + StartChartManage().startCallRequestMessageTimer(ToPeerId: network!.peerId ?? '', isMonitoring: true); } else { showToast('猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式'.tr); } diff --git a/lib/talk/starChart/handle/impl/udp_talk_hangup_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_hangup_handler.dart index c73dcce3..30500c63 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_hangup_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_hangup_handler.dart @@ -37,6 +37,8 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle startChartManage.stopSendingRbcuInfoMessages(); startChartManage.stopSendingRbcuProBeMessages(); startChartManage.stopTalkHangupMessageTimer(); + // 设置最终结束状态 + talkStatus.setEnd(); Get.back(); } } @@ -55,6 +57,8 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle startChartManage.stopSendingRbcuInfoMessages(); startChartManage.stopSendingRbcuProBeMessages(); startChartManage.stopTalkHangupMessageTimer(); + // 设置最终结束状态 + talkStatus.setEnd(); } @override diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index b44a131c..1c5f3890 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -433,7 +433,10 @@ class StartChartManage { } /// 启动持续发送对讲请求 - void startCallRequestMessageTimer({required String ToPeerId}) async { + void startCallRequestMessageTimer({required String ToPeerId, bool isMonitoring = false}) async { + // 更新全局ToPeerId为当前要连接的锁的peerId + this.ToPeerId = ToPeerId; + this.lockPeerId = ToPeerId; // 如果已经处于等待接听状态就不发送 // if (talkStatus.status != TalkStatus.proactivelyCallWaitingAnswer) { // // 如果是h264则跳转至webview @@ -477,9 +480,12 @@ class StartChartManage { await sendCallRequestMessage(ToPeerId: ToPeerId); }, ); - talkStatus.setProactivelyCallWaitingAnswer(); - // 启动对讲请求应答超时判断 - talkeRequestOverTimeTimerManager.start(); + // 只有非监控模式才设置为等待接听状态 + if (!isMonitoring) { + talkStatus.setProactivelyCallWaitingAnswer(); + // 启动对讲请求应答超时判断 + talkeRequestOverTimeTimerManager.start(); + } } /// 停止持续发送对讲请求 @@ -730,19 +736,19 @@ class StartChartManage { // _log(text: '发送通话保持'); } - void _sendTalkHangupMessage() async { + Future _sendTalkHangupMessage() async { final message = MessageCommand.talkHangupMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true), ); - // try { - // await _sendMessage(message: message); - // } catch (e) { - // // 记录日志但不中断程序执行 - // AppLog.log('发送挂断消息失败: $e'); - // // 不抛出异常,避免应用崩溃 - // } + try { + await _sendMessage(message: message); + } catch (e) { + // 记录日志但不中断程序执行 + AppLog.log('发送挂断消息失败: $e'); + // 不抛出异常,避免应用崩溃 + } } // 发送通话中挂断消息 @@ -751,7 +757,7 @@ class StartChartManage { talkHangupTimer ??= Timer.periodic( Duration(seconds: _defaultIntervalTime), (Timer timer) async { - _sendTalkHangupMessage(); + await _sendTalkHangupMessage(); }, ); @@ -1250,7 +1256,7 @@ class StartChartManage { final message = MessageCommand.bleMessage( FromPeerId: FromPeerId, ToPeerId: lockPeerId, - MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true), + MessageId: MessageCommand.getNextMessageId(lockPeerId, increment: true), bluetoothDeviceName: bluetoothDeviceName, bleStructData: bleStructData, ); @@ -1265,6 +1271,9 @@ class StartChartManage { status == TalkStatus.proactivelyCallWaitingAnswer || status == TalkStatus.answeredSuccessfully || status == TalkStatus.uninitialized) { + // 先发送一次挂断消息 + await _sendTalkHangupMessage(); + // 再启动定时器确保消息能被接收 startTalkRejectMessageTimer(); startTalkHangupMessageTimer(); await Future.delayed(Duration(seconds: 1)); diff --git a/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart b/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart index e4500bc2..e0264db3 100644 --- a/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart +++ b/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart @@ -83,6 +83,9 @@ class ImageTransmissionLogic extends BaseGetXController { // 拒绝 StartChartManage().startTalkRejectMessageTimer(); } + // 完全释放资源,确保不会自动重新连接 + await Future.delayed(Duration(milliseconds: 500)); + StartChartManage().destruction(); Get.back(); } diff --git a/lib/talk/starChart/views/native/talk_view_native_decode_page.dart b/lib/talk/starChart/views/native/talk_view_native_decode_page.dart index 122b34de..c3305d19 100644 --- a/lib/talk/starChart/views/native/talk_view_native_decode_page.dart +++ b/lib/talk/starChart/views/native/talk_view_native_decode_page.dart @@ -410,7 +410,7 @@ class _TalkViewNativeDecodePageState extends State wit case TalkStatus.proactivelyCallWaitingAnswer: return 'images/main/icon_lockDetail_monitoringUnTalkback.png'; default: - return 'images/main/icon_lockDetail_monitoringAnswerCalls.png'; + return 'images/main/icon_lockDetail_monitoringUnTalkback.png'; } } @@ -427,7 +427,7 @@ class _TalkViewNativeDecodePageState extends State wit case TalkStatus.hangingUpDuring: return '长按说话'.tr; default: - return '接听'.tr; + return '长按说话'.tr; } } diff --git a/lib/talk/starChart/views/native/talk_view_native_decode_state.dart b/lib/talk/starChart/views/native/talk_view_native_decode_state.dart index 350961f1..0283db58 100644 --- a/lib/talk/starChart/views/native/talk_view_native_decode_state.dart +++ b/lib/talk/starChart/views/native/talk_view_native_decode_state.dart @@ -41,7 +41,7 @@ class TalkViewNativeDecodeState { TextEditingController passwordTF = TextEditingController(); RxList listAudioData = [].obs; //得到的音频流字节数据 - GlobalKey globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); Timer? oneMinuteTimeTimer; // 定时器超过60秒关闭当前界面 RxInt oneMinuteTime = 0.obs; // 定时器秒数