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\">" +