fix:调整定时器超时逻辑

This commit is contained in:
liyi 2024-12-30 17:26:30 +08:00
parent 63501088e1
commit 13e3839d67
15 changed files with 245 additions and 121 deletions

View File

@ -0,0 +1,7 @@
class TalkConstant {
// TalkPing (s)
static const int talkePingOverTime = 6;
static const int talkeDataOverTime = 6;
// TalkRequest (s)
static const int talkeRequestOverTime = 30;
}

View File

@ -5,6 +5,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
@ -24,24 +25,26 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
@override
void handleResp(ScpMessage scpMessage) {
if (talkStatus.status != TalkStatus.waitingAnswer) {
//
return;
}
//
final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) {
Future.delayed(Duration(seconds: 1), () {
//
_handleStartTalkPing();
//
_handleStartSendTalkExpectDataRequest();
//
_handleCheckTalkDataTimer();
});
//
_handleStartTalkPing();
//
_handleStartSendTalkExpectDataRequest();
//
// _handleCheckTalkDataTimer();
//
stopRingtone();
//
talkStatus.setAnsweredSuccessfully();
//
talkeRequestOverTimeTimerManager.receiveMessage();
talkeRequestOverTimeTimerManager.dispose();
// //
// talkeRequestOverTimeTimerManager.renewTimer();
// talkeRequestOverTimeTimerManager.dispose();
}
}
@ -80,30 +83,13 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
//
startChartManage.startTalkPingMessageTimer();
// x秒内没有收到通话保持则执行的操作
talkePingOverTimeTimerManager.startTimer();
//
talkePingOverTimeTimerManager.setOnTimeout(() {
EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds);
//
startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer();
talkStatus.setNotTalkPing();
talkStatus.setEnd();
});
talkePingOverTimeTimerManager.start();
}
/// x秒内是否收到通话数据
void _handleCheckTalkDataTimer() {
//
talkDataOverTimeTimerManager.startTimer();
//
talkDataOverTimeTimerManager.setOnTimeout(() {
EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds);
startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer();
talkStatus.setNotTalkData();
talkStatus.setEnd();
});
// x秒内没有收到通话保持则执行的操作
talkDataOverTimeTimerManager.start();
}
///

View File

