From 9a139b15be65dcd83ae187bb384627097c6a811a Mon Sep 17 00:00:00 2001
From: vince <757871790@qq.com>
Date: 星期二, 26 十二月 2023 20:29:16 +0800
Subject: [PATCH] 修改解析,增加仓温仓湿度

---
 src/main/java/com/fzzy/protocol/youxian0/client/ClientHandler.java                |    6 +
 src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java |  114 ++++++++++++++++++++--
 src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java                |    6 
 src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java                        |    4 
 src/main/java/com/fzzy/protocol/youxian0/client/ClientEngine.java                 |   13 +
 src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java            |  109 +++++++++++++--------
 6 files changed, 192 insertions(+), 60 deletions(-)

diff --git a/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java b/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java
index c26897a..22c4418 100644
--- a/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java
+++ b/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java
@@ -13,8 +13,8 @@
 
     TCP_FZZY_V3("TCP_FZZY_V3", "绮儏-椋庢鑷磋繙鎺у埗鏌滃崗璁甐3"),
     GRAIN_FZZY_IGDS_V40("GRAIN_FZZY_IGDS_V40", "绮儏-椋庢鑷磋繙绯荤粺V40"),
-    GRAIN_FZZY_BHZN_WEB("GRAIN_FZZY_BHZN_WEB", "绮儏-FZZY-閭︽捣鏅鸿兘缃戝彛鍗忚"),
-    GRAIN_FZZY_ZLDZ_WEB("GRAIN_FZZY_ZLDZ_WEB", "绮儏-FZZY-姝f潵鐢靛瓙缃戝彛鍗忚"),
+    GRAIN_FZZY_BHZN_WEB("GRAIN_FZZY_BHZN_WEB", "绮儏-FZZY-BHZN缃戝彛鍗忚"),
+    GRAIN_FZZY_ZLDZ_WEB("GRAIN_FZZY_ZLDZ_WEB", "绮儏-FZZY-ZLDZ缃戝彛鍗忚"),
     GRAIN_YOUXIAN0_2023("GRAIN_YOUXIAN0_2023", "绮儏-娓镐粰涓诲簱鍗忚"),
     GRAIN_YOUXIAN1_2023("GRAIN_YOUXIAN1_2023", "绮儏-娓镐粰鍒嗗簱鍗忚"),
     DEVICE_WEIGHT_HTTP("DEVICE_WEIGHT_HTTP", "鍦扮-HTTP鍗忚"),
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 f44c036..ed9e782 100644
--- a/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
+++ b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
@@ -229,7 +229,7 @@
 
         THDto thDto = this.getTH(message);
         if (null != thDto) {
-            log.debug("-------THDto--={}", thDto);
+            log.info("-------THDto--={}", thDto);
         }
         //娓呯┖
         String key = "GRAIN_" + message.getAddr();
@@ -379,8 +379,8 @@
         try {
             THDto th = new THDto();
             String data = message.getContent();
-            String houseNo = data.substring(0, 4);
-            int depotId = BytesUtil.hexToInt(BytesUtil.tran_LH(houseNo));
+            String houseNo = data.substring(0, 2);
+            int depotId = BytesUtil.hexToInt(houseNo);
             String t = data.substring(4, 8);
             String h = data.substring(8, 12);
             double humy;
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 fd3b52b..bab4d2e 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/analysis/AnalysisService.java
@@ -80,27 +80,52 @@
         if (ServiceUtils.FUNCTION_66.equalsIgnoreCase(funId)) {
 
             log.info("---------寮�濮嬭В鏋愮伯鎯呬俊鎭�---------");
-            this.analysisGrainStep1(device, msgId, strMsg);
+            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("---------寮�濮嬭В鏋愪粨娓╂箍搴︿俊鎭�---------");
-            this.analysisGrainTh(device, strMsg);
+            try{
+                this.analysisGrainTh(device, strMsg);
+            }catch (Exception e){
+                log.error(e.getMessage(),e);
+            }
+
         }
 
     }
 
     private void analysisGrainTh(GatewayDevice device, String strMsg) {
-        THDto th = new THDto();
+        try{
+            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);
+            //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);
+        }
 
