背景:现在主流的MobdusRTU从站设备云采集方案应该是走ModbusRTU转JSON然后通过MQTT/HTTP等方式上传,这个方案只需要一个物联网网关就能解决,而我本来在公司项目初期也是打算用这个方案的,代码逻辑都写好了,但结果半路杀出个程咬金,项目总监跟我说现场需要物联网网关支持POE供电,而我选的那个产品不支持POE供电所以只能PASS,但很不巧的是,其他厂家的产品虽支持POE供电,但又不支持ModbusRTU转JSON,只能支持透传,所以没有办法,只好采用通过ModbusRTU指令透传来实现采集的下下策。
主要代码:
RTU采集数据Entity:
package com.finder.system.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* 第三方通风橱采集数据表
* </p>
*
* @author finder
* @since 2024-05-27
*/
@TableName("data_new_fumehood")
public class DataNewFumehood implements Serializable {
private static final long serialVersionUID = 1L;
public DataNewFumehood() {
}
public DataNewFumehood(Integer id, String deviceCode, Integer emergencyExhaustWindStatus, Integer windowHeight, BigDecimal windSpeed, BigDecimal temperature, Integer valveOpeningDegree, Integer openStatus, Integer closeStatus, Integer maxExhaustWindOpenStatus, Integer maxExhaustWindCloseStatus, Integer illuminationOpenStatus, Integer illuminationCloseStatus, Integer windowHeightOverlimitStatus, Integer windSpeedOverlimitStatus, Integer temperatureOverlimitStatus, Integer windowExistBarrierStatus, LocalDateTime acquisitionTime) {
this.id = id;
this.deviceCode = deviceCode;
this.emergencyExhaustWindStatus = emergencyExhaustWindStatus;
this.windowHeight = windowHeight;
this.windSpeed = windSpeed;
this.temperature = temperature;
this.valveOpeningDegree = valveOpeningDegree;
this.openStatus = openStatus;
this.closeStatus = closeStatus;
this.maxExhaustWindOpenStatus = maxExhaustWindOpenStatus;
this.maxExhaustWindCloseStatus = maxExhaustWindCloseStatus;
this.illuminationOpenStatus = illuminationOpenStatus;
this.illuminationCloseStatus = illuminationCloseStatus;
this.windowHeightOverlimitStatus = windowHeightOverlimitStatus;
this.windSpeedOverlimitStatus = windSpeedOverlimitStatus;
this.temperatureOverlimitStatus = temperatureOverlimitStatus;
this.windowExistBarrierStatus = windowExistBarrierStatus;
this.acquisitionTime = acquisitionTime;
}
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 设备编号
*/
private String deviceCode;
/**
* 紧急排风状态
*/
private Integer emergencyExhaustWindStatus;
/**
* 视窗1高度
*/
private Integer windowHeight;
/**
* 当前实际面风速(m/s)
*/
private BigDecimal windSpeed;
/**
* 温度(℃)
*/
private BigDecimal temperature;
/**
* 阀开度(%)
*/
private Integer valveOpeningDegree;
/**
* 开机状态
*/
private Integer openStatus;
/**
* 关机状态
*/
private Integer closeStatus;
/**
* 最大排风开启状态
*/
private Integer maxExhaustWindOpenStatus;
/**
* 最大排风关闭状态
*/
private Integer maxExhaustWindCloseStatus;
/**
* 照明开启状态
*/
private Integer illuminationOpenStatus;
/**
* 照明关闭状态
*/
private Integer illuminationCloseStatus;
/**
* 视窗1高度超限状态(0正常/1超限)
*/
private Integer windowHeightOverlimitStatus;
/**
* 面风速超限状态(0正常/1超限)
*/
private Integer windSpeedOverlimitStatus;
/**
* 温度超限状态(0正常/1超限)
*/
private Integer temperatureOverlimitStatus;
/**
* 防夹检测开关状态(0正常/1有障碍物)
*/
private Integer windowExistBarrierStatus;
/**
* 返回报文(十六进制显示的字符串)
*/
private String hexStr;
/**
* 采集时间
*/
private LocalDateTime acquisitionTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDeviceCode() {
return deviceCode;
}
public void setDeviceCode(String deviceCode) {
this.deviceCode = deviceCode;
}
public Integer getEmergencyExhaustWindStatus() {
return emergencyExhaustWindStatus;
}
public void setEmergencyExhaustWindStatus(Integer emergencyExhaustWindStatus) {
this.emergencyExhaustWindStatus = emergencyExhaustWindStatus;
}