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