import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_settings.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_data.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/starChart/views/talkView/talk_view_logic.dart'; import 'package:star_lock/talk/starChart/views/talkView/talk_view_state.dart'; import 'package:star_lock/tools/commonDataManage.dart'; import 'package:star_lock/tools/storage.dart'; import '../../star_chart_manage.dart'; class UdpTalkExpectHandler extends ScpMessageBaseHandle implements ScpMessageHandler { // final TalkViewState talkViewState = Get.put(TalkViewLogic()).state; @override void handleReq(ScpMessage scpMessage) { // 收到预期音视频数据请求 final TalkExpectReq talkExpect = scpMessage.Payload; // 回复请求 replySuccessMessage(scpMessage); } @override void handleResp(ScpMessage scpMessage) async { // 收到预期音视频数据回复 final TalkExpectResp talkExpectResp = scpMessage.Payload; if (talkExpectResp != null) { // print('收到预期音视频数据回复,scpMessage:$scpMessage'); // 停止发送预期数据的定时器 startChartManage.stopTalkExpectMessageTimer(); // 停止发送对讲请求 startChartManage.stopCallRequestMessageTimer(); // talkViewState.rotateAngle.value = talkExpectResp.rotate ?? 0; startChartManage.rotateAngle = talkExpectResp.rotate; startChartManage.videoWidth = talkExpectResp.width; startChartManage.videoHeight = talkExpectResp.height; // 收到预期数据的应答后,代表建立了连接,启动通话保持的监听 // 启动通话保持监听定时器(用来判断如果x秒内没有收到通话保持则执行的操作); talkePingOverTimeTimerManager.start(); // 启动通话数据监听 talkDataOverTimeTimerManager.start(); if (talkStatus.status == TalkStatus.proactivelyCallWaitingAnswer) { // 停止播放铃声 stopRingtone(); // 设置为接听成功 talkStatus.setAnsweredSuccessfully(); // 主动呼叫时需要启动ping startChartManage.startTalkPingMessageTimer(); } else if (talkStatus.status != TalkStatus.answeredSuccessfully) { playRingtone(); } AppLog.log( '视频画面需要旋转:${talkExpectResp.rotate},画面宽高:${talkExpectResp.width}-${talkExpectResp.height}'); // 获取锁支持项 final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo; // 0、wifi保活 1、wifi不保活图传 2、wifi不保活可视对讲 var isWifiLockType = currentKeyInfo.lockFeature?.wifiLockType == 1; final LockListInfoGroupEntity? lockListInfoGroupEntity = await Storage.getLockMainListData(); if (lockListInfoGroupEntity != null) { lockListInfoGroupEntity!.groupList?.forEach((element) { final lockList = element.lockList; if (lockList != null && lockList.length != 0) { for (var lockInfo in lockList) { final peerId = lockInfo.network?.peerId; if (peerId != null && peerId != '') { if (peerId == scpMessage.FromPeerId) { isWifiLockType = lockInfo.lockFeature?.wifiLockType == 1; } } } } }); } if (isWifiLockType || (talkExpectResp.rotate == 0 && talkExpectResp.width == 640 && talkExpectResp.height == 480) && talkStatus.status != TalkStatus.answeredSuccessfully) { Get.toNamed(Routers.imageTransmissionView); return; } if (startChartManage .getDefaultTalkExpect() .videoType .contains(VideoTypeE.H264) && talkStatus.status != TalkStatus.answeredSuccessfully) { Get.toNamed( Routers.h264View, ); } else if (talkStatus.status != TalkStatus.answeredSuccessfully) { Get.toNamed( Routers.starChartTalkView, ); } } } @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 TalkExpectResp talkExpectResp = TalkExpectResp(); talkExpectResp.mergeFromBuffer(byte); return talkExpectResp; // final GenericResp genericResp = GenericResp(); // genericResp.mergeFromBuffer(byte); // return genericResp; } else if (messageType == MessageTypeConstant.Req) { final TalkExpectReq talkExpect = TalkExpectReq(); talkExpect.mergeFromBuffer(byte); return talkExpect; } else { String payload = utf8.decode(byte); return payload; } } }