/* * 【机场1】从 dock2 原类 com.ard.sample.manage.service.impl.CommandServiceImpl 复制/独立适配(DJI Dock 1 / M30)。 * 与 dock2 原类同服务共存;本文件内的适配差异以「// 机场1:」内联注释标出。 */ package com.ard.sample.dock1.manage.service.impl; import com.ard.sample.common.error.CommonErrorEnum; import com.ard.sample.common.model.ResponseResult; import com.ard.sample.component.mqtt.model.*; import com.ard.sample.component.mqtt.service.IMessageSenderService; import com.ard.common.core.redis.RedisConst; import com.ard.common.core.redis.RedisOpsUtils; import com.ard.sample.manage.model.dto.DeviceDTO; import com.ard.sample.manage.model.param.CommandParam; import com.ard.sample.dock1.manage.service.ICommandService; import com.ard.sample.manage.service.IDeviceService; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.MessageHeaders; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.UUID; import com.ard.sample.manage.service.impl.CommandServiceImpl; /** * Description: * Author: lsy * Date: 2025年09月24日9:00 **/ @Slf4j @Service public class Dock1CommandServiceImpl implements ICommandService { @Autowired private ObjectMapper mapper; @Resource private IDeviceService deviceService; @Resource private IMessageSenderService messageSenderService; /** * 负载控制-拍照 * @param sn * @return */ @Override public ResponseResult cameraPhotoTake(String sn, CommandParam param) { boolean isExist = deviceService.checkDeviceOnline(sn); if (!isExist) { return ResponseResult.error("The dock is offline."); } String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + sn + TopicConst.SERVICES_SUF; String bid = UUID.randomUUID().toString(); ServiceReply serviceReplyOpt = messageSenderService.publishWithReply( topic, CommonTopicResponse.builder() .tid(UUID.randomUUID().toString()) .bid(bid) .method("camera_photo_take") .timestamp(System.currentTimeMillis()) .data(param) .build()); ServiceReply serviceReply = mapper.convertValue( serviceReplyOpt, new TypeReference>() {}); if (ResponseResult.CODE_SUCCESS != serviceReply.getResult()) { return ResponseResult.error(serviceReply.getResult(), CommonErrorEnum.getMsgByCode(serviceReply.getResult())); } // if (controlMethodEnum.getProgress()) { // RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER + bid, sn, // RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND); // } return ResponseResult.success(); } // 机场1:不复制原 ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_CAMERA_PHOTO_TAKE_PROGRESS),消费职责由共享层原类承担 public void handleCameraPhotoTakeProgress(CommonTopicReceiver receiver, MessageHeaders headers) { String key = receiver.getMethod() + RedisConst.DELIMITER + receiver.getBid(); if (RedisOpsUtils.getExpire(key) <= 0) { return; } String sn = RedisOpsUtils.get(key).toString(); EventsReceiver eventsReceiver = mapper.convertValue(receiver.getData(), new TypeReference>(){}); eventsReceiver.setBid(receiver.getBid()); eventsReceiver.setSn(sn); log.info("SN: {}, {} ===> CameraPhotoTak progress: {}", sn, receiver.getMethod(), eventsReceiver.getOutput().getProgress().toString()); if (eventsReceiver.getResult() != ResponseResult.CODE_SUCCESS) { log.error("SN: {}, {} ===> Error code: {}", sn, receiver.getMethod(), eventsReceiver.getResult()); } if (eventsReceiver.getOutput().getProgress().getPercent() == 100 || EventsResultStatusEnum.find(eventsReceiver.getOutput().getStatus()).getEnd()) { RedisOpsUtils.del(key); } DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(RedisConst.DEVICE_ONLINE_PREFIX + sn); // webSocketMessageService.sendBatch( // WebSocketManager.getValueWithWorkspaceAndUserType( // device.getWorkspaceId(), UserTypeEnum.WEB.getVal()), // CustomWebSocketMessage.builder() // .data(eventsReceiver) // .timestamp(System.currentTimeMillis()) // .bizCode(receiver.getMethod()) // .build()); if (receiver.getNeedReply() != null && receiver.getNeedReply() == 1) { String topic = headers.get(MqttHeaders.RECEIVED_TOPIC) + TopicConst._REPLY_SUF; messageSenderService.publish(topic, CommonTopicResponse.builder() .tid(receiver.getTid()) .bid(receiver.getBid()) .method(receiver.getMethod()) .timestamp(System.currentTimeMillis()) .data(RequestsReply.success()) .build()); } } }