From caf2599a9869244ded811018811c37a2aabac3fc Mon Sep 17 00:00:00 2001
From: vince <757871790@qq.com>
Date: 星期三, 08 一月 2025 11:29:05 +0800
Subject: [PATCH] 优化测温协议

---
 src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java |  353 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 334 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java b/src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java
index 0b225f2..75489e9 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java
@@ -1,22 +1,50 @@
 package com.fzzy.protocol.youxian0.analysis;
 
-import com.fzzy.api.Constant;
+import com.alibaba.fastjson.JSONObject;
+import com.fzzy.api.data.GatewayDeviceType;
 import com.fzzy.api.utils.BytesUtil;
+import com.fzzy.api.utils.NumberUtil;
 import com.fzzy.gateway.GatewayUtils;
+import com.fzzy.gateway.api.GatewayDeviceReportService;
+import com.fzzy.gateway.api.GatewayRemoteManager;
+import com.fzzy.gateway.data.BaseReqData;
+import com.fzzy.gateway.data.WeatherWebDto;
 import com.fzzy.gateway.entity.GatewayDevice;
+import com.fzzy.gateway.hx2023.ScConstant;
+import com.fzzy.gateway.hx2023.data.*;
 import com.fzzy.protocol.ProtocolUtils;
+import com.fzzy.protocol.bhzn.cmd.ReMessageBuilder;
+import com.fzzy.protocol.data.THDto;
 import com.fzzy.protocol.youxian0.ServiceUtils;
+import com.fzzy.protocol.youxian0.data.GrainRoot;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 娓镐粰涓诲簱锛岃繑鍥炴姤鏂囪В鏋�
  */
+@Slf4j
 @Component(AnalysisService.BEAN_ID)
 public class AnalysisService {
 
     public static final String BEAN_ID = "youxian0.analysisService";
+
+    @Resource
+    private GatewayRemoteManager gatewayRemoteManager;
+
+    private static Map<String, GrainRoot> contextGrainRoot = new HashMap<>();
+
+    /**
+     * 鐢ㄤ簬瀛樻斁杩斿洖鐨勪粨娓╀粨婀夸俊鎭�
+     */
+    public static Map<String, THDto> contextMapTH = new HashMap<>();
 
 
     /**
@@ -50,10 +78,56 @@
 
         //绮儏杩斿洖
         if (ServiceUtils.FUNCTION_66.equalsIgnoreCase(funId)) {
-            this.analysisGrain(device, msgId, strMsg);
+
+            log.info("---------寮�濮嬭В鏋愮伯鎯呬俊鎭�---------");
+            try{
+                this.analysisGrainStep1(device, msgId, strMsg);
+            }catch (Exception e){
+                log.error(e.getMessage(),e);
+            }
+
+            log.info("---------瑙f瀽绮儏淇℃伅缁撴潫---------");
+        }
+
+        //娓╂箍搴﹁繑鍥�
+        if (ServiceUtils.FUNCTION_68.equalsIgnoreCase(funId)) {
+            log.info("---------寮�濮嬭В鏋愪粨娓╂箍搴︿俊鎭�---------");
+            try{
+                this.analysisGrainTh(device, strMsg);
+            }catch (Exception e){
+                log.error(e.getMessage(),e);
+            }
+
         }
 
     }
+
+    private void analysisGrainTh(GatewayDevice device, String strMsg) {
+        try{
+            THDto th = new THDto();
+
+            //TODO----->>> 寰呰В鏋愯皟鏁达紝鍏堢敤澶栭儴姘旇薄淇℃伅
+            //7E 00 01 01 00 06 00 00 A0 FF FF 68 1A 05 CC 16 3A 62 36 7E
+            //绯荤粺姘旇薄绔欎俊鎭�
+//        WeatherWebDto weather = WeatherWebDto.contextMap.get("default");
+//        th.setTempIn(Double.valueOf(weather.getTem()) - 2);
+//        th.setHumidityIn(Double.valueOf(weather.getHumidity()) - 10);
+            double t,h;
+            String temp = strMsg.substring(30,32);
+            t =  BytesUtil.hexToInt(temp)/2;
+            log.info("娓╁害锛歿}",t);
+            temp = strMsg.substring(32,34);
+            h = BytesUtil.hexToInt(temp);
+            log.info("婀垮害锛歿}",h);
+            th.setTempIn(t);
+            th.setHumidityIn(h);
+            this.add2ThMap(device.getDepotIdSys(), th);
+        }catch (Exception e){
+            log.error(e.getMessage(),e);
+        }
+
+    }
+
 
     /**
      * 绮儏瑙f瀽
@@ -64,33 +138,274 @@
      * @param device
      * @param msgId  鍛戒护ID
      */
-    private void analysisGrain(GatewayDevice device, int msgId, String strMsg) {
-
+    private void analysisGrainStep1(GatewayDevice device, int msgId, String strMsg) {
+        String[] attCable = device.getCableRule().split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+        log.info("z={},x={},y={}",cableZ,cableX,cableY);
+        //鑾峰彇璇锋眰淇℃伅
+        BaseReqData reqData = ProtocolUtils.getSyncReq(device.getDepotIdSys());
+        if (null == reqData) {
+            log.error("---------娌℃湁鑾峰彇鍒拌姹備俊鎭紝涓嶆墽琛岃В鏋�------{}", device.getDeviceName());
+            return;
+        }
         //鍙繚鐣欑伯鎯呬俊鎭�
-        int start = 22 * 2;
+        int start = 15 * 2;
         strMsg = strMsg.substring(start);
 
+        GrainRoot grainRoot = new GrainRoot();
+        grainRoot.setKey(buildGrainRootKey(device.getDeviceSn(), msgId));
+        grainRoot.setNum(msgId);
 
-        //瀵嗛挜鍜岀偣鏁�
-        String kyeNumHex = strMsg.substring(2, 4);
-        String kyeNumBin = BytesUtil.toBinary8String(BytesUtil.hexToInt(kyeNumHex));
+        String tempStr = "";
+        for (int j = 0;j<cableY;j++){
+            String index = BytesUtil.intToHexStr1((msgId -1)*cableY + j +1);
+            tempStr = strMsg.substring(strMsg.indexOf(index),strMsg.indexOf(index) + (6+2*cableZ) );
+            strMsg = strMsg.substring(strMsg.indexOf(index) + (6+2*cableZ));
+            //tempStr = strMsg.substring((6+2*cableZ) * j,(6+2*cableZ)  * j + (6+2*cableZ) );
+            log.info("----绾跨紗鎶ユ枃----锛�"+tempStr);
+            log.info("----鍓╀綑鎶ユ枃----锛�"+strMsg);
+            //瀵嗛挜鍜岀偣鏁� 02 A4 BB BA BA B4
+            String kyeNumHex = tempStr.substring(2, 4);
+            String kyeNumBin = BytesUtil.toBinary8String(BytesUtil.hexToInt(kyeNumHex));
 
-        String key = kyeNumBin.substring(0, 3);
-        int keyValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key));
-        key = kyeNumBin.substring(4);
-        int numValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key));
+            String key = "00000" + kyeNumBin.substring(0, 3);
+            int keyValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key));
+            key = "0000" + kyeNumBin.substring(4);
+            int numValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key));
 
