package com.sandu.ximon.admin.manager.iot.frame.inner.report;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
|
import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame;
|
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
|
import lombok.Data;
|
import lombok.ToString;
|
|
/**
|
* @author chenjiantian
|
* @date 2021/12/6 18:20
|
* A5-84-01
|
* 大气心跳包 应答
|
*/
|
@Data
|
@ToString(callSuper = true)
|
public class A5AtmosphereHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5AtmosphereHeartbeatReportInnerFrame> {
|
|
// 目标地址 2
|
private String destinationAddress;
|
// 心跳包数据 58
|
private HeartBeatDataPackage heartBeatDataPackage;
|
|
private String originFrame;
|
|
@Override
|
public A5AtmosphereHeartbeatReportInnerFrame transformFrame(String hex) {
|
// 长度不一致时,返回null
|
if (StrUtil.isBlank(hex)) {
|
return null;
|
}
|
// MQTT通信方式(1)
|
setConnectType(hex.substring(0, 2));
|
// 功能码(1)
|
setFunctionCode(hex.substring(2, 4));
|
// 负荷长度(2)
|
setPayloadLength(hex.substring(4, 8));
|
|
setDestinationAddress(hex.substring(8, 12));
|
|
String heartBeatData = hex.substring(12, 76);
|
HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage();
|
heartBeatDataPackage.transformFrame(heartBeatData);
|
setHeartBeatDataPackage(heartBeatDataPackage);
|
|
setCrc32(hex.substring(hex.length() - 8));
|
// 校验CRC32
|
String frame = hex.substring(2, hex.length() - 8);
|
this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
|
return this;
|
}
|
|
@Data
|
public static class HeartBeatDataPackage implements IResponseInnerFrame<HeartBeatDataPackage> {
|
// 设备型号 2
|
private String deviceType;
|
// 模块预热状态标志 1
|
private String moduleWarmUpStatusFlag;
|
// 温度值
|
private Double temperature;
|
// 湿度值
|
private Double humidity;
|
// 风速
|
private Double windSpeed;
|
// 风向
|
private Double windDirection;
|
// 大气压
|
private Integer pressure;
|
// 光强
|
private Integer lightIntensity;
|
// 噪音
|
private Double noise;
|
// PM2.5
|
private Integer pm25;
|
// PM10
|
private Integer pm10;
|
// 雨量
|
private Double rainfall;
|
// SO2二氧化硫相对值
|
private Integer so2;
|
// 甲醛相对值
|
private Integer ech2o;
|
// NO2二氧化氮
|
private Integer no2;
|
// TVOC
|
private Integer tvoc;
|
// CO一氧化碳
|
private Integer co;
|
// 二氧化碳
|
private Integer co2;
|
// O3臭氧
|
private Integer o3;
|
// F氟化物
|
private Integer fluoride;
|
|
@Override
|
public HeartBeatDataPackage transformFrame(String hex) {
|
if (hex.length() != 64) {
|
return null;
|
}
|
Integer type = 0;
|
this.deviceType = hex.substring(0, 4);
|
if (this.deviceType.equals(DeviceType.SENSOR_V1.getType())) {
|
type = 1;
|
}
|
this.moduleWarmUpStatusFlag = hex.substring(4, 6);
|
this.temperature = Double.parseDouble(
|
parseVal(hex, 6, 8)
|
+ "."
|
+ parseVal(hex, 8, 10)
|
);
|
this.humidity = Double.parseDouble(
|
parseVal(hex, 10, 12)
|
+ "."
|
+ parseVal(hex, 12, 14)
|
);
|
this.windSpeed = parseVal(hex, 14, 18) * .1;
|
this.windDirection = parseVal(hex, 18, 22) * .1;
|
this.pressure = parseVal(hex, 22, 26);
|
this.lightIntensity = parseVal(hex, 26, 32);
|
this.noise = parseVal(hex, 32, 36) * .1;
|
this.pm25 = parseVal(hex, 36, 40);
|
this.pm10 = parseVal(hex, 40, 44);
|
this.rainfall = parseVal(hex, 44, 48) * .1;
|
|
/**
|
* 以下区分版本
|
*/
|
if (type.equals(1)) {
|
this.ech2o = parseVal(hex, 48, 52);
|
this.tvoc = parseVal(hex, 52, 56);
|
this.co2 = parseVal(hex, 56, 60);
|
} else {
|
this.so2 = parseVal(hex, 48, 52);
|
this.ech2o = parseVal(hex, 48, 52);
|
this.tvoc = parseVal(hex, 52, 56);
|
this.no2 = parseVal(hex, 52, 56);
|
this.co = parseVal(hex, 56, 60);
|
this.co2 = parseVal(hex, 56, 60);
|
}
|
|
this.o3 = parseVal(hex, 60, 62);
|
this.fluoride = parseVal(hex, 62, 64);
|
|
return this;
|
}
|
|
private Integer parseVal(String frame, int start, int end) {
|
return Integer.parseInt(frame.substring(start, end), 16);
|
}
|
}
|
|
public enum DeviceType {
|
|
SENSOR_V1("0101");
|
|
private String type;
|
|
DeviceType(String type) {
|
this.type = type;
|
}
|
|
public String getType() {
|
return type;
|
}
|
}
|
}
|