@ -30,7 +30,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
@override
void handleRealTimeData(ScpMessage scpMessage) {
//
talkDataOverTimeTimerManager.receiveMessage();
// talkDataOverTimeTimerManager.renew();
if (scpMessage.Payload != null) {
final TalkData talkData = scpMessage.Payload;
//

View File

@ -41,8 +41,8 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle
stopRingtone();
//
talkeRequestOverTimeTimerManager.receiveMessage();
talkeRequestOverTimeTimerManager.dispose();
// talkeRequestOverTimeTimerManager.renewTimer();
// talkeRequestOverTimeTimerManager.dispose();
}
@override

View File

@ -13,17 +13,18 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
implements ScpMessageHandler {
@override
void handleReq(ScpMessage scpMessage) {
// TODO:
// ,
replySuccessMessage(scpMessage);
}
@override
void handleResp(ScpMessage scpMessage) {
//
// print('收到通话保持回复');
final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) {
//
talkePingOverTimeTimerManager.receiveMessage();
//
talkePingOverTimeTimerManager.renew();
}
}
@ -37,7 +38,7 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
deserializePayload(
{required int payloadType,
required int messageType,
required List<int> byte,
required List<int> byte,
int? offset,
int? PayloadLength,
int? spTotal,

View File

@ -35,8 +35,8 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
//
talkeRequestOverTimeTimerManager.receiveMessage();
talkeRequestOverTimeTimerManager.dispose();
// talkeRequestOverTimeTimerManager.renewTimer();
// talkeRequestOverTimeTimerManager.dispose();
}
@override

View File

@ -36,14 +36,14 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
_talkRequestEvent(talkObjectName: talkReq.callerName);
//
talkeRequestOverTimeTimerManager.startTimer();
talkeRequestOverTimeTimerManager.setOnTimeout(() {
if (talkStatus.status == TalkStatus.waitingAnswer) {
//
startChartManage.sendTalkRejectMessage();
Get.back();
}
});
// talkeRequestOverTimeTimerManager.startTimer();
// talkeRequestOverTimeTimerManager.setOnTimeout(() {
// if (talkStatus.status == TalkStatus.waitingAnswer) {
// //
// startChartManage.sendTalkRejectMessage();
// Get.back();
// }
// });
}
@override

View File

@ -1,49 +0,0 @@
import 'dart:async';
typedef TimeoutCallback = void Function();
class OverTimeTimerManager {
//
OverTimeTimerManager({required this.timeoutInSeconds});
// Timer
Timer? _timer;
// final
final int timeoutInSeconds;
//
TimeoutCallback? _onTimeout;
//
void startTimer() {
_cancelTimer(); //
_timer = Timer(Duration(seconds: timeoutInSeconds), () {
//
_onTimeout?.call();
//
_cancelTimer();
});
}
//
void receiveMessage() {
startTimer();
}
//
void setOnTimeout(TimeoutCallback? callback) {
_onTimeout = callback;
}
//
void _cancelTimer() {
_timer?.cancel();
_timer = null;
}
//
void dispose() {
_cancelTimer();
}
}

View File

@ -0,0 +1,54 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/talk_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class TalkDataOverTimeTimerManager {
//
static final TalkDataOverTimeTimerManager _instance =
TalkDataOverTimeTimerManager._internal();
factory TalkDataOverTimeTimerManager() => _instance;
// StartChartTalkStatus
static StartChartTalkStatus talkStatus = StartChartTalkStatus.instance;
final Duration timeout;
final void Function() onTimeout;
Timer? _timer;
//
TalkDataOverTimeTimerManager._internal()
: timeout = const Duration(seconds: TalkConstant.talkeDataOverTime),
onTimeout = _handleTalkeDataOverTime;
//
static void _handleTalkeDataOverTime() {
EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds);
StartChartManage().stopTalkPingMessageTimer();
StartChartManage().stopTalkExpectMessageTimer();
talkStatus.setNotTalkData();
talkStatus.setEnd();
}
//
void start() {
_timer = Timer(timeout, onTimeout);
}
//
void renew() {
_timer?.cancel();
_timer = null;
start();
}
//
void cancel() {
_timer?.cancel();
_timer = null;
}
}

View File

@ -0,0 +1,59 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/talk_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class TalkePingOverTimeTimerManager {
//
static final TalkePingOverTimeTimerManager _instance =
TalkePingOverTimeTimerManager._internal();
factory TalkePingOverTimeTimerManager() => _instance;
// StartChartTalkStatus
static StartChartTalkStatus talkStatus = StartChartTalkStatus.instance;
final Duration timeout;
final void Function() onTimeout;
Timer? _timer;
//
TalkePingOverTimeTimerManager._internal()
: timeout = const Duration(seconds: TalkConstant.talkePingOverTime),
onTimeout = _handleTalkePingOverTime;
//
static void _handleTalkePingOverTime() {
if (talkStatus.status == TalkStatus.duringCall) {
EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds);
//
StartChartManage().stopTalkPingMessageTimer();
StartChartManage().stopTalkExpectMessageTimer();
//
StartChartManage().sendTalkHangupMessage();
talkStatus.setNotTalkPing();
talkStatus.setEnd();
}
}
//
void start() {
_timer = Timer(timeout, onTimeout);
}
//
void renew() {
_timer?.cancel();
_timer = null;
start();
}
//
void cancel() {
_timer?.cancel();
_timer = null;
}
}

View File

@ -0,0 +1,54 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/talk_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class TalkeRequestOverTimeTimerManager {
//
static final TalkeRequestOverTimeTimerManager _instance =
TalkeRequestOverTimeTimerManager._internal();
factory TalkeRequestOverTimeTimerManager() => _instance;
// StartChartTalkStatus
static StartChartTalkStatus talkStatus = StartChartTalkStatus.instance;
final Duration timeout;
final void Function() onTimeout;
Timer? _timer;
//
TalkeRequestOverTimeTimerManager._internal()
: timeout = const Duration(seconds: TalkConstant.talkeRequestOverTime),
onTimeout = _handleTalkeRequestOverTime;
//
static void _handleTalkeRequestOverTime() {
if (talkStatus.status == TalkStatus.waitingAnswer) {
//
StartChartManage().sendTalkRejectMessage();
Get.back();
}
}
//
void start() {
_timer = Timer(timeout, onTimeout);
}
//
void renew() {
_timer?.cancel();
_timer = null;
start();
}
//
void cancel() {
_timer?.cancel();
_timer = null;
}
}