+            //02 A4 BB BA BA B4
+            start = 2 * 2;
+            String tempHex;
+            double point = 0;
+            log.info("----鎶ユ枃----锛�"+tempStr);
+            log.info("----瀵嗛挜="+keyValue +"----鐐规暟="+numValue+"----"+"灞傛暟="+cableZ+"----");
+            for (int i = 0; i < cableZ; i++) {
+                start = start + (i * 2);
+                tempHex = tempStr.substring(start, start + 2);
+                //瀹為檯娓╁害锛濆瘑閽�*瀵嗛挜*37(婧㈠嚭涓烘棤绗﹀彿瀛楄妭)鍐嶅紓鎴栧姞瀵嗗悗鐨勬俯搴�/2銆�
+                point = this.getGrainTemp(keyValue, tempHex);
+                log.info("--------瑙f瀽鍚庣殑娓╁害鐐�----{}---{}", tempHex, point);
+                grainRoot.getPoints().add(point);
+                start = 2 * 2;
+            }
+        }
 
-        //02 A4 BB BA BA B4
-        start = 2 * 2;
-        String tempHex;
-        for (int i = 0; i < numValue; i++) {
-            start = start + i * 2;
-            tempHex = strMsg.substring(start, start + 2);
-            //瀹為檯娓╁害锛濆瘑閽�*瀵嗛挜*37(婧㈠嚭涓烘棤绗﹀彿瀛楄妭)鍐嶅紓鎴栧姞瀵嗗悗鐨勬俯搴�/2銆�
+        this.add2GrainMap(grainRoot);
+
+        //鍒ゆ柇鏄笉鏄渶鍚庝竴鍖呮暟鎹紝濡傛灉鏄渶鍚庝竴鍖呮墽琛岃В鏋�
+
+        if (grainRoot.getNum() == cableX) {
+            analysisGrainStep2(reqData, cableZ, cableY, cableX);
+        }
+    }
+
+    /**
+     * 灏佽绮儏鐐逛綅
+     *
+     * @param reqData
+     * @param cableZ
+     * @param cableY
+     * @param cableX
+     */
+    private void analysisGrainStep2(BaseReqData reqData, int cableZ, int cableY, int cableX) {
+
+        List<Double> points = new ArrayList<>();
+        GrainRoot root;
+        List<Double> t = null;
+        for (int i = 1; i <= cableX; i++) {
+            root = this.getGrainRoot(buildGrainRootKey(reqData.getDevice().getDeviceSn(), i));
+
+            if (null == root || null == root.getPoints()) {
+                log.error("-----------瑙f瀽鑾峰彇鎵�鏈夌伯鎯呮娴嬬偣澶辫触锛屽彇娑堟墽琛�---------{}---{}", reqData.getDevice().getDeviceName(),i);
+                ;
+                t = new ArrayList<>();
+                for (int x = 0;x<cableY*cableZ;x++
+                     ) {
+                    t.add(-100.00);
+                }
+                //return;
+                points.addAll(t);
+            }else{
+                points.addAll(root.getPoints());
+            }
 
         }
 
+        //鎵ц灏佽瑙f瀽
+        analysisGrainStep3(reqData, cableZ, cableY, cableX, points);
+    }
 
