2021与蓝度共同重构项目,服务端
zhanzhiqin
2022-08-03 41f01abcbf2c5fd6f63da15a0dabeb34ceb9c3ec
大气设备
已修改7个文件
已添加1个文件
428 ■■■■ 文件已修改
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AirEquipmentController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5AtmosphereHeartbeatReportInnerFrame.java 247 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/AtmosphereModifiedDataReqInnerFrame.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/AtmoFunctionCode.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirDataService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AirEquipmentController.java
@@ -106,4 +106,23 @@
        return ResponseUtil.success(airEquipmentService.Reboot(mac));
    }
    /**
     * è®¾ç½®æ•°æ®ä¿®æ­£å€¼
     *
     * @param mac             ç¯æ†MAC
     * @param type            æ•°æ®ä¿®æ­£è®¾å¤‡ç±»åž‹
     * @param valueOfReal     ä¼ æ„Ÿå™¨æ•°å€¼
     * @param valueOfStandard æ ‡å‡†ä»ªå™¨æ•°å€¼
     * @return
     */
    public ResponseVO<Object> ModifiedData(@RequestParam(value = "mac", required = false) String mac,
                                           @RequestParam(value = "type", required = false) String type,
                                           @RequestParam(value = "valueOfReal", required = false) Double valueOfReal,
                                           @RequestParam(value = "valueOfStandard", required = false) Double valueOfStandard) {
        airEquipmentService.ModifiedData(mac, type, valueOfReal, valueOfStandard);
        return ResponseUtil.success(null);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5AtmosphereHeartbeatReportInnerFrame.java
@@ -39,7 +39,7 @@
        setDestinationAddress(hex.substring(8, 12));
        String heartBeatData = hex.substring(12, 76);
        String heartBeatData = hex.substring(12, hex.length() - 8);
        HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage();
        heartBeatDataPackage.transformFrame(heartBeatData);
        setHeartBeatDataPackage(heartBeatDataPackage);
@@ -53,96 +53,231 @@
    @Data
    public static class HeartBeatDataPackage implements IResponseInnerFrame<HeartBeatDataPackage> {
//                  ç¼–号                        æ•°æ®                                            å«ä¹‰            å•位
//                  D7:D6        D5:D4            D3:D2    D1:D0
//                  0x01    ç©ºï¼Œç”¨0x00填充    0x00~0xEC            0x00~0x09                æ¸©åº¦            0.1℃
//                  0x02    ç©ºï¼Œç”¨0x00填充    0x00~0x64            0x00~0x09                æ¹¿åº¦          0.1%
//                  0x03    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    é£Žé€Ÿ            0.1m/s
//                  0x04    ç©ºï¼Œç”¨0x00填充    0xF8或0x00           0x00                    é£Žå‘            å…«æ–¹å‘/0.1℃
//                  0x05    ç©ºï¼Œç”¨0x00填充    ç©ºï¼Œç”¨0x00填充        0x00~0x12                é£ŽåŠ›            çº§
//                  0x06    0x00            0x00                0x00                    å¤§æ°”压        0.01hPA(百帕斯卡)
//                  0x07    0x00            0x00                0x00                    å…‰å¼º            Lux
//                  0x08    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    å™ªéŸ³            0.1dB
//                  0x09    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    PM2.5        ug/m3
//                  0x0A    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    PM10        ug/m3
//                  0x0B    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    TSP            ug/m3
//                  0x0C    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    é›¨é‡          0.1mm
//                  0x0D    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    ç”²é†›            ppm
//                  0x0E    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    TVOC        ppm
//                  0x0F    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    eCO2        ppm
//                  0x10    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    SO2二氧化硫    ppm
//                  0x11    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    NO2二氧化氮    ppm
//                  0x12    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    CO一氧化碳    ppm
//                  0x13    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    O3臭氧        ppm
//                  0x14    ç©ºï¼Œç”¨0x00填充    0x00                0x00                    F氟化物        ppm
        //  è®¾å¤‡åž‹å·    2
        private String deviceType;
        //  æ¨¡å—预热状态标志    1
        private String moduleWarmUpStatusFlag;
        //  æ¸©åº¦å€¼
        private Double temperature;
        private String temperature;
        //  æ¹¿åº¦å€¼
        private Double humidity;
        private String humidity;
        //  é£Žé€Ÿ
        private Double windSpeed;
        private String windSpeed;
        //  é£Žå‘
        private Double windDirection;
        private String windDirection;
        //  é£ŽåŠ›
        private String windPower;
        //  å¤§æ°”压
        private Integer pressure;
        private String pressure;
        //  å…‰å¼º
        private Integer lightIntensity;
        private String lightIntensity;
        //  å™ªéŸ³
        private Double noise;
        private String noise;
        //  PM2.5
        private Integer pm25;
        private String pm25;
        //  PM10
        private Integer pm10;
        private String pm10;
        //总悬浮颗粒物TSP
        private String tsp;
        //  é›¨é‡
        private Double rainfall;
        private String rain;
        //  SO2二氧化硫相对值
        private Integer so2;
        private String so2;
        //  ç”²é†›ç›¸å¯¹å€¼
        private Integer ech2o;
        private String ech2o;
        //  NO2二氧化氮
        private Integer no2;
        private String no2;
        //  TVOC
        private Integer tvoc;
        private String tvoc;
        //  CO一氧化碳
        private Integer co;
        private String co;
        //  äºŒæ°§åŒ–碳
        private Integer co2;
        private String co2;
        //  O3臭氧
        private Integer o3;
        private String o3;
        //  F氟化物
        private Integer fluoride;
        private String fluoride;
        @Override
        public HeartBeatDataPackage transformFrame(String hex) {
            if (hex.length() != 64) {
            //判断数据长度是否正确
            if (hex == null || hex.substring(6).length() % 8 != 0) {
                System.out.println("hex:---" + hex);
                System.out.println("心跳包数据异常!");
                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);
            //心跳包设备数据
            String data = hex.substring(6, hex.length() - 8);
            int lenght = data.length() / 8;
            //设备数据
            String sub;
            for (int i = 0; i < lenght; i++) {
                sub = data.substring(i * 8, i * 8 + 8);
                switch (data.substring(i * 8, i * 8 + 2)) {
                    //温度
                    case "01":
                        //01001E01
                        this.temperature = Double.parseDouble(
                                parseVal(sub, 4, 6)
                                        + "."
                                        + parseVal(sub, 6, 8)
                        ) + "℃";
                        break;
                    //湿度
                    case "02":
                        //02003608
                        this.humidity = Double.parseDouble(
                                parseVal(sub, 4, 6)
                                        + "."
                                        + parseVal(sub, 6, 8)
                        ) + "%";
                        break;
                    //风速
                    case "03":
                        //03000000
                        this.windSpeed = parseVal(sub, 4, 8) * .1 + "m/s";
                        break;
                    //风向
                    case "04":
                        //0400F804
                        if ("F8".equals(sub.substring(4, 6))) {
                            //八向款风向仪
                            switch (sub.substring(6, 8)) {
                                case "00":
                                    this.windDirection = "北风";
                                    break;
                                case "01":
                                    this.windDirection = "东北风";
                                    break;
                                case "02":
                                    this.windDirection = "东风";
                                    break;
                                case "03":
                                    this.windDirection = "东南风";
                                    break;
                                case "04":
                                    this.windDirection = "南风";
                                    break;
                                case "05":
                                    this.windDirection = "西南风";
                                    break;
                                case "06":
                                    this.windDirection = "西风";
                                    break;
                                case "07":
                                    this.windDirection = "西北风";
                                    break;
                                default:
                                    this.windDirection = "未知风向";
                            }
                        } else if ("00".equals(sub.substring(4, 6))) {
                            //360度款风向仪
                            this.windDirection = parseVal(sub, 4, 8) * .1 + "℃";
                        }
                        break;
                    //风力
                    case "05":
                        this.windPower = sub.substring(6, 8) + "级";
                        break;
                    //大气压
                    case "06":
                        //06000000
                        this.pressure = parseVal(sub, 2, 8) * .01 + "hPA";
                        break;
                    //光强
                    case "07":
                        this.lightIntensity = parseVal(sub, 2, 8) + "Lux";
                        break;
                    //噪音
                    case "08":
                        this.noise = parseVal(sub, 4, 8) * .1 + "dB";
                        break;
                    //PM2.5
                    case "09":
                        this.pm25 = parseVal(sub, 4, 8) + "ug/m3";
                        break;
                    //PM10
                    case "0A":
                        this.pm10 = parseVal(sub, 4, 8) + "ug/m3";
                        break;
                    //TSP
                    case "0B":
                        this.tsp = parseVal(sub, 4, 8) + "ug/m3";
                        break;
                    //雨量
                    case "0C":
                        this.rain = parseVal(sub, 4, 8) * .1 + "mm";
                        break;
                    //甲醛
                    case "0D":
                        this.ech2o = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //TVOC
                    case "0E":
                        this.tvoc = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //eCO2
                    case "0F":
                        this.co2 = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //SO2二氧化硫
                    case "10":
                        this.so2 = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //NO2二氧化氮
                    case "11":
                        this.no2 = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //CO一氧化碳
                    case "12":
                        this.co = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //O3臭氧
                    case "13":
                        this.o3 = parseVal(sub, 4, 8) + "ppm";
                        break;
                    //F氟化物
                    case "14":
                        this.fluoride = parseVal(sub, 4, 8) + "ppm";
                        break;
                    default:
                        return null;
                }
            }
            this.o3 = parseVal(hex, 60, 62);
            this.fluoride = parseVal(hex, 62, 64);
            return this;
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/AtmosphereModifiedDataReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.AtmoFunctionCode;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
/**
 * å¤§æ°”设备修正数据
 *
 * @author ZZQ
 * @date 2022/7/29 10:32
 */
public class AtmosphereModifiedDataReqInnerFrame implements IRequestInnerFrame {
    //TODO
    private String functionCode;
    public AtmosphereModifiedDataReqInnerFrame(String functionType, Double valueOfReal, Double valueOfStandard) {
        switch (functionType) {
            //设置数据修正值-温度
            case "温度":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_temperature.getCode();
                break;
            //设置数据修正值-湿度
            case "湿度":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_humidity.getCode();
                break;
            //设置数据修正值-风速
            case "风速":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_windSpeed.getCode();
                break;
            //设置数据修正值-风向
            case "风向":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_windDirection.getCode();
                break;
            //设置数据修正值-气压
            case "气压":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_airPressure.getCode();
                break;
            //设置数据修正值-光强
            case "光强":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_lightIntensity.getCode();
                break;
            //设置数据修正值-噪音
            case "噪音":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_noise.getCode();
                break;
            //设置数据修正值-PM2.5
            case "PM2.5":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_PM2_5.getCode();
                break;
            //设置数据修正值-PM10
            case "PM10":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_PM10.getCode();
                break;
            //设置数据修正值-雨量
            case "雨量":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_rainfall.getCode();
                break;
            //设置数据修正值-SO2二氧化硫
            case "二氧化硫":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_SO2.getCode();
                break;
            //设置数据修正值-NO2二氧化氮
            case "二氧化氮":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_NO2.getCode();
                break;
            //设置数据修正值-CO一氧化碳
            case "一氧化碳":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_CO.getCode();
                break;
            //设置数据修正值-O3臭氧
            case "臭氧":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_O3.getCode();
                break;
            //设置数据修正值-F氟化物
            case "氟化物":
                functionCode = AtmoFunctionCode.Setting_Data_Correction_F.getCode();
                break;
            default:
        }
    }
    @Override
    public String getEncodeFrame() {
        String payloadLength = "0004";
        String payload = "FFFF";
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/AtmoFunctionCode.java
@@ -77,13 +77,4 @@
    AtmoFunctionCode(String code) {
        this.code = code;
    }
    public static AtmoFunctionCode getByCode(String code) {
        for (AtmoFunctionCode atmoFunctionCode : values()) {
            if (atmoFunctionCode.getCode().equals(code)) {
                return atmoFunctionCode;
            }
        }
        return null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirDataService.java
@@ -39,6 +39,10 @@
     * @return æ˜¯å¦æˆåŠŸ
     */
    public boolean saveReportData(String deviceName, A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage) {
        if (heartBeatDataPackage == null) {
            System.out.println("保存大气设备心跳包数据异常,心跳包为空!");
            return false;
        }
        AirData airData = new AirData();
        BeanUtils.copyProperties(heartBeatDataPackage, airData);
ximon-admin/src/main/java/com/sandu/ximon/admin/service/AirEquipmentService.java
@@ -18,6 +18,7 @@
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.RedisUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.admin.utils.StringUtil;
import com.sandu.ximon.admin.vo.EquipmentInfomation;
import com.sandu.ximon.dao.bo.AirEquipmentBo;
import com.sandu.ximon.dao.domain.AirEquipment;
@@ -146,6 +147,9 @@
     * æŸ¥è¯¢å¤§æ°”设备心跳包时间
     */
    public String QueryHeartBeatTime(String mac) {
        if (StringUtil.strIsNullOrEmpty(mac)) {
            throw new BusinessException("灯杆mac参数错误!");
        }
        AirEquipment airEquipment = SpringContextHolder.getBean(AirEquipmentService.class).
                getOne(Wrappers.lambdaQuery(AirEquipment.class).eq(AirEquipment::getMac, mac).last("limit 1"));
@@ -178,6 +182,13 @@
     * @param time
     */
    public String setHeartBeatTime(String mac, Integer time) {
        if (StringUtil.strIsNullOrEmpty(mac)) {
            throw new BusinessException("灯杆mac参数错误!");
        }
        if (time == null) {
            throw new BusinessException("心跳包间隔时间不能为空!");
        }
        if (time < 30) {
            throw new BusinessException("心跳包间隔时间不能少于30s!");
        }
@@ -210,6 +221,10 @@
     * @return
     */
    public A5AtmosphereQuerySensorInfoReportInnerFrame.SensorInfoPackage QuerySensorInfo(String mac) {
        if (StringUtil.strIsNullOrEmpty(mac)) {
            throw new BusinessException("灯杆mac参数错误!");
        }
        AirEquipment airEquipment = SpringContextHolder.getBean(AirEquipmentService.class).
                getOne(Wrappers.lambdaQuery(AirEquipment.class).eq(AirEquipment::getMac, mac).last("limit 1"));
@@ -240,6 +255,9 @@
     * @return
     */
    public void QueryVersion(String mac) {
        if (StringUtil.strIsNullOrEmpty(mac)) {
            throw new BusinessException("灯杆mac参数错误!");
        }
        //TODO
        AirEquipment airEquipment = SpringContextHolder.getBean(AirEquipmentService.class).
                getOne(Wrappers.lambdaQuery(AirEquipment.class).eq(AirEquipment::getMac, mac).last("limit 1"));
@@ -265,6 +283,10 @@
     * @return
     */
    public String Reboot(String mac) {
        if (StringUtil.strIsNullOrEmpty(mac)) {
            throw new BusinessException("灯杆mac参数错误!");
        }
        AirEquipment airEquipment = SpringContextHolder.getBean(AirEquipmentService.class).
                getOne(Wrappers.lambdaQuery(AirEquipment.class).eq(AirEquipment::getMac, mac).last("limit 1"));
        if (airEquipment == null) {
@@ -286,4 +308,37 @@
            throw new BusinessException("数据校验异常!");
        }
    }
    /**
     * è®¾ç½®æ•°æ®ä¿®æ­£å€¼
     *
     * @param mac             ç¯æ†MAC
     * @param type            æ•°æ®ä¿®æ­£è®¾å¤‡ç±»åž‹
     * @param valueOfReal     ä¼ æ„Ÿå™¨æ•°å€¼
     * @param valueOfStandard æ ‡å‡†ä»ªå™¨æ•°å€¼
     */
    public void ModifiedData(String mac, String type, Double valueOfReal, Double valueOfStandard) {
        //TODO
        if (StringUtil.strIsNullOrEmpty(mac)) {
            throw new BusinessException("灯杆mac参数错误!");
        }
        if (StringUtil.strIsNullOrEmpty(type)) {
            throw new BusinessException("数据修正设备类型错误!");
        }
        if (valueOfReal == null || valueOfStandard == null) {
            throw new BusinessException("传感器数值或标准仪器数值错误!");
        }
        AirEquipment airEquipment = SpringContextHolder.getBean(AirEquipmentService.class).
                getOne(Wrappers.lambdaQuery(AirEquipment.class).eq(AirEquipment::getMac, mac).last("limit 1"));
        if (airEquipment == null) {
            throw new BusinessException("大气设备不存在!");
        }
        AtmosphereModifiedDataReqInnerFrame atmosphereModifiedDataReqInnerFrame = new AtmosphereModifiedDataReqInnerFrame(type, valueOfReal, valueOfStandard);
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode(), atmosphereModifiedDataReqInnerFrame);
        System.out.println(a5Frame + "          --------a5Frame");
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame);
        System.out.println(commonFrame + "         -----------commonFrame");
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/VnnoxService.java
@@ -320,6 +320,7 @@
    private List<PlayerWidget> generateWaterAndSensorWidget(A5AtmosphereHeartbeatReportInnerFrame.HeartBeatDataPackage poleSensorEntity) {
        //TODO
        List widgetList = new ArrayList<>();
        List<String> list = new ArrayList<>();
        if (Objects.nonNull(poleSensorEntity)) {
ximon-admin/src/main/java/com/sandu/ximon/admin/service/XiXunPlayerService.java
@@ -366,6 +366,7 @@
        Integer screenHeight = Integer.parseInt(lightemitUtils.getScreenHeight(lightemitControlCode));
        String size = String.valueOf(screenHeight / 18);
        //字幕主体拼接
        //TODO
        String body =
                "<head><style type=\"text/css\">body{background-color:#000;}</style></head>" +
                        "<p style=\"font-size:" + size + "px;line-height:17px;color:#fff\">" +