123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895 |
- package com.huimv.env.input.server;
- import com.alibaba.fastjson.JSONArray;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
- import com.huimv.env.input.c.MyNativeClass;
- import com.huimv.env.input.config.WeChatMessage;
- import com.huimv.env.input.entity.*;
- import com.huimv.env.input.mapper.TerminalPortMapper;
- import com.huimv.env.input.service.*;
- import com.huimv.env.input.ws.WebsocketWorkerUtil;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelHandler;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- import io.netty.util.CharsetUtil;
- import lombok.extern.log4j.Log4j2;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import org.springframework.util.ObjectUtils;
- import java.io.*;
- import java.math.BigDecimal;
- import java.text.DecimalFormat;
- import java.text.ParseException;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Date;
- import java.util.List;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import java.util.stream.Collectors;
- import java.util.stream.IntStream;
- import java.util.stream.Stream;
- /**
- * @Project : huimv.shiwan
- * @Package : com.huimv.biosafety.uface.controller
- * @Description : TODO
- * @Version : 1.0
- * @Author : ZhuoNing
- * @Create : 2020-12-25
- **/
- @ChannelHandler.Sharable
- @Component
- @Log4j2
- public class EnvInputServerHandler extends ChannelInboundHandlerAdapter {
- private StringBuilder askTextSb = null;
- @Autowired
- private IEnvDataService envDataService;
- @Autowired
- private ITerminalPortService terminalPortService;
- @Autowired
- private IBaseFarmService baseFarmService;
- @Autowired
- private IBasePigpenService basePigpenService;
- @Autowired
- private IPortWarningInfoService portWarningInfoService;
- @Autowired
- private IPortChangeDataService portChangeDataService;
- @Autowired
- private ITerminalService terminalService;
- @Autowired
- private IHeartInfoService heartInfoService;
- @Autowired
- private ISysAccountMultilevelService sysAccountMultilevelService;
- //
- public void appendClientAsk(String text) {
- if (this.askTextSb == null) {
- askTextSb = new StringBuilder();
- }
- askTextSb.append(text);
- }
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- ByteBuf data = (ByteBuf) msg;
- String clientAskText = data.toString(CharsetUtil.UTF_8);
- //保存实例内的客户端请求
- appendClientAsk(clientAskText);
- //临时写入耳标数据到文件
- // writeTxt(clientAskText,"all");
- }
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
- if (askTextSb.toString().indexOf("end") != -1) {
- // {处理客户端消息}
- handleClientAskCmd(askTextSb.toString(), ctx);
- //清空重置;
- askTextSb.delete(0, askTextSb.length());
- }
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- if (cause.getMessage().indexOf("Connection reset") != -1) {
- log.info("相关采集器设备正在重启:" + cause.toString());
- }
- // cause.printStackTrace();
- ctx.close();
- }
- /**
- * @Method : handleClientAskCmd
- * @Description : 处理请求小心
- * @Params : [clientAskText, ctx]
- * @Return : void
- * @Author : ZhuoNing
- * @Date : 2022/3/28
- * @Time : 17:36
- */
- private void handleClientAskCmd(String clientAskText, ChannelHandlerContext ctx) throws ParseException, IOException {
- clientAskText = clientAskText.replaceAll("\r", "").replaceAll("\n", "");
- //{处理非正常命令}
- // int countPlus = regexUtil.countPlus(clientAskText);
- // if (countPlus < 4) {
- // System.out.println("当前数据为不完整数据,故丢弃.>>" + clientAskText);
- // } else {
- //--处理客户端请求数据
- //{拆分粘包数据}
- JSONArray askJa = parseAskCmdPackage(clientAskText);
- for (int a = 0; a < askJa.size(); a++) {
- String askText = askJa.getString(a);
- //{处理请求命令}
- askCmdActuator(askText, ctx);
- }
- // }
- }
- /**
- * @Method : askCmdActuator
- * @Description :
- * @Params : [askText, ctx]
- * @Return : void
- * @Author : ZhuoNing
- * @Date : 2022/3/23
- * @Time : 18:08
- */
- private void askCmdActuator(String askText, ChannelHandlerContext ctx) throws ParseException, IOException {
- System.out.println("======>接收设备请求:" + askText);
- String[] dataArray = askText.split("\\+");
- String cmdHeader = dataArray[0];
- if (!cmdHeader.trim().equalsIgnoreCase("hm")) {
- log.info("当前命令是非hm命令[" + askText + "]");
- return;
- }
- String version = dataArray[dataArray.length - 3];
- if ("v2.0".equals(version)) {
- askCmdActuatorV2(askText, ctx, dataArray);
- } else {
- askCmdActuatorV1(askText, ctx, dataArray);
- log.info("当前版本异常[" + askText + "]");
- }
- }
- private void askCmdActuatorV2(String askText, ChannelHandlerContext ctx, String[] dataArray){
- //芯片id/设备编码
- String cmd = dataArray[1];
- switch (cmd) {
- case "1":
- //心跳
- getHear(askText, dataArray, ctx,2);
- break;
- case "2":
- //上传数据
- getChuanGanData2(askText, dataArray, ctx);
- break;
- case "3":
- //充电前后功率
- savePower2(askText, dataArray, ctx);
- break;
- case "4":
- //充电中电流
- saveElectric2(askText, dataArray, ctx);
- break;
- case "5":
- //充电前电流
- saveBeforeElectric2(askText, dataArray, ctx);
- break;
- default:
- log.error(String.format("未知指令 --> %s", askText));
- answerCmd("hm+4+1+end", ctx);
- }
- }
- private synchronized void saveBeforeElectric2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = "1";
- String num = dataArray[4];
- String eleData = dataArray[5];
- Date now = new Date();
- try {
- PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
- if (ObjectUtils.isEmpty(portChangeData)) {
- portChangeData = new PortChangeData();
- portChangeData.setNum(Integer.parseInt(num));
- portChangeData.setCreateTime(now);
- portChangeData.setGatwayCode(gateWayCode);
- portChangeData.setTerminalCode(gateWayCode+terminalCode);
- portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
- portChangeData.setBeforeElectricCurrent(eleData);
- portChangeDataService.save(portChangeData);
- }else {
- portChangeData.setBeforeElectricCurrent(eleData);
- portChangeDataService.updateById(portChangeData);
- if(changeDataIsAll(portChangeData)){
- // int i = getStatusEle(portChangeData);
- int i = getStatusEle2(portChangeData);
- TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", portChangeData.getTerminalPortCode()));
- System.out.println("---->"+i);
- if (i == 1){
- deviceCode.setChargingWarning(1);
- String ans = "hm+5+1+end";
- answerCmd(ans,ctx);
- saveChargingWarning(portChangeData,deviceCode);
- }else {
- String ans = "hm+5+0+end";
- answerCmd(ans,ctx);
- deviceCode.setChargingWarning(0);
- }
- terminalPortService.updateById(deviceCode);
- }
- }
- }catch (Exception e){
- log.error(String.format("点位查询失败--> %s" ,askText));
- log.error(e);
- }
- }
- private int getStatusEle2(PortChangeData portChangeData) {
- // 前有功功率 前无功功率 前视在功率 + 前 128个电流值
- String[] lastEleData = portChangeData.getBeforeElectricCurrent().split(",");
- String[] lastGlData =new String[]{String.valueOf(portChangeData.getBeforeActivePower()),String.valueOf(portChangeData.getBeforeReactivePower()),String.valueOf(portChangeData.getBeforeApparentPower())};
- // 有功功率 无功功率 视在功率 + 128个电流值
- String[] curretEleData = portChangeData.getElectricCurrent().split(",");
- String[] curretGlData =new String[]{String.valueOf(portChangeData.getActivePower()),String.valueOf(portChangeData.getReactivePower()),String.valueOf(portChangeData.getApparentPower())};
- Object[] ints = Stream.concat( Arrays.stream(lastGlData),Arrays.stream(lastEleData)).toArray();
- Object[] ints1 = Stream.concat(Arrays.stream(curretGlData) ,Arrays.stream(curretEleData)).toArray();
- // return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection(ints,ints1 );
- return add2(ints,ints1 );
- // return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection( );
- }
- public int add2(Object[] array1 , Object[] array2) {
- // 步骤1: 将两个数组写入临时文件
- String tempInputFile = "temp_input.txt";
- try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempInputFile))) {
- String array1String = Arrays.stream(array1)
- .map(Object::toString) // 使用 Object 的 toString 方法转换为 String
- .collect(Collectors.joining(","));
- writer.write(array1String);
- writer.newLine(); // 换行
- // 写入第二个数组
- String array2String = Arrays.stream(array2)
- .map(Object::toString) // 使用 Object 的 toString 方法转换为 String
- .collect(Collectors.joining(","));
- writer.write(array2String);
- writer.newLine(); // 换行
- } catch (IOException e) {
- e.printStackTrace();
- return 0;
- }
- // 步骤2: 调用C程序
- String cProgramPath = "/root/svm_detection_c/predict"; // 替换为你的C程序的实际路径
- String tempOutputFile = "temp_output.txt"; // 假设C程序将结果写入此文件
- ProcessBuilder processBuilder = new ProcessBuilder(cProgramPath, tempInputFile, tempOutputFile);
- try {
- Process process = processBuilder.start();
- int exitCode = process.waitFor();
- if (exitCode != 0) {
- System.err.println("C program execution failed with exit code: " + exitCode);
- return 0;
- }
- } catch (IOException | InterruptedException e) {
- e.printStackTrace();
- return 0;
- }
- // 步骤3: 读取结果文件
- try (BufferedReader reader = new BufferedReader(new FileReader(tempOutputFile))) {
- String line;
- String str ="1";
- while ((line = reader.readLine()) != null) {
- System.out.println("line"+line); // 或者你可以将结果存储到某个变量或集合中
- str = line;
- }
- return Integer.parseInt(str);
- } catch (IOException e) {
- e.printStackTrace();
- return 0;
- }
- // 步骤4: 删除所有文件
- // Path inputFilePath = Paths.get(tempInputFile);
- // Path outputFilePath = Paths.get(tempOutputFile);
- // try {
- // Files.deleteIfExists(inputFilePath);
- // Files.deleteIfExists(outputFilePath);
- // } catch (IOException e) {
- // e.printStackTrace();
- // }
- }
- private synchronized void saveElectric2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+4+1+end";
- answerCmd(ans,ctx);
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = "1";
- String num = dataArray[4];
- String eleData = dataArray[5];
- Date now = new Date();
- try {
- PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
- if (ObjectUtils.isEmpty(portChangeData)) {
- portChangeData = new PortChangeData();
- portChangeData.setNum(Integer.parseInt(num));
- portChangeData.setCreateTime(now);
- portChangeData.setGatwayCode(gateWayCode);
- portChangeData.setTerminalCode(gateWayCode+terminalCode);
- portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
- portChangeData.setElectricCurrent(eleData);
- portChangeDataService.save(portChangeData);
- }else {
- portChangeData.setElectricCurrent(eleData);
- portChangeDataService.updateById(portChangeData);
- // if(changeDataIsAll(portChangeData)){
- // int i = getStatusEle(portChangeData);
- // TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", portChangeData.getTerminalPortCode()));
- // if (i == 1){
- // deviceCode.setChargingWarning(1);
- // saveChargingWarning(portChangeData,deviceCode);
- // }else {
- // deviceCode.setChargingWarning(0);
- // }
- // terminalPortService.updateById(deviceCode);
- // }
- }
- }catch (Exception e){
- log.error(String.format("点位查询失败--> %s" ,askText));
- log.error(e);
- }
- }
- private synchronized void savePower2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+3+1+end";
- answerCmd(ans,ctx);
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = "1";
- String num = dataArray[4];
- int[] splitPower = Arrays.stream(dataArray[5].split(",")).mapToInt(Integer::parseInt).toArray();
- int[] splitBeforePower = Arrays.stream(dataArray[6].split(",")).mapToInt(Integer::parseInt).toArray();
- Date now = new Date();
- try {
- PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
- if (ObjectUtils.isEmpty(portChangeData)) {
- portChangeData = new PortChangeData(gateWayCode + terminalCode + terminalPortCode,gateWayCode + terminalCode ,gateWayCode,
- splitPower[0],splitPower[1],splitPower[2],
- splitBeforePower[0],splitBeforePower[1],splitBeforePower[2],
- now,Integer.parseInt(num));
- portChangeDataService.save(portChangeData);
- }else {
- portChangeData.setActivePower( splitPower[0]);
- portChangeData.setReactivePower( splitPower[1]);
- portChangeData.setApparentPower( splitPower[2]);
- portChangeData.setBeforeActivePower(splitBeforePower[0]);
- portChangeData.setBeforeReactivePower(splitBeforePower[1]);
- portChangeData.setBeforeApparentPower(splitBeforePower[2]);
- portChangeDataService.updateById(portChangeData);
- }
- }catch (Exception e){
- log.error(String.format("点位查询失败--> %s" ,askText));
- log.error(e);
- }
- }
- private int getStatusEle(PortChangeData portChangeData) {
- // 前有功功率 前无功功率 前视在功率 + 前 128个电流值
- int[] lastEleData = Arrays.stream(portChangeData.getBeforeElectricCurrent().split(",")).mapToInt(Integer::parseInt).toArray();
- int[] lastGlData = new int[]{portChangeData.getBeforeActivePower(),portChangeData.getBeforeReactivePower(),portChangeData.getBeforeApparentPower()};
- // 有功功率 无功功率 视在功率 + 128个电流值
- int[] curretEleData =Arrays.stream(portChangeData.getElectricCurrent().split(",")).mapToInt(Integer::parseInt).toArray();
- int[] curretGlData = new int[]{portChangeData.getActivePower(),portChangeData.getReactivePower(),portChangeData.getApparentPower()};
- int[] ints = IntStream.concat( Arrays.stream(lastGlData),Arrays.stream(lastEleData)).toArray();
- int[] ints1 = IntStream.concat(Arrays.stream(curretGlData) ,Arrays.stream(curretEleData)).toArray();
- System.out.println("last");
- for (int i : ints) {
- System.out.print(i+",");
- }
- System.out.println();
- System.out.println("curretData");
- for (int i : ints1) {
- System.out.print(i+",");
- }
- System.out.println();
- return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection(ints,ints1 );
- // return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection( );
- }
- private void saveChargingWarning(PortChangeData portChangeData ,TerminalPort deviceCode) {
- BasePigpen basePigpen = basePigpenService.getById(deviceCode.getLocationId());
- BasePigpen basePigpen1= basePigpenService.getById(basePigpen.getOther2().split(",")[1]);
- PortWarningInfo portWarningInfo = new PortWarningInfo();
- portWarningInfo.setGatwayCode(portChangeData.getGatwayCode());
- portWarningInfo.setTerminalCode(portChangeData.getTerminalCode());
- portWarningInfo.setTerminalPortCode(portChangeData.getTerminalPortCode());
- portWarningInfo.setLocationId(deviceCode.getLocationId());
- portWarningInfo.setFarmId(deviceCode.getFarmId());
- portWarningInfo.setWarningType(2);
- Date now = new Date();
- portWarningInfo.setCreateTime(now);
- portWarningInfo.setContent(String.format("%s 充电预警",basePigpen.getBuildName()));
- portWarningInfo.setWarningType(2);
- portWarningInfoService.save(portWarningInfo);
- List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", deviceCode.getFarmId()).eq("subscribe", 1));
- for (SysAccountMultilevel sysAccountMultilevel : list) {
- WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
- sysAccountMultilevel.setSubscribe(0);
- sysAccountMultilevelService.updateById(sysAccountMultilevel);
- }
- WebsocketWorkerUtil.sendWarningMessage(deviceCode.getFarmId(),String.format("%s 充电预警",basePigpen.getBuildName()));
- }
- private boolean changeDataIsAll(PortChangeData portChangeData) {
- return portChangeData.getActivePower() != null &&
- portChangeData.getBeforeActivePower() != null &&
- portChangeData.getReactivePower() != null &&
- portChangeData.getBeforeReactivePower() != null &&
- portChangeData.getApparentPower() != null &&
- portChangeData.getBeforeApparentPower() != null &&
- portChangeData.getElectricCurrent() != null &&
- portChangeData.getBeforeElectricCurrent() != null ;
- }
- private void getChuanGanData2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+2+1+end";
- answerCmd(ans,ctx);
- //hm+2+867699060007086+1+2222+7+260+0+104,17,159+0,0+v2.0+24+end
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = "1";
- String voltage = getNum(dataArray[4]);
- String electriCurrent = getNum(dataArray[5]);
- String temp = getNum(dataArray[6]);
- String leakageValue = getNum(dataArray[7]);
- Date now = new Date();
- int[] splitPower = Arrays.stream(dataArray[8].split(",")).mapToInt(Integer::parseInt).toArray();
- int[] splitStatus =Arrays.stream(dataArray[9].split(",")).mapToInt(Integer::parseInt).toArray();
- EnvData envData = new EnvData(gateWayCode+terminalCode+terminalPortCode,gateWayCode+terminalCode,gateWayCode,
- voltage,electriCurrent,temp, leakageValue,
- splitPower[0],splitPower[1],splitPower[2],
- splitStatus[0],0,splitStatus[1],
- askText,now);
- envDataService.save(envData);
- //更新状态
- // try {
- TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", gateWayCode + terminalCode + terminalPortCode));
- if (ObjectUtils.isEmpty(deviceCode)){
- log.info(String.format("无端口设备--> %s" ,askText));
- return;
- }
- deviceCode.setVoltage(voltage);
- deviceCode.setElectricCurrent(electriCurrent);
- deviceCode.setTemp(temp);
- deviceCode.setLeakageValue(leakageValue);
- deviceCode.setActivePower( splitPower[0]);
- deviceCode.setReactivePower(splitPower[1]);
- deviceCode.setApparentPower(splitPower[2]);
- deviceCode.setHeightTempWarning( splitStatus[0]);
- deviceCode.setChargingWarning( 0);
- deviceCode.setLeakageWarning( splitStatus[1]);
- deviceCode.setUpdateTime(now);
- deviceCode.setStatus(1);
- terminalPortService.updateById(deviceCode);
- //添加报警
- saveWarning2(gateWayCode,terminalCode,terminalPortCode,deviceCode,splitStatus,now);
- }
- private void saveWarning2(String gateWayCode,String terminaCode,String terminalPortCode ,TerminalPort terminalPort,int[] splitStatus,Date now) {
- if (splitStatus[0] == 0 && splitStatus[1] == 0 )
- return;
- Integer farmId = terminalPort.getFarmId();
- Integer locationId = terminalPort.getLocationId();
- BasePigpen basePigpen = basePigpenService.getById(locationId);
- BasePigpen basePigpen1= basePigpenService.getById(basePigpen.getOther2().split(",")[1]);
- if (ObjectUtils.isEmpty(basePigpen)){
- log.info(String.format("无栋舍数据--> %s" ,terminalPort.toString()));
- return;
- }
- PortWarningInfo portWarningInfo = new PortWarningInfo();
- portWarningInfo.setGatwayCode(gateWayCode);
- portWarningInfo.setTerminalCode(gateWayCode+terminaCode);
- portWarningInfo.setTerminalPortCode(gateWayCode+ terminaCode +terminalPortCode);
- portWarningInfo.setLocationId(locationId);
- portWarningInfo.setFarmId(farmId);
- portWarningInfo.setWarningType(farmId);
- portWarningInfo.setCreateTime(now);
- if (splitStatus[0] == 1){
- portWarningInfo.setContent(String.format("%s 高温预警",basePigpen.getBuildName()));
- portWarningInfo.setWarningType(1);
- portWarningInfoService.save(portWarningInfo);
- List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
- for (SysAccountMultilevel sysAccountMultilevel : list) {
- WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
- sysAccountMultilevel.setSubscribe(0);
- sysAccountMultilevelService.updateById(sysAccountMultilevel);
- }
- WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 高温预警",basePigpen.getBuildName()));
- }
- if (splitStatus[1] == 1){
- portWarningInfo.setContent(String.format("%s 漏电预警",basePigpen.getBuildName()));
- portWarningInfo.setWarningType(3);
- portWarningInfoService.save(portWarningInfo);
- List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
- for (SysAccountMultilevel sysAccountMultilevel : list) {
- WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
- sysAccountMultilevel.setSubscribe(0);
- sysAccountMultilevelService.updateById(sysAccountMultilevel);
- }
- WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 漏电预警",basePigpen.getBuildName()));
- }
- }
- private void askCmdActuatorV1(String askText, ChannelHandlerContext ctx, String[] dataArray){
- //芯片id/设备编码
- String cmd = dataArray[1];
- switch (cmd) {
- case "1":
- //心跳
- getHear(askText, dataArray, ctx,1);
- break;
- case "2":
- //上传数据
- getChuanGanData(askText, dataArray, ctx);
- break;
- case "3":
- //充电前后功率
- savePower(askText, dataArray, ctx);
- break;
- case "4":
- //充电中电流
- saveElectric(askText, dataArray, ctx);
- break;
- case "5":
- //充电前电流
- saveBeforeElectric(askText, dataArray, ctx);
- break;
- default:
- log.error(String.format("未知指令 --> %s", askText));
- answerCmd("hm+4+1+end", ctx);
- }
- }
- private synchronized void saveBeforeElectric(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+5+1+end";
- answerCmd(ans,ctx);
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = dataArray[4];
- String num = dataArray[5];
- String eleData = dataArray[6];
- Date now = new Date();
- try {
- PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
- if (ObjectUtils.isEmpty(portChangeData)) {
- portChangeData = new PortChangeData();
- portChangeData.setNum(Integer.parseInt(num));
- portChangeData.setCreateTime(now);
- portChangeData.setGatwayCode(gateWayCode);
- portChangeData.setTerminalCode(gateWayCode+terminalCode);
- portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
- portChangeData.setBeforeElectricCurrent(eleData);
- portChangeDataService.save(portChangeData);
- }else {
- portChangeData.setBeforeElectricCurrent(eleData);
- portChangeDataService.updateById(portChangeData);
- }
- }catch (Exception e){
- log.error(String.format("点位查询失败--> %s" ,askText));
- log.error(e);
- }
- }
- private synchronized void saveElectric(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+4+1+end";
- answerCmd(ans,ctx);
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = dataArray[4];
- String num = dataArray[5];
- String eleData = dataArray[6];
- Date now = new Date();
- try {
- PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
- if (ObjectUtils.isEmpty(portChangeData)) {
- portChangeData = new PortChangeData();
- portChangeData.setNum(Integer.parseInt(num));
- portChangeData.setCreateTime(now);
- portChangeData.setGatwayCode(gateWayCode);
- portChangeData.setTerminalCode(gateWayCode+terminalCode);
- portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
- portChangeData.setElectricCurrent(eleData);
- portChangeDataService.save(portChangeData);
- }else {
- portChangeData.setElectricCurrent(eleData);
- portChangeDataService.updateById(portChangeData);
- }
- }catch (Exception e){
- log.error(String.format("点位查询失败--> %s" ,askText));
- log.error(e);
- }
- }
- public String reverseWithComma(String input) {
- String[] parts = input.split(",");
- List<String> partList = Arrays.asList(parts);
- Collections.reverse(partList);
- StringBuilder reversedBuilder = new StringBuilder();
- for (int i = 0; i < partList.size(); i++) {
- reversedBuilder.append(partList.get(i));
- if (i < partList.size() - 1) {
- reversedBuilder.append(",");
- }
- }
- return reversedBuilder.toString();
- }
- private synchronized void savePower(String askText, String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+3+1+end";
- answerCmd(ans,ctx);
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = dataArray[4];
- String num = dataArray[5];
- int[] splitPower = Arrays.stream(dataArray[6].split(",")).mapToInt(Integer::parseInt).toArray();
- int[] splitBeforePower = Arrays.stream(dataArray[7].split(",")).mapToInt(Integer::parseInt).toArray();
- Date now = new Date();
- try {
- PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
- if (ObjectUtils.isEmpty(portChangeData)) {
- portChangeData = new PortChangeData(gateWayCode + terminalCode + terminalPortCode,gateWayCode + terminalCode ,gateWayCode,
- splitPower[0],splitPower[1],splitPower[2],
- splitBeforePower[0],splitBeforePower[1],splitBeforePower[2],
- now,Integer.parseInt(num));
- portChangeDataService.save(portChangeData);
- }else {
- portChangeData.setActivePower( splitPower[0]);
- portChangeData.setReactivePower( splitPower[1]);
- portChangeData.setApparentPower( splitPower[2]);
- portChangeData.setBeforeActivePower(splitBeforePower[0]);
- portChangeData.setBeforeReactivePower(splitBeforePower[1]);
- portChangeData.setBeforeApparentPower(splitBeforePower[2]);
- portChangeDataService.updateById(portChangeData);
- }
- }catch (Exception e){
- log.error(String.format("点位查询失败--> %s" ,askText));
- log.error(e);
- }
- }
- private void getHear(String askText,String[] dataArray, ChannelHandlerContext ctx,int version) {
- /**
- * 接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义
- * 映射libadd.so里面的函数,注意类型要匹配
- */
- String ans = "hm+1+1+end";
- answerCmd(ans,ctx);
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- TerminalPort terminalPort = new TerminalPort();
- terminalPort.setStatus(1);
- terminalPortService.update(terminalPort,new UpdateWrapper<TerminalPort>().like("device_code",gateWayCode + terminalCode));
- Terminal terminal = new Terminal();
- terminal.setStatus(1);
- terminalService.update(terminal,new UpdateWrapper<Terminal>().eq("device_code",gateWayCode + terminalCode));
- switch ( version){
- case 1:
- HeartInfo heartInfo1 = new HeartInfo(new Date(), gateWayCode + terminalCode, gateWayCode, askText);
- heartInfoService.save(heartInfo1);
- break;
- case 2:
- HeartInfo heartInfo2 = new HeartInfo(new Date(), gateWayCode + "1", gateWayCode, askText);
- heartInfoService.save(heartInfo2);
- break;
- default:
- log.info("未知版本");
- break;
- }
- }
- private void getChuanGanData(String askText,String[] dataArray, ChannelHandlerContext ctx) {
- String ans = "hm+2+1+end";
- answerCmd(ans,ctx);
- //hm+1+867699060007086+1+1+242+3+2494+9+0+0+31+0+0+0+V1.0+0+end
- String gateWayCode = dataArray[2];
- String terminalCode = dataArray[3];
- String terminalPortCode = dataArray[4];
- String voltage = getNum(dataArray[5]);
- String electriCurrent = getNum(dataArray[6]);
- String temp = getNum(dataArray[7]);
- String leakageValue = getNum(dataArray[8]);
- Date now = new Date();
- int[] splitPower = Arrays.stream(dataArray[9].split(",")).mapToInt(Integer::parseInt).toArray();
- int[] splitStatus =Arrays.stream(dataArray[10].split(",")).mapToInt(Integer::parseInt).toArray();
- EnvData envData = new EnvData(gateWayCode+terminalCode+terminalPortCode,gateWayCode+terminalCode,gateWayCode,
- voltage,electriCurrent,temp, leakageValue,
- splitPower[0],splitPower[1],splitPower[2],
- splitStatus[0],splitStatus[1],splitStatus[2],
- askText,now);
- envDataService.save(envData);
- //更新状态
- // try {
- TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", gateWayCode + terminalCode + terminalPortCode));
- if (ObjectUtils.isEmpty(deviceCode)){
- log.info(String.format("无端口设备--> %s" ,askText));
- return;
- }
- deviceCode.setVoltage(voltage);
- deviceCode.setElectricCurrent(electriCurrent);
- deviceCode.setTemp(temp);
- deviceCode.setLeakageValue(leakageValue);
- deviceCode.setActivePower( splitPower[0]);
- deviceCode.setReactivePower(splitPower[1]);
- deviceCode.setApparentPower(splitPower[2]);
- deviceCode.setHeightTempWarning( splitStatus[0]);
- deviceCode.setChargingWarning( splitStatus[1]);
- deviceCode.setLeakageWarning( splitStatus[2]);
- deviceCode.setUpdateTime(now);
- deviceCode.setStatus(1);
- terminalPortService.updateById(deviceCode);
- //添加报警
- saveWarning(gateWayCode,terminalCode,terminalPortCode,deviceCode,splitStatus,now);
- // }catch (Exception e){
- // log.error(String.format("端口设备查询失败--> %s" ,askText));
- // log.error(e);
- // }
- }
- private void saveWarning(String gateWayCode,String terminaCode,String terminalPortCode ,TerminalPort terminalPort,int[] splitStatus,Date now) {
- if (splitStatus[0] == 0 && splitStatus[1] == 0 &&splitStatus[2] == 0 )
- return;
- Integer farmId = terminalPort.getFarmId();
- Integer locationId = terminalPort.getLocationId();
- BaseFarm baseFarm = baseFarmService.getById(farmId);
- BasePigpen basePigpen = basePigpenService.getById(locationId);
- if (ObjectUtils.isEmpty(baseFarm)){
- log.info(String.format("无小区数据--> %s" ,terminalPort.toString()));
- return;
- }
- if (ObjectUtils.isEmpty(basePigpen)){
- log.info(String.format("无栋舍数据--> %s" ,terminalPort.toString()));
- return;
- }
- BasePigpen basePigpen1= basePigpenService.getById(basePigpen.getOther2().split(",")[1]);
- PortWarningInfo portWarningInfo = new PortWarningInfo();
- portWarningInfo.setGatwayCode(gateWayCode);
- portWarningInfo.setTerminalCode(gateWayCode+terminaCode);
- portWarningInfo.setTerminalPortCode(gateWayCode+ terminaCode +terminalPortCode);
- portWarningInfo.setLocationId(locationId);
- portWarningInfo.setFarmId(farmId);
- portWarningInfo.setWarningType(1);
- portWarningInfo.setCreateTime(now);
- if (splitStatus[0] == 1){
- portWarningInfo.setContent(String.format("%s 高温预警",basePigpen.getBuildName()));
- portWarningInfo.setWarningType(1);
- portWarningInfoService.save(portWarningInfo);
- List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
- for (SysAccountMultilevel sysAccountMultilevel : list) {
- WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
- sysAccountMultilevel.setSubscribe(0);
- sysAccountMultilevelService.updateById(sysAccountMultilevel);
- }
- WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 高温预警",basePigpen.getBuildName()));
- }
- if (splitStatus[1] == 1){
- portWarningInfo.setContent(String.format("%s 充电预警",basePigpen.getBuildName()));
- portWarningInfo.setWarningType(2);
- portWarningInfoService.save(portWarningInfo);
- List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
- for (SysAccountMultilevel sysAccountMultilevel : list) {
- WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
- sysAccountMultilevel.setSubscribe(0);
- sysAccountMultilevelService.updateById(sysAccountMultilevel);
- }
- WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 充电预警",basePigpen.getBuildName()));
- }
- if (splitStatus[2] == 1){
- portWarningInfo.setContent(String.format("%s 漏电预警",basePigpen.getBuildName()));
- portWarningInfo.setWarningType(3);
- portWarningInfoService.save(portWarningInfo);
- List<SysAccountMultilevel> list = sysAccountMultilevelService.list(new QueryWrapper<SysAccountMultilevel>().eq("last_farm_id", farmId).eq("subscribe", 1));
- for (SysAccountMultilevel sysAccountMultilevel : list) {
- WeChatMessage.sendMsg(now,"充电预警",basePigpen1.getBuildName(),basePigpen.getBuildName().substring(basePigpen1.getBuildName().length()),sysAccountMultilevel.getWechatId());
- sysAccountMultilevel.setSubscribe(0);
- sysAccountMultilevelService.updateById(sysAccountMultilevel);
- }
- WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 漏电预警",basePigpen.getBuildName()));
- }
- }
- private String getNum(String num){
- return String.format("%.1f", Double.parseDouble(num) / 10.0);
- }
- //应答
- public void answerCmd(String answerText, ChannelHandlerContext ctx) {
- log.info(String.format("应答数据--->%s",answerText));
- ctx.writeAndFlush(Unpooled.copiedBuffer(answerText.getBytes()));
- }
- //检查无效耳标
- public boolean checkValidEarmark(String earmark) {
- if (earmark.trim().equalsIgnoreCase("ffffffffffffffff") || earmark.trim().equalsIgnoreCase("0000000000000000")) {
- return true;
- } else {
- return false;
- }
- }
- //拆分粘包数据
- public JSONArray parseAskCmdPackage(String text) {
- String key = "end";
- Pattern pattern = Pattern.compile(key);
- Matcher matcher = pattern.matcher(text);
- int count = 0;
- while (matcher.find()) {
- count++;
- }
- JSONArray dataJa = new JSONArray();
- if (count == 1) {
- dataJa.add(text);
- } else {
- for (int a = 0; a < count; a++) {
- int p1 = text.indexOf("end");
- dataJa.add(text.substring(0, p1 + 3));
- text = text.substring(p1 + 3, text.length());
- }
- }
- return dataJa;
- }
- }
|