1,新增无应答逻辑处理

2,修复点击接听无反应后无法继续使用问题
3,修复点击挂断后的重连机制
4,解决偶发的短时间响铃自动退出对讲问题
This commit is contained in:
Daisy 2024-03-23 16:12:17 +08:00
parent de32c10be9
commit 2d508678d4
5 changed files with 134 additions and 32 deletions

View File

@ -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<int> 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<int> 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);
}
}

View File

@ -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<LockMonitoringPage> {
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<int>(state.listData.value.hashCode),
gaplessPlayback: true,
width: 1.sw,
@ -164,7 +166,10 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
//
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<LockMonitoringPage> {
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<LockMonitoringPage> {
}
// state.isSenderAudioData.value = false;
print("发送接听了");
// print("发送接听了");
//
});
}

View File

@ -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 = <int>[].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;
}

View File

@ -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;

View File

@ -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<int>? 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();
}
}