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 Integer noise;
|
// PM2.5
|
private Integer pm25;
|
// PM10
|
private Integer pm10;
|
// 总悬浮颗粒物(TSP)
|
private Integer tsp;
|
// SO2二氧化硫/甲醛相对值
|
private Integer so2;
|
private Integer ech2o;
|
// NO2二氧化氮/TVOC
|
private Integer no2;
|
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);
|
this.pm25 = parseVal(hex,36, 40);
|
this.pm10 = parseVal(hex,40,44);
|
this.tsp = parseVal(hex,44,48);
|
|
/**
|
* 以下区分版本
|
*/
|
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;
|
}
|
}
|
}
|