From 3a56308b1a8f3f453a56da52af64ad4ba669aec1 Mon Sep 17 00:00:00 2001 From: jiazx0107@163.com <jiazx0107@163.com> Date: 星期三, 13 十二月 2023 15:41:38 +0800 Subject: [PATCH] 提交邦海智能粮情协议解析--1 --- src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2MessageConsumer.java | 56 ++ src/main/java/com/fzzy/protocol/bhzn/data/Content.java | 43 + src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java | 1 src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java | 431 ++++++++++++++++++ src/main/java/com/fzzy/protocol/bhzn/cmd/CommandBuild.java | 179 +++++++ src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisGrain.java | 1 src/main/java/com/fzzy/gateway/GatewayUtils.java | 7 src/main/java/com/fzzy/protocol/bhzn/package-info.java | 4 src/main/java/com/fzzy/api/Constant.java | 17 src/main/java/com/fzzy/protocol/bhzn/data/THDto.java | 39 + src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java | 85 +++ src/main/java/com/fzzy/protocol/ConstantProtocol.java | 15 src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2HeartbeatImpl.java | 36 + src/main/java/com/fzzy/api/utils/BytesUtil.java | 60 ++ src/main/java/com/fzzy/protocol/fzzy/server/ServerUtils.java | 4 src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java | 2 src/main/java/com/fzzy/protocol/bhzn/data/IoMessage.java | 20 src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerEngine.java | 91 +++ src/main/java/com/fzzy/protocol/bhzn/cmd/ReMessageBuilder.java | 52 ++ src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2SessionListener.java | 62 ++ src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerUtils.java | 116 +++++ 21 files changed, 1,317 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fzzy/api/Constant.java b/src/main/java/com/fzzy/api/Constant.java index 6c17aee..78701d7 100644 --- a/src/main/java/com/fzzy/api/Constant.java +++ b/src/main/java/com/fzzy/api/Constant.java @@ -2,6 +2,7 @@ import com.fzzy.api.data.ApiCommonDevice; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -335,6 +336,22 @@ return null; } + public static ApiCommonDevice updateCacheOnline(String ip, Integer port) { + ApiCommonDevice device = getCommonDeviceCacheByIp(ip); + + if (null == device) { + device = new ApiCommonDevice(); + } + device.setIp(ip); + device.setPort(port); + device.setStatus(Constant.YN_Y); + device.setCode("SUCCESS"); + device.setMsg("璁惧涓婄嚎"); + device.setOnlineTime(new Date()); + contextDeviceMap.put(device.getSn(), device); + return device; + } + public static ApiCommonDevice updateCacheOffline(String ip, Integer port) { ApiCommonDevice device = getCommonDeviceCacheByIp(ip); diff --git a/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java b/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java index 2acecef..99631d8 100644 --- a/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java +++ b/src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java @@ -13,6 +13,7 @@ TCP_FZZY_V3("TCP_FZZY_V3", "绮儏-椋庢鑷磋繙鎺у埗鏌滃崗璁甐3"), GRAIN_FZZY_IGDS_V40("GRAIN_FZZY_IGDS_V40", "绮儏-椋庢鑷磋繙绯荤粺V40"), + GRAIN_FZZY_BHZN_WEB("GRAIN_FZZY_BHZN_WEB", "绮儏-椋庢鑷磋繙閭︽捣缃戝彛鍗忚"), DEVICE_WEIGHT_HTTP("DEVICE_WEIGHT_HTTP", "鍦扮-HTTP鍗忚"), DEVICE_WEIGHT_TCP_YH("DEVICE_WEIGHT_TCP_YH", "鍦扮-鑰�鍗嶵CP鍗忚"), DEVICE_IDCARD_HTTP("DEVICE_IDCARD_HTTP", "韬唤璇�-HTTP鍗忚"), @@ -28,6 +29,7 @@ List<ApiTrigger> list = new ArrayList<>(); list.add(new ApiTrigger(TCP_FZZY_V3.getCode(), TCP_FZZY_V3.getName())); list.add(new ApiTrigger(GRAIN_FZZY_IGDS_V40.getCode(), GRAIN_FZZY_IGDS_V40.getName())); + list.add(new ApiTrigger(GRAIN_FZZY_BHZN_WEB.getCode(), GRAIN_FZZY_BHZN_WEB.getName())); list.add(new ApiTrigger(DEVICE_WEIGHT_HTTP.getCode(), DEVICE_WEIGHT_HTTP.getName())); list.add(new ApiTrigger(DEVICE_WEIGHT_TCP_YH.getCode(), DEVICE_WEIGHT_TCP_YH.getName())); list.add(new ApiTrigger(DEVICE_IDCARD_HTTP.getCode(), DEVICE_IDCARD_HTTP.getName())); diff --git a/src/main/java/com/fzzy/api/utils/BytesUtil.java b/src/main/java/com/fzzy/api/utils/BytesUtil.java index af40a1d..37a1ee6 100644 --- a/src/main/java/com/fzzy/api/utils/BytesUtil.java +++ b/src/main/java/com/fzzy/api/utils/BytesUtil.java @@ -401,4 +401,64 @@ public static String folatToHexString(Float value) { return Integer.toHexString(Float.floatToIntBits(value)); } + + /** + * int杞�16杩涘埗瀛楃涓� 1浣嶇疆 00 + * + * @param num + * @return + */ + public static String intToHexStr1(int num) { + // 闇�瑕佷娇鐢�2瀛楄妭琛ㄧずb + return String.format("%02x", num).toUpperCase(); + } + + public static String hexString2binaryString(String hexString, int num) { + //16杩涘埗杞�10杩涘埗 + BigInteger sint = new BigInteger(hexString, num); + //10杩涘埗杞�2杩涘埗 + String str = sint.toString(2); + if(str.length() < num){ + for (int i = str.length(); i < num; i++) { + str = "0" + str; + } + } + return str; + } + + /** + * 灏嗕簩杩涘埗杞崲涓�10杩涘埗 + * @param binStr + * @return + */ + public static Integer biannary2Decimal(String binStr){ + + Integer sum = 0; + int len = binStr.length(); + + for (int i=1;i<=len;i++){ + //绗琲浣� 鐨勬暟瀛椾负锛� + int dt = Integer.parseInt(binStr.substring(i-1,i)); + sum+=(int)Math.pow(2,len-i)*dt; + } + return sum; + } + + /** + * 浜岃繘鍒惰ˉ鐮侊細鍙栧弽鍙e姞1 + * @param str + * @return + */ + public static Integer twoToString(String str) { + String two = ""; + String[] split = str.split(""); + for (int i = 0;i< split.length;i++){ + if("1".equals(split[i])){ + two += "0"; + }else if("0".equals(split[i])){ + two += "1"; + } + } + return biannary2Decimal(two) + 1; + } } diff --git a/src/main/java/com/fzzy/gateway/GatewayUtils.java b/src/main/java/com/fzzy/gateway/GatewayUtils.java index e7da33c..076834c 100644 --- a/src/main/java/com/fzzy/gateway/GatewayUtils.java +++ b/src/main/java/com/fzzy/gateway/GatewayUtils.java @@ -42,6 +42,13 @@ return cacheMapDeviceId.get(deviceId); } + + /** + * 閽堝涓�涓垎鏈哄寤掗棿鐨勬儏鍐� + * + * @param deviceSn + * @return + */ public static GatewayDevice getCacheByDeviceSn(String deviceSn) { Collection<GatewayDevice> list = allCacheDevice(); if (null == list || list.isEmpty()) return null; diff --git a/src/main/java/com/fzzy/protocol/ConstantProtocol.java b/src/main/java/com/fzzy/protocol/ConstantProtocol.java new file mode 100644 index 0000000..c1f168d --- /dev/null +++ b/src/main/java/com/fzzy/protocol/ConstantProtocol.java @@ -0,0 +1,15 @@ +package com.fzzy.protocol; + + +/** + * 鍗忚瑙f瀽鍏ㄥ眬甯搁噺 + */ +public class ConstantProtocol { + + //-绮俯澶囩敤鐐� + public static final double ERROR_TEMP = -100; + //-绮俯鏁呴殰鐐� + public static final double FAULT_TEMP = -101; + //-绮俯琛ュ伩鐐�-閽堝閿ュ舰浠撹ˉ鐐逛娇鐢� + public static final double ADD_TEMP = -102; +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java new file mode 100644 index 0000000..7aca558 --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java @@ -0,0 +1,431 @@ +package com.fzzy.protocol.bhzn.analysis; + +import com.alibaba.fastjson.JSONObject; +import com.fzzy.api.Constant; +import com.fzzy.api.data.ApiCommonDevice; +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.ConstantProtocol; +import com.fzzy.protocol.bhzn.cmd.CommandBuild; +import com.fzzy.protocol.bhzn.cmd.ReMessageBuilder; +import com.fzzy.protocol.bhzn.data.IoMessage; +import com.fzzy.protocol.bhzn.data.THDto; +import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerEngine; +import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerUtils; +import com.fzzy.protocol.fzzy.server.ServerUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 鍗忚瑙f瀽 + * + * @author vince + */ +@Slf4j +@Component(AnalysisService.BEAN_ID) +public class AnalysisService { + + + public static final String BEAN_ID = "bhzn2.analysisService"; + + @Resource + private GatewayRemoteManager gatewayRemoteManager; + + /** + * 閽堝鍒嗗寘绮儏鎶ユ枃杩涜灏佽 + */ + public static Map<String, String> contextMapGrain = new HashMap<>(); + + /** + * 鐢ㄤ簬瀛樻斁杩斿洖鐨勪粨娓╀粨婀夸俊鎭� + */ + public static Map<String, THDto> contextMapTH = new HashMap<>(); + + /** + * @param sessionKey ip:port + */ + public void analysis(String sessionKey, IoMessage message) throws Exception { + + //娉ㄥ唽 + if (BhznGrainV2ServerUtils.FUNCTION_ID_F1.equals(message.getFunctionId())) { + + log.info("涓绘満------->>骞冲彴锛氭敞鍐屼俊鎭姤鏂�={}", message); + + //DO NOTHING + + return; + } + + //蹇冭烦 + if (BhznGrainV2ServerUtils.FUNCTION_ID_F2.equals(message.getFunctionId())) { + + //DO NOTHING + + return; + } + + // 93 瑙f瀽浠撴俯浠撴箍锛屽苟杩斿洖鏀跺埌鎶ユ枃 + if (BhznGrainV2ServerUtils.FUNCTION_ID_93.equals(message.getFunctionId())) { + log.info("涓绘満------->>骞冲彴锛氭俯婀垮害淇℃伅鎶ユ枃={}", message); + analysisTh(message); + return; + } + + // 92 瑙f瀽绮俯锛屽苟杩斿洖鏀跺埌鎶ユ枃 + if (BhznGrainV2ServerUtils.FUNCTION_ID_92.equals(message.getFunctionId())) { + log.info("涓绘満------->>骞冲彴锛氱伯鎯呬俊鎭姤鏂�={}", message); + analysisGrain(message); + } + } + + + /** + * 鏆傛椂涓嶆敮鎸佷箟鍒嗘満澶氫粨妯″紡锛�--骞虫埧浠� + * + * @param message + */ + private void analysisGrain(IoMessage message) { + try { + + //鏍规嵁鍒嗘満鍦板潃鑾峰彇鍒嗘満淇℃伅 + ApiCommonDevice commonDevice = Constant.getCommonDeviceCache(message.getAddr()); + if (commonDevice == null) { + replayGrain(message); + log.error("涓绘満-------->>骞冲彴锛岃В鏋愮伯鎯呭け璐ワ紝鏈幏鍙栧埌绯荤粺绮儏涓绘満閰嶇疆锛�" + message.getAddr()); + return; + } + + //鏍规嵁鍒嗘満SN鑾峰彇璁惧閰嶇疆淇℃伅 + GatewayDevice gatewayDevice = GatewayUtils.getCacheByDeviceSn(commonDevice.getSn()); + if (null == gatewayDevice) { + replayGrain(message); + log.error("涓绘満-------->>骞冲彴锛岃В鏋愮伯鎯呭け璐ワ紝鏈幏鍙栧埌绯荤粺璁惧閰嶇疆淇℃伅锛�" + message.getAddr()); + return; + } + + //鑾峰彇璇锋眰淇℃伅 + BaseReqData reqData = BhznGrainV2ServerUtils.getSyncReq(gatewayDevice.getDepotIdSys()); + if (null == reqData) { + replayGrain(message); + log.error("涓绘満-------->>骞冲彴锛岃В鏋愮伯鎯呭け璐ワ紝鏈幏鍙栧埌绮儏璇锋眰淇℃伅锛�" + message.getAddr()); + return; + } + + // 鍒ゆ柇鏁版嵁鏈夋病鏈夋敹鍙栧畬鏁� + String[] attCable = gatewayDevice.getCableRule().split("-"); + int cableZ = Integer.valueOf(attCable[0]); + int cableY = Integer.valueOf(attCable[1]); + int cableX = Integer.valueOf(attCable[2]); + int sumPoint = cableZ * cableY * cableX; + + //鑾峰彇褰撳墠绮儏娓╁害鎶ユ枃 + String grainHex = message.getContent().substring(16); + + //褰撳墠鎶ユ枃娓╁害鐐规暟 + int curPoint = BytesUtil.hexToInt(BytesUtil.tran_LH(message.getContent().substring(4, 8))); + + //濡傛灉褰撳墠鍖呯殑鏁版嵁涓暟澶т簬绛変簬褰撳墠浠撳簱鐨勯厤缃偣浣嶅垯琛ㄧず鍗曞寘杩斿洖 + if (curPoint >= sumPoint) { + log.info("鍒嗘満------>>>骞冲彴锛氱伯鎯呮暟鎹崟鍖�=" + grainHex); + //杩斿洖绮儏鎺ユ敹淇℃伅 + replayGrain(message); + analysisGrain2(message, reqData, grainHex); + return; + } + + //琛ㄧず鍒嗗寘浼犻�� + String key = "GRAIN_" + message.getAddr(); + String oldGrainHex = contextMapGrain.get(key) == null ? "" : contextMapGrain.get(key); + + //鑾峰彇褰撳墠鍖呰捣濮嬬偣鐨勫眰琛屽垪 + int hang = BytesUtil.hexToInt(BytesUtil.tran_LH(message.getContent().substring(8, 10))); + int lie = BytesUtil.hexToInt(BytesUtil.tran_LH(message.getContent().substring(10, 12))); + int ceng = BytesUtil.hexToInt(BytesUtil.tran_LH(message.getContent().substring(12, 14))); + if (hang > 0 || lie > 0 || ceng > 0) { + //璇存槑闈炵涓�鍖呮暟鎹� + grainHex = oldGrainHex + grainHex; + } + + if (grainHex.length() >= sumPoint * 4) { + //杩斿洖绮儏鎺ユ敹淇℃伅 + replayGrain(message); + log.info("鍒嗘満------>>>骞冲彴锛氱伯鎯呮暟鎹鍖咃紝瀹屾暣鏁版嵁=" + grainHex); + analysisGrain2(message, reqData, grainHex); + return; + + } else { + log.info("鍒嗘満------>>>骞冲彴锛氬皢绗竴鍖呮暟鎹瓨鍏ュ唴瀛�=" + grainHex); + contextMapGrain.put(key, grainHex); + replayGrain(message); + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + /** + * 杩斿洖绮儏鏀跺埌鎶ユ枃淇℃伅锛岄渶瑕佹敞鎰忥細濡傛灉瀛樺湪鍒嗗寘鎯呭喌涓嬶紝闇�瑕佺瓑鎵�鏈夊寘鏀跺埌鍚庤繑鍥� + * + * @param message + */ + private void replayGrain(IoMessage message) throws InterruptedException { + Thread.sleep(50); + String hexStr = CommandBuild.getMsgGrainReply(message.getAddr()); + log.info("骞冲彴--------->>>涓绘満锛岃繑鍥炵伯鎯呮姤鏂囨敹鍒颁俊鎭紝鎶ユ枃={}", hexStr); + + BhznGrainV2ServerEngine.push(message.getIp(), message.getPort(), BytesUtil.hexStrToBytes(hexStr)); + } + + private void analysisGrain2(IoMessage message, BaseReqData reqData, String grainStr) { + + GatewayDevice device = reqData.getDevice(); + // 鑾峰彇瀹屾暣鐨勭伯鎯呭寘淇℃伅 + String[] attCable = device.getCableRule().split("-"); + int cableZ = Integer.valueOf(attCable[0]); + int cableY = Integer.valueOf(attCable[1]); + int cableX = Integer.valueOf(attCable[2]); + + // 鏍规嵁灞傝鍒楄幏鍙栨寚瀹氶暱搴� + int start = 0; + int len = 4 * cableZ * cableY * cableX; + + log.info("鍒嗘満------>>>骞冲彴锛氳繑鍥炵伯鎯呭畬鏁翠俊鎭紝鍒嗘満={}", device.getDeviceName()); + + String strPoints = grainStr.substring(start, start + len); + + // 灏嗙伯鎯呰В鏋愭垚鏁扮粍 + List<Double> temps = new ArrayList<>(); + double tempValue; + String temp; + for (int i = 0; i < strPoints.length() / 4; i++) { + temp = strPoints.substring(i * 4, i * 4 + 4); + if (temp == null) { + temp = "0000"; + } + if (ReMessageBuilder.ERROR_TAG.equals(temp)) { + tempValue = ConstantProtocol.ERROR_TEMP; + } else { + tempValue = BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) / 10.0; + } + // 鏁呴殰鍊煎鐞� + if (tempValue >= ReMessageBuilder.FAULT_CHECK_TAG) { + tempValue = ConstantProtocol.FAULT_TEMP; + } + temps.add(tempValue); + } + + + THDto thDto = this.getTH(message); + if (null != thDto) { + log.debug("-------THDto--={}", thDto); + } + //娓呯┖ + String key = "GRAIN_" + message.getAddr(); + contextMapGrain.put(key, null); + + // 灏嗛泦鍚堣В鏋愭垚鍧愭爣鏁版嵁 + addPoint1(temps, reqData, thDto); + } + + + /** + * 骞虫埧浠擄紝瑙f瀽绗簩姝ワ紝瑙f瀽鍒板潗鏍囨暟鎹� + * + * @param temps + * @throws Exception + */ + private void addPoint1(List<Double> temps, BaseReqData reqData, THDto thDto) { + + GatewayDevice device = reqData.getDevice(); + + String[] attCable = device.getCableRule().split("-"); + int cableZ = Integer.valueOf(attCable[0]); + int cableY = Integer.valueOf(attCable[1]); + int cableX = Integer.valueOf(attCable[2]); + + //鏁版嵁灏佽 + 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 < temps.size(); i++) { + curTemp = temps.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 < -900) { + sumNum--; + } else { + 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 + ""); + + 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 analysisTh(IoMessage message) { + try { + THDto th = new THDto(); + String data = message.getContent(); + String houseNo = data.substring(0, 4); + int depotId = BytesUtil.hexToInt(BytesUtil.tran_LH(houseNo)); + String t = data.substring(4, 8); + String h = data.substring(8, 12); + double humy; + String temp; + int symbol = 0; //绗﹀彿浣� + double tempValue; + if (ReMessageBuilder.ERROR_TAG.equals(t)) { + temp = "0000"; + } else { + temp = BytesUtil.tran_LH(t); + } + temp = BytesUtil.hexString2binaryString(temp, 16); + + //绗﹀彿浣� + symbol = Integer.valueOf(temp.substring(0, 1)); + //鑾峰彇娓╁害鍊� + tempValue = BytesUtil.biannary2Decimal(temp.substring(6)) / 10; + //鑻ヤ负璐燂紝鍒欒ˉ鐮侊細鍙栧弽鍔�1 + if (symbol == 1) { + tempValue = 0.0 - BytesUtil.twoToString(temp) / 10; + } + th.setTempIn(tempValue); + if (ReMessageBuilder.ERROR_TAG.equals(h)) { + humy = 0.0; + } else { + humy = (double) BytesUtil.hexToBigInt(BytesUtil.tran_LH(h)) / 10; + } + th.setHumidityIn(humy); + log.info("涓绘満--------->>>骞冲彴锛岃В鏋愪粨娓╀粨婀夸俊鎭紝浠撳簱={},缁撴灉={}", depotId, th.toString()); + + String key = "TH_" + depotId; + contextMapTH.put(key, th); + + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + String hexStr = CommandBuild.getMsgTHReply(message.getAddr()); + log.info("骞冲彴--------->>>涓绘満锛岃繑鍥炰粨娓╀粨婀挎敹鍒颁俊鎭紝鎶ユ枃={}", hexStr); + BhznGrainV2ServerEngine.push(message.getIp(), message.getPort(), BytesUtil.hexStrToBytes(hexStr)); + } + } + + private THDto getTH(IoMessage message) { + String data = message.getContent(); + String houseNo = data.substring(0, 2); + Integer depotId = BytesUtil.hexToInt(houseNo); + String key = "TH_" + depotId; + return contextMapTH.get(key); + } +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/cmd/CommandBuild.java b/src/main/java/com/fzzy/protocol/bhzn/cmd/CommandBuild.java new file mode 100644 index 0000000..4416584 --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/cmd/CommandBuild.java @@ -0,0 +1,179 @@ +package com.fzzy.protocol.bhzn.cmd; + + +import com.fzzy.api.utils.BytesUtil; +import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerUtils; + +/** + * 鍛戒护鐢熸垚 + * + * @author vince + */ +public class CommandBuild { + + private final static CommandBuild instance = new CommandBuild(); + + private CommandBuild() { + } + + public static CommandBuild getInstance() { + return instance; + } + + /** + * PC鍥炲 蹇冭烦鍟� 鏀跺埌淇℃伅 + * + * @param grainAddr + * @return + */ + public static String getMsgHeartReply(String grainAddr) { + + StringBuffer sb = new StringBuffer(); + + //寮�濮嬬鍙� + sb.append(BhznGrainV2ServerUtils.MSG_START); + sb.append(BhznGrainV2ServerUtils.MSG_START2); + + //鍒嗘満鍦板潃 + int i = Integer.parseInt(grainAddr); + sb.append(BytesUtil.tran_LH(BytesUtil.intToHexStr(i))); + + //鍙戦�佹柟鍦板潃 + sb.append("0001"); + + //鍛戒护ID + sb.append(BhznGrainV2ServerUtils.FUNCTION_ID_F2); + + //鏁版嵁闀垮害-01 + sb.append("01"); + + //鏁版嵁鍖�--浠绘剰鍊� + sb.append("01"); + + //鑾峰彇鏍¢獙鐮� + sb.append(BhznGrainV2ServerUtils.getCheck(sb.toString())); + + //缁撳熬绗� + sb.append(BhznGrainV2ServerUtils.MSG_END_16); + + return sb.toString(); + } + + /** + * 绮儏閲囬泦鍛戒护 + * + * @param grainAddr 绮儏鍒嗘満鍦板潃 + * @param deptId 浠撳簱缂栧彿鍦板潃 + * @return + */ + public static String getMsgCheck(String grainAddr, String deptId) { + + StringBuffer sb = new StringBuffer(); + + //寮�濮嬬鍙� + sb.append(BhznGrainV2ServerUtils.MSG_START); + sb.append(BhznGrainV2ServerUtils.MSG_START2); + + //鍒嗘満鍦板潃 + int i = Integer.parseInt(grainAddr); + sb.append(BytesUtil.tran_LH(BytesUtil.intToHexStr(i))); + + //鍙戦�佹柟鍦板潃 + sb.append("0001"); + + //鍛戒护ID + sb.append(BhznGrainV2ServerUtils.FUNCTION_ID_83); + + //鏁版嵁闀垮害-01 + sb.append("01"); + + //鏁版嵁鍖�--涓绘満閲岄潰閰嶇疆鐨勪粨搴撶紪鐮� + i = Integer.parseInt(deptId); + sb.append(BytesUtil.intToHexStr1(i)); + + //鑾峰彇鏍¢獙鐮� + sb.append(BhznGrainV2ServerUtils.getCheck(sb.toString())); + + //缁撳熬绗� + sb.append(BhznGrainV2ServerUtils.MSG_END_16); + + return sb.toString(); + } + + /** + * PC鍥炲 浠撴俯浠撴箍 鏀跺埌淇℃伅 + * + * @param grainAddr + * @return + */ + public static String getMsgTHReply(String grainAddr) { + + StringBuffer sb = new StringBuffer(); + + //寮�濮嬬鍙� + sb.append(BhznGrainV2ServerUtils.MSG_START); + sb.append(BhznGrainV2ServerUtils.MSG_START2); + + //鍒嗘満鍦板潃 + int i = Integer.parseInt(grainAddr); + sb.append(BytesUtil.tran_LH(BytesUtil.intToHexStr(i))); + + //鍙戦�佹柟鍦板潃 + sb.append("0001"); + + //鍛戒护ID + sb.append(BhznGrainV2ServerUtils.FUNCTION_ID_93); + + //鏁版嵁闀垮害-01 + sb.append("01"); + + //鏁版嵁鍖�--浠绘剰鍊� + sb.append("01"); + + //鑾峰彇鏍¢獙鐮� + sb.append(BhznGrainV2ServerUtils.getCheck(sb.toString())); + + //缁撳熬绗� + sb.append(BhznGrainV2ServerUtils.MSG_END_16); + + return sb.toString(); + } + + /** + * PC鍥炲绮俯鏀跺埌淇℃伅 + * + * @param grainAddr + * @return + */ + public static String getMsgGrainReply(String grainAddr) { + StringBuffer sb = new StringBuffer(); + + //寮�濮嬬鍙� + sb.append(BhznGrainV2ServerUtils.MSG_START); + sb.append(BhznGrainV2ServerUtils.MSG_START2); + + //鍒嗘満鍦板潃 + int i = Integer.parseInt(grainAddr); + sb.append(BytesUtil.tran_LH(BytesUtil.intToHexStr(i))); + + //鍙戦�佹柟鍦板潃 + sb.append("0001"); + + //鍛戒护ID + sb.append(BhznGrainV2ServerUtils.FUNCTION_ID_92); + + //鏁版嵁闀垮害-01 + sb.append("01"); + + //鏁版嵁鍖�--浠绘剰鍊� + sb.append("01"); + + //鑾峰彇鏍¢獙鐮� + sb.append(BhznGrainV2ServerUtils.getCheck(sb.toString())); + + //缁撳熬绗� + sb.append(BhznGrainV2ServerUtils.MSG_END_16); + + return sb.toString(); + } +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/cmd/ReMessageBuilder.java b/src/main/java/com/fzzy/protocol/bhzn/cmd/ReMessageBuilder.java new file mode 100644 index 0000000..4f8c7ec --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/cmd/ReMessageBuilder.java @@ -0,0 +1,52 @@ +package com.fzzy.protocol.bhzn.cmd; + + +import com.fzzy.api.utils.BytesUtil; +import com.fzzy.protocol.bhzn.data.IoMessage; + +/** + * 鏍规嵁鎺ユ敹鍒扮殑淇℃伅杩涜灏佽 + * + * @author vince + */ +public class ReMessageBuilder { + + + public final static String ERROR_TAG = "3CF6"; + public static double FAULT_CHECK_TAG = 85.0; + public static double MAX_TEMP = -50.0; + public static double MIN_TEMP = 50.0; + private final static ReMessageBuilder instance = new ReMessageBuilder(); + + private ReMessageBuilder() { + } + + public static ReMessageBuilder getInstance() { + return instance; + } + + /** + * @param message + * @return + */ + public IoMessage buildMessage(String message) throws Exception { + IoMessage ioMessage = new IoMessage(); + + //杞崲涓烘暟瀛楋紝楂樹綆浣嶈浆鎹�(4浣�) + int i = BytesUtil.hexToBigInt(BytesUtil.tran_LH(message.substring(2, 6))); + ioMessage.setPcAddr(i + ""); + i = BytesUtil.hexToBigInt(BytesUtil.tran_LH(message.substring(6, 10)));//楂樹綆浣嶈浆鎹�(4浣�) + ioMessage.setAddr(i + ""); + + ioMessage.setFunctionId(message.substring(10, 12));//鍔熻兘鐮�(2浣�)锛屼笉鐢ㄩ珮浣庝綅杞崲 + + i = BytesUtil.hexToBigInt(message.substring(12, 14));//闀垮害(1浣�) + ioMessage.setLength(i); + + //鑾峰彇娑堟伅浣� + ioMessage.setContent(message.substring(14, 14 + (i * 2))); + + ioMessage.setCheck(message.substring(message.length() - 2)); + return ioMessage; + } +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/data/Content.java b/src/main/java/com/fzzy/protocol/bhzn/data/Content.java new file mode 100644 index 0000000..93e946d --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/data/Content.java @@ -0,0 +1,43 @@ +package com.fzzy.protocol.bhzn.data; + +import lombok.Data; + +/** + * @author vince.xu + * @Title: Content + * @ProjectName igds-35 + * @Description: TODO + * @date 2022-12-715:48 + */ +@Data +public class Content { + /** + * 鐘舵�佸弽鍥� + */ + public String result; + /** + * 绾害 + */ + public String purity; + /** + * 娴侀噺 + */ + public String flow; + /** + * 鍘嬪姏 + */ + public String pressure; + /** + * 娓╁害 + */ + public String temperature; + /** + * 娴侀噺绱 + */ + public String flowAll; + /** + * 杩愯鐘舵�� + */ + public String isRun; + +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/data/IoMessage.java b/src/main/java/com/fzzy/protocol/bhzn/data/IoMessage.java new file mode 100644 index 0000000..609d9ef --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/data/IoMessage.java @@ -0,0 +1,20 @@ +package com.fzzy.protocol.bhzn.data; + +import lombok.Data; + +@Data +public class IoMessage { + + + private String ip; + + private int port; + + private String pcAddr; + private String addr; + private String functionId; + private int length; + private String content; + private String check; + +} \ No newline at end of file diff --git a/src/main/java/com/fzzy/protocol/bhzn/data/THDto.java b/src/main/java/com/fzzy/protocol/bhzn/data/THDto.java new file mode 100644 index 0000000..b7fdfbf --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/data/THDto.java @@ -0,0 +1,39 @@ +package com.fzzy.protocol.bhzn.data; + +import com.bstek.dorado.annotation.PropertyDef; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 涓氬姟鏁版嵁锛氱伯椋熸俯搴︽箍搴︾粺璁′俊鎭� + * + * @author Andy + * + */ +@Data +public class THDto implements Serializable { + + + private static final long serialVersionUID = 1L; + + private String serId;//鎵�灞炲垎鏈� + + private String thConf = "1";//鎵�灞為�氶亾 + + @PropertyDef(label = "鎵�灞炰粨搴�", description = "浠撳簱缂栧彿") + private String depotId; + + @PropertyDef(label = "浠撳唴娓╁害", description = "鍗曚綅鈩�") + private Double tempIn; + + @PropertyDef(label = "浠撳唴婀垮害", description = "鍗曚綅%RH") + private Double humidityIn; + + @PropertyDef(label = "鎺ユ敹鏃堕棿", description = "") + private Date receiveDate = new Date(); + + private String remark; + +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/package-info.java b/src/main/java/com/fzzy/protocol/bhzn/package-info.java new file mode 100644 index 0000000..7fee62e --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/package-info.java @@ -0,0 +1,4 @@ +/** + * 閭︽捣鏅鸿兘绾伯鎯呭垎鏈哄崗璁�-缃戝彛璁惧 + */ +package com.fzzy.protocol.bhzn; \ No newline at end of file diff --git a/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2HeartbeatImpl.java b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2HeartbeatImpl.java new file mode 100644 index 0000000..5fa4c0b --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2HeartbeatImpl.java @@ -0,0 +1,36 @@ +package com.fzzy.protocol.bhzn.server; + + +import com.ld.io.api.HeartbeatProvider; +import com.ld.io.api.IoSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 鎻愪緵蹇冭烦淇℃伅 + * + * @author Andy + */ +@Slf4j +@Service +public class BhznGrainV2HeartbeatImpl implements HeartbeatProvider { + + @Override + public byte[] provide(IoSession session) { + + Long lastBeatTime = BhznGrainV2ServerUtils.getHearBeat(session); + + if (null == lastBeatTime) { + return null; + } + + //濡傛灉鏈�鍚庝竴娆$粓绔績璺虫椂闂磋窛绂诲綋鍓嶆椂闂村ぇ浜� 缁堢蹇冭烦鏃堕棿鐨�3娆★紝鍒欏垽鏂负绂荤嚎 + long deTime = System.currentTimeMillis() - lastBeatTime; + + if (deTime > (BhznGrainV2ServerUtils.HEART_BEAT_TIME * 3 * 1000)) { + log.info("-----------瓒呰繃{}绉掓湭鑾峰彇鍒板績璺充俊鎭紝鍒ゅ畾缁堢绂荤嚎锛岃涪鍑鸿繛鎺�------------{}-{}", deTime, session.getAddress(), session.getPort()); + session.destroy(); + } + return null; + } +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2MessageConsumer.java b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2MessageConsumer.java new file mode 100644 index 0000000..aa12dfe --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2MessageConsumer.java @@ -0,0 +1,56 @@ +package com.fzzy.protocol.bhzn.server; + +import com.fzzy.api.utils.BytesUtil; +import com.fzzy.api.utils.SpringUtil; +import com.fzzy.protocol.bhzn.analysis.AnalysisService; +import com.fzzy.protocol.bhzn.cmd.ReMessageBuilder; +import com.fzzy.protocol.bhzn.data.IoMessage; +import com.ld.io.api.IoMsgConsumer; +import com.ld.io.api.IoSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * + */ +@Slf4j +public class BhznGrainV2MessageConsumer implements IoMsgConsumer { + + + private AnalysisService analysis; + + /** + * 澶勭悊娑堟伅 + * + * @param ioSession + * @param bytes + */ + @Override + public void consume(IoSession ioSession, byte[] bytes) { + if (null == bytes) { + log.error("Reply bytes is null"); + return; + } + + //娣诲姞淇℃伅蹇冭烦鏍囪 + BhznGrainV2ServerUtils.addHeartBeat(ioSession); + + try { + String hexStr = BytesUtil.bytesToString(bytes); + + log.info("銆�"+ioSession.getAddress()+"銆戜富鏈�------->>骞冲彴锛氭姤鏂囷細" + hexStr); + hexStr = hexStr.substring(BhznGrainV2ServerUtils.MSG_START.length()); + + IoMessage ioMessage = ReMessageBuilder.getInstance().buildMessage(hexStr); + ioMessage.setIp(ioSession.getAddress()); + ioMessage.setPort(ioSession.getPort()); + + if(null == analysis) analysis = SpringUtil.getBean(AnalysisService.class); + + analysis.analysis(ioSession.getBusinessKey(), ioMessage); + + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerEngine.java b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerEngine.java new file mode 100644 index 0000000..f56c482 --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerEngine.java @@ -0,0 +1,91 @@ +package com.fzzy.protocol.bhzn.server; + +import com.fzzy.protocol.fzzy.server.ServerUtils; +import com.ld.io.api.*; +import com.ld.io.netty.NettyServer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Desc: 閭︽捣鏅鸿兘绾伯鎯呭崗璁� + * @author: Andy + * @update-time: 2023/5/11 + */ +@Slf4j +@Service +public class BhznGrainV2ServerEngine { + + public static final Integer PORT = 19309; + + public static NettyServer ioServer = null; + + + // 閰嶇疆娑堟伅鎺ユ敹绫� + private static BhznGrainV2MessageConsumer messageConsume = new BhznGrainV2MessageConsumer(); + // 鐩戝惉浼氳瘽鐨勫垱寤轰笌閿�姣� + private static BhznGrainV2SessionListener ioSessionListener = new BhznGrainV2SessionListener(); + // 蹇冭烦鎻愪緵 + private static HeartbeatProvider heartbeatProvider = new BhznGrainV2HeartbeatImpl(); + + + public static void start(Integer port) { + IoServerOption ioServerOption = new IoServerOption(); + + if (null != port) { + ioServerOption.setPort(port); + } else { + ioServerOption.setPort(PORT); + } + + //纭缁撳熬鏍囧織 + ioServerOption.setDelimiter(BhznGrainV2ServerUtils.MSG_END.getBytes()); + + // 閰嶇疆绯荤粺蹇冭烦闂撮殧 + ioServerOption.setReaderIdleTime(5 * 60); + + NettyServer ioServer = new NettyServer(ioServerOption, messageConsume, ioSessionListener, heartbeatProvider); + ioServer.startup(); + + + log.info("* "); + log.info("* ========================"); + log.info("* "); + log.info("* [GRAIN-SERVER锛欱HZN_GRAIN,PORT={}]" + port); + log.info("* "); + log.info("* ========================"); + log.info("* "); + + System.out.println("* ========================"); + System.out.println("* "); + System.out.println("* [GRAIN-SERVER锛欱HZN_GRAIN,PORT={}]" + port); + System.out.println("* "); + System.out.println("* ========================"); + } + + /** + * 鍙戦�佷俊鎭� + * + * @param ip + * @param port + * @param msg + * @return + */ + public static InvokeResult push(String ip, int port, byte[] msg) { + IoSessionQuery sessionFactory = ioServer.getSessionQuery(); + List<IoSession> sessions = sessionFactory.getAllSession(); + IoSession session = null; + for (IoSession ioSession : sessions) { + if (ServerUtils.getServerKey(ip, port).equals(ioSession.getBusinessKey())) { + session = ioSession; + break; + } + } + if (null == session) { + return InvokeResult.CHANNEL_CLOSED; + } + return session.invoke(msg); + } + +} \ No newline at end of file diff --git a/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerUtils.java b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerUtils.java new file mode 100644 index 0000000..68a7acd --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2ServerUtils.java @@ -0,0 +1,116 @@ +package com.fzzy.protocol.bhzn.server; + + +import com.fzzy.api.utils.BytesUtil; +import com.fzzy.gateway.data.BaseReqData; +import com.ld.io.api.IoSession; + +import java.util.HashMap; +import java.util.Map; + +/** + * 宸ュ叿绫� + * + * @author vince + */ +public class BhznGrainV2ServerUtils { + + + /** + * 璁板綍姣忎釜杩炴帴鐨勬渶鍚庝竴娆′俊鎭椂闂� key = 杩炴帴鐨凨YE锛宒ata =褰撳墠鏃堕棿鎴� + */ + public static Map<String, Long> contextMapHeart = new HashMap<>(); + + /** + * 璇锋眰缂撳瓨 key = deviceId,value = requData + */ + private static Map<String, BaseReqData> contextSyncReqMap = new HashMap<>(); + + + + public static int HEART_BEAT_TIME = 30;//蹇冭烦闂撮殧鏃堕棿 + + + public static String MSG_START = "3C42485A4E3E";//<BHZN> + public static String MSG_START2 = "AA"; + public static String MSG_END = "<END>";//<END> + public static String MSG_END_16 = "3C454E443E";//<END> + public static final String CHARSET = "UTF-8"; + + + /** + * 閽堝鏃犵嚎绮儏涓绘満鐨勯粯璁D閰嶇疆 + */ + public static String DEFAULT_MAC_ID = "53681"; + + public static String FUNCTION_ID_00 = "00"; + public static String FUNCTION_ID_F1 = "F1"; + public static String FUNCTION_ID_F2 = "F2"; + public static String FUNCTION_ID_83 = "83"; + public static String FUNCTION_ID_93 = "93"; + public static String FUNCTION_ID_92 = "92"; + + + /** + * 灏嗘墽琛屽懡浠や俊鎭瓨鏀惧湪缂撳瓨 + * + * @param depotId 浠撳簱缂栫爜 + * @param reqData 璇锋眰鍙傛暟淇℃伅 + */ + public static void addSyncReq2Map(String depotId, BaseReqData reqData) { + contextSyncReqMap.put(depotId, reqData); + } + + public static BaseReqData getSyncReq(String depotId) { + return contextSyncReqMap.get(depotId); + } + + + /** + * 鐢熸垚TCP杩炴帴鐨凨EY + * + * @param ip + * @param port + * @return + */ + public static String getServerKey(String ip, Integer port) { + return ip + ":" + port; + } + + + /** + * 娣诲姞鏈�鏂板績璺虫椂闂存埑 + * + * @param session + */ + public static void addHeartBeat(IoSession session) { + contextMapHeart.put(getServerKey(session.getAddress(), session.getPort()), System.currentTimeMillis()); + } + + public static Long getHearBeat(IoSession session) { + return contextMapHeart.get(getServerKey(session.getAddress(), session.getPort())); + } + + + /** + * 璁$畻鏍¢獙 + * + * @param content + * @return + */ + public static String getCheck(String content) { + int start = BhznGrainV2ServerUtils.MSG_START.length() + BhznGrainV2ServerUtils.MSG_START2.length(); + content = content.substring(start); + int sum = 0; + String hex; + for (int i = 0; i < content.length() / 2; i++) { + hex = content.substring(i * 2, i * 2 + 2); + sum += BytesUtil.hexToInt(hex); + } + String hexSum = BytesUtil.intToHexStr(sum); + int check = BytesUtil.hexToInt(hexSum.substring(hexSum.length() - 2)); + + return BytesUtil.intToHexStr(256 - check).substring(2); + } + +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2SessionListener.java b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2SessionListener.java new file mode 100644 index 0000000..3211e6b --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/server/BhznGrainV2SessionListener.java @@ -0,0 +1,62 @@ +package com.fzzy.protocol.bhzn.server; + +import com.fzzy.api.Constant; +import com.fzzy.api.data.ApiCommonDevice; +import com.fzzy.api.utils.SpringUtil; +import com.fzzy.gateway.service.GatewayDeviceService; +import com.ld.io.api.IoSession; +import com.ld.io.api.IoSessionListener; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 杩炴帴涓婄嚎鍜屼笅闄愰�氱煡 + */ +@Slf4j +public class BhznGrainV2SessionListener implements IoSessionListener { + + + private GatewayDeviceService gatewayDeviceService; + + /** + * 璁惧鍒涘缓鍦ㄧ嚎锛岄渶瑕佹敞鎰忓綋鍓嶄娇鐢ㄤ富鏈烘ā寮忥紝涓绘満涓婄嚎榛樿鎵�鏈夌浉鍚孲N閰嶇疆鐨勫垎鏈哄叏閮ㄤ笂绾� + * + * @param session + */ + @Override + public void onCreate(IoSession session) { + + log.info("++++鏂板缓杩炴帴++++-IP={}锛孭ORT={}", session.getAddress(), session.getPort()); + + // 娣诲姞鑷畾涔変笟鍔D + session.setBusinessKey(BhznGrainV2ServerUtils.getServerKey(session.getAddress(), session.getPort())); + + //鎵ц鍒嗘満涓婄嚎 + ApiCommonDevice commonDevice = Constant.updateCacheOnline(session.getAddress(), session.getPort()); + if (null == commonDevice.getSn()) { + log.error("------璁惧涓婄嚎锛岀郴缁熶腑鏈彂鐜板綋鍓嶉厤缃�-------"); + } + } + + /** + * 娉ㄦ剰锛屽綋鍓嶉噰鐢ㄤ富鏈烘ā寮忥紝涓绘満绂荤嚎鎵�鏈夌浉鍚孲N閰嶇疆鐨勫垎鏈哄叏閮ㄧ绾� + * + * @param session + */ + @Override + public void onDestroy(IoSession session) { + log.info("----杩炴帴鏂紑-----IP={}锛孭ORT={}", session.getAddress(), session.getPort()); + + //璁剧疆鍒嗘満鎺夌嚎 + ApiCommonDevice commonDevice = Constant.updateCacheOffline(session.getAddress(), session.getPort()); + + if (null == commonDevice) return; + + if (null == gatewayDeviceService) { + gatewayDeviceService = SpringUtil.getBean(GatewayDeviceService.class); + + gatewayDeviceService.OfflineByCommonDevice(commonDevice); + } + + } +} diff --git a/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java b/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java new file mode 100644 index 0000000..0cde399 --- /dev/null +++ b/src/main/java/com/fzzy/protocol/bhzn/service/Bhzn2GatewayGrainService.java @@ -0,0 +1,85 @@ +package com.fzzy.protocol.bhzn.service; + +import com.fzzy.api.Constant; +import com.fzzy.api.data.ApiCommonDevice; +import com.fzzy.api.data.GatewayDeviceProtocol; +import com.fzzy.api.utils.BytesUtil; +import com.fzzy.gateway.api.GatewaySyncGranService; +import com.fzzy.gateway.data.BaseReqData; +import com.fzzy.gateway.data.BaseResp; +import com.fzzy.gateway.entity.GatewayDevice; +import com.fzzy.protocol.bhzn.cmd.CommandBuild; +import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerEngine; +import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerUtils; +import com.ld.io.api.InvokeResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 椋庢鑷磋繙鎺у埗鏌滃崗璁� + */ +@Slf4j +@Component +public class Bhzn2GatewayGrainService implements GatewaySyncGranService { + + @Override + public String getGrainProtocol() { + return GatewayDeviceProtocol.GRAIN_FZZY_BHZN_WEB.getCode(); + } + + @Override + public BaseResp syncGrain(BaseReqData reqData) { + + BaseResp resp = new BaseResp(); + + GatewayDevice device = reqData.getDevice(); + + //鑾峰彇杩炴帴涓殑璁惧淇℃伅 + ApiCommonDevice apiCommonDevice = Constant.getCommonDeviceCache(device.getDeviceSn()); + + if (null == apiCommonDevice) { + resp.setCode(500); + resp.setMsg("绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅锛屾棤娉曟墽琛�"); + log.error("----------------绯荤粺鏈幏鍙栧埌涓嬭杩炴帴璁惧淇℃伅,鏃犳硶鎵ц---------"); + return resp; + } + + if (Constant.YN_N.equals(apiCommonDevice.getStatus())) { + resp.setCode(500); + resp.setMsg("涓嬭璁惧涓嶅湪绾�---鏃犳硶鎵ц----" + device.getDeviceName()); + log.error("涓嬭璁惧涓嶅湪绾�---鏃犳硶鎵ц----" + device.getDeviceName()); + return resp; + } + + device.setIp(apiCommonDevice.getIp()); + device.setPort(apiCommonDevice.getPort()); + + reqData.setDevice(device); + + try { + //Step 璇锋眰淇℃伅鏀惧叆鍐呭瓨 + BhznGrainV2ServerUtils.addSyncReq2Map(device.getDepotIdSys(), reqData); + + // 鐢熸垚绮儏淇℃伅 + String hexStr = CommandBuild.getInstance().getMsgCheck(device.getDeviceSn(), device.getDepotIdSys()); + // 鍙戦�佸懡浠� + InvokeResult message = BhznGrainV2ServerEngine.push(device.getIp(), device.getPort(), BytesUtil.hexStrToBytes(hexStr)); + + log.error("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-{}", message); + + // 灏佽杩斿洖淇℃伅 + if (!InvokeResult.SUCCESS.getCode().equals(message.getCode())) { + log.error("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-澶辫触{}", message.getMessage()); + resp.setCode(500); + resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠�-澶辫触锛�" + message.getMessage()); + } + + } catch (Exception e) { + log.error("绮儏妫�娴嬪紓甯革細{}", e); + resp.setCode(500); + resp.setMsg("骞冲彴------>>>>鎺у埗鏌滐細鍙戦�佺伯鎯呮娴嬪懡浠わ細" + e.getMessage()); + return resp; + } + return resp; + } +} diff --git a/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisGrain.java b/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisGrain.java index 945f152..0c70f31 100644 --- a/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisGrain.java +++ b/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisGrain.java @@ -202,6 +202,7 @@ GatewayDeviceReportService reportService = gatewayRemoteManager.getDeviceReportService(reqData.getDevice().getPushProtocol()); if (null == reportService) { log.error("------------绮儏鎺ㄩ�佸け璐ワ紝绯荤粺涓嶅瓨鍦ㄥ綋鍓嶅崗璁墽琛岀被----{}", reqData.getDevice().getDeviceName()); + return; } reportService.reportGrainData(reqData); } diff --git a/src/main/java/com/fzzy/protocol/fzzy/server/ServerUtils.java b/src/main/java/com/fzzy/protocol/fzzy/server/ServerUtils.java index b205f83..f6d8633 100644 --- a/src/main/java/com/fzzy/protocol/fzzy/server/ServerUtils.java +++ b/src/main/java/com/fzzy/protocol/fzzy/server/ServerUtils.java @@ -1,8 +1,6 @@ package com.fzzy.protocol.fzzy.server; -import com.fzzy.api.utils.ContextUtil; import com.fzzy.gateway.data.BaseReqData; -import com.fzzy.gateway.data.BaseResp; import java.util.HashMap; import java.util.Map; @@ -214,6 +212,6 @@ regDepotId = regDepotId.substring(regDepotId.length() - 4); } - return Integer.valueOf(regDepotId)+""; + return Integer.valueOf(regDepotId) + ""; } } diff --git a/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java b/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java index aa9da47..f4c1399 100644 --- a/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java +++ b/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java @@ -34,7 +34,6 @@ if (null == commonDevice) return; - if (null == gatewayDeviceService) { gatewayDeviceService = SpringUtil.getBean(GatewayDeviceService.class); -- Gitblit v1.9.3