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