拓恒接入

This commit is contained in:
孙小云 2026-02-04 14:36:52 +08:00
parent 8f0d69b42f
commit dad7be582e
1 changed files with 134 additions and 12 deletions

View File

@ -9,6 +9,7 @@ import com.ruoyi.device.domain.model.thingsboard.TelemetryValue;
import com.ruoyi.device.domain.model.thingsboard.attributes.psdk.PsdkDevice;
import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes;
import com.ruoyi.device.domain.model.thingsboard.constants.DeviceTelemetry;
import com.ruoyi.device.domain.model.thingsboard.tuoheng.constants.TuohengDeviceAttributes;
import com.ruoyi.device.api.enums.PayloadTypeEnum;
import com.ruoyi.device.service.enums.DeviceType;
import org.slf4j.Logger;
@ -73,6 +74,7 @@ public class SynService {
/**
* 初始化设备名称过滤正则表达式列表
* 延迟初始化在第一次使用时编译正则表达式
* 改动点: 首先不要用这个过滤了TH开头的就是拓恒无人机
*/
private void initExcludePatterns() {
if (excludePatternList == null) {
@ -188,17 +190,20 @@ public class SynService {
}
try {
// 获取子设备属性
AttributeMap attributes = iThingsBoardDomain.getPredefinedDeviceAttributes(childDeviceId);
String deviceName = childDeviceInfo.getName();
// 判断设备类型
DeviceType deviceType = determineDeviceType(childDeviceInfo, attributes);
// 同步子设备传入网关ID
Long deviceId = syncDevice(childDeviceInfo, deviceType, gatewayInfo.getId());
// 根据设备类型进行不同的处理
syncDeviceByType(deviceId, childDeviceInfo.getName(), deviceType, attributes);
// 判断是大疆还是拓恒设备通过设备名称是否以 TH 开头
if (deviceName.startsWith("TH")) {
// 拓恒设备处理逻辑
log.info("检测到拓恒设备: {}", deviceName);
syncTuohengDevice(childDeviceInfo, gatewayInfo.getId());
} else {
// 大疆设备处理逻辑原有逻辑
AttributeMap attributes = iThingsBoardDomain.getPredefinedDeviceAttributes(childDeviceId);
DeviceType deviceType = determineDeviceType(childDeviceInfo, attributes);
Long deviceId = syncDevice(childDeviceInfo, deviceType, gatewayInfo.getId());
syncDeviceByType(deviceId, childDeviceInfo.getName(), deviceType, attributes);
}
totalCount++;
@ -321,8 +326,12 @@ public class SynService {
newDevice.setGateway(gatewayId);
newDevice.setCreateBy("system");
log.info("准备插入新设备: deviceName={}, deviceType={}, deviceSn={}",
deviceName, deviceType, deviceSn);
// 根据设备名称判断厂商
String manufacturer = deviceName.startsWith("TH") ? "tuoheng" : "dajiang";
newDevice.setDeviceManufacturer(manufacturer);
log.info("准备插入新设备: deviceName={}, deviceType={}, deviceSn={}, manufacturer={}",
deviceName, deviceType, deviceSn, manufacturer);
deviceDomain.insertDevice(newDevice);
Long deviceId = newDevice.getDeviceId();
@ -657,4 +666,117 @@ public class SynService {
log.info("将机场添加到默认分组: dockId={}, dockName={}, groupId={}",
dockId, dockName, defaultGroupId);
}
/**
* 同步拓恒设备机场和无人机不区分类型同时落三个表
*
* @param deviceInfo 设备信息
* @param gatewayId 网关ID
*/
private void syncTuohengDevice(DeviceInfo deviceInfo, String gatewayId) {
String deviceId = deviceInfo.getId();
String deviceName = deviceInfo.getName(); // 这是SN号 THJSQ03B2410TGJ3MCJY
log.info("开始同步拓恒设备: deviceName(SN)={}", deviceName);
try {
// 获取拓恒设备属性
AttributeMap attributes = iThingsBoardDomain.getPredefinedTuohengDeviceAttributes(deviceId);
// 获取 airportID机场和无人机的名称
Optional<String> airportIdOpt = attributes.get(TuohengDeviceAttributes.AIRPORT_ID);
String airportId = airportIdOpt.orElse(deviceName); // 如果没有 airportID使用设备名称
// 获取固件版本
Optional<String> firmwareVersionOpt = attributes.get(TuohengDeviceAttributes.HARDWARE_VERSION);
String firmwareVersion = firmwareVersionOpt.orElse("");
log.info("拓恒设备属性: SN={}, airportID={}, firmwareVersion={}",
deviceName, airportId, firmwareVersion);
// 1. 同步到 device 作为机场
Long dockDeviceId = syncDevice(deviceInfo, DeviceType.DOCK, gatewayId);
// 2. 同步到 device_dock
syncTuohengDock(dockDeviceId, deviceName, airportId, firmwareVersion);
// 3. 同步到 device 作为无人机
Long aircraftDeviceId = syncDevice(deviceInfo, DeviceType.AIRCRAFT, gatewayId);
// 4. 同步到 device_aircraft
syncTuohengAircraft(aircraftDeviceId, deviceName, airportId, firmwareVersion);
// 5. 同步到 device_dock_aircraft 建立机场-无人机关联
syncDockAircraft(dockDeviceId, aircraftDeviceId);
log.info("拓恒设备同步完成: SN={}, dockDeviceId={}, aircraftDeviceId={}",
deviceName, dockDeviceId, aircraftDeviceId);
} catch (Exception e) {
log.error("同步拓恒设备失败: deviceName={}, error={}", deviceName, e.getMessage(), e);
throw e;
}
}
/**
* 同步拓恒机场数据
*
* @param deviceId 设备主键ID
* @param sn 设备SN号设备名称
* @param airportId 机场IDairportID属性
* @param firmwareVersion 固件版本
*/
private void syncTuohengDock(Long deviceId, String sn, String airportId, String firmwareVersion) {
log.info("开始同步拓恒机场: deviceId={}, SN={}, airportID={}", deviceId, sn, airportId);
// 查询机场是否已存在
Dock existingDock = dockDomain.selectDockByDeviceId(deviceId);
if (existingDock == null) {
// 机场不存在插入新机场
Dock newDock = new Dock();
newDock.setDockName(airportId); // 使用 airportID 作为机场名称
newDock.setDeviceId(deviceId);
newDock.setCreateBy("system");
log.info("准备插入新拓恒机场: deviceId={}, dockName={}, SN={}", deviceId, airportId, sn);
dockDomain.insertDock(newDock);
log.info("插入新拓恒机场成功: dockId={}", newDock.getDockId());
// 确保默认分组存在并加入
ensureDefaultGroupExists();
insertDockToDefaultGroup(newDock.getDockId(), airportId);
} else {
log.info("拓恒机场已存在: deviceId={}, dockId={}", deviceId, existingDock.getDockId());
}
}
/**
* 同步拓恒无人机数据
*
* @param deviceId 设备主键ID
* @param sn 设备SN号设备名称
* @param airportId 机场IDairportID属性
* @param firmwareVersion 固件版本
*/
private void syncTuohengAircraft(Long deviceId, String sn, String airportId, String firmwareVersion) {
log.info("开始同步拓恒无人机: deviceId={}, SN={}, airportID={}", deviceId, sn, airportId);
// 查询无人机是否已存在
Aircraft existingAircraft = aircraftDomain.selectAircraftByDeviceId(deviceId);
if (existingAircraft == null) {
// 无人机不存在插入新无人机
Aircraft newAircraft = new Aircraft();
newAircraft.setAircraftName(airportId); // 使用 airportID 作为无人机名称
newAircraft.setDeviceId(deviceId);
newAircraft.setCreateBy("system");
log.info("准备插入新拓恒无人机: deviceId={}, aircraftName={}, SN={}", deviceId, airportId, sn);
aircraftDomain.insertAircraft(newAircraft);
log.info("插入新拓恒无人机成功: aircraftId={}", newAircraft.getAircraftId());
} else {
log.info("拓恒无人机已存在: deviceId={}, aircraftId={}", deviceId, existingAircraft.getAircraftId());
}
}
}