From 5867b06535d1c7e54117dc9af378f964b08f0e05 Mon Sep 17 00:00:00 2001 From: yiming Date: Thu, 29 Dec 2022 13:15:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0http=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=88=B0master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...宁福迦南HTTP通信协议文档12.2.doc | Bin 0 -> 108032 bytes readme.md | 4 + .../web/controller/MonitorController.java | 25 +++ .../leaper/web/service/CommandHandler.java | 36 ++++ .../leaper/web/service/CommandRunnable.java | 190 ++++++++++++++++++ .../leaper/web/service/ksec/KescFilter.java | 7 +- .../leaper/web/service/ksec/KsecDecoder.java | 164 +-------------- .../web/service/ksec/KsecNettyClient.java | 7 +- web/src/main/resources/application-dev.yml | 8 +- web/src/main/resources/application-prod.yml | 3 - web/src/main/resources/application-test.yml | 3 - web/src/main/resources/application.yml | 3 + 12 files changed, 268 insertions(+), 182 deletions(-) create mode 100644 doc/宁福迦南HTTP通信协议文档12.2.doc create mode 100644 web/src/main/java/com/leaper/web/controller/MonitorController.java create mode 100644 web/src/main/java/com/leaper/web/service/CommandHandler.java create mode 100644 web/src/main/java/com/leaper/web/service/CommandRunnable.java diff --git a/doc/宁福迦南HTTP通信协议文档12.2.doc b/doc/宁福迦南HTTP通信协议文档12.2.doc new file mode 100644 index 0000000000000000000000000000000000000000..4500064aee00198222cf76b044875341135c0087 GIT binary patch literal 108032 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 + + static { + String lotnum = FileUtil.getText("lastLotnum"); + if(lotnum != null){ + CommandRunnable.setLastLotnum(lotnum); + } + log.info("read lastLotnum:{}",lotnum); + } + + public static void exec(ChannelHandlerContext ctx, ByteBuf in){ + CommandRunnable commandRunnable = new CommandRunnable(in,ctx); + threadPoolExecutor.execute(commandRunnable); + } + + public static void exec(KsecInfo ksecInfo){ + CommandRunnable commandRunnable = new CommandRunnable(ksecInfo); + threadPoolExecutor.execute(commandRunnable); + } +} diff --git a/web/src/main/java/com/leaper/web/service/CommandRunnable.java b/web/src/main/java/com/leaper/web/service/CommandRunnable.java new file mode 100644 index 0000000..e2fff80 --- /dev/null +++ b/web/src/main/java/com/leaper/web/service/CommandRunnable.java @@ -0,0 +1,190 @@ +package com.leaper.web.service; + +import com.alibaba.fastjson.JSONObject; +import com.leaper.common.util.FileUtil; +import com.leaper.common.util.SpringContextUtil; +import com.leaper.web.pojo.Cmd; +import com.leaper.web.service.ksec.KsecDataInfo; +import com.leaper.web.service.ksec.KsecInfo; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.nio.charset.Charset; + +@Slf4j +public class CommandRunnable implements Runnable{ + + private static final Logger tcpLogger = LoggerFactory.getLogger("tcp"); + + public static void setLastLotnum(String lotnum){ + lastLotnum = lotnum; + } + + private static String lastLotnum; + + private PlcService plcService; + + private ByteBuf in; + + private ChannelHandlerContext ctx; + + private KsecInfo ksecInfo; + + private String content; + + /** + * TCP协议的 + * @param body + * @param ctx + */ + public CommandRunnable(ByteBuf body, ChannelHandlerContext ctx){ + this.in = body; + this.ctx = ctx; + this.plcService = SpringContextUtil.getBean(PlcService.class); + content = body.toString(Charset.forName("UTF-8")); + if(content.startsWith("<")){ + content = content.substring(1, content.length()); + ksecInfo = JSONObject.parseObject(content, KsecInfo.class); + } + tcpLogger.info("{}",content); + } + + /** + * HTTP协议的 + * @param ksecInfo + */ + public CommandRunnable(KsecInfo ksecInfo){ + this.ksecInfo = ksecInfo; + this.plcService = SpringContextUtil.getBean(PlcService.class); + tcpLogger.info("{}",JSONObject.toJSONString(ksecInfo)); + } + + @Override + public void run() { + if (Cmd.A.name().equals(ksecInfo.getType())) { + in.release(); + return ; + } + KsecDataInfo dataInfo = ksecInfo.getData(); + String lotnum = dataInfo.getLotnum(); + PlcCmdInfo plcCmdInfo = null; + String srmNumber = null; + String cmdName = null; + if(dataInfo != null){ + + plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum); + + srmNumber = dataInfo.getSRMNumber(); + cmdName = dataInfo.getCmdName(); + } + if (Cmd.A.name().equals(ksecInfo.getType())) { + //心跳 + log.debug("receieve heart "); + } else if (Cmd.B.name().equals(ksecInfo.getType())) { + + //任务 + if (Cmd.B1.name().equals(cmdName)) { + //昆船盘点模式下也会发B1 ,但是不会发送B2 + //这里判断下,是否存在盘点批次号 若存在,既是盘点的B1,无需处理;若不存在lotnum,则是随行的B1 + if(StringUtils.isEmpty(dataInfo.getLotnum())){ + //任务开始 旋转到原点位 + plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); + plcService.orderStart(plcCmdInfo); + }else { + log.info("check move"); + } + + } else if (Cmd.B2.name().equals(cmdName)) { + //B2 C4 一起发的,需要停止等B2 + + //这里判断是不是双伸 + if(plcCmdInfo.getSeparation2() == 2){ + //深测货架延迟 + try { + Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }else { + //浅侧延迟 + try { + Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); + plcService.orderStop(plcCmdInfo); + } + } else if (Cmd.C.name().equals(ksecInfo.getType())) { + + //动作 + String code = dataInfo.getCmdName(); + log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString()); + if (Cmd.isBaseAction(code)) { + //执行动作,需要保存执行到第几步了 + Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); + plcCmdInfo.setTimes(times); + code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times); + //执行动作 + try { + plcService.action(plcCmdInfo, times, code); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }else { + log.info("other C code :{}",code); + } + } else if (Cmd.D.name().equals(ksecInfo.getType())) { + + //柳州去掉告警 + String code = dataInfo.getCmdName(); + if(code.equals(Cmd.D1.name())){ + log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); + //根据告警code转动camera + String warnCode = dataInfo.getWarnCode(); + if(!StringUtils.isEmpty(warnCode)){ + String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0]; + plcService.warnAction(plcCmdInfo,warnCode0); + } + plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); + }else if(code.equals(Cmd.D2.name())){ + log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); + plcService.warnStop(plcCmdInfo.getPlcId()); + }else { + log.info("other D code :{}",code); + } + } else if (Cmd.E.name().equals(ksecInfo.getType())) { + + //盘点 + //转球机到盘点位 然后拍照 + + if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){ + //需要把stock表truncate + FileUtil.save(lotnum,"lastLotnum"); + tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum); + plcService.truncateStock(); + lastLotnum = lotnum; + } + plcCmdInfo.setTimes(1); + Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode()); + if(ok){ + ksecInfo.getData().setAckStatus(1); + }else { + ksecInfo.getData().setAckStatus(0); + } + if(ctx != null){ + ctx.channel().writeAndFlush(ksecInfo); + } + } + if(in != null){ + in.release(); + } + } + + +} diff --git a/web/src/main/java/com/leaper/web/service/ksec/KescFilter.java b/web/src/main/java/com/leaper/web/service/ksec/KescFilter.java index 8008921..e8550ff 100644 --- a/web/src/main/java/com/leaper/web/service/ksec/KescFilter.java +++ b/web/src/main/java/com/leaper/web/service/ksec/KescFilter.java @@ -21,13 +21,10 @@ public class KescFilter extends ChannelInitializer { private KsecInfo ksecInfo; - private PlcService plcService; - private KsecNettyClient nettyClient; - public KescFilter(KsecInfo ksecInfo, PlcService plcService, KsecNettyClient nettyClient){ + public KescFilter(KsecInfo ksecInfo, KsecNettyClient nettyClient){ this.ksecInfo = ksecInfo; - this.plcService = plcService; this.nettyClient = nettyClient; } @@ -38,7 +35,7 @@ public class KescFilter extends ChannelInitializer { //4秒发一次心跳 ph.addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS)); ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes()); - ph.addLast(new KsecDecoder(10000,byteBuf,plcService)); + ph.addLast(new KsecDecoder(10000,byteBuf)); ph.addLast(new KescEncoder()); ph.addLast(new KescNettyHandler(ksecInfo,nettyClient)); } diff --git a/web/src/main/java/com/leaper/web/service/ksec/KsecDecoder.java b/web/src/main/java/com/leaper/web/service/ksec/KsecDecoder.java index 74dc65f..26c3da8 100644 --- a/web/src/main/java/com/leaper/web/service/ksec/KsecDecoder.java +++ b/web/src/main/java/com/leaper/web/service/ksec/KsecDecoder.java @@ -2,6 +2,7 @@ package com.leaper.web.service.ksec; import com.alibaba.fastjson.JSONObject; import com.leaper.web.pojo.Cmd; +import com.leaper.web.service.CommandHandler; import com.leaper.web.service.PlcService; import com.leaper.common.util.FileUtil; import com.leaper.web.service.GoodsActionTimes; @@ -25,21 +26,8 @@ import java.util.concurrent.TimeUnit; @Slf4j public class KsecDecoder extends DelimiterBasedFrameDecoder { - private static final Logger tcpLogger = LoggerFactory.getLogger("tcp"); - - public static void setLastLotnum(String lotnum){ - lastLotnum = lotnum; - } - - private static String lastLotnum; - - private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000)); - - private PlcService plcService; - - public KsecDecoder(int maxFrameLength, ByteBuf delimiter, PlcService plcService) { + public KsecDecoder(int maxFrameLength, ByteBuf delimiter) { super(maxFrameLength, delimiter); - this.plcService = plcService; } @Override @@ -49,153 +37,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { log.debug("no data"); return null; } - KescRunnable kescRunnable = new KescRunnable(in,ctx,plcService); - threadPoolExecutor.execute(kescRunnable); + CommandHandler.exec(ctx, in); return null; } - - public static class KescRunnable implements Runnable{ - - private ByteBuf in; - - private ChannelHandlerContext ctx; - - private PlcService plcService; - - public KescRunnable(ByteBuf body,ChannelHandlerContext ctx,PlcService plcService){ - this.in = body; - this.ctx = ctx; - this.plcService = plcService; - } - - @Override - public void run() { - String body = in.toString(Charset.forName("UTF-8")); - tcpLogger.info(body); - if (body.startsWith("<")){ - // 去掉首尾标识符 - body = body.substring(1, body.length()); - KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class); - if (Cmd.A.name().equals(ksecInfo.getType())) { - in.release(); - return ; - } - KsecDataInfo dataInfo = ksecInfo.getData(); - String lotnum = dataInfo.getLotnum(); - PlcCmdInfo plcCmdInfo = null; - String srmNumber = null; - String cmdName = null; - if(dataInfo != null){ - - plcCmdInfo = new PlcCmdInfo(dataInfo.getSRMNumber(), dataInfo.getTaskId(), dataInfo.getFromSide(), dataInfo.getFromDirection(), dataInfo.getFromColumn(), dataInfo.getFromRow(), dataInfo.getFromSeparation(),dataInfo.getToSide(), dataInfo.getToDirection(), dataInfo.getToColumn(), dataInfo.getToRow(),dataInfo.getToSeparation(),lotnum); - - srmNumber = dataInfo.getSRMNumber(); - cmdName = dataInfo.getCmdName(); - } - if (Cmd.A.name().equals(ksecInfo.getType())) { - //心跳 - log.debug("receieve heart "); - } else if (Cmd.B.name().equals(ksecInfo.getType())) { - - //任务 - if (Cmd.B1.name().equals(cmdName)) { - //昆船盘点模式下也会发B1 ,但是不会发送B2 - //这里判断下,是否存在盘点批次号 若存在,既是盘点的B1,无需处理;若不存在lotnum,则是随行的B1 - if(StringUtils.isEmpty(dataInfo.getLotnum())){ - //任务开始 旋转到原点位 - plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); - plcService.orderStart(plcCmdInfo); - }else { - log.info("check move"); - } - - } else if (Cmd.B2.name().equals(cmdName)) { - //B2 C4 一起发的,需要停止等B2 - - //这里判断是不是双伸 - if(plcCmdInfo.getSeparation2() == 2){ - //深测货架延迟 - try { - Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2OutDelayTime()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }else { - //浅侧延迟 - try { - Thread.sleep(plcService.getConfigProperties().getCameraConfig().getB2DelayTime()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - plcService.gyrateCamera(plcCmdInfo,Cmd.C5.name()); - plcService.orderStop(plcCmdInfo); - } - } else if (Cmd.C.name().equals(ksecInfo.getType())) { - - //动作 - String code = dataInfo.getCmdName(); - log.info("action code,{},orderInfo:{}", code, plcCmdInfo.toString()); - if (Cmd.isBaseAction(code)) { - //执行动作,需要保存执行到第几步了 - Integer times = GoodsActionTimes.put(plcCmdInfo.getOrderNum()); - plcCmdInfo.setTimes(times); - code = code + "-" + plcCmdInfo.getLeftRightStr(times) + plcCmdInfo.getInOutStr(times); - //执行动作 - try { - plcService.action(plcCmdInfo, times, code); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }else { - log.info("other C code :{}",code); - } - } else if (Cmd.D.name().equals(ksecInfo.getType())) { - - //柳州去掉告警 - String code = dataInfo.getCmdName(); - if(code.equals(Cmd.D1.name())){ - log.info("plcId:{},warn start",plcCmdInfo.getPlcId()); - //根据告警code转动camera - String warnCode = dataInfo.getWarnCode(); - if(!StringUtils.isEmpty(warnCode)){ - String warnCode0 = Cmd.D1.name()+"-"+warnCode.split(",")[0]; - plcService.warnAction(plcCmdInfo,warnCode0); - } - plcService.warnStart(plcCmdInfo.getPlcId(),dataInfo.getWarnCode()); - }else if(code.equals(Cmd.D2.name())){ - log.info("plcId:{},warn stop",plcCmdInfo.getPlcId()); - plcService.warnStop(plcCmdInfo.getPlcId()); - }else { - log.info("other D code :{}",code); - } - } else if (Cmd.E.name().equals(ksecInfo.getType())) { - - //盘点 - //转球机到盘点位 然后拍照 - - if(!StringUtils.isEmpty(lotnum) && !lotnum.equals(lastLotnum)){ - //需要把stock表truncate - FileUtil.save(lotnum,"lastLotnum"); - tcpLogger.info("truncate table ,last lotnum:{},new lotnum:{}",lastLotnum,lotnum); - plcService.truncateStock(); - lastLotnum = lotnum; - } - plcCmdInfo.setTimes(1); - Boolean ok = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode()); - if(ok){ - ksecInfo.getData().setAckStatus(1); - }else { - ksecInfo.getData().setAckStatus(0); - } - ctx.channel().writeAndFlush(ksecInfo); - - - } - //找到该货位的最后一张照片与现在的照片比照 - //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); - } - in.release(); - } - } } diff --git a/web/src/main/java/com/leaper/web/service/ksec/KsecNettyClient.java b/web/src/main/java/com/leaper/web/service/ksec/KsecNettyClient.java index b635757..57cb5a2 100644 --- a/web/src/main/java/com/leaper/web/service/ksec/KsecNettyClient.java +++ b/web/src/main/java/com/leaper/web/service/ksec/KsecNettyClient.java @@ -33,10 +33,7 @@ public class KsecNettyClient { private static Channel channel; public void createClient(ConfigProperties.KSEC ksec) throws InterruptedException { - String lotnum = FileUtil.getText("lastLotnum"); - if(lotnum != null){ - KsecDecoder.setLastLotnum(lotnum); - } + if (StringUtils.isEmpty(ksec.getIp()) || ksec.getPort() == null) { return; } @@ -44,7 +41,7 @@ public class KsecNettyClient { client.group(group); client.channel(NioSocketChannel.class); KsecInfo heart = KsecInfo.heart(); - client.handler(new KescFilter(heart, plcService,this)); + client.handler(new KescFilter(heart,this)); // 连接服务端 channel = client.connect(ksec.getIp(), ksec.getPort()).sync().channel(); } diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index b9a1135..172a097 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -17,18 +17,16 @@ spring: url: jdbc:mysql://115.236.65.98:12004/lia_duoji_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL -# --------本服务端口号 -server: - port: 8099 + #-------------- # ----------- # ----默认摄像头的连接信息 cameraConfig: # ------------球機選擇--- 0:利珀 1:海康 - cameraType: 0 + cameraType: 1 cameraPassword: a1234567 cameraUser: admin - cameraPort: 37777 + cameraPort: 8000 videoServer: 127.0.0.1:8083 #相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的 delayCaptureTime: 3500 diff --git a/web/src/main/resources/application-prod.yml b/web/src/main/resources/application-prod.yml index 1b99eaa..3cbfe3e 100644 --- a/web/src/main/resources/application-prod.yml +++ b/web/src/main/resources/application-prod.yml @@ -17,9 +17,6 @@ spring: url: jdbc:mysql://127.0.0.1:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL -# --------本服务端口号 -server: - port: 8099 #-------------- # ----------- # ----默认摄像头的连接信息 diff --git a/web/src/main/resources/application-test.yml b/web/src/main/resources/application-test.yml index d4ec534..cf2e001 100644 --- a/web/src/main/resources/application-test.yml +++ b/web/src/main/resources/application-test.yml @@ -17,9 +17,6 @@ spring: url: jdbc:mysql://127.0.0.1:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root validationQuery: SELECT 1 FROM DUAL -# --------本服务端口号 -server: - port: 8099 #-------------- # ----------- # ----默认摄像头的连接信息 diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index 35ee836..58bad61 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -1,3 +1,6 @@ +server: + # --------本服务端口号 + port: 8099 spring: profiles: active: @profileActive@