1,新增无应答逻辑处理
2,修复点击接听无反应后无法继续使用问题 3,修复点击挂断后的重连机制 4,解决偶发的短时间响铃自动退出对讲问题
This commit is contained in:
parent
de32c10be9
commit
2d508678d4
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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("发送接听了");
|
||||
// 刚进来是接听状态,然后改为长按对讲
|
||||
});
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user