package com.ard.sample.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.manage.model.receiver.OsdDockReceiver; 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; /** * @author sean * @version 1.0 * @date 2022/5/11 */ @Service public class DockOSDServiceImpl extends AbstractTSAService { @Autowired private DockWebSocketHandler _dockWebSocketHandler; @Autowired private IDeviceService _deviceService; public DockOSDServiceImpl() { super(null); } @Override public void pushTelemetryData(Collection sessions, CustomWebSocketMessage message, Object Object) { } @Override public void handleOSD(CommonTopicReceiver receiver, DeviceDTO device, Collection webSessions, CustomWebSocketMessage wsMessage) { if (DeviceDomainEnum.DOCK.getVal() == device.getDomain()) { wsMessage.setBizCode(BizCodeEnum.DOCK_OSD.getCode()); OsdDockReceiver data = mapper.convertValue(receiver.getData(), OsdDockReceiver.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); if (jsonNode.has("drone_in_dock") && jsonNode.get("sub_device").has("device_online_status")) { if(jsonNode.get("sub_device").has("device_sn")) { String childDeviceSn = jsonNode.get("sub_device").get("device_sn").asText(); Long inDock = jsonNode.get("drone_in_dock").asLong(); Long deviceOnlineStatus = jsonNode.get("sub_device").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); } } } 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, ""); } } }