import 'dart:convert'; import 'dart:typed_data'; 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/main/lockMian/entity/lockListInfo_entity.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/entity/scp_message.dart'; import 'package:star_lock/talk/starChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/starChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/starChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/starChart/proto/generic.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_accept.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/tools/commonDataManage.dart'; import '../../star_chart_manage.dart'; class UdpTalkAcceptHandler extends ScpMessageBaseHandle implements ScpMessageHandler { @override void handleReq(ScpMessage scpMessage) { // 回复同意接听消息 replySuccessMessage(scpMessage); } @override void handleResp(ScpMessage scpMessage) { // 收到同意接听回复 final GenericResp genericResp = scpMessage.Payload; if (checkGenericRespSuccess(genericResp)) { // 停止同意接听的重发 startChartManage.stopTalkAcceptTimer(); // 接听之后增加期望音频的接收 _handleSendExpect(); // 停止播放铃声 stopRingtone(); // 设置状态为接听成功 talkStatus.setAnsweredSuccessfully(); // 同意接听之后,停止对讲请求超时监听定时器 talkeRequestOverTimeTimerManager.renew(); talkeRequestOverTimeTimerManager.cancel(); // 启动发送rbcuInfo数据 // startChartManage.startSendingRbcuInfoMessages( // ToPeerId: startChartManage.lockPeerId); } } @override void handleInvalidReq(ScpMessage scpMessage) {} @override void handleRealTimeData(ScpMessage scpMessage) {} @override deserializePayload( {required int payloadType, required int messageType, required List 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; } } /// 收到同意接听回复之后增加音频的期望数据 void _handleSendExpect() { final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo; final isH264 = currentKeyInfo.lockFeature?.isH264 == 1; final isMJpeg = currentKeyInfo.lockFeature?.isMJpeg == 1; // 优先使用H264,其次是MJPEG if (isH264) { // 锁支持H264,发送H264视频和G711音频期望 startChartManage.sendH264VideoAndG711AudioTalkExpectData(); print('锁支持H264,发送H264视频格式期望数据'); } else if (isMJpeg) { // 锁只支持MJPEG,发送图像视频和G711音频期望 startChartManage.sendImageVideoAndG711AudioTalkExpectData(); print('锁不支持H264,支持MJPEG,发送MJPEG视频格式期望数据'); } else { // 默认使用图像视频 startChartManage.sendImageVideoAndG711AudioTalkExpectData(); print('锁不支持H264和MJPEG,默认发送图像视频格式期望数据'); } } }