diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/DeviceController.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/DeviceController.java index f614d734..d5f71489 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/DeviceController.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/DeviceController.java @@ -9,11 +9,13 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.iot.domain.Device; import com.ruoyi.iot.model.DeviceAllShortOutput; import com.ruoyi.iot.model.DeviceShortOutput; +import com.ruoyi.iot.mqtt.EmqxService; import com.ruoyi.iot.service.IDeviceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -35,6 +37,10 @@ public class DeviceController extends BaseController @Autowired private IDeviceService deviceService; + @Lazy + @Autowired + private EmqxService emqxService; + /** * 查询设备列表 */ @@ -119,6 +125,17 @@ public class DeviceController extends BaseController return AjaxResult.success(deviceService.selectDeviceByDeviceId(deviceId)); } + /** + * 设备数据同步 + */ + @PreAuthorize("@ss.hasPermi('iot:device:query')") + @GetMapping(value = "/synchronization/{serialNumber}") + @ApiOperation("设备数据同步") + public AjaxResult deviceSynchronization(@PathVariable("serialNumber") String serialNumber) + { + return AjaxResult.success(emqxService.deviceSynchronization(serialNumber)); + } + /** * 根据设备编号详细信息 */ diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/ToolController.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/ToolController.java index 986fdf60..38d98d0b 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/ToolController.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/controller/ToolController.java @@ -203,8 +203,6 @@ public class ToolController extends BaseController { } else if (model.getAction().equals("client_connected")) { device.setStatus(3); deviceService.updateDeviceStatusAndLocation(device, model.getIpaddress()); - // 发布设备状态 - emqxService.publishStatus(device.getProductId(), device.getSerialNumber(), 3, device.getIsShadow()); // 影子模式,发布属性和功能 if (device.getIsShadow() == 1) { ThingsModelShadow shadow = deviceService.getDeviceShadowThingsModel(device); diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java index ca132e19..fda5780c 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java @@ -53,6 +53,7 @@ public class EmqxService { * 发布的主题 */ String pStatusTopic = "/status/post"; + String pInfoTopic = "/info/get"; String pNtpTopic = "/ntp/get"; String pPropertyTopic = "/property/get"; String pFunctionTopic = "/function/get"; @@ -127,10 +128,15 @@ public class EmqxService { */ private void reportDevice(Long productId, String deviceNum, String message) { try { + // 设备实体 + Device deviceEntity=deviceService.selectDeviceBySerialNumber(deviceNum); + // 上报设备信息 Device device = JSON.parseObject(message, Device.class); device.setProductId(productId); device.setSerialNumber(deviceNum); - deviceService.reportDevice(device); + deviceService.reportDevice(device,deviceEntity); + // 发布设备状态 + publishStatus(productId, deviceNum, 3, deviceEntity.getIsShadow()); } catch (Exception e) { logger.error("接收设备信息,解析数据时异常 message={}", e.getMessage()); } @@ -216,7 +222,14 @@ public class EmqxService { } /** - * 2.发布时钟同步信息 + * 2.发布设备信息 + */ + public void publishInfo(Long productId, String deviceNum) { + emqxClient.publish(1, false, "/" + productId + "/" + deviceNum + pInfoTopic, ""); + } + + /** + * 3.发布时钟同步信息 * * @param message */ @@ -228,7 +241,7 @@ public class EmqxService { } /** - * 3.发布属性 + * 4.发布属性 */ public void publishProperty(Long productId, String deviceNum, List thingsList) { if (thingsList == null) { @@ -239,7 +252,7 @@ public class EmqxService { } /** - * 4.发布功能 + * 5.发布功能 */ public void publishFunction(Long productId, String deviceNum, List thingsList) { if (thingsList == null) { @@ -250,5 +263,21 @@ public class EmqxService { } - + /** + * 设备数据同步 + * + * @param deviceNumber 设备编号 + * @return 设备 + */ + public Device deviceSynchronization(String deviceNumber) { + Device device=deviceService.selectDeviceBySerialNumber(deviceNumber); + // 1-未激活,2-禁用,3-在线,4-离线 + if(device.getStatus()==3){ + device.setStatus(4); + deviceService.updateDevice(device); + // 发布设备信息 + publishInfo(device.getProductId(),device.getSerialNumber()); + } + return device; + } } diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/IDeviceService.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/IDeviceService.java index f3225686..08c7a68f 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/IDeviceService.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/IDeviceService.java @@ -152,7 +152,7 @@ public interface IDeviceService * @param device 设备 * @return 结果 */ - public int reportDevice(Device device); + public int reportDevice(Device device,Device deviceentity); /** * 删除设备 diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java index 0b5cd962..1aa76614 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java @@ -530,16 +530,19 @@ public class DeviceServiceImpl implements IDeviceService { device.setTenantName(product.getTenantName()); device.setImgUrl(product.getImgUrl()); // 随机经纬度和地址 - device.setNetworkIp("127.0.0.1"); - if(device.getLongitude()==null || device.getLongitude().equals("")){ - device.setLongitude(BigDecimal.valueOf(116.23-(Math.random()*15))); - } - if(device.getLatitude()==null || device.getLatitude().equals("")){ - device.setLatitude(BigDecimal.valueOf(39.54-(Math.random()*15))); - } - if(device.getNetworkAddress()==null || device.getNetworkAddress().equals("")){ - device.setNetworkAddress("中国"); - } + SysUser user = getLoginUser().getUser(); + device.setNetworkIp(user.getLoginIp()); + setLocation(user.getLoginIp(),device); +// if(device.getLongitude()==null || device.getLongitude().equals("")){ +// device.setLongitude(BigDecimal.valueOf(116.23-(Math.random()*15))); +// } +// if(device.getLatitude()==null || device.getLatitude().equals("")){ +// device.setLatitude(BigDecimal.valueOf(39.54-(Math.random()*15))); +// } +// if(device.getNetworkAddress()==null || device.getNetworkAddress().equals("")){ +// device.setNetworkAddress("中国"); +// } + deviceMapper.insertDevice(device); // 添加设备用户 DeviceUser deviceUser = new DeviceUser(); @@ -577,11 +580,13 @@ public class DeviceServiceImpl implements IDeviceService { device.setUserId(userId); device.setUserName(user.getUserName()); device.setFirmwareVersion(BigDecimal.valueOf(1.0)); - device.setStatus(3); // 设备状态(1-未激活,2-禁用,3-在线,4-离线) + // 设备状态(1-未激活,2-禁用,3-在线,4-离线) + device.setStatus(3); device.setActiveTime(DateUtils.getNowDate()); device.setIsShadow(0); device.setRssi(0); - device.setLocationWay(1); // 1-自动定位,2-设备定位,3-自定义位置 + // 1-自动定位,2-设备定位,3-自定义位置 + device.setLocationWay(1); device.setCreateTime(DateUtils.getNowDate()); device.setThingsModelValue(JSONObject.toJSONString(getThingsModelDefaultValue(productId))); // 随机位置 @@ -830,8 +835,7 @@ public class DeviceServiceImpl implements IDeviceService { * @return 结果 */ @Override - public int reportDevice(Device device) { - Device deviceEntity=deviceMapper.selectDeviceBySerialNumber(device.getSerialNumber()); + public int reportDevice(Device device,Device deviceEntity) { // 未采用设备定位则清空定位,定位方式(1=ip自动定位,2=设备定位,3=自定义) if(deviceEntity.getLocationWay()!=2){ device.setLatitude(null);