From c8ff96af8647474b1d03f5f374bb18eb59f65987 Mon Sep 17 00:00:00 2001
From: jiazx0107@163.com <jiazx0107@163.com>
Date: 星期日, 24 十二月 2023 12:30:09 +0800
Subject: [PATCH] 游仙协议解析-2

---
 src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java        |    5 
 src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java |    5 
 src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java                |    1 
 src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java         |   13 +
 src/main/java/com/fzzy/gateway/api/GatewaySyncGranService.java                    |    9 +
 src/main/java/com/fzzy/protocol/fzzy/service/FzzyGatewayGrainService.java         |    5 
 src/main/java/com/fzzy/protocol/youxian0/ServiceUtils.java                        |   17 ++
 src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java            |  267 +++++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/fzzy/protocol/youxian0/data/GrainRoot.java                      |    5 
 9 files changed, 318 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/fzzy/gateway/api/GatewaySyncGranService.java b/src/main/java/com/fzzy/gateway/api/GatewaySyncGranService.java
index 87f01a1..a6a19c2 100644
--- a/src/main/java/com/fzzy/gateway/api/GatewaySyncGranService.java
+++ b/src/main/java/com/fzzy/gateway/api/GatewaySyncGranService.java
@@ -28,6 +28,15 @@
 
 
     /**
+     * 鍚屾绮儏淇℃伅杩斿洖JSON鎶ユ枃
+     *
+     * @param reqData
+     * @return
+     */
+    public BaseResp syncGrainTh(BaseReqData reqData);
+
+
+    /**
      *  鑾峰彇鎵ц鍒嗘満鐨勫弬鏁颁俊鎭紝濡傛灉璁惧涓嶆敮鎸佸垯鐩存帴杩斿洖涓嶆墽琛屽嵆鍙�
      * @param reqData
      * @return
diff --git a/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
index 9f804ac..f44c036 100644
--- a/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
+++ b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
@@ -190,7 +190,6 @@
     }
 
     private void analysisGrain2(IoMessage message, BaseReqData reqData, String grainStr) {
-
         GatewayDevice device = reqData.getDevice();
         // 鑾峰彇瀹屾暣鐨勭伯鎯呭寘淇℃伅
         String[] attCable = device.getCableRule().split("-");
diff --git a/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java b/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java
index 3e121d5..9d0a916 100644
--- a/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java
+++ b/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java
@@ -84,6 +84,11 @@
     }
 
     @Override
+    public BaseResp syncGrainTh(BaseReqData reqData) {
+        return new BaseResp();
+    }
+
+    @Override
     public BaseResp syncConf(BaseReqData reqData) {
         return new BaseResp();
     }
diff --git a/src/main/java/com/fzzy/protocol/fzzy/service/FzzyGatewayGrainService.java b/src/main/java/com/fzzy/protocol/fzzy/service/FzzyGatewayGrainService.java
index ede70f3..b6f3461 100644
--- a/src/main/java/com/fzzy/protocol/fzzy/service/FzzyGatewayGrainService.java
+++ b/src/main/java/com/fzzy/protocol/fzzy/service/FzzyGatewayGrainService.java
@@ -87,6 +87,11 @@
     }
 
     @Override
+    public BaseResp syncGrainTh(BaseReqData reqData) {
+        return new BaseResp();
+    }
+
+    @Override
     public BaseResp syncConf(BaseReqData reqData) {
         return new BaseResp();
     }
diff --git a/src/main/java/com/fzzy/protocol/youxian0/ServiceUtils.java b/src/main/java/com/fzzy/protocol/youxian0/ServiceUtils.java
index a70f734..fd8c58f 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/ServiceUtils.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/ServiceUtils.java
@@ -1,6 +1,8 @@
 package com.fzzy.protocol.youxian0;
 
 
+import com.fzzy.api.utils.BytesUtil;
+
 /**
  * 宸ュ叿绫�
  */
@@ -23,4 +25,19 @@
     public static String FUNCTION_68 = "68";
 
 
