/*
|
* 【机场1】从 dock2 原类 com.ard.sample.manage.service.impl.DockOSDServiceImpl 复制/独立适配(DJI Dock 1 / M30)。
|
* 与 dock2 原类同服务共存;本文件内的适配差异以「// 机场1:」内联注释标出。
|
*/
|
package com.ard.sample.dock1.manage.service.impl;
|
|
import com.ard.common.core.redis.RedisConst;
|
import com.ard.common.core.redis.RedisOpsUtils;
|
import com.ard.sample.component.mqtt.model.CommonTopicReceiver;
|
import com.ard.sample.component.websocket.config.ConcurrentWebSocketSession;
|
import com.ard.sample.component.websocket.enums.MessageType;
|
import com.ard.sample.component.websocket.handler.DockWebSocketHandler;
|
import com.ard.sample.component.websocket.model.BizCodeEnum;
|
import com.ard.sample.component.websocket.model.CustomWebSocketMessage;
|
import com.ard.sample.manage.model.dto.DeviceDTO;
|
import com.ard.sample.manage.model.dto.TelemetryDTO;
|
import com.ard.sample.manage.model.enums.DeviceDomainEnum;
|
import com.ard.sample.dock1.manage.model.receiver.Dock1OsdDockReceiver;
|
import com.ard.sample.manage.service.IDeviceService;
|
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.Collection;
|
import com.ard.sample.manage.service.impl.AbstractTSAService;
|
import com.ard.sample.manage.service.impl.DockOSDServiceImpl;
|
|
/**
|
* @author sean
|
* @version 1.0
|
* @date 2022/5/11
|
*/
|
@Service
|
public class Dock1DockOSDServiceImpl extends AbstractTSAService {
|
|
@Autowired
|
private DockWebSocketHandler _dockWebSocketHandler;
|
|
@Autowired
|
private IDeviceService _deviceService;
|
|
public Dock1DockOSDServiceImpl() {
|
super(null);
|
}
|
|
|
@Override
|
public void pushTelemetryData(Collection<ConcurrentWebSocketSession> sessions,
|
CustomWebSocketMessage<TelemetryDTO> message, Object Object) {
|
|
}
|
|
@Override
|
public void handleOSD(CommonTopicReceiver receiver, DeviceDTO device,
|
Collection<ConcurrentWebSocketSession> webSessions,
|
CustomWebSocketMessage<TelemetryDTO> wsMessage) {
|
|
if (DeviceDomainEnum.DOCK.getVal() == device.getDomain()) {
|
wsMessage.setBizCode(BizCodeEnum.DOCK_OSD.getCode());
|
Dock1OsdDockReceiver data = mapper.convertValue(receiver.getData(), Dock1OsdDockReceiver.class);
|
// receiver.setType(MessageType.STATUS.getType());
|
String dockOsd = "";
|
String dockOsdData = "";
|
try {
|
dockOsdData = mapper.writeValueAsString(receiver.getData());
|
if (dockOsdData.contains("flighttask_step_code")) {
|
JsonNode jsonNode = mapper.readTree(dockOsdData);
|
if (jsonNode.has("flighttask_step_code")) {
|
String deviceSn = device.getDeviceSn();
|
Long code = jsonNode.get("flighttask_step_code").asLong();
|
if (code != null) {
|
//只要状态 "0":"作业准备中","1":"飞行作业中","5":"任务空闲"
|
if (code == 0 || code == 1 || code == 5) {
|
_deviceService.updateWorkType(deviceSn, code);
|
RedisOpsUtils.set(RedisConst.OSD_STATUS_PREFIX + deviceSn, code);
|
}
|
}
|
}
|
receiver.setType(MessageType.STATUS.getType() + "-flighttask");
|
} else if (dockOsdData.contains("network_state")) {
|
JsonNode jsonNode = mapper.readTree(dockOsdData);
|
// 机场1:Dock1 刚上线时 network_state 可能不带 sub_device(飞行器尚未入舱),
|
// 原写法直接 jsonNode.get("sub_device").has(...) 会抛 NPE,导致整帧 OSD 丢失。
|
JsonNode subDeviceNode = jsonNode.get("sub_device");
|
JsonNode droneInDockNode = jsonNode.get("drone_in_dock");
|
if (subDeviceNode != null && !subDeviceNode.isNull()
|
&& droneInDockNode != null && !droneInDockNode.isNull()
|
&& subDeviceNode.has("device_online_status")
|
&& subDeviceNode.has("device_sn")) {
|
String childDeviceSn = subDeviceNode.get("device_sn").asText();
|
Long inDock = droneInDockNode.asLong();
|
Long deviceOnlineStatus = subDeviceNode.get("device_online_status").asLong();
|
if (inDock.equals(1L) && deviceOnlineStatus.equals(0L)) {// 飞行器在舱内且关机状态为6
|
_deviceService.updateWorkType(childDeviceSn, 6L);
|
RedisOpsUtils.set(RedisConst.OSD_STATUS_PREFIX + device.getChildDeviceSn(), 6);
|
}
|
}
|
if (jsonNode.has("cover_state")) {
|
// 舱盖状态存redis
|
RedisOpsUtils.set(RedisConst.COVER_STATE_OSD_PREFIX + device.getDeviceSn(), jsonNode.get("cover_state").asInt());
|
// //实时监控机场内外舱盖状态
|
// Integer coverState = jsonNode.get("cover_state").asInt();
|
// if(coverState != null && (coverState == 1 || coverState == 0)) {
|
// // 执行0和1的互转逻辑,结果赋值给变量(保持Integer类型)
|
// Integer newCoverState = coverState == 0 ? 1 : 0;
|
// _deviceService.setRedisCameraPosition(device.getDeviceSn(), newCoverState);
|
// }
|
|
}
|
receiver.setType(MessageType.STATUS.getType() + "-network");
|
} else if (dockOsdData.contains("job_number")) {
|
receiver.setType(MessageType.STATUS.getType() + "-job");
|
}
|
dockOsd = mapper.writeValueAsString(receiver);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
wsMessage.getData().setHost(data);
|
sendMessageService.sendBatch(webSessions, wsMessage);
|
// 发送给websocket客户端
|
_dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd, "");
|
}
|
}
|
}
|