1,新增无应答逻辑处理
2,修复点击接听无反应后无法继续使用问题 3,修复点击挂断后的重连机制 4,解决偶发的短时间响铃自动退出对讲问题
This commit is contained in:
parent
de32c10be9
commit
2d508678d4
@ -1,5 +1,4 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
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:get/get.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:star_lock/talk/call/callTalk.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/call/g711.dart';
|
||||||
import '../../../../talk/udp/udp_manage.dart';
|
import '../../../../talk/udp/udp_manage.dart';
|
||||||
@ -33,7 +33,7 @@ class LockMonitoringLogic extends BaseGetXController {
|
|||||||
// 预加载图片数据
|
// 预加载图片数据
|
||||||
Uint8List imageData = Uint8List.fromList(event.tvList);
|
Uint8List imageData = Uint8List.fromList(event.tvList);
|
||||||
// 更新状态
|
// 更新状态
|
||||||
state.listData.value = imageData;
|
state.listPhotoData.value = imageData;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -54,6 +54,7 @@ class LockMonitoringLogic extends BaseGetXController {
|
|||||||
// 超过60秒了
|
// 超过60秒了
|
||||||
state.oneMinuteTimeTimer.cancel();
|
state.oneMinuteTimeTimer.cancel();
|
||||||
state.oneMinuteTime.value = 0;
|
state.oneMinuteTime.value = 0;
|
||||||
|
print('输出挂断1');
|
||||||
// 挂断
|
// 挂断
|
||||||
UDPSenderManage.sendMainProtocol(
|
UDPSenderManage.sendMainProtocol(
|
||||||
command: 150,
|
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 {
|
udpAnswerAction() async {
|
||||||
|
print('点了接听么');
|
||||||
UDPSenderManage.sendMainProtocol(
|
UDPSenderManage.sendMainProtocol(
|
||||||
command: 150,
|
command: 150,
|
||||||
commandTypeIsCalling: 1,
|
commandTypeIsCalling: 1,
|
||||||
@ -87,6 +110,27 @@ class LockMonitoringLogic extends BaseGetXController {
|
|||||||
endData: []);
|
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 {
|
udpHangUpAction() async {
|
||||||
UDPSenderManage.sendMainProtocol(
|
UDPSenderManage.sendMainProtocol(
|
||||||
@ -100,6 +144,20 @@ class LockMonitoringLogic extends BaseGetXController {
|
|||||||
endData: []);
|
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 {
|
udpOpenDoorAction(List<int> list) async {
|
||||||
UDPSenderManage.sendMainProtocol(
|
UDPSenderManage.sendMainProtocol(
|
||||||
@ -406,6 +464,6 @@ class LockMonitoringLogic extends BaseGetXController {
|
|||||||
state.oneMinuteTimeTimer.cancel();
|
state.oneMinuteTimeTimer.cancel();
|
||||||
}
|
}
|
||||||
stopProcessing();
|
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/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
@ -34,10 +36,10 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
|||||||
height: 1.sh,
|
height: 1.sh,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
Obx(() => state.listData.value.isEmpty
|
Obx(() => state.listPhotoData.value.isEmpty
|
||||||
? Container(color: Colors.transparent)
|
? Container(color: Colors.transparent)
|
||||||
: Image.memory(
|
: Image.memory(
|
||||||
state.listData.value,
|
state.listPhotoData.value,
|
||||||
// key: ValueKey<int>(state.listData.value.hashCode),
|
// key: ValueKey<int>(state.listData.value.hashCode),
|
||||||
gaplessPlayback: true,
|
gaplessPlayback: true,
|
||||||
width: 1.sw,
|
width: 1.sw,
|
||||||
@ -164,7 +166,10 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
|||||||
// 接听
|
// 接听
|
||||||
Obx(() => bottomBtnItemWidget(
|
Obx(() => bottomBtnItemWidget(
|
||||||
getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async {
|
getAnswerBtnImg(), getAnswerBtnName(), Colors.white, () async {
|
||||||
logic.udpAnswerAction();
|
if (state.isClickAnswer.value == false) {
|
||||||
|
logic.initiateUdpAnswerAction();
|
||||||
|
state.isClickAnswer.value = true;
|
||||||
|
}
|
||||||
}, longPress: () {
|
}, longPress: () {
|
||||||
// 开始长按
|
// 开始长按
|
||||||
print("onLongPress");
|
print("onLongPress");
|
||||||
@ -186,7 +191,12 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
|||||||
logic.stopProcessing();
|
logic.stopProcessing();
|
||||||
CallTalk().stopPcmSound();
|
CallTalk().stopPcmSound();
|
||||||
// 挂断
|
// 挂断
|
||||||
logic.udpHangUpAction();
|
if (state.isClickHangUp.value == false) {
|
||||||
|
logic.initiateUdpHangUpAction();
|
||||||
|
state.isClickHangUp.value = true;
|
||||||
|
} else {
|
||||||
|
print('点了这里?');
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png",
|
bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png",
|
||||||
"开锁", AppColors.mainColor, () {
|
"开锁", AppColors.mainColor, () {
|
||||||
@ -298,7 +308,7 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// state.isSenderAudioData.value = false;
|
// state.isSenderAudioData.value = false;
|
||||||
print("发送接听了");
|
// print("发送接听了");
|
||||||
// 刚进来是接听状态,然后改为长按对讲
|
// 刚进来是接听状态,然后改为长按对讲
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,16 +10,17 @@ import '../../../../tools/storage.dart';
|
|||||||
|
|
||||||
class LockMonitoringState {
|
class LockMonitoringState {
|
||||||
var isOpenVoice = false.obs;
|
var isOpenVoice = false.obs;
|
||||||
var udpSendDataFrameNumber = 0;// 帧序号
|
var udpSendDataFrameNumber = 0; // 帧序号
|
||||||
// var isSenderAudioData = false.obs;// 是否要发送音频数据
|
// var isSenderAudioData = false.obs;// 是否要发送音频数据
|
||||||
|
|
||||||
var userMobileIP = NetworkInfo().getWifiIP();
|
var userMobileIP = NetworkInfo().getWifiIP();
|
||||||
var userUid = Storage.getUid();
|
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 passwordTF = TextEditingController();
|
||||||
|
|
||||||
var listData = Uint8List(0).obs; //得到的视频流字节数据
|
var listPhotoData = Uint8List(0).obs; //得到的视频流字节数据
|
||||||
var listAudioData = <int>[].obs; //得到的音频流字节数据
|
var listAudioData = <int>[].obs; //得到的音频流字节数据
|
||||||
|
|
||||||
late final VoiceProcessor? voiceProcessor;
|
late final VoiceProcessor? voiceProcessor;
|
||||||
@ -29,7 +30,14 @@ class LockMonitoringState {
|
|||||||
var oneMinuteTime = 0.obs; // 定时器秒数
|
var oneMinuteTime = 0.obs; // 定时器秒数
|
||||||
|
|
||||||
// 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次
|
// 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次
|
||||||
late Timer answerTimer;
|
late Timer answerTimer = Timer(const Duration(seconds: 1), () {}); //接听命令定时器
|
||||||
late Timer hangUpTimer;
|
var answerSeconds = 0.obs;
|
||||||
late Timer openDoorTimer;
|
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:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.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 'package:star_lock/talk/udp/udp_manage.dart';
|
||||||
|
|
||||||
import '../../blue/io_tool/io_tool.dart';
|
import '../../blue/io_tool/io_tool.dart';
|
||||||
@ -33,7 +35,7 @@ class CommandUDPReciverManager {
|
|||||||
// print("心跳包反馈 在线状态");
|
// print("心跳包反馈 在线状态");
|
||||||
} else if (data[7] == 3) {
|
} else if (data[7] == 3) {
|
||||||
// [Toast.show(msg: "您已在其他设备登录")];
|
// [Toast.show(msg: "您已在其他设备登录")];
|
||||||
EasyLoading.showToast("您已在其他设备登录",duration: 2000.milliseconds);
|
EasyLoading.showToast("您已在其他设备登录", duration: 2000.milliseconds);
|
||||||
}
|
}
|
||||||
} else if (data[6] == 150) {
|
} else if (data[6] == 150) {
|
||||||
// if( [Pub getApp].isBack){
|
// if( [Pub getApp].isBack){
|
||||||
@ -95,7 +97,7 @@ class CommandUDPReciverManager {
|
|||||||
print("appReceiveUDPData:$data");
|
print("appReceiveUDPData:$data");
|
||||||
if ((data[7] & 0x3) == 2) {
|
if ((data[7] & 0x3) == 2) {
|
||||||
print("开门成功");
|
print("开门成功");
|
||||||
EasyLoading.showToast("开门成功",duration: 2000.milliseconds);
|
EasyLoading.showToast("开门成功", duration: 2000.milliseconds);
|
||||||
} else {
|
} else {
|
||||||
print("开门失败");
|
print("开门失败");
|
||||||
}
|
}
|
||||||
@ -103,6 +105,7 @@ class CommandUDPReciverManager {
|
|||||||
break;
|
break;
|
||||||
case 30:
|
case 30:
|
||||||
{
|
{
|
||||||
|
print('反馈挂断1');
|
||||||
// 挂断
|
// 挂断
|
||||||
if ((data[7] & 0x3) == 1) {
|
if ((data[7] & 0x3) == 1) {
|
||||||
// 对方结束对讲
|
// 对方结束对讲
|
||||||
@ -111,12 +114,15 @@ class CommandUDPReciverManager {
|
|||||||
//结束对讲反馈
|
//结束对讲反馈
|
||||||
print("结束对讲反馈");
|
print("结束对讲反馈");
|
||||||
}
|
}
|
||||||
UDPTalkClass().status = 0;
|
UDPTalkClass().isEndCall = true;
|
||||||
UDPTalkClass().isBeCall = false;
|
LockMonitoringState().isClickHangUp.value = false;
|
||||||
UDPTalkClass().stopLocalAudio();
|
UDPTalkClass().callNoAnswer();
|
||||||
CallTalk().stopPcmSound();
|
// UDPTalkClass().status = 0;
|
||||||
eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status));
|
// UDPTalkClass().isBeCall = false;
|
||||||
Get.back();
|
// UDPTalkClass().stopLocalAudio();
|
||||||
|
// CallTalk().stopPcmSound();
|
||||||
|
// eventBus.fire(GetUDPStatusRefreshUI(UDPTalkClass().status));
|
||||||
|
// Get.back();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 140:
|
case 140:
|
||||||
@ -187,10 +193,10 @@ class CommandUDPReciverManager {
|
|||||||
if ((data[7] & 0x3) == 2) {
|
if ((data[7] & 0x3) == 2) {
|
||||||
print("开门成功");
|
print("开门成功");
|
||||||
// Toast.show(msg: "开门成功");
|
// Toast.show(msg: "开门成功");
|
||||||
EasyLoading.showToast("开门成功",duration: 2000.milliseconds);
|
EasyLoading.showToast("开门成功", duration: 2000.milliseconds);
|
||||||
} else {
|
} else {
|
||||||
print("开门失败");
|
print("开门失败");
|
||||||
EasyLoading.showToast("开门失败",duration: 2000.milliseconds);
|
EasyLoading.showToast("开门失败", duration: 2000.milliseconds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -3,7 +3,9 @@ import 'package:audioplayers/audioplayers.dart';
|
|||||||
import 'package:fast_gbk/fast_gbk.dart';
|
import 'package:fast_gbk/fast_gbk.dart';
|
||||||
import 'package:get/get.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_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/talk/call/callTalk.dart';
|
||||||
|
import 'package:star_lock/tools/eventBusEventManage.dart';
|
||||||
import '../../appRouters.dart';
|
import '../../appRouters.dart';
|
||||||
import '../../tools/storage.dart';
|
import '../../tools/storage.dart';
|
||||||
import 'udp_manage.dart';
|
import 'udp_manage.dart';
|
||||||
@ -27,7 +29,11 @@ class UDPTalkClass {
|
|||||||
late Timer timer;
|
late Timer timer;
|
||||||
// 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态
|
// 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态
|
||||||
var isBeCall = false;
|
var isBeCall = false;
|
||||||
|
var isEndCall = false; //是否已经调用结束对讲
|
||||||
final audioPlayer = AudioPlayer();
|
final audioPlayer = AudioPlayer();
|
||||||
|
var playLocalAudioSecond = 0;
|
||||||
|
Timer playLocalAudioTimer =
|
||||||
|
Timer.periodic(const Duration(seconds: 1), (timer) {});
|
||||||
|
|
||||||
beCallW({List<int>? data, String? ip, int? port}) async {
|
beCallW({List<int>? data, String? ip, int? port}) async {
|
||||||
print("beCall status:$status");
|
print("beCall status:$status");
|
||||||
@ -70,12 +76,20 @@ class UDPTalkClass {
|
|||||||
|
|
||||||
Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"});
|
Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"});
|
||||||
}
|
}
|
||||||
Timer(const Duration(minutes: 1), () {
|
|
||||||
stopLocalAudio();
|
|
||||||
callNoAnswer();
|
|
||||||
});
|
|
||||||
|
|
||||||
playLocalAudio();
|
playLocalAudio();
|
||||||
|
|
||||||
|
if (isEndCall == true) {
|
||||||
|
print('已经结束对讲');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
playLocalAudioTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||||
|
playLocalAudioSecond++;
|
||||||
|
// 检查条件,如果达到60秒且未得到应答,则认为失败
|
||||||
|
if (playLocalAudioSecond >= 60) {
|
||||||
|
playLocalAudioTimer.cancel(); // 取消定时器
|
||||||
|
// LockMonitoringLogic().initiateUdpHangUpAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
// 忙
|
// 忙
|
||||||
}
|
}
|
||||||
@ -136,10 +150,16 @@ class UDPTalkClass {
|
|||||||
|
|
||||||
//呼叫有响铃无应答处理
|
//呼叫有响铃无应答处理
|
||||||
void callNoAnswer() {
|
void callNoAnswer() {
|
||||||
|
print('无应答处理');
|
||||||
|
|
||||||
|
stopLocalAudio();
|
||||||
CallTalk().stopPcmSound();
|
CallTalk().stopPcmSound();
|
||||||
// 挂断
|
status = 0;
|
||||||
LockMonitoringLogic().udpHangUpAction();
|
isBeCall = false;
|
||||||
// 关闭当前界面
|
isEndCall = false;
|
||||||
|
LockMonitoringState().isClickHangUp.value = false;
|
||||||
|
|
||||||
|
eventBus.fire(GetUDPStatusRefreshUI(status));
|
||||||
Get.back();
|
Get.back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user