+    public static void main(String[] args) {
+        String hex1 ="9D";
+        String hex2 ="BB";
+
+        int num1 = BytesUtil.hexToInt(hex1);
+        int num2 = BytesUtil.hexToInt(hex2);
+
+        int result = num1^num2;
+
+        System.out.println(result);
+
+
+    }
+
+
 }
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..5e1d840 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,52 @@
 package com.fzzy.protocol.youxian0.analysis;
 
+import com.alibaba.fastjson.JSONObject;
 import com.fzzy.api.Constant;
+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 +80,28 @@
 
         //绮儏杩斿洖
         if (ServiceUtils.FUNCTION_66.equalsIgnoreCase(funId)) {
-            this.analysisGrain(device, msgId, strMsg);
+            this.analysisGrainStep1(device, msgId, strMsg);
+        }
+
+        //娓╂箍搴﹁繑鍥�
+        if (ServiceUtils.FUNCTION_68.equalsIgnoreCase(funId)) {
+            this.analysisGrainTh(device, strMsg);
         }
 
     }
+
+    private void analysisGrainTh(GatewayDevice device, String strMsg) {
+        THDto th = new THDto();
+
+        //TODO----->>> 寰呰В鏋愯皟鏁达紝鍏堢敤澶栭儴姘旇薄淇℃伅
+        //绯荤粺姘旇薄绔欎俊鎭�
+        WeatherWebDto weather = WeatherWebDto.contextMap.get("default");
+        th.setTempIn(Double.valueOf(weather.getTem()) - 1);
+        th.setHumidityIn(Double.valueOf(weather.getHumidity()) - 1);
+
+        this.add2ThMap(device.getDepotIdSys(), th);
+    }
+
 
     /**
      * 绮儏瑙f瀽
@@ -64,7 +112,14 @@
      * @param device
      * @param msgId  鍛戒护ID
      */
-    private void analysisGrain(GatewayDevice device, int msgId, String strMsg) {
+    private void analysisGrainStep1(GatewayDevice device, int msgId, String strMsg) {
+
+        //鑾峰彇璇锋眰淇℃伅
+        BaseReqData reqData = ProtocolUtils.getSyncReq(device.getDepotIdSys());
+        if (null == reqData) {
+            log.error("---------娌℃湁鑾峰彇鍒拌姹備俊鎭紝涓嶆墽琛岃В鏋�------{}", device.getDeviceName());
+            return;
+        }
 
         //鍙繚鐣欑伯鎯呬俊鎭�
         int start = 22 * 2;
@@ -80,17 +135,221 @@
         key = kyeNumBin.substring(4);
         int numValue = BytesUtil.hexToInt(BytesUtil.bin2Hex(key));
 
-
         //02 A4 BB BA BA B4
         start = 2 * 2;
         String tempHex;
+        GrainRoot grainRoot = new GrainRoot();
+        grainRoot.setKey(buildGrainRootKey(device.getDeviceSn(), msgId));
+        grainRoot.setNum(msgId);
+        double point = 0;
         for (int i = 0; i < numValue; i++) {
             start = start + i * 2;
             tempHex = strMsg.substring(start, start + 2);
             //瀹為檯娓╁害锛濆瘑閽�*瀵嗛挜*37(婧㈠嚭涓烘棤绗﹀彿瀛楄妭)鍐嶅紓鎴栧姞瀵嗗悗鐨勬俯搴�/2銆�
-
+            point = this.getGrainTemp(keyValue, tempHex);
+            log.debug("--------瑙f瀽鍚庣殑娓╁害鐐�----{}---{}", tempHex, point);
+            grainRoot.getPoints().add(point);
         }
 
 
+        this.add2GrainMap(grainRoot);
+
+        //鍒ゆ柇鏄笉鏄渶鍚庝竴鍖呮暟鎹紝濡傛灉鏄渶鍚庝竴鍖呮墽琛岃В鏋�
+        String[] attCable = device.getCableRule().split("-");
+        int cableZ = Integer.valueOf(attCable[0]);
+        int cableY = Integer.valueOf(attCable[1]);
+        int cableX = Integer.valueOf(attCable[2]);
+        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;
+        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());
+                return;
+            }
+            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, sumNum = cableX * cableY * cableZ;
+
+        List<GrainTemp> temperature = new ArrayList<>();
+        //鏍瑰彿
+        int cableNum = 1, position = 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 + ""));
+
+            sumT += curTemp;
+            if (curTemp > max) {
+                max = curTemp;
+            }
+            if (curTemp < min) {
+                min = curTemp;
+            }
+        }
+
+        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(min + "");
+        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());
+        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);
+    }
+
+    private void doPushGrain(BaseReqData reqData) {
+
+        GatewayDeviceReportService reportService = gatewayRemoteManager.getDeviceReportService(reqData.getDevice().getPushProtocol());
+        if (null == reportService) {
+            log.error("------------绮儏鎺ㄩ�佸け璐ワ紝绯荤粺涓嶅瓨鍦ㄥ綋鍓嶅崗璁墽琛岀被----{}", reqData.getDevice().getDeviceName());
+            return;
+        }
+        reportService.reportGrainData(reqData);
+    }
+
+    private 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);
+
+        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);
     }
 }
