EnvInputServerHandler.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  1. package com.huimv.env.input.server;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  5. import com.huimv.env.input.c.MyNativeClass;
  6. import com.huimv.env.input.config.WeChatMessage;
  7. import com.huimv.env.input.entity.*;
  8. import com.huimv.env.input.mapper.TerminalPortMapper;
  9. import com.huimv.env.input.service.*;
  10. import com.huimv.env.input.ws.WebsocketWorkerUtil;
  11. import io.netty.buffer.ByteBuf;
  12. import io.netty.buffer.Unpooled;
  13. import io.netty.channel.ChannelHandler;
  14. import io.netty.channel.ChannelHandlerContext;
  15. import io.netty.channel.ChannelInboundHandlerAdapter;
  16. import io.netty.util.CharsetUtil;
  17. import lombok.extern.log4j.Log4j2;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Component;
  20. import org.springframework.util.ObjectUtils;
  21. import java.io.*;
  22. import java.math.BigDecimal;
  23. import java.text.DecimalFormat;
  24. import java.text.ParseException;
  25. import java.util.Arrays;
  26. import java.util.Collections;
  27. import java.util.Date;
  28. import java.util.List;
  29. import java.util.regex.Matcher;
  30. import java.util.regex.Pattern;
  31. import java.util.stream.Collectors;
  32. import java.util.stream.IntStream;
  33. import java.util.stream.Stream;
  34. /**
  35. * @Project : huimv.shiwan
  36. * @Package : com.huimv.biosafety.uface.controller
  37. * @Description : TODO
  38. * @Version : 1.0
  39. * @Author : ZhuoNing
  40. * @Create : 2020-12-25
  41. **/
  42. @ChannelHandler.Sharable
  43. @Component
  44. @Log4j2
  45. public class EnvInputServerHandler extends ChannelInboundHandlerAdapter {
  46. private StringBuilder askTextSb = null;
  47. @Autowired
  48. private IEnvDataService envDataService;
  49. @Autowired
  50. private ITerminalPortService terminalPortService;
  51. @Autowired
  52. private IBaseFarmService baseFarmService;
  53. @Autowired
  54. private IBasePigpenService basePigpenService;
  55. @Autowired
  56. private IPortWarningInfoService portWarningInfoService;
  57. @Autowired
  58. private IPortChangeDataService portChangeDataService;
  59. @Autowired
  60. private ITerminalService terminalService;
  61. @Autowired
  62. private IHeartInfoService heartInfoService;
  63. @Autowired
  64. private ISysAccountMultilevelService sysAccountMultilevelService;
  65. //
  66. public void appendClientAsk(String text) {
  67. if (this.askTextSb == null) {
  68. askTextSb = new StringBuilder();
  69. }
  70. askTextSb.append(text);
  71. }
  72. @Override
  73. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  74. ByteBuf data = (ByteBuf) msg;
  75. String clientAskText = data.toString(CharsetUtil.UTF_8);
  76. //保存实例内的客户端请求
  77. appendClientAsk(clientAskText);
  78. //临时写入耳标数据到文件
  79. // writeTxt(clientAskText,"all");
  80. }
  81. @Override
  82. public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
  83. if (askTextSb.toString().indexOf("end") != -1) {
  84. // {处理客户端消息}
  85. handleClientAskCmd(askTextSb.toString(), ctx);
  86. //清空重置;
  87. askTextSb.delete(0, askTextSb.length());
  88. }
  89. }
  90. @Override
  91. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  92. if (cause.getMessage().indexOf("Connection reset") != -1) {
  93. log.info("相关采集器设备正在重启:" + cause.toString());
  94. }
  95. // cause.printStackTrace();
  96. ctx.close();
  97. }
  98. /**
  99. * @Method : handleClientAskCmd
  100. * @Description : 处理请求小心
  101. * @Params : [clientAskText, ctx]
  102. * @Return : void
  103. * @Author : ZhuoNing
  104. * @Date : 2022/3/28
  105. * @Time : 17:36
  106. */
  107. private void handleClientAskCmd(String clientAskText, ChannelHandlerContext ctx) throws ParseException, IOException {
  108. clientAskText = clientAskText.replaceAll("\r", "").replaceAll("\n", "");
  109. //{处理非正常命令}
  110. // int countPlus = regexUtil.countPlus(clientAskText);
  111. // if (countPlus < 4) {
  112. // System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
  113. // } else {
  114. //--处理客户端请求数据
  115. //{拆分粘包数据}
  116. JSONArray askJa = parseAskCmdPackage(clientAskText);
  117. for (int a = 0; a < askJa.size(); a++) {
  118. String askText = askJa.getString(a);
  119. //{处理请求命令}
  120. askCmdActuator(askText, ctx);
  121. }
  122. // }
  123. }
  124. /**
  125. * @Method : askCmdActuator
  126. * @Description :
  127. * @Params : [askText, ctx]
  128. * @Return : void
  129. * @Author : ZhuoNing
  130. * @Date : 2022/3/23
  131. * @Time : 18:08
  132. */
  133. private void askCmdActuator(String askText, ChannelHandlerContext ctx) throws ParseException, IOException {
  134. System.out.println("======>接收设备请求:" + askText);
  135. String[] dataArray = askText.split("\\+");
  136. String cmdHeader = dataArray[0];
  137. if (!cmdHeader.trim().equalsIgnoreCase("hm")) {
  138. log.info("当前命令是非hm命令[" + askText + "]");
  139. return;
  140. }
  141. String version = dataArray[dataArray.length - 3];
  142. if ("v2.0".equals(version)) {
  143. askCmdActuatorV2(askText, ctx, dataArray);
  144. } else {
  145. askCmdActuatorV1(askText, ctx, dataArray);
  146. log.info("当前版本异常[" + askText + "]");
  147. }
  148. }
  149. private void askCmdActuatorV2(String askText, ChannelHandlerContext ctx, String[] dataArray){
  150. //芯片id/设备编码
  151. String cmd = dataArray[1];
  152. switch (cmd) {
  153. case "1":
  154. //心跳
  155. getHear(askText, dataArray, ctx,2);
  156. break;
  157. case "2":
  158. //上传数据
  159. getChuanGanData2(askText, dataArray, ctx);
  160. break;
  161. case "3":
  162. //充电前后功率
  163. savePower2(askText, dataArray, ctx);
  164. break;
  165. case "4":
  166. //充电中电流
  167. saveElectric2(askText, dataArray, ctx);
  168. break;
  169. case "5":
  170. //充电前电流
  171. saveBeforeElectric2(askText, dataArray, ctx);
  172. break;
  173. default:
  174. log.error(String.format("未知指令 --> %s", askText));
  175. answerCmd("hm+4+1+end", ctx);
  176. }
  177. }
  178. private synchronized void saveBeforeElectric2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  179. String gateWayCode = dataArray[2];
  180. String terminalCode = dataArray[3];
  181. String terminalPortCode = "1";
  182. String num = dataArray[4];
  183. String eleData = dataArray[5];
  184. Date now = new Date();
  185. try {
  186. PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
  187. if (ObjectUtils.isEmpty(portChangeData)) {
  188. portChangeData = new PortChangeData();
  189. portChangeData.setNum(Integer.parseInt(num));
  190. portChangeData.setCreateTime(now);
  191. portChangeData.setGatwayCode(gateWayCode);
  192. portChangeData.setTerminalCode(gateWayCode+terminalCode);
  193. portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
  194. portChangeData.setBeforeElectricCurrent(eleData);
  195. portChangeDataService.save(portChangeData);
  196. }else {
  197. portChangeData.setBeforeElectricCurrent(eleData);
  198. portChangeDataService.updateById(portChangeData);
  199. if(changeDataIsAll(portChangeData)){
  200. // int i = getStatusEle(portChangeData);
  201. int i = getStatusEle2(portChangeData);
  202. TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", portChangeData.getTerminalPortCode()));
  203. System.out.println("---->"+i);
  204. if (i == 1){
  205. deviceCode.setChargingWarning(1);
  206. String ans = "hm+5+1+end";
  207. answerCmd(ans,ctx);
  208. saveChargingWarning(portChangeData,deviceCode);
  209. }else {
  210. String ans = "hm+5+0+end";
  211. answerCmd(ans,ctx);
  212. deviceCode.setChargingWarning(0);
  213. }
  214. terminalPortService.updateById(deviceCode);
  215. }
  216. }
  217. }catch (Exception e){
  218. log.error(String.format("点位查询失败--> %s" ,askText));
  219. log.error(e);
  220. }
  221. }
  222. private int getStatusEle2(PortChangeData portChangeData) {
  223. // 前有功功率 前无功功率 前视在功率 + 前 128个电流值
  224. String[] lastEleData = portChangeData.getBeforeElectricCurrent().split(",");
  225. String[] lastGlData =new String[]{String.valueOf(portChangeData.getBeforeActivePower()),String.valueOf(portChangeData.getBeforeReactivePower()),String.valueOf(portChangeData.getBeforeApparentPower())};
  226. // 有功功率 无功功率 视在功率 + 128个电流值
  227. String[] curretEleData = portChangeData.getElectricCurrent().split(",");
  228. String[] curretGlData =new String[]{String.valueOf(portChangeData.getActivePower()),String.valueOf(portChangeData.getReactivePower()),String.valueOf(portChangeData.getApparentPower())};
  229. Object[] ints = Stream.concat( Arrays.stream(lastGlData),Arrays.stream(lastEleData)).toArray();
  230. Object[] ints1 = Stream.concat(Arrays.stream(curretGlData) ,Arrays.stream(curretEleData)).toArray();
  231. // return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection(ints,ints1 );
  232. return add2(ints,ints1 );
  233. // return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection( );
  234. }
  235. public int add2(Object[] array1 , Object[] array2) {
  236. // 步骤1: 将两个数组写入临时文件
  237. String tempInputFile = "temp_input.txt";
  238. try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempInputFile))) {
  239. String array1String = Arrays.stream(array1)
  240. .map(Object::toString) // 使用 Object 的 toString 方法转换为 String
  241. .collect(Collectors.joining(","));
  242. writer.write(array1String);
  243. writer.newLine(); // 换行
  244. // 写入第二个数组
  245. String array2String = Arrays.stream(array2)
  246. .map(Object::toString) // 使用 Object 的 toString 方法转换为 String
  247. .collect(Collectors.joining(","));
  248. writer.write(array2String);
  249. writer.newLine(); // 换行
  250. } catch (IOException e) {
  251. e.printStackTrace();
  252. return 0;
  253. }
  254. // 步骤2: 调用C程序
  255. String cProgramPath = "/root/svm_detection_c/predict"; // 替换为你的C程序的实际路径
  256. String tempOutputFile = "temp_output.txt"; // 假设C程序将结果写入此文件
  257. ProcessBuilder processBuilder = new ProcessBuilder(cProgramPath, tempInputFile, tempOutputFile);
  258. try {
  259. Process process = processBuilder.start();
  260. int exitCode = process.waitFor();
  261. if (exitCode != 0) {
  262. System.err.println("C program execution failed with exit code: " + exitCode);
  263. return 0;
  264. }
  265. } catch (IOException | InterruptedException e) {
  266. e.printStackTrace();
  267. return 0;
  268. }
  269. // 步骤3: 读取结果文件
  270. try (BufferedReader reader = new BufferedReader(new FileReader(tempOutputFile))) {
  271. String line;
  272. String str ="1";
  273. while ((line = reader.readLine()) != null) {
  274. System.out.println("line"+line); // 或者你可以将结果存储到某个变量或集合中
  275. str = line;
  276. }
  277. return Integer.parseInt(str);
  278. } catch (IOException e) {
  279. e.printStackTrace();
  280. return 0;
  281. }
  282. // 步骤4: 删除所有文件
  283. // Path inputFilePath = Paths.get(tempInputFile);
  284. // Path outputFilePath = Paths.get(tempOutputFile);
  285. // try {
  286. // Files.deleteIfExists(inputFilePath);
  287. // Files.deleteIfExists(outputFilePath);
  288. // } catch (IOException e) {
  289. // e.printStackTrace();
  290. // }
  291. }
  292. private synchronized void saveElectric2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  293. String ans = "hm+4+1+end";
  294. answerCmd(ans,ctx);
  295. String gateWayCode = dataArray[2];
  296. String terminalCode = dataArray[3];
  297. String terminalPortCode = "1";
  298. String num = dataArray[4];
  299. String eleData = dataArray[5];
  300. Date now = new Date();
  301. try {
  302. PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
  303. if (ObjectUtils.isEmpty(portChangeData)) {
  304. portChangeData = new PortChangeData();
  305. portChangeData.setNum(Integer.parseInt(num));
  306. portChangeData.setCreateTime(now);
  307. portChangeData.setGatwayCode(gateWayCode);
  308. portChangeData.setTerminalCode(gateWayCode+terminalCode);
  309. portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
  310. portChangeData.setElectricCurrent(eleData);
  311. portChangeDataService.save(portChangeData);
  312. }else {
  313. portChangeData.setElectricCurrent(eleData);
  314. portChangeDataService.updateById(portChangeData);
  315. // if(changeDataIsAll(portChangeData)){
  316. // int i = getStatusEle(portChangeData);
  317. // TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", portChangeData.getTerminalPortCode()));
  318. // if (i == 1){
  319. // deviceCode.setChargingWarning(1);
  320. // saveChargingWarning(portChangeData,deviceCode);
  321. // }else {
  322. // deviceCode.setChargingWarning(0);
  323. // }
  324. // terminalPortService.updateById(deviceCode);
  325. // }
  326. }
  327. }catch (Exception e){
  328. log.error(String.format("点位查询失败--> %s" ,askText));
  329. log.error(e);
  330. }
  331. }
  332. private synchronized void savePower2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  333. String ans = "hm+3+1+end";
  334. answerCmd(ans,ctx);
  335. String gateWayCode = dataArray[2];
  336. String terminalCode = dataArray[3];
  337. String terminalPortCode = "1";
  338. String num = dataArray[4];
  339. int[] splitPower = Arrays.stream(dataArray[5].split(",")).mapToInt(Integer::parseInt).toArray();
  340. int[] splitBeforePower = Arrays.stream(dataArray[6].split(",")).mapToInt(Integer::parseInt).toArray();
  341. Date now = new Date();
  342. try {
  343. PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
  344. if (ObjectUtils.isEmpty(portChangeData)) {
  345. portChangeData = new PortChangeData(gateWayCode + terminalCode + terminalPortCode,gateWayCode + terminalCode ,gateWayCode,
  346. splitPower[0],splitPower[1],splitPower[2],
  347. splitBeforePower[0],splitBeforePower[1],splitBeforePower[2],
  348. now,Integer.parseInt(num));
  349. portChangeDataService.save(portChangeData);
  350. }else {
  351. portChangeData.setActivePower( splitPower[0]);
  352. portChangeData.setReactivePower( splitPower[1]);
  353. portChangeData.setApparentPower( splitPower[2]);
  354. portChangeData.setBeforeActivePower(splitBeforePower[0]);
  355. portChangeData.setBeforeReactivePower(splitBeforePower[1]);
  356. portChangeData.setBeforeApparentPower(splitBeforePower[2]);
  357. portChangeDataService.updateById(portChangeData);
  358. }
  359. }catch (Exception e){
  360. log.error(String.format("点位查询失败--> %s" ,askText));
  361. log.error(e);
  362. }
  363. }
  364. private int getStatusEle(PortChangeData portChangeData) {
  365. // 前有功功率 前无功功率 前视在功率 + 前 128个电流值
  366. int[] lastEleData = Arrays.stream(portChangeData.getBeforeElectricCurrent().split(",")).mapToInt(Integer::parseInt).toArray();
  367. int[] lastGlData = new int[]{portChangeData.getBeforeActivePower(),portChangeData.getBeforeReactivePower(),portChangeData.getBeforeApparentPower()};
  368. // 有功功率 无功功率 视在功率 + 128个电流值
  369. int[] curretEleData =Arrays.stream(portChangeData.getElectricCurrent().split(",")).mapToInt(Integer::parseInt).toArray();
  370. int[] curretGlData = new int[]{portChangeData.getActivePower(),portChangeData.getReactivePower(),portChangeData.getApparentPower()};
  371. int[] ints = IntStream.concat( Arrays.stream(lastGlData),Arrays.stream(lastEleData)).toArray();
  372. int[] ints1 = IntStream.concat(Arrays.stream(curretGlData) ,Arrays.stream(curretEleData)).toArray();
  373. System.out.println("last");
  374. for (int i : ints) {
  375. System.out.print(i+",");
  376. }
  377. System.out.println();
  378. System.out.println("curretData");
  379. for (int i : ints1) {
  380. System.out.print(i+",");
  381. }
  382. System.out.println();
  383. return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection(ints,ints1 );
  384. // return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection( );
  385. }
  386. private void saveChargingWarning(PortChangeData portChangeData ,TerminalPort deviceCode) {
  387. BasePigpen basePigpen = basePigpenService.getById(deviceCode.getLocationId());
  388. BasePigpen basePigpen1= basePigpenService.getById(basePigpen.getOther2().split(",")[1]);
  389. PortWarningInfo portWarningInfo = new PortWarningInfo();
  390. portWarningInfo.setGatwayCode(portChangeData.getGatwayCode());
  391. portWarningInfo.setTerminalCode(portChangeData.getTerminalCode());
  392. portWarningInfo.setTerminalPortCode(portChangeData.getTerminalPortCode());
  393. portWarningInfo.setLocationId(deviceCode.getLocationId());
  394. portWarningInfo.setFarmId(deviceCode.getFarmId());
  395. portWarningInfo.setWarningType(2);
  396. Date now = new Date();
  397. portWarningInfo.setCreateTime(now);
  398. portWarningInfo.setContent(String.format("%s 充电预警",basePigpen.getBuildName()));
  399. portWarningInfo.setWarningType(2);
  400. portWarningInfoService.save(portWarningInfo);
  401. List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", deviceCode.getFarmId()).eq("subscribe", 1));
  402. for (SysAccountMultilevel sysAccountMultilevel : list) {
  403. WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
  404. sysAccountMultilevel.setSubscribe(0);
  405. sysAccountMultilevelService.updateById(sysAccountMultilevel);
  406. }
  407. WebsocketWorkerUtil.sendWarningMessage(deviceCode.getFarmId(),String.format("%s 充电预警",basePigpen.getBuildName()));
  408. }
  409. private boolean changeDataIsAll(PortChangeData portChangeData) {
  410. return portChangeData.getActivePower() != null &&
  411. portChangeData.getBeforeActivePower() != null &&
  412. portChangeData.getReactivePower() != null &&
  413. portChangeData.getBeforeReactivePower() != null &&
  414. portChangeData.getApparentPower() != null &&
  415. portChangeData.getBeforeApparentPower() != null &&
  416. portChangeData.getElectricCurrent() != null &&
  417. portChangeData.getBeforeElectricCurrent() != null ;
  418. }
  419. private void getChuanGanData2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  420. String ans = "hm+2+1+end";
  421. answerCmd(ans,ctx);
  422. //hm+2+867699060007086+1+2222+7+260+0+104,17,159+0,0+v2.0+24+end
  423. String gateWayCode = dataArray[2];
  424. String terminalCode = dataArray[3];
  425. String terminalPortCode = "1";
  426. String voltage = getNum(dataArray[4]);
  427. String electriCurrent = getNum(dataArray[5]);
  428. String temp = getNum(dataArray[6]);
  429. String leakageValue = getNum(dataArray[7]);
  430. Date now = new Date();
  431. int[] splitPower = Arrays.stream(dataArray[8].split(",")).mapToInt(Integer::parseInt).toArray();
  432. int[] splitStatus =Arrays.stream(dataArray[9].split(",")).mapToInt(Integer::parseInt).toArray();
  433. EnvData envData = new EnvData(gateWayCode+terminalCode+terminalPortCode,gateWayCode+terminalCode,gateWayCode,
  434. voltage,electriCurrent,temp, leakageValue,
  435. splitPower[0],splitPower[1],splitPower[2],
  436. splitStatus[0],0,splitStatus[1],
  437. askText,now);
  438. envDataService.save(envData);
  439. //更新状态
  440. // try {
  441. TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", gateWayCode + terminalCode + terminalPortCode));
  442. if (ObjectUtils.isEmpty(deviceCode)){
  443. log.info(String.format("无端口设备--> %s" ,askText));
  444. return;
  445. }
  446. deviceCode.setVoltage(voltage);
  447. deviceCode.setElectricCurrent(electriCurrent);
  448. deviceCode.setTemp(temp);
  449. deviceCode.setLeakageValue(leakageValue);
  450. deviceCode.setActivePower( splitPower[0]);
  451. deviceCode.setReactivePower(splitPower[1]);
  452. deviceCode.setApparentPower(splitPower[2]);
  453. deviceCode.setHeightTempWarning( splitStatus[0]);
  454. deviceCode.setChargingWarning( 0);
  455. deviceCode.setLeakageWarning( splitStatus[1]);
  456. deviceCode.setUpdateTime(now);
  457. deviceCode.setStatus(1);
  458. terminalPortService.updateById(deviceCode);
  459. //添加报警
  460. saveWarning2(gateWayCode,terminalCode,terminalPortCode,deviceCode,splitStatus,now);
  461. }
  462. private void saveWarning2(String gateWayCode,String terminaCode,String terminalPortCode ,TerminalPort terminalPort,int[] splitStatus,Date now) {
  463. if (splitStatus[0] == 0 && splitStatus[1] == 0 )
  464. return;
  465. Integer farmId = terminalPort.getFarmId();
  466. Integer locationId = terminalPort.getLocationId();
  467. BasePigpen basePigpen = basePigpenService.getById(locationId);
  468. BasePigpen basePigpen1= basePigpenService.getById(basePigpen.getOther2().split(",")[1]);
  469. if (ObjectUtils.isEmpty(basePigpen)){
  470. log.info(String.format("无栋舍数据--> %s" ,terminalPort.toString()));
  471. return;
  472. }
  473. PortWarningInfo portWarningInfo = new PortWarningInfo();
  474. portWarningInfo.setGatwayCode(gateWayCode);
  475. portWarningInfo.setTerminalCode(gateWayCode+terminaCode);
  476. portWarningInfo.setTerminalPortCode(gateWayCode+ terminaCode +terminalPortCode);
  477. portWarningInfo.setLocationId(locationId);
  478. portWarningInfo.setFarmId(farmId);
  479. portWarningInfo.setWarningType(farmId);
  480. portWarningInfo.setCreateTime(now);
  481. if (splitStatus[0] == 1){
  482. portWarningInfo.setContent(String.format("%s 高温预警",basePigpen.getBuildName()));
  483. portWarningInfo.setWarningType(1);
  484. portWarningInfoService.save(portWarningInfo);
  485. List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
  486. for (SysAccountMultilevel sysAccountMultilevel : list) {
  487. WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
  488. sysAccountMultilevel.setSubscribe(0);
  489. sysAccountMultilevelService.updateById(sysAccountMultilevel);
  490. }
  491. WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 高温预警",basePigpen.getBuildName()));
  492. }
  493. if (splitStatus[1] == 1){
  494. portWarningInfo.setContent(String.format("%s 漏电预警",basePigpen.getBuildName()));
  495. portWarningInfo.setWarningType(3);
  496. portWarningInfoService.save(portWarningInfo);
  497. List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
  498. for (SysAccountMultilevel sysAccountMultilevel : list) {
  499. WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
  500. sysAccountMultilevel.setSubscribe(0);
  501. sysAccountMultilevelService.updateById(sysAccountMultilevel);
  502. }
  503. WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 漏电预警",basePigpen.getBuildName()));
  504. }
  505. }
  506. private void askCmdActuatorV1(String askText, ChannelHandlerContext ctx, String[] dataArray){
  507. //芯片id/设备编码
  508. String cmd = dataArray[1];
  509. switch (cmd) {
  510. case "1":
  511. //心跳
  512. getHear(askText, dataArray, ctx,1);
  513. break;
  514. case "2":
  515. //上传数据
  516. getChuanGanData(askText, dataArray, ctx);
  517. break;
  518. case "3":
  519. //充电前后功率
  520. savePower(askText, dataArray, ctx);
  521. break;
  522. case "4":
  523. //充电中电流
  524. saveElectric(askText, dataArray, ctx);
  525. break;
  526. case "5":
  527. //充电前电流
  528. saveBeforeElectric(askText, dataArray, ctx);
  529. break;
  530. default:
  531. log.error(String.format("未知指令 --> %s", askText));
  532. answerCmd("hm+4+1+end", ctx);
  533. }
  534. }
  535. private synchronized void saveBeforeElectric(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  536. String ans = "hm+5+1+end";
  537. answerCmd(ans,ctx);
  538. String gateWayCode = dataArray[2];
  539. String terminalCode = dataArray[3];
  540. String terminalPortCode = dataArray[4];
  541. String num = dataArray[5];
  542. String eleData = dataArray[6];
  543. Date now = new Date();
  544. try {
  545. PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
  546. if (ObjectUtils.isEmpty(portChangeData)) {
  547. portChangeData = new PortChangeData();
  548. portChangeData.setNum(Integer.parseInt(num));
  549. portChangeData.setCreateTime(now);
  550. portChangeData.setGatwayCode(gateWayCode);
  551. portChangeData.setTerminalCode(gateWayCode+terminalCode);
  552. portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
  553. portChangeData.setBeforeElectricCurrent(eleData);
  554. portChangeDataService.save(portChangeData);
  555. }else {
  556. portChangeData.setBeforeElectricCurrent(eleData);
  557. portChangeDataService.updateById(portChangeData);
  558. }
  559. }catch (Exception e){
  560. log.error(String.format("点位查询失败--> %s" ,askText));
  561. log.error(e);
  562. }
  563. }
  564. private synchronized void saveElectric(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  565. String ans = "hm+4+1+end";
  566. answerCmd(ans,ctx);
  567. String gateWayCode = dataArray[2];
  568. String terminalCode = dataArray[3];
  569. String terminalPortCode = dataArray[4];
  570. String num = dataArray[5];
  571. String eleData = dataArray[6];
  572. Date now = new Date();
  573. try {
  574. PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
  575. if (ObjectUtils.isEmpty(portChangeData)) {
  576. portChangeData = new PortChangeData();
  577. portChangeData.setNum(Integer.parseInt(num));
  578. portChangeData.setCreateTime(now);
  579. portChangeData.setGatwayCode(gateWayCode);
  580. portChangeData.setTerminalCode(gateWayCode+terminalCode);
  581. portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
  582. portChangeData.setElectricCurrent(eleData);
  583. portChangeDataService.save(portChangeData);
  584. }else {
  585. portChangeData.setElectricCurrent(eleData);
  586. portChangeDataService.updateById(portChangeData);
  587. }
  588. }catch (Exception e){
  589. log.error(String.format("点位查询失败--> %s" ,askText));
  590. log.error(e);
  591. }
  592. }
  593. public String reverseWithComma(String input) {
  594. String[] parts = input.split(",");
  595. List<String> partList = Arrays.asList(parts);
  596. Collections.reverse(partList);
  597. StringBuilder reversedBuilder = new StringBuilder();
  598. for (int i = 0; i < partList.size(); i++) {
  599. reversedBuilder.append(partList.get(i));
  600. if (i < partList.size() - 1) {
  601. reversedBuilder.append(",");
  602. }
  603. }
  604. return reversedBuilder.toString();
  605. }
  606. private synchronized void savePower(String askText, String[] dataArray, ChannelHandlerContext ctx) {
  607. String ans = "hm+3+1+end";
  608. answerCmd(ans,ctx);
  609. String gateWayCode = dataArray[2];
  610. String terminalCode = dataArray[3];
  611. String terminalPortCode = dataArray[4];
  612. String num = dataArray[5];
  613. int[] splitPower = Arrays.stream(dataArray[6].split(",")).mapToInt(Integer::parseInt).toArray();
  614. int[] splitBeforePower = Arrays.stream(dataArray[7].split(",")).mapToInt(Integer::parseInt).toArray();
  615. Date now = new Date();
  616. try {
  617. PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
  618. if (ObjectUtils.isEmpty(portChangeData)) {
  619. portChangeData = new PortChangeData(gateWayCode + terminalCode + terminalPortCode,gateWayCode + terminalCode ,gateWayCode,
  620. splitPower[0],splitPower[1],splitPower[2],
  621. splitBeforePower[0],splitBeforePower[1],splitBeforePower[2],
  622. now,Integer.parseInt(num));
  623. portChangeDataService.save(portChangeData);
  624. }else {
  625. portChangeData.setActivePower( splitPower[0]);
  626. portChangeData.setReactivePower( splitPower[1]);
  627. portChangeData.setApparentPower( splitPower[2]);
  628. portChangeData.setBeforeActivePower(splitBeforePower[0]);
  629. portChangeData.setBeforeReactivePower(splitBeforePower[1]);
  630. portChangeData.setBeforeApparentPower(splitBeforePower[2]);
  631. portChangeDataService.updateById(portChangeData);
  632. }
  633. }catch (Exception e){
  634. log.error(String.format("点位查询失败--> %s" ,askText));
  635. log.error(e);
  636. }
  637. }
  638. private void getHear(String askText,String[] dataArray, ChannelHandlerContext ctx,int version) {
  639. /**
  640. * 接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义
  641. * 映射libadd.so里面的函数,注意类型要匹配
  642. */
  643. String ans = "hm+1+1+end";
  644. answerCmd(ans,ctx);
  645. String gateWayCode = dataArray[2];
  646. String terminalCode = dataArray[3];
  647. TerminalPort terminalPort = new TerminalPort();
  648. terminalPort.setStatus(1);
  649. terminalPortService.update(terminalPort,new UpdateWrapper<TerminalPort>().like("device_code",gateWayCode + terminalCode));
  650. Terminal terminal = new Terminal();
  651. terminal.setStatus(1);
  652. terminalService.update(terminal,new UpdateWrapper<Terminal>().eq("device_code",gateWayCode + terminalCode));
  653. switch ( version){
  654. case 1:
  655. HeartInfo heartInfo1 = new HeartInfo(new Date(), gateWayCode + terminalCode, gateWayCode, askText);
  656. heartInfoService.save(heartInfo1);
  657. break;
  658. case 2:
  659. HeartInfo heartInfo2 = new HeartInfo(new Date(), gateWayCode + "1", gateWayCode, askText);
  660. heartInfoService.save(heartInfo2);
  661. break;
  662. default:
  663. log.info("未知版本");
  664. break;
  665. }
  666. }
  667. private void getChuanGanData(String askText,String[] dataArray, ChannelHandlerContext ctx) {
  668. String ans = "hm+2+1+end";
  669. answerCmd(ans,ctx);
  670. //hm+1+867699060007086+1+1+242+3+2494+9+0+0+31+0+0+0+V1.0+0+end
  671. String gateWayCode = dataArray[2];
  672. String terminalCode = dataArray[3];
  673. String terminalPortCode = dataArray[4];
  674. String voltage = getNum(dataArray[5]);
  675. String electriCurrent = getNum(dataArray[6]);
  676. String temp = getNum(dataArray[7]);
  677. String leakageValue = getNum(dataArray[8]);
  678. Date now = new Date();
  679. int[] splitPower = Arrays.stream(dataArray[9].split(",")).mapToInt(Integer::parseInt).toArray();
  680. int[] splitStatus =Arrays.stream(dataArray[10].split(",")).mapToInt(Integer::parseInt).toArray();
  681. EnvData envData = new EnvData(gateWayCode+terminalCode+terminalPortCode,gateWayCode+terminalCode,gateWayCode,
  682. voltage,electriCurrent,temp, leakageValue,
  683. splitPower[0],splitPower[1],splitPower[2],
  684. splitStatus[0],splitStatus[1],splitStatus[2],
  685. askText,now);
  686. envDataService.save(envData);
  687. //更新状态
  688. // try {
  689. TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", gateWayCode + terminalCode + terminalPortCode));
  690. if (ObjectUtils.isEmpty(deviceCode)){
  691. log.info(String.format("无端口设备--> %s" ,askText));
  692. return;
  693. }
  694. deviceCode.setVoltage(voltage);
  695. deviceCode.setElectricCurrent(electriCurrent);
  696. deviceCode.setTemp(temp);
  697. deviceCode.setLeakageValue(leakageValue);
  698. deviceCode.setActivePower( splitPower[0]);
  699. deviceCode.setReactivePower(splitPower[1]);
  700. deviceCode.setApparentPower(splitPower[2]);
  701. deviceCode.setHeightTempWarning( splitStatus[0]);
  702. deviceCode.setChargingWarning( splitStatus[1]);
  703. deviceCode.setLeakageWarning( splitStatus[2]);
  704. deviceCode.setUpdateTime(now);
  705. deviceCode.setStatus(1);
  706. terminalPortService.updateById(deviceCode);
  707. //添加报警
  708. saveWarning(gateWayCode,terminalCode,terminalPortCode,deviceCode,splitStatus,now);
  709. // }catch (Exception e){
  710. // log.error(String.format("端口设备查询失败--> %s" ,askText));
  711. // log.error(e);
  712. // }
  713. }
  714. private void saveWarning(String gateWayCode,String terminaCode,String terminalPortCode ,TerminalPort terminalPort,int[] splitStatus,Date now) {
  715. if (splitStatus[0] == 0 && splitStatus[1] == 0 &&splitStatus[2] == 0 )
  716. return;
  717. Integer farmId = terminalPort.getFarmId();
  718. Integer locationId = terminalPort.getLocationId();
  719. BaseFarm baseFarm = baseFarmService.getById(farmId);
  720. BasePigpen basePigpen = basePigpenService.getById(locationId);
  721. if (ObjectUtils.isEmpty(baseFarm)){
  722. log.info(String.format("无小区数据--> %s" ,terminalPort.toString()));
  723. return;
  724. }
  725. if (ObjectUtils.isEmpty(basePigpen)){
  726. log.info(String.format("无栋舍数据--> %s" ,terminalPort.toString()));
  727. return;
  728. }
  729. BasePigpen basePigpen1= basePigpenService.getById(basePigpen.getOther2().split(",")[1]);
  730. PortWarningInfo portWarningInfo = new PortWarningInfo();
  731. portWarningInfo.setGatwayCode(gateWayCode);
  732. portWarningInfo.setTerminalCode(gateWayCode+terminaCode);
  733. portWarningInfo.setTerminalPortCode(gateWayCode+ terminaCode +terminalPortCode);
  734. portWarningInfo.setLocationId(locationId);
  735. portWarningInfo.setFarmId(farmId);
  736. portWarningInfo.setWarningType(1);
  737. portWarningInfo.setCreateTime(now);
  738. if (splitStatus[0] == 1){
  739. portWarningInfo.setContent(String.format("%s 高温预警",basePigpen.getBuildName()));
  740. portWarningInfo.setWarningType(1);
  741. portWarningInfoService.save(portWarningInfo);
  742. List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
  743. for (SysAccountMultilevel sysAccountMultilevel : list) {
  744. WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
  745. sysAccountMultilevel.setSubscribe(0);
  746. sysAccountMultilevelService.updateById(sysAccountMultilevel);
  747. }
  748. WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 高温预警",basePigpen.getBuildName()));
  749. }
  750. if (splitStatus[1] == 1){
  751. portWarningInfo.setContent(String.format("%s 充电预警",basePigpen.getBuildName()));
  752. portWarningInfo.setWarningType(2);
  753. portWarningInfoService.save(portWarningInfo);
  754. List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
  755. for (SysAccountMultilevel sysAccountMultilevel : list) {
  756. WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
  757. sysAccountMultilevel.setSubscribe(0);
  758. sysAccountMultilevelService.updateById(sysAccountMultilevel);
  759. }
  760. WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 充电预警",basePigpen.getBuildName()));
  761. }
  762. if (splitStatus[2] == 1){
  763. portWarningInfo.setContent(String.format("%s 漏电预警",basePigpen.getBuildName()));
  764. portWarningInfo.setWarningType(3);
  765. portWarningInfoService.save(portWarningInfo);
  766. List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
  767. for (SysAccountMultilevel sysAccountMultilevel : list) {
  768. WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
  769. sysAccountMultilevel.setSubscribe(0);
  770. sysAccountMultilevelService.updateById(sysAccountMultilevel);
  771. }
  772. WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 漏电预警",basePigpen.getBuildName()));
  773. }
  774. }
  775. private String getNum(String num){
  776. return String.format("%.1f", Double.parseDouble(num) / 10.0);
  777. }
  778. //应答
  779. public void answerCmd(String answerText, ChannelHandlerContext ctx) {
  780. log.info(String.format("应答数据--->%s",answerText));
  781. ctx.writeAndFlush(Unpooled.copiedBuffer(answerText.getBytes()));
  782. }
  783. //检查无效耳标
  784. public boolean checkValidEarmark(String earmark) {
  785. if (earmark.trim().equalsIgnoreCase("ffffffffffffffff") || earmark.trim().equalsIgnoreCase("0000000000000000")) {
  786. return true;
  787. } else {
  788. return false;
  789. }
  790. }
  791. //拆分粘包数据
  792. public JSONArray parseAskCmdPackage(String text) {
  793. String key = "end";
  794. Pattern pattern = Pattern.compile(key);
  795. Matcher matcher = pattern.matcher(text);
  796. int count = 0;
  797. while (matcher.find()) {
  798. count++;
  799. }
  800. JSONArray dataJa = new JSONArray();
  801. if (count == 1) {
  802. dataJa.add(text);
  803. } else {
  804. for (int a = 0; a < count; a++) {
  805. int p1 = text.indexOf("end");
  806. dataJa.add(text.substring(0, p1 + 3));
  807. text = text.substring(p1 + 3, text.length());
  808. }
  809. }
  810. return dataJa;
  811. }
  812. }