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); src/main/java/com/fzzy/api/data/GatewayDeviceProtocol.java
@@ -13,6 +13,7 @@ TCP_FZZY_V3("TCP_FZZY_V3", "ç²®æ -飿£è´è¿æ§å¶æåè®®V3"), 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", "å°ç£ -èåTCPåè®®"), 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())); 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++){ //第iä½ çæ°åä¸ºï¼ int dt = Integer.parseInt(binStr.substring(i-1,i)); sum+=(int)Math.pow(2,len-i)*dt; } return sum; } /** * äºè¿å¶è¡¥ç ï¼ååå£å 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; } } 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; src/main/java/com/fzzy/protocol/ConstantProtocol.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.fzzy.protocol; /** * å议解æå ¨å±å¸¸é */ public class ConstantProtocol { //-粮温å¤ç¨ç¹ public static final double ERROR_TEMP = -100; //-粮温æ éç¹ public static final double FAULT_TEMP = -101; //-粮温补å¿ç¹-é对é¥å½¢ä»è¡¥ç¹ä½¿ç¨ public static final double ADD_TEMP = -102; } 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.*; /** * å议解æ * * @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 è§£æä»æ¸©ä»æ¹¿ï¼å¹¶è¿åæ¶å°æ¥æ if (BhznGrainV2ServerUtils.FUNCTION_ID_93.equals(message.getFunctionId())) { log.info("主æº------->>å¹³å°ï¼æ¸©æ¹¿åº¦ä¿¡æ¯æ¥æ={}", message); analysisTh(message); return; } // 92 è§£æç²®æ¸©ï¼å¹¶è¿åæ¶å°æ¥æ 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); } /** * å¹³æ¿ä»ï¼è§£æç¬¬äºæ¥ï¼è§£æå°åæ æ°æ® * * @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); } } 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(); } } 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; } } 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; } 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; } 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; } src/main/java/com/fzzy/protocol/bhzn/package-info.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,4 @@ /** * 馿µ·æºè½çº¯ç²®æ åæºåè®®-ç½å£è®¾å¤ */ package com.fzzy.protocol.bhzn; 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; } } 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); } } } 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ï¼BHZN_GRAIN,PORT={}]" + port); log.info("* "); log.info("* ========================"); log.info("* "); System.out.println("* ========================"); System.out.println("* "); System.out.println("* [GRAIN-SERVERï¼BHZN_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); } } 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 = è¿æ¥çKYEï¼data =å½åæ¶é´æ³ */ 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"; /** * é对æ 线粮æ 主æºçé»è®¤IDé ç½® */ 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è¿æ¥çKEY * * @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); } } 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; /** * 设å¤å建å¨çº¿ï¼éè¦æ³¨æå½å使ç¨ä¸»æºæ¨¡å¼ï¼ä¸»æºä¸çº¿é»è®¤ææç¸åSNé ç½®çåæºå ¨é¨ä¸çº¿ * * @param session */ @Override public void onCreate(IoSession session) { log.info("++++æ°å»ºè¿æ¥++++-IP={}ï¼PORT={}", session.getAddress(), session.getPort()); // æ·»å èªå®ä¹ä¸å¡ID session.setBusinessKey(BhznGrainV2ServerUtils.getServerKey(session.getAddress(), session.getPort())); //æ§è¡åæºä¸çº¿ ApiCommonDevice commonDevice = Constant.updateCacheOnline(session.getAddress(), session.getPort()); if (null == commonDevice.getSn()) { log.error("------设å¤ä¸çº¿ï¼ç³»ç»ä¸æªåç°å½åé ç½®-------"); } } /** * 注æï¼å½åéç¨ä¸»æºæ¨¡å¼ï¼ä¸»æºç¦»çº¿ææç¸åSNé ç½®çåæºå ¨é¨ç¦»çº¿ * * @param session */ @Override public void onDestroy(IoSession session) { log.info("----è¿æ¥æå¼-----IP={}ï¼PORT={}", 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); } } } 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; } } 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); } 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; 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);