更新设备物联网逻辑

This commit is contained in:
磷叶 2025-05-17 17:25:03 +08:00
parent 2e05d93809
commit 8b35e17553
6 changed files with 65 additions and 38 deletions

View File

@ -1,5 +1,6 @@
package com.ruoyi.bst.device.service; package com.ruoyi.bst.device.service;
import java.time.LocalDateTime;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -155,11 +156,20 @@ public interface DeviceIotService {
*/ */
int updateIot(Device device); int updateIot(Device device);
/**
* 更新设备在线状态
*
* @param mac
* @param onlineStatus
* @param lastOnlineTime
* @return
*/
int updateOnlineStatus(String mac, String onlineStatus, LocalDateTime lastOnlineTime);
/** /**
* 蓝牙上传 * 蓝牙上传
* *
* @param dto * @param dto
* @return
*/ */
int bltUpload(DeviceBltUploadDTO dto); int bltUpload(DeviceBltUploadDTO dto);

View File

@ -41,6 +41,7 @@ import com.ruoyi.iot.domain.IotDeviceInfo;
import com.ruoyi.iot.domain.response.CommandResponse; import com.ruoyi.iot.domain.response.CommandResponse;
import com.ruoyi.iot.enums.IotHttpStatus; import com.ruoyi.iot.enums.IotHttpStatus;
import com.ruoyi.iot.service.IotService; import com.ruoyi.iot.service.IotService;
import com.ruoyi.iot.service.impl.DeviceOnlineStatus;
import com.ruoyi.iot.util.IotUtil; import com.ruoyi.iot.util.IotUtil;
import com.ruoyi.system.operLog.service.OperLogService; import com.ruoyi.system.operLog.service.OperLogService;
@ -293,24 +294,23 @@ public class DeviceIotServiceImpl implements DeviceIotService {
.filter(item -> Objects.equals(item.getMac(), device.getMac())) .filter(item -> Objects.equals(item.getMac(), device.getMac()))
.findFirst().orElse(null); .findFirst().orElse(null);
DeviceUtil.setIotInfo(device, iot); DeviceUtil.setIotInfo(device, iot);
this.updateIot(device);
} }
// 异步发送命令强制设备上报数据 // 异步发送命令强制设备上报数据
// scheduledExecutorService.execute(() -> { scheduledExecutorService.execute(() -> {
// for (DeviceVO device : deviceList) { for (DeviceVO device : deviceList) {
// try { try {
// if (onlineType != null) { if (onlineType != null) {
// iotService.getOnlineStatus(device, onlineType); iotService.getOnlineStatus(device, onlineType);
// } }
// } catch (Exception e) { } catch (Exception e) {
// log.error("强制设备{}上报数据失败", device.getSn(), e); log.error("强制设备{}上报数据失败", device.getSn(), e);
// } }
// } }
// }); });
} }
@Override
public int updateIot(Device device) { public int updateIot(Device device) {
if (device == null || StringUtils.isBlank(device.getMac())) { if (device == null || StringUtils.isBlank(device.getMac())) {
return 0; return 0;
@ -351,15 +351,9 @@ public class DeviceIotServiceImpl implements DeviceIotService {
if (device.getLastLocationTime() != null) { if (device.getLastLocationTime() != null) {
info.setLastLocationTime(device.getLastLocationTime()); info.setLastLocationTime(device.getLastLocationTime());
} }
if (device.getOnlineStatus() != null) {
info.setOnlineStatus(device.getOnlineStatus());
}
if (device.getSoftwareVersion() != null) { if (device.getSoftwareVersion() != null) {
info.setSoftwareVersion(device.getSoftwareVersion()); info.setSoftwareVersion(device.getSoftwareVersion());
} }
if (device.getLastOnlineTime() != null) {
info.setLastOnlineTime(device.getLastOnlineTime());
}
String key = CacheConstants.DEVICE_CACHE_INFO + device.getMac(); String key = CacheConstants.DEVICE_CACHE_INFO + device.getMac();
redisCache.setCacheObject(key, info); redisCache.setCacheObject(key, info);
@ -367,6 +361,29 @@ public class DeviceIotServiceImpl implements DeviceIotService {
return 1; return 1;
} }
@Override
public int updateOnlineStatus(String mac, String onlineStatus, LocalDateTime lastOnlineTime) {
if (StringUtils.isBlank(mac)) {
return 0;
}
DeviceCacheInfo info = this.getIotInfo(mac);
if (info == null) {
info = new DeviceCacheInfo();
}
if (onlineStatus != null) {
info.setOnlineStatus(onlineStatus);
}
if (DeviceOnlineStatus.ONLINE.getStatus().equals(onlineStatus) && lastOnlineTime != null) {
info.setLastOnlineTime(lastOnlineTime);
}
String key = CacheConstants.DEVICE_CACHE_INFO + mac;
redisCache.setCacheObject(key, info);
return 1;
}
@Override @Override
public boolean create(String mac) { public boolean create(String mac) {
if (StringUtils.isBlank(mac)) { if (StringUtils.isBlank(mac)) {

View File

@ -100,10 +100,6 @@ public class DeviceUtil {
if (device == null || info == null) { if (device == null || info == null) {
return; return;
} }
if (info.getOnlineStatus() != null) {
device.setOnlineStatus(info.getOnlineStatus());
}
if (info.getVoltage() != null) { if (info.getVoltage() != null) {
device.setVoltage(info.getVoltage()); device.setVoltage(info.getVoltage());
} }
@ -137,6 +133,11 @@ public class DeviceUtil {
if (info.getSoftwareVersion() != null) { if (info.getSoftwareVersion() != null) {
device.setSoftwareVersion(info.getSoftwareVersion()); device.setSoftwareVersion(info.getSoftwareVersion());
} }
// 在线状态
if (info.getOnlineStatus() != null) {
device.setOnlineStatus(info.getOnlineStatus());
}
if (info.getLastOnlineTime() != null) { if (info.getLastOnlineTime() != null) {
device.setLastOnlineTime(info.getLastOnlineTime()); device.setLastOnlineTime(info.getLastOnlineTime());
} }

View File

@ -108,8 +108,10 @@ public class IotReceiveServiceImpl implements IotReceiveService {
device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus());
device.setLastOnlineTime(at); device.setLastOnlineTime(at);
// 增加更新频率控制 // 更新设备信息
deviceIotService.updateIot(device); deviceIotService.updateIot(device);
// 更新设备在线状态
deviceIotService.updateOnlineStatus(device.getMac(), DeviceOnlineStatus.ONLINE.getStatus(), at);
// 定位无效不处理 // 定位无效不处理
if (device.getLongitude() == null || device.getLatitude() == null) { if (device.getLongitude() == null || device.getLatitude() == null) {

View File

@ -18,7 +18,6 @@ import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.bst.commandLog.domain.CommandLog; import com.ruoyi.bst.commandLog.domain.CommandLog;
import com.ruoyi.bst.commandLog.domain.enums.CommandLogType; import com.ruoyi.bst.commandLog.domain.enums.CommandLogType;
import com.ruoyi.bst.commandLog.service.CommandLogService; import com.ruoyi.bst.commandLog.service.CommandLogService;
import com.ruoyi.bst.device.domain.Device;
import com.ruoyi.bst.device.service.DeviceIotService; import com.ruoyi.bst.device.service.DeviceIotService;
import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.constant.HttpStatus;
@ -319,13 +318,7 @@ public class IotServiceImpl implements IotService {
} }
private void updateOnlineStatus(String mac, String status) { private void updateOnlineStatus(String mac, String status) {
Device device = new Device(); deviceIotService.updateOnlineStatus(mac, status, LocalDateTime.now());
device.setMac(mac);
device.setOnlineStatus(status);
if (DeviceOnlineStatus.ONLINE.getStatus().equals(status)) {
device.setLastOnlineTime(LocalDateTime.now());
}
deviceIotService.updateIot(device);
} }
// 新增命令日志 // 新增命令日志

View File

@ -2,7 +2,6 @@ package com.ruoyi.web.bst;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.ruoyi.bst.device.service.DeviceAssembler;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
@ -13,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinPermission; import com.ruoyi.bst.areaJoin.domain.enums.AreaJoinPermission;
import com.ruoyi.bst.device.domain.DeviceVO; import com.ruoyi.bst.device.domain.DeviceVO;
import com.ruoyi.bst.device.domain.enums.DeviceUnLockType; import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import com.ruoyi.bst.device.service.DeviceAssembler;
import com.ruoyi.bst.device.service.DeviceIotService; import com.ruoyi.bst.device.service.DeviceIotService;
import com.ruoyi.bst.device.service.DeviceService; import com.ruoyi.bst.device.service.DeviceService;
import com.ruoyi.bst.device.service.DeviceValidator; import com.ruoyi.bst.device.service.DeviceValidator;
@ -54,6 +54,7 @@ public class DeviceIotController extends BaseController {
/** /**
* 执行带设备锁的操作 * 执行带设备锁的操作
*
* @param device 设备信息 * @param device 设备信息
* @param operation 具体操作 * @param operation 具体操作
* @return 操作结果 * @return 操作结果
@ -77,7 +78,8 @@ public class DeviceIotController extends BaseController {
@PutMapping("/unlock") @PutMapping("/unlock")
public AjaxResult unlock(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn) { public AjaxResult unlock(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn) {
DeviceVO device = this.getDevice(id, sn); DeviceVO device = this.getDevice(id, sn);
return executeWithLock(device, () -> success(deviceIotService.unlock(device, DeviceUnLockType.ADMIN, "管理员开锁", true))); return executeWithLock(device,
() -> success(deviceIotService.unlock(device, DeviceUnLockType.ADMIN, "管理员开锁", true)));
} }
@PreAuthorize("@ss.hasPermi('bst:device:lock')") @PreAuthorize("@ss.hasPermi('bst:device:lock')")
@ -93,7 +95,8 @@ public class DeviceIotController extends BaseController {
@PutMapping("/ring") @PutMapping("/ring")
public AjaxResult ring(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn) { public AjaxResult ring(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn) {
DeviceVO device = this.getDevice(id, sn); DeviceVO device = this.getDevice(id, sn);
return executeWithLock(device, () -> success(deviceIotService.play(device, IotConstants.PLAY_WARNING, "管理员响铃寻车", true))); return executeWithLock(device,
() -> success(deviceIotService.play(device, IotConstants.PLAY_WARNING, "管理员响铃寻车", true)));
} }
@PreAuthorize("@ss.hasPermi('bst:device:reboot')") @PreAuthorize("@ss.hasPermi('bst:device:reboot')")
@ -127,7 +130,8 @@ public class DeviceIotController extends BaseController {
@PreAuthorize("@ss.hasPermi('bst:device:music')") @PreAuthorize("@ss.hasPermi('bst:device:music')")
@Log(title = "管理员设置声音", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.DEVICE) @Log(title = "管理员设置声音", businessType = BusinessType.OTHER, bizIdName = "arg0", bizType = LogBizType.DEVICE)
@PutMapping("/music") @PutMapping("/music")
public AjaxResult music(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn, @RequestParam String music) { public AjaxResult music(@RequestParam(required = false) Long id, @RequestParam(required = false) String sn,
@RequestParam String music) {
DeviceVO device = this.getDevice(id, sn); DeviceVO device = this.getDevice(id, sn);
return executeWithLock(device, () -> success(deviceIotService.setMusic(device, music, "管理员设置声音", true))); return executeWithLock(device, () -> success(deviceIotService.setMusic(device, music, "管理员设置声音", true)));
} }