-        this.add2ThMap(device.getDepotIdSys(), th);
     }
 
 
@@ -114,53 +139,57 @@
      * @param msgId  鍛戒护ID
      */
     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);
 
-
-        //瀵嗛挜鍜岀偣鏁�
-        String kyeNumHex = strMsg.substring(2, 4);
-        String kyeNumBin = BytesUtil.toBinary8String(BytesUtil.hexToInt(kyeNumHex));
-
-        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;
         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);
-            start = 2 * 2;
-        }
 
+        String tempStr = "";
+        for (int j = 0;j<cableY;j++){
+            tempStr = strMsg.substring(12 * j,12 * j +12);
+            //瀵嗛挜鍜岀偣鏁� 02 A4 BB BA BA B4
+            String kyeNumHex = tempStr.substring(2, 4);
+            String kyeNumBin = BytesUtil.toBinary8String(BytesUtil.hexToInt(kyeNumHex));
+
+            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;
+            for (int i = 0; i < numValue; 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;
+            }
+        }
 
         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);
         }
@@ -182,7 +211,7 @@
             root = this.getGrainRoot(buildGrainRootKey(reqData.getDevice().getDeviceSn(), i));
 
             if (null == root || null == root.getPoints()) {
-                log.error("-----------瑙f瀽鑾峰彇鎵�鏈夌伯鎯呮娴嬬偣澶辫触锛屽彇娑堟墽琛�---------{}", reqData.getDevice().getDeviceName());
+                log.error("-----------瑙f瀽鑾峰彇鎵�鏈夌伯鎯呮娴嬬偣澶辫触锛屽彇娑堟墽琛�---------{}---{}", reqData.getDevice().getDeviceName(),i);
                 return;
             }
             points.addAll(root.getPoints());
diff --git a/src/main/java/com/fzzy/protocol/youxian0/client/ClientEngine.java b/src/main/java/com/fzzy/protocol/youxian0/client/ClientEngine.java
index 044b901..2bc98f2 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/client/ClientEngine.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/client/ClientEngine.java
@@ -30,7 +30,7 @@
 
     private String host;
     private int port;
