设备数据同步和设备的默认定位

This commit is contained in:
kerwincui
2022-07-04 14:49:20 +08:00
parent ebea98ca99
commit dd0b0942be
5 changed files with 70 additions and 22 deletions

View File

@@ -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));
}
/**
* 根据设备编号详细信息
*/

View File

@@ -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);

View File

@@ -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<IdentityAndName> thingsList) {
if (thingsList == null) {
@@ -239,7 +252,7 @@ public class EmqxService {
}
/**
* 4.发布功能
* 5.发布功能
*/
public void publishFunction(Long productId, String deviceNum, List<IdentityAndName> 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;
}
}

View File

@@ -152,7 +152,7 @@ public interface IDeviceService
* @param device 设备
* @return 结果
*/
public int reportDevice(Device device);
public int reportDevice(Device device,Device deviceentity);
/**
* 删除设备

View File

@@ -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);