diff --git a/src/main/java/com/fzzy/protocol/youxian0/data/GrainRoot.java b/src/main/java/com/fzzy/protocol/youxian0/data/GrainRoot.java
index 7221834..ce68490 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/data/GrainRoot.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/data/GrainRoot.java
@@ -3,6 +3,9 @@
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Getter
 @Setter
 public class GrainRoot {
@@ -12,7 +15,7 @@
     private int num;
 
     //閫楀彿闅斿紑鐨勬俯搴﹀��
-    private String points;
+    private List<Double> points = new ArrayList<>();
 
     private String key;
 
diff --git a/src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java b/src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java
index 070c5bd..b15b8ba 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java
@@ -98,6 +98,11 @@
         return resp;
     }
 
+    @Override
+    public BaseResp syncGrainTh(BaseReqData reqData) {
+        return new BaseResp();
+    }
+
     /**
      * 鐢熸垚绮儏閲囬泦鍛戒护
      *
diff --git a/src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java b/src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java
index 366935a..7f2350e 100644
--- a/src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java
+++ b/src/main/java/com/fzzy/protocol/zldz/service/ZldzGatewayGrainService.java
@@ -91,6 +91,13 @@
     }
 
     @Override
+    public BaseResp syncGrainTh(BaseReqData reqData) {
+        BaseResp resp = new BaseResp();
+
+        return resp;
+    }
+
+    @Override
     public BaseResp syncConf(BaseReqData reqData) {
         BaseResp resp = new BaseResp();
 
@@ -129,7 +136,7 @@
         request.setSerName(device.getDeviceName());
 
         // Step1 鐢熸垚鍛戒护
-        Message message = CommandBuilder1116_1.getInstance().buildMessage(request,device);
+        Message message = CommandBuilder1116_1.getInstance().buildMessage(request, device);
         // 鍙戦�佸懡浠�
         InvokeResult result = ZldzServerEngine.push(device.getIp(), device.getPort(), message.getByteMsg());
 
@@ -176,13 +183,13 @@
 
         ApiCommonDevice commonDevice = Constant.getCommonDeviceCache(device.getDeviceSn());
 
-        if(null == commonDevice){
+        if (null == commonDevice) {
             resp.setCode(500);
             resp.setMsg("绯荤粺鏈彂鐜拌繛鎺ヨ澶囷紝鍙栨秷鎵ц");
             return resp;
         }
 
-        ZldzServerEngine.disconnect(commonDevice.getIp(),commonDevice.getPort());
+        ZldzServerEngine.disconnect(commonDevice.getIp(), commonDevice.getPort());
         return resp;
     }
 

--
Gitblit v1.9.3