View File

@ -3,15 +3,21 @@ import 'dart:convert';
import 'dart:typed_data';
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/other/audio_player_manager.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/udp_constant.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/other/overtime_timer_manger.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.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/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
@ -19,8 +25,16 @@ import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class ScpMessageBaseHandle {
/// 使 TimerManager
///
final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager =
TalkeRequestOverTimeTimerManager();
final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager =
TalkePingOverTimeTimerManager();
final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager =
TalkDataOverTimeTimerManager();
final startChartManage = StartChartManage();
final List<int> _buffer = [];
///
// messageId
@ -36,21 +50,6 @@ class ScpMessageBaseHandle {
final audioManager = AudioPlayerManager();
//
final talkeRequestOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 8,
);
//
final talkePingOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 5,
);
//
final talkDataOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 30,
);
//
void replySuccessMessage(ScpMessage scpMessage) {
startChartManage.sendGenericRespSuccessMessage(
@ -142,4 +141,11 @@ class ScpMessageBaseHandle {
_packetBuffer.remove(key);
_packetTimers.remove(key)?.cancel();
}
//
void _handleTalkeRequestOverTime() {}
void _handleTalkePingOverTime() {}
void _handleTalkDataOverTime() {}
}

View File

@ -451,7 +451,7 @@ class StartChartManage {
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
_log(text: '发送通话保持');
// _log(text: '发送通话保持');
}
//

View File

@ -30,13 +30,14 @@ import '../../../../tools/baseGetXController.dart';
class TalkViewLogic extends BaseGetXController {
final TalkViewState state = TalkViewState();
Timer? _syncTimer;
int _startTime = 0;
final int bufferSize = 20; //
Timer? _syncTimer; //
int _startTime = 0; //
final int bufferSize = 8; //
final List<int> frameTimestamps = []; // FPS
int frameIntervalMs = 45; // 4522FPS
int minFrameIntervalMs = 30; // 33 FPS
int maxFrameIntervalMs = 100; // 10 FPS
int maxFrameIntervalMs = 500; // 2 FPS
// int maxFrameIntervalMs = 100; // 10 FPS
///
void _initFlutterPcmSound() {
@ -82,7 +83,7 @@ class TalkViewLogic extends BaseGetXController {
//
void _startListenTalkData() {
state.talkDataRepository.talkDataStream.listen((talkData) {
state.talkDataRepository.talkDataStream.listen((TalkData talkData) {
final contentType = talkData.contentType;
final currentTimestamp = DateTime.now().millisecondsSinceEpoch;
@ -97,11 +98,14 @@ class TalkViewLogic extends BaseGetXController {
if (state.audioBuffer.length < bufferSize) {
state.audioBuffer.add(talkData);
}
// print('收到音频数据');
break;
case TalkData_ContentTypeE.Image:
if (state.videoBuffer.length < bufferSize) {
state.videoBuffer.add(talkData);
}
print('talkData durationMs-->:${talkData.durationMs}');
///
updateNetworkStatus(currentTimestamp);
@ -257,7 +261,6 @@ class TalkViewLogic extends BaseGetXController {
} else {
state.networkStatus.value = NetworkStatus.normal;
state.alertCount.value = 0; //
EasyLoading.dismiss(); //
}
}
state.lastFrameTimestamp.value = currentTimestamp;
@ -340,6 +343,7 @@ class TalkViewLogic extends BaseGetXController {
_stopPlayG711Data();
state.listData.value = Uint8List(0);
_syncTimer?.cancel();
_syncTimer = null;
}
///

View File

@ -199,8 +199,10 @@ class _TalkViewPageState extends State<TalkViewPage>
if (state.talkStatus.value == TalkStatus.duringCall) {
if (state.isRecordingScreen.value) {
await logic.stopRecording();
print('停止录屏');
} else {
await logic.startRecording();
print('开始录屏');
}
}
},