+    private void analysisGrainStep3(BaseReqData reqData, int cableZ, int cableY, int cableX, List<Double> points) {
+
+        GatewayDevice device = reqData.getDevice();
+        //鏁版嵁灏佽
+        GrainData grain = new GrainData();
+        grain.setMessageId(ScConstant.getMessageId());
+        grain.setDeviceId(device.getDeviceId());
+        grain.setTimestamp(System.currentTimeMillis() + "");
+
+        ClientHeaders headers = new ClientHeaders();
+        headers.setDeviceName(device.getDeviceName());
+        headers.setProductId(device.getProductId());
+        headers.setOrgId(device.getOrgId());
+        headers.setMsgId(reqData.getMessageId());
+        grain.setHeaders(headers);
+
+
+        GrainOutPut outPut = new GrainOutPut();
+
+
+        double max = ReMessageBuilder.MAX_TEMP, min = ReMessageBuilder.MIN_TEMP, sumT = 0.0;
+
+        List<GrainTemp> temperature = new ArrayList<>();
+        //鏍瑰彿
+        int cableNum = 1, position = 0,sumNum = 0;
+
+        double curTemp;
+        int x = 0, y = 0, z = 0;
+        for (int i = 0; i < points.size(); i++) {
+            curTemp = points.get(i);
+            position = i;
+            z = i % cableZ + 1;
+            x = i / (cableZ * cableY);
+            y = x * (cableZ * cableY);
+            y = (i - y) / cableZ;
+            //鏍瑰彿
+            cableNum = (i / cableZ) + 1;
+
+            temperature.add(new GrainTemp(cableNum + "", z + "", curTemp + "", position + ""));
+
+            if (curTemp > max  && curTemp < 40) {
+                max = curTemp;
+            }
+            if (curTemp < min && curTemp > 3) {
+                min = curTemp;
+            }
+            if(curTemp > 3 &&  curTemp < 40){
+                sumT += curTemp;
+                sumNum++;
+            }
+        }
+
+        if (sumNum == 0) {
+            sumNum = 1;
+            log.warn("---褰撳墠绮儏閲囬泦寮傚父--");
+        }
+        //杩囨护姣旇緝鐢ㄧ殑鏈�澶ф渶灏忓��
+        if (max == ReMessageBuilder.MAX_TEMP) {
+            max = 0.0;
+        }
+        if (min == ReMessageBuilder.MIN_TEMP) {
+            min = 0.0;
+        }
+
+        outPut.setTemperature(temperature);
+        outPut.setAvgTemperature(NumberUtil.keepPrecision((sumT / sumNum), 1) + "");
+        outPut.setMinTemperature(min + "");
+        outPut.setMaxTemperature(max + "");
+        List<GrainTH> ths = new ArrayList<>();
+
+
+        //鑾峰彇娓╂箍搴�
+        THDto thDto = this.getGrainTh(device.getDepotIdSys());
+
+        ths.add(new GrainTH(thDto.getTempIn() != null ? thDto.getTempIn() + "" : "", thDto.getHumidityIn() != null ? thDto.getHumidityIn() + "" : "", "1"));
+        outPut.setTemperatureAndhumidity(ths);
+        grain.setOutput(JSONObject.toJSONString(outPut));
+
+        GatewayDevice gatewayDeviceWeather = GatewayUtils.getCacheByDeviceTypeOne(GatewayDeviceType.TYPE_09.getCode());
+
+        //绯荤粺姘旇薄绔欎俊鎭�
+        WeatherWebDto weather = WeatherWebDto.contextMap.get("default");
+
+        //姘旇薄淇℃伅
+        GrainWeather weatherStation = new GrainWeather();
+        weatherStation.setMessageId(ScConstant.getMessageId());
+        weatherStation.setMessgeId(weatherStation.getMessageId());
+
+        if (null != gatewayDeviceWeather) {
+            weatherStation.setId(gatewayDeviceWeather.getDeviceId());
+        } else {
+            weatherStation.setId(device.getDeviceId());
+        }
+        weatherStation.setAirPressure(weather.getPressure());
+        weatherStation.setHumidity(weather.getHumidity().replaceAll("%",""));
+        weatherStation.setPm(weather.getAir_pm25());
+        weatherStation.setRadiation("0");
+        weatherStation.setRainfallAmount(weather.getWea());
+        weatherStation.setTemperature(weather.getTem());
+        weatherStation.setWindDirection(weather.getWin());
+        weatherStation.setWindPower(weather.getWin_meter());
+        weatherStation.setWindSpeed(weather.getWin_speed());
+
+        grain.setWeatherStation(JSONObject.toJSONString(weatherStation));
+
+        //灏佽濂界殑鏁版嵁
+        log.info("---绮儏淇℃伅灏佽瀹屾垚-寮�濮嬫墽琛屾帹閫�");
+
+        reqData.setData(JSONObject.toJSONString(grain));
+
+        doPushGrain(reqData,grain);
+    }
+
+    private void doPushGrain(BaseReqData reqData,GrainData grainData) {
+
+        GatewayDeviceReportService reportService = gatewayRemoteManager.getDeviceReportService(reqData.getDevice().getPushProtocol());
+        if (null == reportService) {
+            log.error("------------绮儏鎺ㄩ�佸け璐ワ紝绯荤粺涓嶅瓨鍦ㄥ綋鍓嶅崗璁墽琛岀被----{}", reqData.getDevice().getDeviceName());
+            return;
+        }
+        reportService.reportGrainData(reqData);
+        reqData.setData(reportService.grainData2GatewayApiInfoKafka(grainData,reqData.getDevice()).getData());
+        reportService.reportGrainDataByKafka(reqData);
+    }
+
+    private synchronized  void add2GrainMap(GrainRoot grainRoot) {
+        contextGrainRoot.put(grainRoot.getKey(), grainRoot);
+    }
+
+    private GrainRoot getGrainRoot(String key) {
+        return contextGrainRoot.get(key);
+    }
+
+    private String buildGrainRootKey(String deviceSn, int num) {
+        return deviceSn + "_" + num;
+    }
+
+    /**
+     * 璁$畻绮儏娓╁害
+     * 瀹為檯娓╁害锛濆瘑閽�*瀵嗛挜*37(婧㈠嚭涓烘棤绗﹀彿瀛楄妭)鍐嶅紓鎴栧姞瀵嗗悗鐨勬俯搴�/2銆�
+     * 涓句緥璇存槑锛氱涓変釜瀛楄妭BB瀹為檯娓╁害鏄�5*5*37=039D鍙�9D^(0xBB)锛�38/2=19锛�
+     *
+     * @param keyValue
+     * @param tempHex
+     * @return
+     */
+    private double getGrainTemp(int keyValue, String tempHex) {
+        int value = keyValue * keyValue * 37;
+        String valueHex = BytesUtil.intToHexStr(value);
+
+        valueHex = valueHex.substring(2);
+
+        int num1 = BytesUtil.hexToInt(valueHex);
+        int num2 = BytesUtil.hexToInt(tempHex);
+        if((num1 ^ num2) / 2.0 > 35){
+            return  -100.00;
+        }else {
+            return  (num1 ^ num2) / 2.0;
+        }
+
+    }
+
+    private void add2ThMap(String depotIdSys, THDto th) {
+        String key = "TH_" + depotIdSys;
+        contextMapTH.put(key, th);
+    }
+
+    private THDto getGrainTh(String depotIdSys) {
+        String key = "TH_" + depotIdSys;
+        return contextMapTH.get(key);
     }
 }

--
Gitblit v1.9.3