Commit 1b5354ca by gdj

调整ai信息

parent 4684d677
......@@ -178,4 +178,6 @@ public class ChannelName {
public static final String INBOUND_DRC_UP_OSD_INFO_PUSH = "inboundDrcUpOsdInfoPush";
public static final String INBOUND_AI_INFO = "inboundAiInfo";
}
......@@ -28,6 +28,8 @@ public enum CloudApiTopicEnum {
DRC_UP(Pattern.compile("^" + THING_MODEL_PRE + PRODUCT + REGEX_SN + DRC + UP + "$"), ChannelName.INBOUND_DRC_UP),
AI_INFO(Pattern.compile("^" + AI_INFO_SUF + "$"), ChannelName.INBOUND_AI_INFO),
UNKNOWN(Pattern.compile("^.*$"), ChannelName.DEFAULT);
private final Pattern pattern;
......
......@@ -39,4 +39,6 @@ public class TopicConst {
public static final String UP = "/up";
public static final String DOWN = "/down";
public static final String AI_INFO_SUF = "/ai_info";
}
\ No newline at end of file
package com.dji.sdk.mqtt.ai;
import com.dji.sdk.mqtt.ChannelName;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.Message;
import java.io.IOException;
/**
* @author guan
*/
public abstract class AbstractAiInfoService {
/**
* Handle the reply message from topic "/ai_info".
* @param message reply message
* @throws IOException
*/
@ServiceActivator(inputChannel = ChannelName.INBOUND_AI_INFO)
public void aiInfo(Message<?> message) throws IOException {
throw new UnsupportedOperationException("aiInfo not implemented");
}
}
package com.dji.sdk.mqtt.ai;
import com.dji.sdk.mqtt.services.ServicesErrorCode;
/**
* @author sean.zhou
* @version 0.1
* @date 2021/11/22
*/
public class AiInfoReceiver<T> {
private ServicesErrorCode result;
private T info;
public AiInfoReceiver() {
}
@Override
public String toString() {
return "ServicesAiReceiver{" +
"result=" + result +
", info=" + info +
'}';
}
public ServicesErrorCode getResult() {
return result;
}
public AiInfoReceiver<T> setResult(ServicesErrorCode result) {
this.result = result;
return this;
}
public T getInfo() {
return info;
}
public AiInfoReceiver<T> setInfo(T info) {
this.info = info;
return this;
}
}
\ No newline at end of file
package com.dji.sdk.mqtt.ai;
import com.dji.sdk.mqtt.CommonTopicResponse;
/**
* Unified Topic request format
* @author sean.zhou
* @date 2021/11/15
* @version 0.1
*/
public class TopicAiInfoResponse<T> extends CommonTopicResponse<T> {
private String method;
@Override
public String toString() {
return "TopicAiInfoResponse{" +
"tid='" + tid + '\'' +
", bid='" + bid + '\'' +
", method='" + method + '\'' +
", data=" + data +
", timestamp=" + timestamp +
'}';
}
public TopicAiInfoResponse() {
}
public String getTid() {
return tid;
}
public TopicAiInfoResponse<T> setTid(String tid) {
this.tid = tid;
return this;
}
public String getBid() {
return bid;
}
public TopicAiInfoResponse<T> setBid(String bid) {
this.bid = bid;
return this;
}
public String getMethod() {
return method;
}
public TopicAiInfoResponse<T> setMethod(String method) {
this.method = method;
return this;
}
public T getData() {
return data;
}
public TopicAiInfoResponse<T> setData(T data) {
this.data = data;
return this;
}
public Long getTimestamp() {
return timestamp;
}
public TopicAiInfoResponse<T> setTimestamp(Long timestamp) {
this.timestamp = timestamp;
return this;
}
}
\ No newline at end of file
......@@ -37,6 +37,8 @@ public enum StateDataKeyEnum {
DOCK_LIVE_STATUS(ChannelName.INBOUND_STATE_DOCK_LIVE_STATUS, DockLiveStatus.class),
AI_INFO(ChannelName.INBOUND_AI_INFO, UpdateTopo.class),
DOCK_DRONE_WPMZ_VERSION(ChannelName.INBOUND_STATE_DOCK_DRONE_WPMZ_VERSION, DockDroneWpmzVersion.class),
DOCK_DRONE_THERMAL_SUPPORTED_PALETTE_STYLE(ChannelName.INBOUND_STATE_DOCK_DRONE_THERMAL_SUPPORTED_PALETTE_STYLE, DockDroneThermalSupportedPaletteStyle.class),
......
package com.dji.sample.ai.controller;
import com.dji.sample.ai.model.dto.AiInfoDTO;
import com.dji.sample.ai.model.param.AiInfoSearchParam;
import com.dji.sample.ai.service.IAiInfoService;
import com.dji.sample.common.model.CustomClaim;
import com.dji.sample.control.model.enums.DroneAuthorityEnum;
import com.dji.sample.control.model.enums.RemoteDebugMethodEnum;
import com.dji.sample.control.model.param.*;
import com.dji.sample.control.service.IControlService;
import com.dji.sample.manage.model.dto.UserListDTO;
import com.dji.sample.manage.model.entity.UserEntity;
import com.dji.sdk.common.HttpResultResponse;
import com.dji.sdk.common.PaginationData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import static com.dji.sample.component.AuthInterceptor.TOKEN_CLAIM;
/**
* @author gdj
* @version 1.0
* @date 20225/7/2
*/
@RestController
@Slf4j
@RequestMapping("${url.manage.prefix}${url.manage.version}/aiInfo")
public class AiInfoController {
@Autowired
private IAiInfoService aiInfoService;
/**
* Paging to query all users in a workspace.
* @param param param
* @param page current page
* @param pageSize pageSize
* @return
*/
@GetMapping("/Page")
public HttpResultResponse<PaginationData<AiInfoDTO>> getAiInfoPage(AiInfoSearchParam param,
@RequestParam(defaultValue = "1") Long page,
@RequestParam(value = "page_size", defaultValue = "50") Long pageSize) {
PaginationData<AiInfoDTO> paginationData = aiInfoService.getAiInfoPageByParam(param, page, pageSize);
return HttpResultResponse.success(paginationData);
}
}
package com.dji.sample.ai.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dji.sample.ai.model.entity.AiInfoEntity;
/**
* @author guan
*/
public interface IAiInfoMapper extends BaseMapper<AiInfoEntity> {
}
package com.dji.sample.ai.model.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author guan
*/
@Data
public class AiInfoDTO implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 设备sn
*/
private String deviceSn;
/**
* 负载sn
*/
private String payloadSn;
/**
* 告警类型
*/
private String warnType;
/**
* 告警事件
*/
private String warnEvent;
/**
* 告警时间
*/
private LocalDateTime warnTime;
/**
* 图片url
*/
private String imageUrl;
/**
* 触发地点
*/
private String warnLocation;
/**
* 存放json数据
*/
private String json;
}
package com.dji.sample.ai.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* @author guan
*/
@TableName(value = "manage_ai_info")
@Data
public class AiInfoEntity implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 创建时间
*/
private Long createTime;
/**
* 设备sn
*/
private String deviceSn;
/**
* 负载sn
*/
private String payloadSn;
/**
* 告警类型
*/
private String warnType;
/**
* 告警事件
*/
private String warnEvent;
/**
* 告警时间
*/
private Long warnTime;
/**
* 图片url
*/
private String imageUrl;
/**
* 触发地点
*/
private String warnLocation;
/**
* 存放json数据
*/
private String json;
}
package com.dji.sample.ai.model.param;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* @author guan
*/
@Data
public class AiInfoSearchParam {
@JsonProperty("device_sn")
private String deviceSn;
}
package com.dji.sample.ai.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dji.sample.ai.model.dto.AiInfoDTO;
import com.dji.sample.ai.model.entity.AiInfoEntity;
import com.dji.sample.ai.model.param.AiInfoSearchParam;
import com.dji.sdk.common.PaginationData;
/**
* @author guan
*/
public interface IAiInfoService extends IService<AiInfoEntity> {
PaginationData<AiInfoDTO> getAiInfoPageByParam(AiInfoSearchParam param, Long page, Long pageSize);
}
package com.dji.sample.ai.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dji.sample.ai.dao.IAiInfoMapper;
import com.dji.sample.ai.model.dto.AiInfoDTO;
import com.dji.sample.ai.model.entity.AiInfoEntity;
import com.dji.sample.ai.model.param.AiInfoSearchParam;
import com.dji.sample.ai.service.IAiInfoService;
import com.dji.sdk.common.Pagination;
import com.dji.sdk.common.PaginationData;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author guan
*/
@Service
public class AiInfoServiceImpl extends ServiceImpl<IAiInfoMapper, AiInfoEntity> implements IAiInfoService {
@Override
public PaginationData<AiInfoDTO> getAiInfoPageByParam(AiInfoSearchParam param, Long page, Long pageSize) {
LambdaQueryWrapper<AiInfoEntity> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.hasText(param.getDeviceSn())) {
wrapper.eq(AiInfoEntity::getDeviceSn, param.getDeviceSn());
}
Page<AiInfoEntity> pagination = this.page(new Page<>(page, pageSize), wrapper);
List<AiInfoDTO> aiInfoDTOList = pagination.getRecords().stream().map(this::AiInfoEntityToDTO)
.collect(Collectors.toList());
return new PaginationData<>(aiInfoDTOList, new Pagination(pagination.getCurrent(), pagination.getSize(), pagination.getTotal()));
}
public AiInfoDTO AiInfoEntityToDTO(AiInfoEntity aiInfoEntity) {
AiInfoDTO aiInfoDTO = new AiInfoDTO();
aiInfoDTO.setId(aiInfoEntity.getId());
aiInfoDTO.setCreateTime(Objects.nonNull(aiInfoEntity.getCreateTime()) ?
LocalDateTime.ofInstant(Instant.ofEpochMilli(aiInfoEntity.getCreateTime()), ZoneId.systemDefault()) : null);
aiInfoDTO.setDeviceSn(aiInfoEntity.getDeviceSn());
aiInfoDTO.setPayloadSn(aiInfoEntity.getPayloadSn());
aiInfoDTO.setImageUrl(aiInfoEntity.getImageUrl());
aiInfoDTO.setWarnType(aiInfoEntity.getWarnType());
aiInfoDTO.setWarnEvent(aiInfoEntity.getWarnEvent());
aiInfoDTO.setWarnLocation(aiInfoEntity.getWarnLocation());
aiInfoDTO.setWarnTime(Objects.nonNull(aiInfoEntity.getWarnTime()) ?
LocalDateTime.ofInstant(Instant.ofEpochMilli(aiInfoEntity.getWarnTime()), ZoneId.systemDefault()) : null);
aiInfoDTO.setJson(aiInfoEntity.getJson());
return aiInfoDTO;
}
public AiInfoEntity AiInfoDTOToEntity(AiInfoDTO aiInfoDTO) {
AiInfoEntity aiInfoEntity = new AiInfoEntity();
aiInfoEntity.setId(aiInfoDTO.getId());
if (Objects.nonNull(aiInfoDTO.getCreateTime())) {
aiInfoEntity.setCreateTime(aiInfoDTO.getCreateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
aiInfoEntity.setDeviceSn(aiInfoDTO.getDeviceSn());
aiInfoEntity.setPayloadSn(aiInfoDTO.getPayloadSn());
aiInfoEntity.setImageUrl(aiInfoDTO.getImageUrl());
aiInfoEntity.setWarnType(aiInfoDTO.getWarnType());
aiInfoEntity.setWarnEvent(aiInfoDTO.getWarnEvent());
aiInfoEntity.setWarnLocation(aiInfoDTO.getWarnLocation());
if (Objects.nonNull(aiInfoDTO.getWarnTime())) {
aiInfoEntity.setWarnTime(aiInfoDTO.getWarnTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
aiInfoEntity.setJson(aiInfoDTO.getJson());
return aiInfoEntity;
}
}
package com.dji.sample.ai.service.impl;
import com.dji.sample.ai.model.entity.AiInfoEntity;
import com.dji.sample.ai.service.IAiInfoService;
import com.dji.sdk.common.Common;
import com.dji.sdk.mqtt.ai.AbstractAiInfoService;
import com.dji.sdk.mqtt.ai.TopicAiInfoResponse;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Objects;
/**
* @author guan
*/
@Service
public class SdkAiInfoServiceImpl extends AbstractAiInfoService {
@Autowired
IAiInfoService aiInfoService;
/**
* Handle the reply message from topic "/ai_info".
* @param message reply message
* @throws IOException
*/
@Override
public void aiInfo(Message<?> message) throws IOException {
MessageHeaders headers = message.getHeaders();
String topic = Objects.requireNonNull(headers.get(MqttHeaders.RECEIVED_TOPIC)).toString();
byte[] payload = (byte[])message.getPayload();
JsonNode jsonData = Common.getObjectMapper().readValue(payload, new TypeReference<>() {});
// 转换数据
// TopicAiInfoResponse<JsonNode> receiver = Common.getObjectMapper().readValue(payload, new TypeReference<>() {});
// JsonNode jsonData = receiver.getData();
// 进行操作
AiInfoEntity aiInfoEntity = new AiInfoEntity();
// 保存数据库
aiInfoEntity.setCreateTime(System.currentTimeMillis());
aiInfoEntity.setDeviceSn(jsonData.get("device_sn").asText());
aiInfoEntity.setPayloadSn(jsonData.get("payload_sn").asText());
aiInfoEntity.setWarnType(jsonData.get("warn_type").asText());
aiInfoEntity.setWarnEvent(jsonData.get("warn_event").asText());
aiInfoEntity.setWarnTime(jsonData.get("warn_time").asLong());
aiInfoEntity.setImageUrl(jsonData.get("image_url").asText());
aiInfoEntity.setWarnLocation(jsonData.get("warn_Location").asText());
JsonNode obj = jsonData.get("obj");
if (obj != null) {
aiInfoEntity.setJson(obj.toString());
}
aiInfoService.save(aiInfoEntity);
}
}
......@@ -72,4 +72,9 @@ public class MqttMessageChannel {
return new DirectChannel();
}
@Bean(name = ChannelName.INBOUND_AI_INFO)
public MessageChannel aiInfoChannel() {
return new DirectChannel();
}
}
......@@ -95,7 +95,7 @@ mqtt:
cloud-sdk:
mqtt:
# Topics that need to be subscribed when initially connecting to mqtt, multiple topics are divided by ",".
inbound-topic: sys/product/+/status,thing/product/+/requests
inbound-topic: sys/product/+/status,thing/product/+/requests,/ai_info
url:
manage:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment