package com.ruoyi.device.service.impl; import com.ruoyi.device.domain.api.IAircraftDomain; import com.ruoyi.device.domain.api.IDeviceDomain; import com.ruoyi.device.domain.api.IDockAircraftDomain; import com.ruoyi.device.domain.api.IDockDomain; import com.ruoyi.device.domain.impl.DockDomainImpl; import com.ruoyi.device.domain.impl.djimqtt.callback.IDockDataCallback; import com.ruoyi.device.domain.impl.djimqtt.callback.IDroneDataCallback; import com.ruoyi.device.domain.impl.djimqtt.config.DjiMqttClientConfig; import com.ruoyi.device.service.config.DjiMqttProperties; import com.ruoyi.device.domain.impl.djimqtt.handler.DjiMqttMessageHandler; import com.ruoyi.device.domain.impl.djimqtt.manager.DjiMqttClientManager; import com.ruoyi.device.domain.impl.djimqtt.model.DockData; import com.ruoyi.device.domain.impl.djimqtt.model.DroneData; import com.ruoyi.device.domain.model.Aircraft; import com.ruoyi.device.domain.model.Device; import com.ruoyi.device.domain.model.Dock; import com.ruoyi.device.domain.model.DockAircraft; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; import java.util.Objects; @Service @Slf4j public class DjiService { @Autowired private DjiMqttClientManager clientManager; @Autowired private DjiMqttProperties mqttProperties; @Autowired private IDockDomain dockDomain; @Autowired private IDeviceDomain deviceDomain; @Autowired private IAircraftDomain aircraftDomain; @Autowired private IDockAircraftDomain dockAircraftDomain; @EventListener(ApplicationReadyEvent.class) public void onApplicationReady() { // 从配置文件读取配置 DjiMqttClientConfig config = DjiMqttClientConfig.builder() .host(mqttProperties.getHost()) .port(mqttProperties.getPort()) .clientId(mqttProperties.getClientId()) .username(mqttProperties.getUsername()) .password(mqttProperties.getPassword()) .connectionTimeout(mqttProperties.getConnectionTimeout()) .keepAliveInterval(mqttProperties.getKeepAliveInterval()) .autoReconnect(mqttProperties.getAutoReconnect()) .cleanSession(mqttProperties.getCleanSession()) .useSharedSubscription(true) .sharedGroupName("dji-group") .build(); // 创建客户端 String clientId = clientManager.createClient(config); // 获取消息处理器 DjiMqttMessageHandler handler = clientManager.getHandler(clientId); // 注册无人机数据回调 handler.registerDroneDataCallback(new IDroneDataCallback() { @Override public void onDroneData(DroneData droneData) { //log.info("droneData:{}", droneData); // 更新 Dock 表的 lastActiveTime Device device = deviceDomain.selectDeviceByDeviceSn(droneData.getDeviceSn()); if(Objects.nonNull(device)) { Aircraft aircraft = aircraftDomain.selectAircraftByDeviceId(device.getDeviceId()); if(Objects.nonNull(aircraft)) { List aircrafts = dockAircraftDomain.selectDockAircraftByAircraftId(aircraft.getAircraftId()); if(!aircrafts.isEmpty()) { for(DockAircraft dockAircraft : aircrafts) { Dock dock = dockDomain.selectDockByDockId(dockAircraft.getDockId()); if(Objects.nonNull(dock)) { dock.setLastActiveTime(new Date()); dockDomain.updateDock(dock); } } } } } } }); // 注册机场数据回调 handler.registerDockDataCallback(new IDockDataCallback() { @Override public void onDockData(DockData dockData) { // log.info("droneData:{}", dockData); } }); log.info("客户端已创建并注册回调"); } }