import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.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'; import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_accept.pb.dart'; import '../../start_chart_manage.dart'; class UdpTalkAcceptHandler extends ScpMessageBaseHandle implements ScpMessageHandler { @override void handleReq(ScpMessage scpMessage) { print('收到同意接听请求'); // 回复同意接听消息 startChartManage.sendGenericRespSuccessMessage( ToPeerId: scpMessage.FromPeerId!, FromPeerId: scpMessage.ToPeerId!, PayloadType: scpMessage.PayloadType!, ); } @override void handleResp(ScpMessage scpMessage) { // 收到同意接听回复 final GenericResp genericResp = scpMessage.Payload; if (checkGenericRespSuccess(genericResp)) { // 启动发送预期数据请求 _handleStartSendTalkExpectDataRequest(); Future.delayed(Duration(seconds: 1), () { print('启动定时器判断'); // 启动通话保持定时器 _handleStartTalkPing(); // 启动通话数据检查的定时器 _handleCheckTalkDataTimer(); }); // 停止播放铃声 stopRingtone(); // 设置状态为接听中 talkStatus.setAnsweredSuccessfully(); talkStatus.setDuringCall(); } } @override void handleInvalidReq(ScpMessage scpMessage) {} @override void handleRealTimeData(ScpMessage scpMessage) {} @override deserializePayload( {required int payloadType, required int messageType, required Uint8List byte, int? offset, int? PayloadLength, int? spTotal, int? spIndex, int? messageId}) { if (messageType == MessageTypeConstant.Resp) { final GenericResp genericResp = GenericResp(); genericResp.mergeFromBuffer(byte); return genericResp; } else if (messageType == MessageTypeConstant.Req) { final TalkAcceptReq talkAccept = TalkAcceptReq(); talkAccept.mergeFromBuffer(byte); return talkAccept; } else { String payload = utf8.decode(byte); return payload; } } // 启动通话保持,判断x秒内是否收到通话保持 void _handleStartTalkPing() { // 启动通话保持 startChartManage.startTalkPingMessageTimer(); // 启动通话保持监听定时器(用来判断如果x秒内没有收到通话保持则执行的操作) talkePingOverTimeTimerManager.startTimer(); // 设置通话保持超时后的事件 talkePingOverTimeTimerManager.setOnTimeout(() { EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds); // 停止发送通话保持的命令 startChartManage.stopTalkPingMessageTimer(); startChartManage.stopTalkExpectMessageTimer(); talkStatus.setNotTalkPing(); talkStatus.setEnd(); }); } /// 启动通话数据的检查,判断x秒内是否收到通话数据 void _handleCheckTalkDataTimer() { // 启动对讲数据监听定时器 talkDataOverTimeTimerManager.startTimer(); // 设置对讲数据超时后的事件 talkDataOverTimeTimerManager.setOnTimeout(() { EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds); startChartManage.stopTalkPingMessageTimer(); startChartManage.stopTalkExpectMessageTimer(); talkStatus.setNotTalkData(); talkStatus.setEnd(); }); } /// 启动发送预期数据请求 void _handleStartSendTalkExpectDataRequest() { // 启动发送预期数据定时器 startChartManage.startTalkExpectTimer(); } }