| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import cn.hutool.core.util.HexUtil; |
| | | import cn.hutool.core.util.NumberUtil; |
| | | 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; |
| | | |
| | | /** |
| | | * ç¯æå¾æå¿è·³å
䏿¥ |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | | public class A5LightPoleHeelingHeartbeatReportInnerFrame extends BaseResponseInnerFrame<A5LightPoleHeelingHeartbeatReportInnerFrame> { |
| | | |
| | | // ç®æ å°å 4 |
| | | private String destinationAddress; |
| | | // å¿è·³å
æ°æ® |
| | | private HeartBeatDataPackage heartBeatDataPackage; |
| | | |
| | | |
| | | @Override |
| | | public A5LightPoleHeelingHeartbeatReportInnerFrame 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, hex.length() - 8); |
| | | 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> { |
| | | //设å¤åå· |
| | | private String equipmentModel; |
| | | //Xè½´ |
| | | private double theXAxis; |
| | | //Yè½´ |
| | | private double theYAxis; |
| | | //Zè½´ |
| | | private double theZAxis; |
| | | //é¢ç |
| | | private String reservedA; |
| | | private String reservedB; |
| | | private String reservedC; |
| | | private String reservedD; |
| | | |
| | | @Override |
| | | public HeartBeatDataPackage transformFrame(String hex) { |
| | | if (StrUtil.isBlank(hex)) { |
| | | return null; |
| | | } |
| | | this.equipmentModel = "V" + (parseVal(hex, 0, 2)) + "." + String.format("%02d", parseVal(hex, 2, 4)); |
| | | this.theXAxis = NumberUtil.round(temperatureTransition(hex.substring(4, 8)) * 0.1, 1).doubleValue(); |
| | | this.theYAxis = NumberUtil.round(temperatureTransition(hex.substring(8, 12)) * 0.1, 1).doubleValue(); |
| | | this.theZAxis = NumberUtil.round(temperatureTransition(hex.substring(12, 16)) * 0.1, 1).doubleValue(); |
| | | this.reservedA = hex.substring(16, 20); |
| | | this.reservedB = hex.substring(20, 24); |
| | | this.reservedC = hex.substring(24, 28); |
| | | this.reservedD = hex.substring(28, 32); |
| | | //72-80ä¿çï¼ææªä½¿ç¨ |
| | | |
| | | return this; |
| | | } |
| | | |
| | | private Integer parseVal(String frame, int start, int end) { |
| | | return Integer.parseInt(frame.substring(start, end), 16); |
| | | } |
| | | |
| | | private String parseVal(String hex) { |
| | | return Integer.parseInt(hex, 16) + ""; |
| | | } |
| | | |
| | | /** |
| | | * å°16è¿å¶è½¬æ2è¿å¶ï¼è¿è¡è¡¥ç ï¼åç åºç¡ä¸+1ï¼ï¼å¾å°æ£ç¡®æ°å¼ |
| | | * ä¼ å
¥16è¿å¶ç温度ï¼ç±»å为String |
| | | * å¦F500 |
| | | */ |
| | | public Double temperatureTransition(String temperature) { |
| | | |
| | | //å°ä¼ è¿æ¥ç16è¿å¶ç转为2è¿å¶ |
| | | String twoBinStr = hexStr2BinStr(temperature); |
| | | |
| | | if ("1".equals(twoBinStr.substring(0, 1))) { |
| | | //æé«ä½æ¯1ï¼ä¸ºè´æ°,å°16è¿å¶çè¿è¡è¡¥ç ï¼è¿å |
| | | int max = 0b1111111111111111; |
| | | double result = (max - HexUtil.hexToInt(temperature)) * (-0.01); |
| | | return result; |
| | | |
| | | } else if ("0".equals(twoBinStr.substring(0, 1))) { |
| | | //æé«ä½æ¯0ï¼æ£æ°ï¼ç´æ¥è¿å |
| | | double result = (HexUtil.hexToInt(temperature)) * (0.01); |
| | | return result; |
| | | |
| | | } |
| | | // |
| | | return 0.00; |
| | | } |
| | | |
| | | /** |
| | | * 16è¿å¶å符串转为äºè¿å¶ |
| | | */ |
| | | public String hexStr2BinStr(String hexStr) { |
| | | if (hexStr == null || hexStr.length() % 2 != 0) { |
| | | return null; |
| | | } |
| | | String bString = "", tmp; |
| | | for (int i = 0; i < hexStr.length(); i++) { |
| | | tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexStr.substring(i, i + 1), 16)); |
| | | bString += tmp.substring(tmp.length() - 4); |
| | | } |
| | | return bString; |
| | | } |
| | | } |
| | | } |