EnvInputServerHandler.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package com.huimv.env.input.server;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.huimv.env.common.entity.EnvElectricity;
  6. import com.huimv.env.common.entity.EnvWarning;
  7. import com.huimv.env.common.entity.EnvWater;
  8. import com.huimv.env.common.service.IEnvElectricityService;
  9. import com.huimv.env.common.service.IEnvWaterService;
  10. import com.huimv.env.input.utils.ModBusUtils;
  11. import io.netty.buffer.ByteBuf;
  12. import io.netty.buffer.Unpooled;
  13. import io.netty.channel.*;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Component;
  17. import java.io.IOException;
  18. import java.math.BigDecimal;
  19. import java.nio.charset.Charset;
  20. import java.text.ParseException;
  21. import java.util.Date;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import java.util.regex.Matcher;
  25. import java.util.regex.Pattern;
  26. import static com.huimv.env.input.utils.ModBusUtils.hexStr2Bytes;
  27. /**
  28. * @Project : huimv.shiwan
  29. * @Package : com.huimv.biosafety.uface.controller
  30. * @Description : TODO
  31. * @Version : 1.0
  32. * @Author : ZhuoNing
  33. * @Create : 2020-12-25
  34. **/
  35. @ChannelHandler.Sharable
  36. @Component
  37. @Slf4j
  38. public class EnvInputServerHandler extends ChannelInboundHandlerAdapter {
  39. private StringBuilder askTextSb = null;
  40. @Autowired
  41. private IEnvWaterService envWaterService;
  42. @Autowired
  43. private IEnvElectricityService envElectricityService;
  44. //
  45. public void appendClientAsk(String text) {
  46. if (this.askTextSb == null) {
  47. askTextSb = new StringBuilder();
  48. }
  49. askTextSb.append(text);
  50. }
  51. @Override
  52. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  53. Channel channel = ctx.channel();
  54. ByteBuf byteBuf = (ByteBuf) msg;
  55. byte[] bytes = new byte[byteBuf.readableBytes()];
  56. byteBuf.readBytes(bytes);
  57. String str = ModBusUtils.bytes2HexString(bytes);
  58. System.out.println("收到的数据:"+str);
  59. String cmd = saveWaterAndEle(str);
  60. Thread.sleep(5*60*1000);
  61. System.out.println(cmd);
  62. channel.writeAndFlush(Unpooled.copiedBuffer(hexStr2Bytes(cmd)));
  63. super.channelRead(ctx, msg);
  64. }
  65. private String saveWaterAndEle(String str) {
  66. String[] s = str.split(" ");
  67. //读水表
  68. String cmd ="1D 03 00 00 00 02 C6 57";
  69. //读电表
  70. // String cmd ="1C 04 01 00 00 02 73 BA";
  71. if (s.length>10 || s.length<7){
  72. return cmd;
  73. }
  74. String val = s[3]+s[4]+s[5]+s[6];
  75. System.out.println("val=" +val);
  76. Date now = new Date();
  77. //水表
  78. if (str.startsWith("1D 03")){
  79. System.out.println("水表");
  80. int waterOrigValue = Integer.parseInt(val, 16);
  81. BigDecimal bigDecimal = new BigDecimal(waterOrigValue);
  82. EnvWater oldEnvWater = envWaterService.getOne(new QueryWrapper<EnvWater>().orderByDesc("id").last("limit 1"));
  83. BigDecimal originalValue = oldEnvWater.getOriginalValue();
  84. EnvWater envWater = new EnvWater();
  85. envWater.setOriginalValue(bigDecimal);
  86. int i = bigDecimal.compareTo(originalValue);
  87. if (ObjectUtil.isNotEmpty(oldEnvWater) && i>0){
  88. envWater.setHandleValue(bigDecimal.subtract(oldEnvWater.getOriginalValue()).divide(new BigDecimal(100)));
  89. }
  90. envWater.setUpdateTime(now);
  91. envWater.setFarmId(27);
  92. envWaterService.save(envWater);
  93. cmd = "1C 04 01 00 00 02 73 BA";
  94. }
  95. //电表
  96. if (str.startsWith("1C 04")){
  97. try {
  98. System.out.println("电表");
  99. int eleOrigValue = Integer.parseInt(val, 16);
  100. Float f = Float.intBitsToFloat(eleOrigValue);
  101. BigDecimal bigDecimal = new BigDecimal(f);
  102. EnvElectricity oldEnvWater = envElectricityService.getOne(new QueryWrapper<EnvElectricity>().orderByDesc("id").last("limit 1"));
  103. BigDecimal originalValue = oldEnvWater.getOriginalValue();
  104. EnvElectricity envElectricity = new EnvElectricity();
  105. envElectricity.setOriginalValue(bigDecimal);
  106. int i = bigDecimal.compareTo(originalValue);
  107. if (ObjectUtil.isNotEmpty(oldEnvWater) && i>0){
  108. envElectricity.setHandleValue(bigDecimal.subtract(oldEnvWater.getOriginalValue()));
  109. }
  110. envElectricity.setUpdateTime(now);
  111. envElectricity.setFarmId(27);
  112. envElectricityService.save(envElectricity);
  113. }catch (Exception e){
  114. System.out.println(e);
  115. }
  116. }
  117. return cmd;
  118. }
  119. private Integer countWeight(String[] s) {
  120. int count = 48;
  121. return (Integer.parseInt(s[8], 16) -count)
  122. +((Integer.parseInt(s[9], 16) -count) * 16)
  123. +((Integer.parseInt(s[10], 16) -count) * 256)
  124. +((Integer.parseInt(s[11], 16) -count) * 4096)
  125. +((Integer.parseInt(s[12], 16) -count) * 6556);
  126. }
  127. @Override
  128. public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
  129. // if (true){
  130. // ctx.writeAndFlush(Unpooled.copiedBuffer(new byte[]{1, 2, 3}));
  131. // }
  132. // if (askTextSb.toString().indexOf("end") != -1) {
  133. // // {处理客户端消息}
  134. // handleClientAskCmd(askTextSb.toString(), ctx);
  135. // //清空重置;
  136. // askTextSb.delete(0, askTextSb.length());
  137. // }
  138. }
  139. @Override
  140. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  141. if (cause.getMessage().indexOf("Connection reset") != -1) {
  142. log.info("相关采集器设备正在重启:" + cause.toString());
  143. }
  144. // cause.printStackTrace();
  145. ctx.close();
  146. }
  147. /**
  148. * @Method : handleClientAskCmd
  149. * @Description : 处理请求小心
  150. * @Params : [clientAskText, ctx]
  151. * @Return : void
  152. * @Author : ZhuoNing
  153. * @Date : 2022/3/28
  154. * @Time : 17:36
  155. */
  156. private void handleClientAskCmd(String clientAskText, ChannelHandlerContext ctx) throws ParseException, IOException {
  157. clientAskText = clientAskText.replaceAll("\r", "").replaceAll("\n", "");
  158. //{处理非正常命令}
  159. // int countPlus = regexUtil.countPlus(clientAskText);
  160. // if (countPlus < 4) {
  161. // System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
  162. // } else {
  163. //--处理客户端请求数据
  164. //{拆分粘包数据}
  165. JSONArray askJa = parseAskCmdPackage(clientAskText);
  166. for (int a = 0; a < askJa.size(); a++) {
  167. String askText = askJa.getString(a);
  168. //{处理请求命令}
  169. askCmdActuator(askText, ctx);
  170. }
  171. // }
  172. }
  173. /**
  174. * @Method : askCmdActuator
  175. * @Description :
  176. * @Params : [askText, ctx]
  177. * @Return : void
  178. * @Author : ZhuoNing
  179. * @Date : 2022/3/23
  180. * @Time : 18:08
  181. */
  182. private void askCmdActuator(String askText, ChannelHandlerContext ctx) throws ParseException, IOException {
  183. System.out.println("======>接收设备请求:" + askText);
  184. String[] dataArray = askText.split("\\+");
  185. String cmdHeader = dataArray[0];
  186. if (!cmdHeader.trim().equalsIgnoreCase("hm")) {
  187. log.info("当前命令是非hm命令[" + askText + "]");
  188. return;
  189. }
  190. //芯片id/设备编码
  191. String idCode = dataArray[1];
  192. String cmd = dataArray[2];
  193. Map map = new HashMap();
  194. map.put("askText", askText);
  195. switch (cmd) {
  196. case "1":
  197. //获取远程设备编码
  198. getDeviceCode(askText, idCode, ctx);
  199. break;
  200. case "2":
  201. //同步时间
  202. getServerTime(askText, idCode, ctx);
  203. break;
  204. default:
  205. System.out.println("==>未知命令");
  206. log.error(">>当前数据为非法数据-未知命令>>" + askText);
  207. }
  208. }
  209. //时间同步请求
  210. private void getServerTime(String askText, String deviceCode, ChannelHandlerContext ctx) throws ParseException {
  211. System.out.println("==>时间同步请求:" + askText);
  212. // if (!cmdProService.isEffectiveDevice(deviceCode)) {
  213. // System.out.println("##时间同步请求-未注册设备 idCode=" + deviceCode);
  214. // return;
  215. // }
  216. String answerText = "hm+2+" + "+0+4+end";
  217. // log.info(">>时间同步请求-应答数据>>" + answerText);
  218. answerCmd(answerText, ctx);
  219. }
  220. //获取远程设备编码
  221. private void getDeviceCode(String askText, String idCode, ChannelHandlerContext ctx) {
  222. System.out.println("==>获取远程设备编码请求:" + askText.trim());
  223. //{读取设备编码}
  224. // String deviceCode = cmdProService.getDeviceCodeByChipId(idCode);
  225. // log.info("获取远程设备编码请求,芯片id>>" + idCode + " ,deviceCode>>" + deviceCode);
  226. // if (deviceCode == null) {
  227. // log.error("该设备未注册,已舍弃请求.");
  228. // return;
  229. // }
  230. // String answerText = "hm+1+0+" + deviceCode + "+123+8+end";
  231. // log.info("<<获取远程设备编码请求-应答数据:" + answerText);
  232. //{应答指令}
  233. // answerCmd(answerText, ctx);
  234. }
  235. //应答
  236. public void answerCmd(String answerText, ChannelHandlerContext ctx) {
  237. ctx.writeAndFlush(Unpooled.copiedBuffer(answerText.getBytes()));
  238. }
  239. //检查无效耳标
  240. public boolean checkValidEarmark(String earmark) {
  241. if (earmark.trim().equalsIgnoreCase("ffffffffffffffff") || earmark.trim().equalsIgnoreCase("0000000000000000")) {
  242. return true;
  243. } else {
  244. return false;
  245. }
  246. }
  247. //拆分粘包数据
  248. public JSONArray parseAskCmdPackage(String text) {
  249. String key = "end";
  250. Pattern pattern = Pattern.compile(key);
  251. Matcher matcher = pattern.matcher(text);
  252. int count = 0;
  253. while (matcher.find()) {
  254. count++;
  255. }
  256. JSONArray dataJa = new JSONArray();
  257. if (count == 1) {
  258. dataJa.add(text);
  259. } else {
  260. for (int a = 0; a < count; a++) {
  261. int p1 = text.indexOf("end");
  262. dataJa.add(text.substring(0, p1 + 3));
  263. text = text.substring(p1 + 3, text.length());
  264. }
  265. }
  266. return dataJa;
  267. }
  268. }