From 25bbd0cd199b65a62541b6cce33b93c870f4017f Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 2 Jan 2025 10:27:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=8C=82=E6=96=AD?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E9=80=BB=E8=BE=91=E3=80=81=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=9C=AA=E7=99=BB=E5=BD=95=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=98=9F=E5=9B=BE=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E3=80=81=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9=E9=A2=84=E6=9C=9F?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E6=95=B0=E6=8D=AE=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/startChart/start_chart_manage.dart | 119 +++++++++++++++----- 1 file changed, 88 insertions(+), 31 deletions(-) diff --git a/lib/talk/startChart/start_chart_manage.dart b/lib/talk/startChart/start_chart_manage.dart index 454ad627..10022e9f 100644 --- a/lib/talk/startChart/start_chart_manage.dart +++ b/lib/talk/startChart/start_chart_manage.dart @@ -9,6 +9,7 @@ import 'package:get/get.dart'; import 'package:pointycastle/export.dart' as pc; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/flavors.dart'; +import 'package:star_lock/login/login/entity/LoginData.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/start_chart_api.dart'; @@ -24,6 +25,9 @@ import 'package:star_lock/talk/startChart/entity/report_information_data.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/entity/star_chart_register_node_entity.dart'; import 'package:star_lock/talk/startChart/exception/start_chart_message_exception.dart'; +import 'package:star_lock/talk/startChart/handle/other/talke_data_over_time_timer_manager.dart'; +import 'package:star_lock/talk/startChart/handle/other/talke_ping_over_time_timer_manager.dart'; +import 'package:star_lock/talk/startChart/handle/other/talke_request_over_time_timer_manager.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handler_factory.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; @@ -44,6 +48,12 @@ class StartChartManage { // 单例对象 static final StartChartManage _instance = StartChartManage._internal(); + final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager = + TalkeRequestOverTimeTimerManager(); + final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager = + TalkePingOverTimeTimerManager(); + final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager = + TalkDataOverTimeTimerManager(); // 工厂构造函数,返回单例对象 factory StartChartManage() { @@ -80,6 +90,7 @@ class StartChartManage { Timer? talkPingTimer; // 发送通话保持消息定时器 int talkExpectIntervalTime = 1; // 发送通话预期数据的消息间隔(s) Timer? talkExpectTimer; // 发送通话预期消息定时器 + Timer? talkAcceptTimer; // 重发同意接听消息定时器 int talkDataIntervalTime = 10; // 通话数据的消息间隔(ms) Timer? talkDataTimer; // 发送通话数据消息定时器 @@ -101,12 +112,15 @@ class StartChartManage { // 星图服务初始化 Future init() async { - if (isOnlineStartChartServer && _udpSocket != null) { + // 判断是否登录账户 + final loginData = await Storage.getLoginData(); + + if ((isOnlineStartChartServer && _udpSocket != null) || loginData == null) { // 如果已经上线就不进行初始化 return; } // 节点注册 - await _clientRegister(); + await _clientRegister(loginData); // 中继查询 await _relayQuery(); // 初始化udp服务 @@ -116,12 +130,10 @@ class StartChartManage { } /// 客户端注册 - Future _clientRegister() async { - final StarChartRegisterNodeEntity? registerNodeEntity = - await Storage.getStarChartRegisterNodeInfo(); - if (registerNodeEntity != null && registerNodeEntity.peer?.id != null) { - _log(text: '获取到星图注册节点信息:$registerNodeEntity'); - FromPeerId = registerNodeEntity.peer!.id ?? ''; + Future _clientRegister(LoginData? loginData) async { + if (loginData?.starchart?.starchartId != null) { + _log(text: '获取到星图注册节点信息:${loginData?.starchart}'); + FromPeerId = loginData?.starchart?.starchartId ?? ''; } else { _log(text: '开始注册客户端'); final StarChartRegisterNodeEntity requestStarChartRegisterNode = @@ -143,6 +155,8 @@ class StartChartManage { starchartPeerPublicKey: registerNodeEntity?.peer?.publicKey ?? '', starchartPeerPrivateKey: registerNodeEntity?.peer?.privateKey ?? '', ); + registerNodeEntity?.peer?.id = entity.data?.starchart?.starchartId; + await Storage.saveStarChartRegisterNodeInfo(registerNodeEntity!); if (entity.errorCode!.codeIsSuccessful) { AppLog.log('绑定成功'); } else { @@ -237,7 +251,7 @@ class StartChartManage { // 发送对讲请求消息 Future sendCallRequestMessage({required String ToPeerId}) async { - if (talkStatus.status == TalkStatus.duringCall) { + if (talkStatus.status == TalkStatus.answeredSuccessfully) { _log(text: '已经在通话中,请勿重复发送对讲请求'); return; } @@ -364,23 +378,13 @@ class StartChartManage { // 发送同意接听消息 void sendTalkAcceptMessage() async { - if (talkStatus.status == TalkStatus.duringCall) { - _log(text: '已经在通话中,请勿重复发送同意接听消息'); - return; - } - if (talkStatus.status != TalkStatus.waitingAnswer) { - _log(text: '当前未处于等待接听状态, 无法发送同意接听消息'); - return; - } final message = MessageCommand.talkAcceptMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true), ); await _sendMessage(message: message); - // 设置状态为等待接听 - talkStatus.setWaitingAnswer(); - // _log(text: '发送同意接听消息'); + stopTalkExpectMessageTimer(); } // 发送拒绝接听消息 @@ -400,6 +404,11 @@ class StartChartManage { StartChartTalkStatus.instance.setRejected(); // 停止播放铃声 AudioPlayerManager().stopRingtone(); + // 停止发送通话保持消息、通话预期数据请求 + stopTalkExpectMessageTimer(); + stopTalkPingMessageTimer(); + // 取消定时器 + talkePingOverTimeTimerManager.cancel(); } // 发送期望接受消息 @@ -456,7 +465,7 @@ class StartChartManage { // 发送通话中挂断消息 Future sendTalkHangupMessage() async { - if (talkStatus.status != TalkStatus.duringCall) { + if (talkStatus.status != TalkStatus.answeredSuccessfully) { _log(text: '当前未处于接听状态, 无法发送通话中挂断消息'); return; } @@ -471,6 +480,11 @@ class StartChartManage { StartChartTalkStatus.instance.setHangingUpDuring(); // 停止播放铃声 AudioPlayerManager().stopRingtone(); + // 停止发送通话保持消息、通话预期数据请求 + stopTalkExpectMessageTimer(); + stopTalkPingMessageTimer(); + // 取消定时器 + talkePingOverTimeTimerManager.cancel(); } // 重新上线 @@ -799,17 +813,21 @@ class StartChartManage { /// 获取公钥 Future getPublicKey() async { // 从缓存中获取星图注册节点信息 - final StarChartRegisterNodeEntity? starChartRegisterNodeInfo = - await Storage.getStarChartRegisterNodeInfo(); - return starChartRegisterNodeInfo?.peer?.publicKey ?? ''; + // final StarChartRegisterNodeEntity? starChartRegisterNodeInfo = + // await Storage.getStarChartRegisterNodeInfo(); + // return starChartRegisterNodeInfo?.peer?.publicKey ?? ''; + final loginData = await Storage.getLoginData(); + return loginData?.starchart?.starchartPeerPublicKey ?? ''; } /// 获取私钥 Future getPrivateKey() async { // 从缓存中获取星图注册节点信息 - final StarChartRegisterNodeEntity? starChartRegisterNodeInfo = - await Storage.getStarChartRegisterNodeInfo(); - return starChartRegisterNodeInfo?.peer?.privateKey ?? ''; + // final StarChartRegisterNodeEntity? starChartRegisterNodeInfo = + // await Storage.getStarChartRegisterNodeInfo(); + // return starChartRegisterNodeInfo?.peer?.privateKey ?? ''; + final loginData = await Storage.getLoginData(); + return loginData?.starchart?.starchartPeerPrivateKey ?? ''; } // 接收返回的数据 @@ -895,6 +913,23 @@ class StartChartManage { ); } + /// 通话期望数据定时器 + void startTalkAcceptTimer() { + talkAcceptTimer ??= Timer.periodic( + Duration( + seconds: talkExpectIntervalTime, + ), + (Timer timer) { + sendTalkAcceptMessage(); + }, + ); + } + + void stopTalkAcceptTimer() { + talkAcceptTimer?.cancel(); + talkAcceptTimer = null; // 清除定时器引用 + } + /// 通话数据定时器 void startTalkDataTimer() async { // 如果已经启动了就不运行 @@ -1010,22 +1045,44 @@ class StartChartManage { } /// 修改预期接收到的数据 - void changeTalkExpectDataType({required TalkExpectReq talkExpect}) { + void changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( + {required TalkExpectReq talkExpect}) { _defaultTalkExpect = talkExpect; reStartTalkExpectMessageTimer(); } + /// 修改预期接收到的数据 + void sendOnlyImageVideoTalkExpectData() { + final talkExpectReq = TalkExpectReq( + videoType: [VideoTypeE.IMAGE], + audioType: [], + ); + changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( + talkExpect: talkExpectReq); + } + + + /// 修改预期接收到的数据 + void sendImageVideoAndG711AudioTalkExpectData() { + final talkExpectReq = TalkExpectReq( + videoType: [VideoTypeE.IMAGE], + audioType: [AudioTypeE.G711], + ); + changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( + talkExpect: talkExpectReq); + } + /// 销毁资源 void destruction() async { isOnlineStartChartServer = false; + stopHeartbeat(); stopTalkExpectMessageTimer(); stopTalkPingMessageTimer(); - stopHeartbeat(); stopReStartOnlineStartChartServer(); stopTalkDataTimer(); _resetData(); - // await Storage.removerRelayInfo(); - // await Storage.removerStarChartRegisterNodeInfo(); + await Storage.removerRelayInfo(); + await Storage.removerStarChartRegisterNodeInfo(); } void _resetData() {