From 2d508678d4c51e99df614b1dc13b00df6e97fa8d Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Sat, 23 Mar 2024 16:12:17 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=97=A0=E5=BA=94?= =?UTF-8?q?=E7=AD=94=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86=202=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=82=B9=E5=87=BB=E6=8E=A5=E5=90=AC=E6=97=A0?= =?UTF-8?q?=E5=8F=8D=E5=BA=94=E5=90=8E=E6=97=A0=E6=B3=95=E7=BB=A7=E7=BB=AD?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=97=AE=E9=A2=98=203=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=82=B9=E5=87=BB=E6=8C=82=E6=96=AD=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E6=9C=BA=E5=88=B6=204=EF=BC=8C=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=81=B6=E5=8F=91=E7=9A=84=E7=9F=AD=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=93=8D=E9=93=83=E8=87=AA=E5=8A=A8=E9=80=80=E5=87=BA=E5=AF=B9?= =?UTF-8?q?=E8=AE=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitoring/lockMonitoring_logic.dart | 64 ++++++++++++++++++- .../monitoring/lockMonitoring_page.dart | 20 ++++-- .../monitoring/lockMonitoring_state.dart | 20 ++++-- star_lock/lib/talk/udp/udp_reciverData.dart | 26 +++++--- star_lock/lib/talk/udp/udp_talkClass.dart | 36 ++++++++--- 5 files changed, 134 insertions(+), 32 deletions(-) diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart index 9b83b752..3c8501ae 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'dart:math'; import 'package:flutter/services.dart'; @@ -7,6 +6,7 @@ import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/talk/call/callTalk.dart'; +import 'package:star_lock/talk/udp/udp_talkClass.dart'; import '../../../../talk/call/g711.dart'; import '../../../../talk/udp/udp_manage.dart'; @@ -33,7 +33,7 @@ class LockMonitoringLogic extends BaseGetXController { // 预加载图片数据 Uint8List imageData = Uint8List.fromList(event.tvList); // 更新状态 - state.listData.value = imageData; + state.listPhotoData.value = imageData; } }); } @@ -54,6 +54,7 @@ class LockMonitoringLogic extends BaseGetXController { // 超过60秒了 state.oneMinuteTimeTimer.cancel(); state.oneMinuteTime.value = 0; + print('输出挂断1'); // 挂断 UDPSenderManage.sendMainProtocol( command: 150, @@ -74,8 +75,30 @@ class LockMonitoringLogic extends BaseGetXController { }); } + //发起接听命令,每隔一秒钟发一次,六秒无应答则失败 + void initiateUdpAnswerAction() { + state.answerTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + state.answerSeconds++; + udpAnswerAction(); + + //如果接听成功,取消定时器;接听失败,继续发接听命令 + if (UDPTalkClass().status == 8) { + state.answerTimer.cancel(); // 取消定时器 + return; + } + + // 检查条件,如果达到6秒且未得到应答,则认为失败 + if (state.answerSeconds >= 6) { + state.answerTimer.cancel(); + initiateUdpHangUpAction(); + // UDPTalkClass().callNoAnswer(); + } + }); + } + /// 接听 udpAnswerAction() async { + print('点了接听么'); UDPSenderManage.sendMainProtocol( command: 150, commandTypeIsCalling: 1, @@ -87,6 +110,27 @@ class LockMonitoringLogic extends BaseGetXController { endData: []); } + //发起挂断命令,每隔一秒钟发一次,六秒无应答则失败 + void initiateUdpHangUpAction() { + // 每隔一秒调用一次 udpHangUpAction 方法 + state.hangUpTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + state.hangUpSeconds++; + udpHangUpAction(); + + //如果已经挂断成功,则取消定时器 + if (UDPTalkClass().isEndCall == true) { + state.hangUpTimer.cancel(); + return; + } + + // 检查条件,如果达到6秒且未得到应答,则认为失败 + if (state.hangUpSeconds >= 6) { + state.hangUpTimer.cancel(); // 取消定时器 + UDPTalkClass().callNoAnswer(); + } + }); + } + /// 挂断 udpHangUpAction() async { UDPSenderManage.sendMainProtocol( @@ -100,6 +144,20 @@ class LockMonitoringLogic extends BaseGetXController { endData: []); } + //发起开门命令,每隔一秒钟发一次,六秒无应答则失败 + void initiateUdpOpenDoorAction(List list) { + // 每隔一秒调用一次 udpOpenDoorAction 方法 + state.openDoorTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + state.openDoorSeconds++; + udpOpenDoorAction(list); + + // 检查条件,如果达到6秒且未得到应答,则认为失败 + if (state.openDoorSeconds >= 6) { + state.openDoorTimer.cancel(); // 取消定时器 + } + }); + } + /// 开门 udpOpenDoorAction(List list) async { UDPSenderManage.sendMainProtocol( @@ -406,6 +464,6 @@ class LockMonitoringLogic extends BaseGetXController { state.oneMinuteTimeTimer.cancel(); } stopProcessing(); - state.listData.value = Uint8List(0); + state.listPhotoData.value = Uint8List(0); } } diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart index cd3a7164..da34612e 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -34,10 +36,10 @@ class _LockMonitoringPageState extends State { height: 1.sh, child: Stack( children: [ - Obx(() => state.listData.value.isEmpty + Obx(() => state.listPhotoData.value.isEmpty ? Container(color: Colors.transparent) : Image.memory( - state.listData.value, + state.listPhotoData.value, // key: ValueKey(state.listData.value.hashCode), gaplessPlayback: true, width: 1.sw, @@ -164,7 +166,10 @@ class _LockMonitoringPageState extends State { // 接听 Obx(() => bottomBtnItemWidget( getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async { - logic.udpAnswerAction(); + if (state.isClickAnswer.value == false) { + logic.initiateUdpAnswerAction(); + state.isClickAnswer.value = true; + } }, longPress: () { // 开始长按 print("onLongPress"); @@ -186,7 +191,12 @@ class _LockMonitoringPageState extends State { logic.stopProcessing(); CallTalk().stopPcmSound(); // 挂断 - logic.udpHangUpAction(); + if (state.isClickHangUp.value == false) { + logic.initiateUdpHangUpAction(); + state.isClickHangUp.value = true; + } else { + print('点了这里?'); + } }), bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", "开锁", AppColors.mainColor, () { @@ -298,7 +308,7 @@ class _LockMonitoringPageState extends State { } // state.isSenderAudioData.value = false; - print("发送接听了"); + // print("发送接听了"); // 刚进来是接听状态,然后改为长按对讲 }); } diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart index 0aa6ca7a..115baf05 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart @@ -10,16 +10,17 @@ import '../../../../tools/storage.dart'; class LockMonitoringState { var isOpenVoice = false.obs; - var udpSendDataFrameNumber = 0;// 帧序号 + var udpSendDataFrameNumber = 0; // 帧序号 // var isSenderAudioData = false.obs;// 是否要发送音频数据 var userMobileIP = NetworkInfo().getWifiIP(); var userUid = Storage.getUid(); - var udpStatus = 0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话 + var udpStatus = + 0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话 var passwordTF = TextEditingController(); - var listData = Uint8List(0).obs; //得到的视频流字节数据 + var listPhotoData = Uint8List(0).obs; //得到的视频流字节数据 var listAudioData = [].obs; //得到的音频流字节数据 late final VoiceProcessor? voiceProcessor; @@ -29,7 +30,14 @@ class LockMonitoringState { var oneMinuteTime = 0.obs; // 定时器秒数 // 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次 - late Timer answerTimer; - late Timer hangUpTimer; - late Timer openDoorTimer; + late Timer answerTimer = Timer(const Duration(seconds: 1), () {}); //接听命令定时器 + var answerSeconds = 0.obs; + var isClickAnswer = false.obs; //是否点击了接听按钮 + + late Timer hangUpTimer = Timer(const Duration(seconds: 1), () {}); //挂断命令定时器 + var hangUpSeconds = 0.obs; + var isClickHangUp = false.obs; //是否点击了挂断按钮 + + late Timer openDoorTimer = Timer(const Duration(seconds: 1), () {}); //开门命令定时器 + var openDoorSeconds = 0.obs; } diff --git a/star_lock/lib/talk/udp/udp_reciverData.dart b/star_lock/lib/talk/udp/udp_reciverData.dart index 799d6ca0..7b84f5f0 100644 --- a/star_lock/lib/talk/udp/udp_reciverData.dart +++ b/star_lock/lib/talk/udp/udp_reciverData.dart @@ -2,6 +2,8 @@ import 'dart:typed_data'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart'; +import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart'; import 'package:star_lock/talk/udp/udp_manage.dart'; import '../../blue/io_tool/io_tool.dart'; @@ -33,7 +35,7 @@ class CommandUDPReciverManager { // print("心跳包反馈 在线状态"); } else if (data[7] == 3) { // [Toast.show(msg: "您已在其他设备登录")]; - EasyLoading.showToast("您已在其他设备登录",duration: 2000.milliseconds); + EasyLoading.showToast("您已在其他设备登录", duration: 2000.milliseconds); } } else if (data[6] == 150) { // if( [Pub getApp].isBack){ @@ -95,7 +97,7 @@ class CommandUDPReciverManager { print("appReceiveUDPData:$data"); if ((data[7] & 0x3) == 2) { print("开门成功"); - EasyLoading.showToast("开门成功",duration: 2000.milliseconds); + EasyLoading.showToast("开门成功", duration: 2000.milliseconds); } else { print("开门失败"); } @@ -103,6 +105,7 @@ class CommandUDPReciverManager { break; case 30: { + print('反馈挂断1'); // 挂断 if ((data[7] & 0x3) == 1) { // 对方结束对讲 @@ -111,12 +114,15 @@ class CommandUDPReciverManager { //结束对讲反馈 print("结束对讲反馈"); } - UDPTalkClass().status = 0; - UDPTalkClass().isBeCall = false; - UDPTalkClass().stopLocalAudio(); - CallTalk().stopPcmSound(); - eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status)); - Get.back(); + UDPTalkClass().isEndCall = true; + LockMonitoringState().isClickHangUp.value = false; + UDPTalkClass().callNoAnswer(); + // UDPTalkClass().status = 0; + // UDPTalkClass().isBeCall = false; + // UDPTalkClass().stopLocalAudio(); + // CallTalk().stopPcmSound(); + // eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status)); + // Get.back(); } break; case 140: @@ -187,10 +193,10 @@ class CommandUDPReciverManager { if ((data[7] & 0x3) == 2) { print("开门成功"); // Toast.show(msg: "开门成功"); - EasyLoading.showToast("开门成功",duration: 2000.milliseconds); + EasyLoading.showToast("开门成功", duration: 2000.milliseconds); } else { print("开门失败"); - EasyLoading.showToast("开门失败",duration: 2000.milliseconds); + EasyLoading.showToast("开门失败", duration: 2000.milliseconds); } } break; diff --git a/star_lock/lib/talk/udp/udp_talkClass.dart b/star_lock/lib/talk/udp/udp_talkClass.dart index 8113bf71..1b766152 100644 --- a/star_lock/lib/talk/udp/udp_talkClass.dart +++ b/star_lock/lib/talk/udp/udp_talkClass.dart @@ -3,7 +3,9 @@ import 'package:audioplayers/audioplayers.dart'; import 'package:fast_gbk/fast_gbk.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart'; +import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart'; import 'package:star_lock/talk/call/callTalk.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; import '../../appRouters.dart'; import '../../tools/storage.dart'; import 'udp_manage.dart'; @@ -27,7 +29,11 @@ class UDPTalkClass { late Timer timer; // 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态 var isBeCall = false; + var isEndCall = false; //是否已经调用结束对讲 final audioPlayer = AudioPlayer(); + var playLocalAudioSecond = 0; + Timer playLocalAudioTimer = + Timer.periodic(const Duration(seconds: 1), (timer) {}); beCallW({List? data, String? ip, int? port}) async { print("beCall status:$status"); @@ -70,12 +76,20 @@ class UDPTalkClass { Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"}); } - Timer(const Duration(minutes: 1), () { - stopLocalAudio(); - callNoAnswer(); - }); - playLocalAudio(); + + if (isEndCall == true) { + print('已经结束对讲'); + return; + } + playLocalAudioTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + playLocalAudioSecond++; + // 检查条件,如果达到60秒且未得到应答,则认为失败 + if (playLocalAudioSecond >= 60) { + playLocalAudioTimer.cancel(); // 取消定时器 + // LockMonitoringLogic().initiateUdpHangUpAction(); + } + }); } else { // 忙 } @@ -136,10 +150,16 @@ class UDPTalkClass { //呼叫有响铃无应答处理 void callNoAnswer() { + print('无应答处理'); + + stopLocalAudio(); CallTalk().stopPcmSound(); - // 挂断 - LockMonitoringLogic().udpHangUpAction(); - // 关闭当前界面 + status = 0; + isBeCall = false; + isEndCall = false; + LockMonitoringState().isClickHangUp.value = false; + + eventBus.fire(GetUDPStatusRefreshUI(status)); Get.back(); } }