-    public Channel defaultChannel;
+    public  static  Channel defaultChannel;
 
 
     public ClientEngine(String host, int port) {
@@ -46,6 +46,7 @@
     @Override
     public void run() {
         try {
+
             startClient();
         } catch (Exception e) {
             e.printStackTrace();
@@ -53,6 +54,10 @@
     }
 
     public void startClient() throws Exception {
+        if(defaultChannel != null){
+            log.info("-----IP={},杩炴帴瀛樺湪锛岀洿鎺ヤ娇鐢�",host);
+            return;
+        }
         EventLoopGroup group = new OioEventLoopGroup();
         Bootstrap b = new Bootstrap();
         //榛樿闀胯繛鎺�
@@ -82,9 +87,9 @@
             @Override
             public void operationComplete(ChannelFuture arg0) throws Exception {
                 if (channelFuture.isSuccess()) {
-                    log.info("-----IP={},杩炴帴鎴愬姛");
+                    log.info("-----IP={},杩炴帴鎴愬姛",host);
                 } else {
-                    log.info("-----IP={},杩炴帴澶辫触锛岃嚜鍔ㄥ叧闂嚎绋�");
+                    log.info("-----IP={},杩炴帴澶辫触锛岃嚜鍔ㄥ叧闂嚎绋�",host);
                     channelFuture.cause().printStackTrace();
                     group.shutdownGracefully(); // 鍏抽棴绾跨▼缁�
                 }
@@ -107,7 +112,7 @@
     }
 
 
-    public Channel getChannel() {
+    public static Channel getChannel() {
         return defaultChannel;
     }
 
diff --git a/src/main/java/com/fzzy/protocol/youxian0/client/ClientHandler.java b/src/main/java/com/fzzy/protocol/youxian0/client/ClientHandler.java
index 41e4c99..f29fd15 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/client/ClientHandler.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/client/ClientHandler.java
@@ -49,7 +49,11 @@
             analysisService = SpringUtil.getBean(AnalysisService.class);
         }
 
-        analysisService.analysis(socketAddress.getAddress(), socketAddress.getPort(), strMsg);
+       try{
+           analysisService.analysis(socketAddress.getAddress(), socketAddress.getPort(), strMsg);
+       }catch (Exception e){
+           log.error(e.getMessage(),e);
+       }
 
     }
 
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 ba4473e..0495501 100644
--- a/src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java
+++ b/src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java
@@ -38,7 +38,7 @@
      * @return
      */
     @Override
-    public BaseResp syncGrain(BaseReqData reqData) {
+    public synchronized BaseResp syncGrain(BaseReqData reqData) {
 
         BaseResp resp = new BaseResp();
 
@@ -50,8 +50,8 @@
             log.error("----------------绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅,鏃犳硶鎵ц---------");
             return resp;
         }
-
         try {
+            this.syncGrainTh(reqData);
             //Step 璇锋眰淇℃伅鏀惧叆鍐呭瓨
             ProtocolUtils.addSyncReq2Map(device.getDepotIdSys(), reqData);
 
@@ -62,7 +62,7 @@
 
             int start = 0, length = cableY;
             // 鐢熸垚绮儏淇℃伅
-            String hexStr = "";
+            String  hexStr = "";
             InvokeResult message;
             for (int i = 1; i <= cableX; i++) {
                 if (1 == i) {
@@ -70,9 +70,7 @@
                 } else {
                     start = (i - 1) * cableY + 1;
                 }
-
-                hexStr = this.buildGrainCmd(device, i, start, length);
-
+                hexStr = buildGrainCmd(device, i, start, length);
                 // 鍙戦�佸懡浠� TODO----->>>鏆傛椂璋冩暣涓烘瘡娆″垱寤轰竴涓柊杩炴帴
                 //Channel channel = ClientEngine.getChannel(device.getIp());
                 Channel channel = null;
@@ -92,6 +90,7 @@
                     resp.setCode(500);
                     resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-澶辫触锛�" + message.getMessage());
                 }
+                Thread.sleep(500);
             }
         } catch (Exception e) {
             log.error("绮儏妫�娴嬪紓甯革細{}", e);
@@ -104,7 +103,46 @@
 
     @Override
     public BaseResp syncGrainTh(BaseReqData reqData) {
-        return new BaseResp();
+
+        BaseResp resp = new BaseResp();
+
+        GatewayDevice device = reqData.getDevice();
+
+        if (null == device) {
+            resp.setCode(500);
+            resp.setMsg("绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅锛屾棤娉曟墽琛�");
+            log.error("----------------绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅,鏃犳硶鎵ц---------");
+            return resp;
+        }
+
+        try {
+            //Step 璇锋眰淇℃伅鏀惧叆鍐呭瓨
+            ProtocolUtils.addSyncReq2Map(device.getDepotIdSys(), reqData);
+            InvokeResult message;
+            Channel channel = null;
+            if (null == channel) {
+                ClientEngine clientEngine = new ClientEngine(device.getIp(), device.getPort());
+                clientEngine.start();
+                Thread.sleep(300);
+                channel = clientEngine.getChannel();
+            }
+            String hexStr = this.buildTHCmd(device);
+            message = ClientEngine.send2(hexStr, channel);
+                log.error("骞冲彴------>>>>涓绘帶锛氬彂閫佹俯婀垮害妫�娴嬪懡浠�-{}---{}", message,hexStr);
+                // 灏佽杩斿洖淇℃伅
+                if (!InvokeResult.SUCCESS.getCode().equals(message.getCode())) {
+                    log.error("骞冲彴------>>>>涓绘帶锛氬彂閫佹俯婀垮害妫�娴嬪懡浠�-澶辫触{}", message.getMessage());
+                    resp.setCode(500);
+                    resp.setMsg("骞冲彴------>>>>涓绘帶锛氬彂閫佹俯婀垮害妫�娴嬪懡浠�-澶辫触锛�" + message.getMessage());
+                }
+                Thread.sleep(500);
+        } catch (Exception e) {
+            log.error("娓╂箍搴︽娴嬪紓甯革細{}", e);
+            resp.setCode(500);
+            resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佹俯婀垮害妫�娴嬪懡浠わ細" + e.getMessage());
+            return resp;
+        }
+        return resp;
     }
 
     /**
@@ -124,7 +162,7 @@
         deviceSn = BytesUtil.intToHexStr1(Integer.valueOf(deviceSn));
         content = content.replace("{id}", deviceSn);
         content = content.replace("{id}", deviceSn);
-
+        content = content.replace("{id}", deviceSn);
         //鍛戒护ID
         String msgIdHex = BytesUtil.intToHexStr1(cur);
         content = content.replace("{msgId}", msgIdHex);
@@ -147,7 +185,40 @@
 
         return start + content + crcCode + end;
     }
+    private String buildTHCmd(GatewayDevice device) {
 
+        String start = "7e";
+        //娴嬫俯鍛戒护--7e 01 00 00 01 06 00 02 00 01 a0 ff ff 68 1a 05 88 5c 7e
+        String content = "{id}0000{id}{msgId}000200{id}a0ffff{funId}{start}{length}";
+
+        //寮�濮嬪皝瑁呮秷鎭綋-涓绘満ID
+        String deviceSn = device.getDeviceSn();
+        deviceSn = BytesUtil.intToHexStr1(Integer.valueOf(deviceSn));
+        content = content.replace("{id}", deviceSn);
+        content = content.replace("{id}", deviceSn);
+        content = content.replace("{id}", deviceSn);
+        //鍛戒护ID
+        String msgIdHex = BytesUtil.intToHexStr1(20);
+        content = content.replace("{msgId}", msgIdHex);
+
+        //鍛戒护绫诲瀷
+        content = content.replace("{funId}", ServiceUtils.FUNCTION_68);
+
+        //寮�濮嬫牴鍙�
+        String startCurHex = BytesUtil.intToHexStr1(0);
+        content = content.replace("{start}", startCurHex);
+
+        //鎴彇闀垮害
+        String lenHex = BytesUtil.intToHexStr1(0);
+        content = content.replace("{length}", lenHex);
+
+        //鏍¢獙鐮�
+        String crcCode = this.getCRC(content);
+
+        String end = "7e";
+
+        return start + content + crcCode + end;
+    }
     /**
      * 鍙傝�冪粨鏋滐細http://www.ip33.com/crc.html
      * <p>
@@ -159,17 +230,40 @@
      * @param content
      * @return
      */
-    private String getCRC(String content) {
+    private static String getCRC(String content) {
         byte[] bytes = HexStringToBytes(content);//16杩涘埗瀛楃涓茶浆鎴�16杩涘埗瀛楃涓叉暟缁�
         int i = CRC16_XMODEM(bytes);//杩涜CRC鈥擷MODEM鏍¢獙寰楀埌鍗佽繘鍒舵牎楠屾暟
         String CRC = Integer.toHexString(i);//10杩涘埗杞�16杩涘埗
-
+       if(CRC.length() < 4){
+           CRC = "0"+CRC;
+       }
+        if(CRC.length() < 4){
+            CRC = "0"+CRC;
+        }
         //璋冩暣楂樹綅鍦ㄥ彸锛屽湴浣嶅湪宸︿晶
         CRC = tran_LH(CRC);
 
         return CRC;
     }
 
+    public static void main(String[] args) {
+        //System.out.println(getCRC("010000010400020001a0ffff661005"));
+        //System.out.println(getCRC("010000010500020001a0ffff661505"));
+        String strMsg = "7E00010100010000A0FFFF66FF05BE01635B696FCE02A38ABAB5CE03E3003131CE044383B7B6CE0583497276D9FA";
+        int start = 15 * 2;
+        strMsg = strMsg.substring(start);
+        System.out.println(strMsg);
+        String kyeNumBin = BytesUtil.toBinary8String(BytesUtil.hexToInt("A3"));
+        System.out.println(kyeNumBin);
+        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));
+        System.out.println((keyValue + ""));
+        System.out.println((numValue + ""));
+
+    }
+
     public static String tran_LH(String info) {
         return info.substring(2) + info.substring(0, 2);
     }

--
Gitblit v1.9.3