Commit a52642df by guoxuejian

Merge branch 'prod' of http://git.raytue.com/GeoFly/GeoFlyApi into prod

parents d3a3ee49 ccec91c8
...@@ -83,34 +83,34 @@ public enum DeviceEnum { ...@@ -83,34 +83,34 @@ public enum DeviceEnum {
/** /**
* 草莓机场SuperDock Pro V4 * 草莓机场S2301
*/ */
SUPER_DOCK_PRO_V4(DeviceDomainEnum.DOCK, DeviceTypeEnum.DOCK, DeviceSubTypeEnum._99), S2301(DeviceDomainEnum.DOCK, DeviceTypeEnum.DOCK, DeviceSubTypeEnum._99),
/** /**
* 草莓机场S22M300 * 草莓机场S22M300
*/ */
S22M300(DeviceDomainEnum.DOCK, DeviceTypeEnum._97, DeviceSubTypeEnum.ZERO), S22M300(DeviceDomainEnum.DOCK, DeviceTypeEnum._88097, DeviceSubTypeEnum.ZERO),
/** /**
* 草莓机场S2201 * 草莓机场S2201
*/ */
S2201(DeviceDomainEnum.DOCK, DeviceTypeEnum._98, DeviceSubTypeEnum.ZERO), S2201(DeviceDomainEnum.DOCK, DeviceTypeEnum._88098, DeviceSubTypeEnum.ZERO),
/** /**
* 草莓机场S24M350 * 草莓机场S24M350
*/ */
S24M350(DeviceDomainEnum.DOCK, DeviceTypeEnum._100, DeviceSubTypeEnum.ZERO), S24M350(DeviceDomainEnum.DOCK, DeviceTypeEnum._88100, DeviceSubTypeEnum.ZERO),
/** /**
* 草莓机场S24M350S * 草莓机场S24M350S
*/ */
S24M350S(DeviceDomainEnum.DOCK, DeviceTypeEnum._101, DeviceSubTypeEnum.ZERO), S24M350S(DeviceDomainEnum.DOCK, DeviceTypeEnum._88101, DeviceSubTypeEnum.ZERO),
/** /**
* 草莓机场S24M3 * 草莓机场S24M3
*/ */
S24M3(DeviceDomainEnum.DOCK, DeviceTypeEnum._102, DeviceSubTypeEnum.ZERO), S24M3(DeviceDomainEnum.DOCK, DeviceTypeEnum._88102, DeviceSubTypeEnum.ZERO),
/** /**
* 草莓机场S24M4 * 草莓机场S24M4
*/ */
S24M4(DeviceDomainEnum.DOCK, DeviceTypeEnum._103, DeviceSubTypeEnum.ZERO), S24M4(DeviceDomainEnum.DOCK, DeviceTypeEnum._88103, DeviceSubTypeEnum.ZERO),
M3D(DeviceDomainEnum.DRONE, DeviceTypeEnum.M3D, DeviceSubTypeEnum.ZERO), M3D(DeviceDomainEnum.DRONE, DeviceTypeEnum.M3D, DeviceSubTypeEnum.ZERO),
......
...@@ -91,12 +91,12 @@ public enum DeviceTypeEnum { ...@@ -91,12 +91,12 @@ public enum DeviceTypeEnum {
M4TD_CAMERA(99), M4TD_CAMERA(99),
// 草莓 // 草莓
_97(97), _88097(88097),
_98(98), _88098(88098),
_100(100), _88100(88100),
_101(101), _88101(88101),
_102(102), _88102(88102),
_103(103), _88103(88103),
; ;
private final int type; private final int type;
......
...@@ -14,7 +14,7 @@ public enum GatewayTypeEnum { ...@@ -14,7 +14,7 @@ public enum GatewayTypeEnum {
RC(DeviceEnum.RC, DeviceEnum.RC_PLUS, DeviceEnum.RC_PRO, DeviceEnum.RC_PRO_TWO), RC(DeviceEnum.RC, DeviceEnum.RC_PLUS, DeviceEnum.RC_PRO, DeviceEnum.RC_PRO_TWO),
DOCK(DeviceEnum.DOCK, DeviceEnum.SUPER_DOCK_PRO_V4, DeviceEnum.S22M300, DeviceEnum.S2201, DOCK(DeviceEnum.DOCK, DeviceEnum.S2301, DeviceEnum.S22M300, DeviceEnum.S2201,
DeviceEnum.S24M350, DeviceEnum.S24M350S, DeviceEnum.S24M3, DeviceEnum.S24M4), DeviceEnum.S24M350, DeviceEnum.S24M350S, DeviceEnum.S24M3, DeviceEnum.S24M4),
DOCK2(DeviceEnum.DOCK2), DOCK2(DeviceEnum.DOCK2),
......
...@@ -35,10 +35,10 @@ import org.springframework.util.StringUtils; ...@@ -35,10 +35,10 @@ import org.springframework.util.StringUtils;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.*;
import java.util.List; import java.util.concurrent.ConcurrentHashMap;
import java.util.Objects; import java.util.concurrent.Executors;
import java.util.Optional; import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -68,6 +68,9 @@ public class SDKDeviceService extends AbstractDeviceService { ...@@ -68,6 +68,9 @@ public class SDKDeviceService extends AbstractDeviceService {
@Autowired @Autowired
private UOMRecordService uomRecordService; private UOMRecordService uomRecordService;
private static final ScheduledExecutorService recordExecutor = Executors.newScheduledThreadPool(4);
private static final Map<String, Long> lastRecordTimeMap = new ConcurrentHashMap<>();
private static final long MIN_RECORD_INTERVAL = 2000; // 2秒间隔
@Override @Override
public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) { public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) {
UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0); UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0);
...@@ -188,37 +191,38 @@ public class SDKDeviceService extends AbstractDeviceService { ...@@ -188,37 +191,38 @@ public class SDKDeviceService extends AbstractDeviceService {
DeviceDTO device = deviceOpt.get(); DeviceDTO device = deviceOpt.get();
deviceRedisService.setDeviceOnline(device); deviceRedisService.setDeviceOnline(device);
deviceRedisService.setDeviceOsd(from, request.getData()); deviceRedisService.setDeviceOsd(from, request.getData());
// 3. 带频率控制的记录上报
new Thread(() -> { submitRecordWithRateLimit(device, request);
UOMDroneFlightRecordDTO uomDroneFlightRecordDTO = new UOMDroneFlightRecordDTO(); // new Thread(() -> {
uomDroneFlightRecordDTO.setOrderID(device.getDeviceSn()+"-"+ DateUtil.format(new Date(), "yyyyMMdd")+"-"+ RandomUtil.randomString(8)); // UOMDroneFlightRecordDTO uomDroneFlightRecordDTO = new UOMDroneFlightRecordDTO();
uomDroneFlightRecordDTO.setSn(device.getDeviceSn()); // uomDroneFlightRecordDTO.setOrderID(device.getDeviceSn()+"-"+ DateUtil.format(new Date(), "yyyyMMdd")+"-"+ RandomUtil.randomString(8));
uomDroneFlightRecordDTO.setFlightStatus("Land"); // uomDroneFlightRecordDTO.setSn(device.getDeviceSn());
uomDroneFlightRecordDTO.setManufacturerID("914403007954257495"); // uomDroneFlightRecordDTO.setFlightStatus("Land");
uomDroneFlightRecordDTO.setUasID("UAS-DEFAULT"); // uomDroneFlightRecordDTO.setManufacturerID("914403007954257495");
uomDroneFlightRecordDTO.setTimeStamp(DateUtil.format(DateUtil.date(request.getTimestamp()),"yyyyMMddHHmmss")); // uomDroneFlightRecordDTO.setUasID("UAS-DEFAULT");
uomDroneFlightRecordDTO.setUasModel(device.getType().name()); // uomDroneFlightRecordDTO.setTimeStamp(DateUtil.format(DateUtil.date(request.getTimestamp()),"yyyyMMddHHmmss"));
uomDroneFlightRecordDTO.setCoordinate(1); // uomDroneFlightRecordDTO.setUasModel(device.getType().name());
uomDroneFlightRecordDTO.setLongitude((long) (NumberUtil.round(request.getData().getLongitude(),7, RoundingMode.DOWN).doubleValue() * 10000000)); // uomDroneFlightRecordDTO.setCoordinate(1);
uomDroneFlightRecordDTO.setLatitude((long) (NumberUtil.round(request.getData().getLatitude(),7, RoundingMode.DOWN).doubleValue() * 10000000)); // uomDroneFlightRecordDTO.setLongitude((long) (NumberUtil.round(request.getData().getLongitude(),7, RoundingMode.DOWN).doubleValue() * 10000000));
uomDroneFlightRecordDTO.setHeightType(1); // uomDroneFlightRecordDTO.setLatitude((long) (NumberUtil.round(request.getData().getLatitude(),7, RoundingMode.DOWN).doubleValue() * 10000000));
uomDroneFlightRecordDTO.setHeight((int) (NumberUtil.round(request.getData().getElevation(),1, RoundingMode.DOWN).doubleValue() * 10)); // uomDroneFlightRecordDTO.setHeightType(1);
uomDroneFlightRecordDTO.setAltitude((int) (request.getData().getHeight().doubleValue() * 10)); // uomDroneFlightRecordDTO.setHeight((int) (NumberUtil.round(request.getData().getElevation(),1, RoundingMode.DOWN).doubleValue() * 10));
uomDroneFlightRecordDTO.setVS((int) (NumberUtil.round(request.getData().getVerticalSpeed(),1, RoundingMode.DOWN).doubleValue() * 10)); // uomDroneFlightRecordDTO.setAltitude((int) (request.getData().getHeight().doubleValue() * 10));
uomDroneFlightRecordDTO.setGS((int) (NumberUtil.round(request.getData().getHorizontalSpeed(),1, RoundingMode.DOWN).doubleValue() * 10)); // uomDroneFlightRecordDTO.setVS((int) (NumberUtil.round(request.getData().getVerticalSpeed(),1, RoundingMode.DOWN).doubleValue() * 10));
uomDroneFlightRecordDTO.setCourse(-999); // uomDroneFlightRecordDTO.setGS((int) (NumberUtil.round(request.getData().getHorizontalSpeed(),1, RoundingMode.DOWN).doubleValue() * 10));
log.info("UOM Record start: =================+++++++++++++++++"); // uomDroneFlightRecordDTO.setCourse(-999);
log.info("UOM Record DTO: " + JSONUtil.toJsonStr(uomDroneFlightRecordDTO)); // log.info("UOM Record start: =================+++++++++++++++++");
try { // log.info("UOM Record DTO: " + JSONUtil.toJsonStr(uomDroneFlightRecordDTO));
String body = uomRecordService.sendRecord(uomDroneFlightRecordDTO); // try {
log.info("UOM Record: " + body); // String body = uomRecordService.sendRecord(uomDroneFlightRecordDTO);
} catch (Exception e) { // log.info("UOM Record: " + body);
e.printStackTrace(); // } catch (Exception e) {
log.error("UOM Record Error: " + e.getMessage()); // e.printStackTrace();
log.error("UOM Record Error: " + e.getMessage()); // log.error("UOM Record Error: " + e.getMessage());
} // log.error("UOM Record Error: " + e.getMessage());
log.info("UOM Record end: =================+++++++++++++++++"); // }
}).start(); // log.info("UOM Record end: =================+++++++++++++++++");
// }).start();
deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData()); deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData());
} }
...@@ -538,4 +542,79 @@ public class SDKDeviceService extends AbstractDeviceService { ...@@ -538,4 +542,79 @@ public class SDKDeviceService extends AbstractDeviceService {
deviceRedisService.setDeviceOsd(dockSn, oldDock); deviceRedisService.setDeviceOsd(dockSn, oldDock);
} }
} }
private void submitRecordWithRateLimit(DeviceDTO device, TopicOsdRequest<OsdDockDrone> request) {
String sn = device.getDeviceSn();
long currentTime = System.currentTimeMillis();
// 检查时间间隔
if (lastRecordTimeMap.containsKey(sn)) {
long lastTime = lastRecordTimeMap.get(sn);
if (currentTime - lastTime < MIN_RECORD_INTERVAL) {
log.debug("Skip record for SN {} due to rate limit", sn);
return;
}
}
// 更新时间戳并提交任务
lastRecordTimeMap.put(sn, currentTime);
recordExecutor.submit(() -> processFlightRecord(device, request));
}
private void processFlightRecord(DeviceDTO device, TopicOsdRequest<OsdDockDrone> request) {
// 1. 构建DTO(提取为独立方法)
UOMDroneFlightRecordDTO recordDto = buildFlightRecordDto(device, request);
// 2. 记录日志(优化日志格式)
log.info("UOM Record start ================= [SN: {}]", device.getDeviceSn());
log.debug("UOM Record DTO: {}", JSONUtil.toJsonStr(recordDto));
// 3. 发送记录(带异常处理)
try {
String response = uomRecordService.sendRecord(recordDto);
log.info("UOM Record success, response: {}", response);
} catch (Exception e) {
log.error("UOM Record failed for SN {}: {}", device.getDeviceSn(), e.getMessage());
log.debug("Stack trace: ", e);
} finally {
log.info("UOM Record end =================== [SN: {}]", device.getDeviceSn());
}
}
private UOMDroneFlightRecordDTO buildFlightRecordDto(DeviceDTO device, TopicOsdRequest<OsdDockDrone> request) {
UOMDroneFlightRecordDTO dto = new UOMDroneFlightRecordDTO();
// 公共字段设置
dto.setOrderID(String.format("%s-%s-%s",
device.getDeviceSn(),
DateUtil.format(new Date(), "yyyyMMdd"),
RandomUtil.randomString(8)));
dto.setSn(device.getDeviceSn());
dto.setFlightStatus("Land");
dto.setManufacturerID("914403007954257495");
dto.setUasID("UAS-DEFAULT");
dto.setTimeStamp(DateUtil.format(DateUtil.date(request.getTimestamp()), "yyyyMMddHHmmss"));
dto.setUasModel(device.getType().name());
// 坐标相关计算
OsdDockDrone data = request.getData();
dto.setCoordinate(1);
dto.setLongitude(convertCoordinate(data.getLongitude().doubleValue()));
dto.setLatitude(convertCoordinate(data.getLatitude().doubleValue()));
dto.setHeightType(1);
dto.setHeight(convertToInt(data.getElevation().doubleValue(), 1));
dto.setAltitude(convertToInt(data.getHeight().doubleValue(), 1));
dto.setVS(convertToInt(data.getVerticalSpeed().doubleValue(), 1));
dto.setGS(convertToInt(data.getHorizontalSpeed().doubleValue(), 1));
dto.setCourse(-999);
return dto;
}
// 辅助方法
private long convertCoordinate(Double value) {
return (long) (NumberUtil.round(value, 7, RoundingMode.DOWN).doubleValue() * 10000000);
}
private int convertToInt(Double value, int decimalPlaces) {
return (int) (NumberUtil.round(value, decimalPlaces, RoundingMode.DOWN).doubleValue() * 10);
}
} }
...@@ -48,11 +48,11 @@ public class UOMRecordService { ...@@ -48,11 +48,11 @@ public class UOMRecordService {
post.header("source", String.valueOf(uomConfiguration.getSource())); post.header("source", String.valueOf(uomConfiguration.getSource()));
post.header("platform", uomConfiguration.getPlatform()); post.header("platform", uomConfiguration.getPlatform());
post.header("programVersion", uomConfiguration.getProgramVersion()); post.header("programVersion", uomConfiguration.getProgramVersion());
post.header("signature",JSONUtil.toJsonStr(sendUOMDTO)); String encrypt = SM3Util.encrypt(JSONUtil.toJsonStr(sendUOMDTO), uomConfiguration.getAppKey());
post.header("signature",encrypt);
post.header("Content-Type","application/json"); post.header("Content-Type","application/json");
sendUOMDTO.setPaths(paths); sendUOMDTO.setPaths(paths);
String encrypt = SM3Util.encrypt(JSONUtil.toJsonStr(sendUOMDTO), uomConfiguration.getAppKey()); post.body(JSONUtil.toJsonStr(sendUOMDTO));
post.body(encrypt);
log.info("UOM Record: " + JSONUtil.toJsonStr(sendUOMDTO)); log.info("UOM Record: " + JSONUtil.toJsonStr(sendUOMDTO));
return post.execute().body(); return post.execute().body();
} }
......
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