From 75bdadc0c4e468217b93142d965cd92ee52838ec Mon Sep 17 00:00:00 2001
From: vince <757871790@qq.com>
Date: 星期一, 20 五月 2024 09:01:27 +0800
Subject: [PATCH] 粮情协议优化

---
 src/main/java/com/fzzy/protocol/youxian0/service/Youxian0GatewayGrainService.java |  229 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 188 insertions(+), 41 deletions(-)

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..50ff78b 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,72 @@
      * @return
      */
     @Override
-    public BaseResp syncGrain(BaseReqData reqData) {
+    public  synchronized BaseResp syncGrain(BaseReqData reqData) {
+
+        BaseResp resp = new BaseResp();
+
+        GatewayDevice device = reqData.getDevice();
+
+        if (null == device) {
+            resp.setCode(500);
+            resp.setMsg("绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅锛屾棤娉曟墽琛�");
+            log.error("----------------绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅,鏃犳硶鎵ц---------");
+            return resp;
+        }
+        try {
+            this.syncGrainTh(reqData);
+            //Step 璇锋眰淇℃伅鏀惧叆鍐呭瓨
+            ProtocolUtils.addSyncReq2Map(device.getDepotIdSys(), reqData);
+
+            // 鍒ゆ柇鏁版嵁鏈夋病鏈夋敹鍙栧畬鏁�
+            String[] attCable = device.getCableRule().split("-");
+            int cableY = Integer.valueOf(attCable[1]);
+            int cableX = Integer.valueOf(attCable[2]);
+
+            int start = 0, length = cableY;
+            // 鐢熸垚绮儏淇℃伅
+            String  hexStr = "";
+            InvokeResult message;
+            Channel channel = ClientEngine.getChannel();
+            if (null == channel) {
+                ClientEngine clientEngine = new ClientEngine(device.getIp(), device.getPort());
+                clientEngine.start();
+                Thread.sleep(1000);
+                channel = clientEngine.getChannel();
+            }
+            for (int i = 1; i <= cableX; i++) {
+                if (1 == i) {
+                    start = 255;
+                } else {
+                    start = (i - 1) * cableY + 1;
+                }
+                hexStr = buildGrainCmd(device, i, start, length);
+                // 鍙戦�佸懡浠� TODO----->>>鏆傛椂璋冩暣涓烘瘡娆″垱寤轰竴涓柊杩炴帴
+                //Channel channel = ClientEngine.getChannel(device.getIp());
+
+                message = ClientEngine.send2(hexStr, channel);
+                //log.error("骞冲彴------>>>>涓绘帶锛氬彂閫佺伯鎯呮娴嬪懡浠�-{}---{}", message,hexStr);
+                log.error("骞冲彴------>>>>涓绘帶锛氬彂閫佺伯鎯呮娴嬪懡浠�-{}---{}", message,hexStr);
+
+                // 灏佽杩斿洖淇℃伅
+                if (!InvokeResult.SUCCESS.getCode().equals(message.getCode())) {
+                    log.error("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-澶辫触{}", message.getMessage());
+                    resp.setCode(500);
+                    resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-澶辫触锛�" + message.getMessage());
+                }
+                Thread.sleep(3000);
+            }
+        } catch (Exception e) {
+            log.error("绮儏妫�娴嬪紓甯革細{}", e);
+            resp.setCode(500);
+            resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠わ細" + e.getMessage());
+            return resp;
+        }
+        return resp;
+    }
+
+    @Override
+    public BaseResp syncGrainTh(BaseReqData reqData) {
 
         BaseResp resp = new BaseResp();
 
@@ -54,45 +119,28 @@
         try {
             //Step 璇锋眰淇℃伅鏀惧叆鍐呭瓨
             ProtocolUtils.addSyncReq2Map(device.getDepotIdSys(), reqData);
-
-            // 鍒ゆ柇鏁版嵁鏈夋病鏈夋敹鍙栧畬鏁�
-            String[] attCable = device.getCableRule().split("-");
-            int cableY = Integer.valueOf(attCable[1]);
-            int cableX = Integer.valueOf(attCable[2]);
-
-            int start = 0, length = cableY;
-            // 鐢熸垚绮儏淇℃伅
-            String hexStr = "";
             InvokeResult message;
-            for (int i = 1; i <= cableX; i++) {
-                if (1 == i) start = 255;
-                start = i * cableY + 1;
-
-                hexStr = this.buildGrainCmd(device, i, start, length);
-
-                // 鍙戦�佸懡浠�
-                Channel channel = ClientEngine.getChannel(device.getIp());
-                if (null == channel) {
-                    ClientEngine clientEngine = new ClientEngine(device.getIp(), device.getPort());
-                    clientEngine.start();
-                    Thread.sleep(500);
-                    channel = clientEngine.getChannel();
-                }
-                message = ClientEngine.send2(hexStr, channel);
-
-                log.error("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-{}", 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());
+                    log.error("骞冲彴------>>>>涓绘帶锛氬彂閫佹俯婀垮害妫�娴嬪懡浠�-澶辫触{}", message.getMessage());
                     resp.setCode(500);
-                    resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-澶辫触锛�" + message.getMessage());
+                    resp.setMsg("骞冲彴------>>>>涓绘帶锛氬彂閫佹俯婀垮害妫�娴嬪懡浠�-澶辫触锛�" + message.getMessage());
                 }
-            }
+                Thread.sleep(500);
         } catch (Exception e) {
-            log.error("绮儏妫�娴嬪紓甯革細{}", e);
+            log.error("娓╂箍搴︽娴嬪紓甯革細{}", e);
             resp.setCode(500);
-            resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠わ細" + e.getMessage());
+            resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佹俯婀垮害妫�娴嬪懡浠わ細" + e.getMessage());
             return resp;
         }
         return resp;
@@ -108,27 +156,50 @@
 
         String start = "7e";
         //娴嬫俯鍛戒护--7e 01 00 00 01 00 00 02 00 01 a0 ff ff 66 ff 05 3a 59 7e
-        String content = "{id}0000{id}{msgId}000200{id}a0ffff{funId}{start}{length}";
+        //7e 0f 00 00 10 5f 00 03 00 0f 10 a0 ff ff 66 ff 05 9e 43 7e
+        //7e 06 00 00 06 29 00 02 00 06 a0 ff ff 66 1a 05 58 0f 7e
+        String content = "{depotId}0000{id1}{msgId}00{type}00{id2}a0ffff{funId}{start}{length}";
 
+
+        String type = "02";
         //寮�濮嬪皝瑁呮秷鎭綋-涓绘満ID
         String deviceSn = device.getDeviceSn();
+        String depotId = device.getDepotIdSys();
         deviceSn = BytesUtil.intToHexStr1(Integer.valueOf(deviceSn));
-        content = content.replaceAll("\\{id}", deviceSn);
+        depotId = BytesUtil.intToHexStr1(Integer.valueOf(depotId));
+        if(!depotId.equals(deviceSn)){
+            type = "03";
+
+            content = content.replace("{depotId}", depotId);
+            content = content.replace("{id1}", deviceSn);
+            if(deviceSn.toLowerCase().equals("0e".toLowerCase())){
+                content = content.replace("{id2}", depotId +"13"+ deviceSn);
+                type = "04";
+            }else{
+                content = content.replace("{id2}", depotId + deviceSn);
+            }
+            content = content.replace("{type}", type);
+        }else{
+            content = content.replace("{type}", type);
+            content = content.replace("{depotId}", depotId);
+            content = content.replace("{id1}", deviceSn);
+            content = content.replace("{id2}", deviceSn);
+        }
 
         //鍛戒护ID
         String msgIdHex = BytesUtil.intToHexStr1(cur);
-        content = content.replace("\\{msgId}", msgIdHex);
+        content = content.replace("{msgId}", msgIdHex);
 
         //鍛戒护绫诲瀷
-        content = content.replace("\\{funId}", ServiceUtils.FUNCTION_66);
+        content = content.replace("{funId}", ServiceUtils.FUNCTION_66);
 
         //寮�濮嬫牴鍙�
         String startCurHex = BytesUtil.intToHexStr1(startCur);
-        content = content.replace("\\{start}", startCurHex);
+        content = content.replace("{start}", startCurHex);
 
         //鎴彇闀垮害
         String lenHex = BytesUtil.intToHexStr1(length);
-        content = content.replace("\\{length}", lenHex);
+        content = content.replace("{length}", lenHex);
 
         //鏍¢獙鐮�
         String crcCode = this.getCRC(content);
@@ -137,7 +208,60 @@
 
         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
+        //                {depotId}0000{id1}{msgId}00{type}00{id2}
+        String content = "{depotId}0000{id1}{msgId}00{type}00{id2}a0ffff{funId}{start}{length}";
+
+        String type = "02";
+        //寮�濮嬪皝瑁呮秷鎭綋-涓绘満ID
+        String deviceSn = device.getDeviceSn();
+        String depotId = device.getDepotIdSys();
+        deviceSn = BytesUtil.intToHexStr1(Integer.valueOf(deviceSn));
+        depotId = BytesUtil.intToHexStr1(Integer.valueOf(depotId));
+        if(!depotId.equals(deviceSn)){
+            type = "03";
+
+            content = content.replace("{depotId}", depotId);
+            content = content.replace("{id1}", deviceSn);
+            if(deviceSn.toLowerCase().equals("0e".toLowerCase())){
+                content = content.replace("{id2}", depotId +"13"+ deviceSn);
+                type = "04";
+            }else{
+                content = content.replace("{id2}", depotId + deviceSn);
+            }
+            content = content.replace("{type}", type);
+        }else{
+            content = content.replace("{type}", type);
+            content = content.replace("{depotId}", depotId);
+            content = content.replace("{id1}", deviceSn);
+            content = content.replace("{id2}", 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>
@@ -149,17 +273,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