普天通讯协议

nanjing-yancao-wuliuzhongxin
yiming 3 years ago
parent 13589cee72
commit 584c99aab3

@ -109,13 +109,7 @@
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/core-1.0.0.jar</systemPath>
</dependency>
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>base-assembly</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/base-assembly-1.0.0.jar</systemPath>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>

@ -21,7 +21,7 @@
<dependency>
<groupId>com.zhehekeji</groupId>
<artifactId>base-assembly</artifactId>
<artifactId>common</artifactId>
<version>${base.assembly.version}</version>
</dependency>
<dependency>

@ -37,6 +37,16 @@ public class ConfigProperties {
private ScanCodeMode scanCodeMode;
/**
* IP
*/
private String IP;
/**
* TCP
*/
private Integer serverPort;
@Data
public static class CameraConfig{

@ -3,11 +3,16 @@ package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.web.entity.CheckLog;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.pojo.stock.CheckLogSearch;
import com.zhehekeji.web.pojo.street.StreetVO;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.ECTransmission;
import com.zhehekeji.web.service.client.TMTransmission;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.StreetService;
import com.zhehekeji.web.service.client.*;
import com.zhehekeji.web.service.putian.PTData;
import com.zhehekeji.web.service.putian.PTEmptyCheckContent;
import com.zhehekeji.web.service.putian.PuTianNettyClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@ -23,42 +28,135 @@ public class ClientTestController {
@Resource
private EmptyCheckService emptyCheckService;
@Resource
private StreetService streetService;
@Resource
private PlcService plcService;
@ApiOperation("空货位盘点【发起】")
@ApiOperation("模拟普天 空货位盘点【发起】")
@GetMapping("/emptyCheck/start")
public Result<Boolean> startEmptyCheck(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId, @ApiParam("检测第几行") Integer row){
ClientChanel.write(ECTransmission.toEmptyCheckStartString(SRMNumber),SRMNumber);
return Result.success();
public Result<String> startEmptyCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("检测第几行")@RequestParam Integer row,
@ApiParam("开始列")@RequestParam Integer startColumn,@ApiParam("结束列")@RequestParam Integer endColumn){
emptyCheckService.emptyCheckStart(SRMNumber,taskId,row);
String msg = ECTransmission.toEmptyCheckStartString(SRMNumber);
ClientChanel.write(msg,SRMNumber);
return Result.success(msg);
}
@ApiOperation("空货位盘点 【结束】")
@ApiOperation("模拟普天 空货位盘点 【结束】")
@GetMapping("/emptyCheck/stop")
public Result<Boolean> stopEmptyCheck(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId, @ApiParam("检测第几行") Integer row){
emptyCheckService.emptyCheckStart(SRMNumber,taskId,row);
ClientChanel.write(ECTransmission.toEmptyCheckEndString(SRMNumber),SRMNumber);
return Result.success();
public Result<String> stopEmptyCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId, @ApiParam("检测第几行")@RequestParam Integer row,
@ApiParam("开始列")@RequestParam Integer startColumn,@ApiParam("结束列")@RequestParam Integer endColumn){
String msg = ECTransmission.toEmptyCheckEndString(SRMNumber);
ClientChanel.write(msg,SRMNumber);
//获取空货位的结果信息
// 返回给普天
Street street = streetService.getStreetByPlcId(SRMNumber);
PTEmptyCheckContent ptEmptyCheckContent = null;
PTData ptData = null;
String shevel = null;
if(street.getLeftType() == 0){
//单伸
String SingleLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row);
shevel = "L01";
ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleLeft);
ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
String SingleRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,2,row);
shevel = "R01";
ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleRight);
ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
}else {
String SingleInLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row);
shevel = "L01";
ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleInLeft);
ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
String SingleInRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,2,row);
shevel = "R01";
ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleInRight);
ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
String SingleOutLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,2,1,row);
shevel = "L02";
ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleOutLeft);
ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
String SingleOutRight = emptyCheckService.getEmptyStatus(SRMNumber,taskId,2,2,row);
shevel = "R02";
ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,shevel,SingleOutRight);
ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
}
return Result.success(msg);
}
@ApiOperation("盘点具体货位 第一步 【发起盘点】")
@ApiOperation("模拟普天 盘点具体货位 第一步 【发起盘点】")
@GetMapping("/stockCheck/start")
public Result<Boolean> startStockCheck(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId,
@ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位02深,0001是X,0002是Y") String goodsLocation,@ApiParam("品规")String code,@ApiParam("数量")Integer count,
@ApiParam("是否是虚拟检测 Y:是 N:不是")String V){
public Result<String> startStockCheck(@ApiParam("巷道标识")@RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId,
@ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位02深,0001是X,0002是Y") @RequestParam String goodsLocation,@ApiParam("品规")@RequestParam String code,@ApiParam("数量") @RequestParam Integer count,
@ApiParam("是否是虚拟检测 Y:是 N:不是") @RequestParam String V){
TMTransmission tmTransmission = new TMTransmission(SRMNumber,taskId,goodsLocation,code,count,V);
ClientChanel.write(tmTransmission.toString(),SRMNumber);
String msg = tmTransmission.toString();
ClientChanel.write(msg,SRMNumber);
return Result.success();
}
@ApiOperation("盘点具体货位 第二步 【取货到载货台完成】")
@ApiOperation("模拟普天 盘点具体货位 第二步 【取货到载货台完成,客户端拍照】")
@GetMapping("/stockCheck/goodsMoveOver")
public Result<Boolean> goodsMoveOver(@ApiParam("巷道标识") String SRMNumber,@ApiParam("盘点批次ID") String taskId){
public Result<String> goodsMoveOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId){
TMTransmission tmTransmission = new TMTransmission(SRMNumber,taskId);
ClientChanel.write(tmTransmission.toSC02String(),SRMNumber);
String msg = tmTransmission.toSC02String();
ClientChanel.write(msg,SRMNumber);
return Result.success();
}
@ApiOperation("模拟普天 货物入库 【货位入库】")
@GetMapping("/intoStock/picOver")
public Result<String> picOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId,
@ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位02深,0001是X,0002是Y") @RequestParam String goodsLocation){
//todo 顶部拍照
Integer row = Integer.valueOf(goodsLocation.substring(3,7));
Integer column = Integer.valueOf(goodsLocation.substring(7));
String picPath = plcService.IntoStock(SRMNumber,"C1",row,column);
//返回普天
PTData ptData = PTData.IntoStock(SRMNumber,taskId,goodsLocation,picPath);
PuTianNettyClient.write(ptData);
return Result.success(ptData.toString());
}
@ApiOperation("模拟普天 货物入库完成 【货物入库完成】")
@GetMapping("/intoStock/goodsOver")
public Result<String> goodsOver(@ApiParam("巷道标识") @RequestParam String SRMNumber,@ApiParam("盘点批次ID") @RequestParam String taskId,
@ApiParam("货位号,如L0100010002 ,R/L表示左右,01是浅货位02深,0001是X,0002是Y") @RequestParam String goodsLocation){
//拍入库完成后的照片
Integer row = Integer.valueOf(goodsLocation.substring(3,7));
Integer column = Integer.valueOf(goodsLocation.substring(7));
String picPath = plcService.IntoStock(SRMNumber,"C2",row,column);
//向客户端发送读码指令,等待客户端返回条码
ISTransmission isTransmission = new ISTransmission(SRMNumber,taskId,goodsLocation);
//为防万一先清除code
ClientCodeMap.removeCode(SRMNumber);
ClientChanel.write(isTransmission.toString(),SRMNumber);
//发送结果给普天
//若1分钟内仍为收到 则放弃
Long start = System.currentTimeMillis();
while (ClientCodeMap.getCode(SRMNumber) == null && (System.currentTimeMillis()-start)<60000){
try {
Thread.sleep(300l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String code = ClientCodeMap.getCode(SRMNumber);
PTData ptData = PTData.IntoStock04(SRMNumber,taskId,goodsLocation,picPath,code);
PuTianNettyClient.write(ptData);
return Result.success();
}
}

@ -13,6 +13,7 @@ import com.zhehekeji.web.mapper.SensorGunMapper;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.service.client.NettyServer;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.putian.PuTianNettyClient;
import com.zhehekeji.web.service.robotic.NettyClient;
import com.zhehekeji.web.service.sick.SickNettyClient;
import lombok.extern.slf4j.Slf4j;
@ -39,9 +40,7 @@ public class InitService implements ApplicationRunner {
@Resource
private StreetMapper streetMapper;
@Resource
private NettyClient nettyClient;
@Resource
private KsecNettyClient ksecNettyClient;
private PuTianNettyClient puTianNettyClient;
@Resource
private ConfigProperties configProperties;
@ -80,43 +79,26 @@ public class InitService implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
nettyServer.CreateNettyServer(3001);
nettyServer.CreateNettyServer(configProperties.getServerPort());
//球机登录
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
cameras.forEach(camera -> {
LoginThread loginThread = new LoginThread(camera);
loginThread.start();
});
//plc连接
if(configProperties.getServerMode() == 0){
log.info("PLC TCP MODE");
//plc 连接状态初始化
List<Street> streets = streetMapper.selectByMap(new HashMap<>(0));
streets.forEach(street -> {
StreetConn.init(street.getId(),street.getPlcId());
try {
nettyClient.createClient(street);
}catch (Exception e){
log.error("streetId:{}初始plc连接失败,url:{},port:{}",street.getId(),street.getPlcIp(),street.getPlcPort());
}
});
}else if(configProperties.getServerMode() == 1){
log.info("KESC JSON MODE");
// 昆船协议
ConfigProperties.KSEC ksec = configProperties.getKsec();
if(ksec != null){
StreetConn.init(1,"ksec");
try {
ksecNettyClient.createClient(ksec);
puTianNettyClient.createClient(ksec);
}catch (Exception e){
log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort());
}
}else {
log.error("ksec no config");
}
}
TaskDelayExecutor.runMp4DownloadExecutor();
//TaskDelayExecutor.runMp4DownloadExecutor();
}
class LoginThread extends Thread{

@ -80,10 +80,6 @@ public class PlcService {
public Integer plcStatus() {
Integer count = 1;
if(configProperties.getServerMode() == 0){
count = streetMapper.selectCount(new QueryWrapper<>());
}
List<Integer> connIds = StreetConn.connList();
return (count - connIds.size());
}
@ -623,4 +619,28 @@ public class PlcService {
return configProperties;
}
/**
*
* @param SRMNumber
* @param PTZCode
* @return
*/
public String IntoStock(String SRMNumber,String PTZCode,Integer row,Integer column){
Street street = streetService.getStreetByPlcId(SRMNumber);
//南京烟草物流只有一个相机
Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id();
//转动拍照
gyrateCameraByCode(cameraId,PTZCode);
//等待2s再拍照
try {
Thread.sleep(2000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column);
cameraCapture(cameraId,false,0l,path);
return configProperties.getIP()+":9007/"+path;
}
}

@ -0,0 +1,25 @@
package com.zhehekeji.web.service.client;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public class ClientCodeMap {
/**
* 线map
*/
protected static Map<String,String> codeMap = new Hashtable<>();
public static void putCode(String SRMNumber,String code){
codeMap.put(SRMNumber,code);
}
public static String getCode(String SRMNumber){
return codeMap.get(SRMNumber);
}
public static void removeCode(String SRMNumber){
codeMap.remove(SRMNumber);
}
}

@ -0,0 +1,44 @@
package com.zhehekeji.web.service.client;
import lombok.Data;
@Data
public class ISTransmission {
private static String HEADER = "IS";
private static String Split = ",";
private String SRMNumber;
private String taskId;
private String goodsLocation;
private String code;
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append(HEADER).append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append(goodsLocation);
if(code != null){
sb.append(Split).append(code);
}
return sb.toString();
}
public ISTransmission(String SRMNumber,String taskId,String goodsLocation){
this.SRMNumber = SRMNumber;
this.goodsLocation = goodsLocation;
this.taskId = taskId;
}
public ISTransmission(String msg){
String [] strings = msg.split(Split);
HEADER = strings[0];
SRMNumber = strings[1];
goodsLocation = strings[2];
if(strings.length == 4){
code = strings[3];
}
}
}

@ -13,6 +13,21 @@ public class PTData {
public static String HEART_TYPE = "HB";
/**
*
*/
protected static String FLOW_NO_NEED_RES = ".";
/**
*
*/
protected static String FLOW_R = "R";
/**
*
*/
protected static String FLOW_A = "A";
/**
* 1.EmptyCheck01 EC01
* 2.EmptyCheck02: EC02
@ -45,10 +60,6 @@ public class PTData {
private String Content;
public String toString(){
return FlowControl + SPLIT + Type + SPLIT + Content + END_STRING;
}
public PTData(String data){
String[] strings = data.split(SPLIT);
FlowControl = strings[0];
@ -64,7 +75,35 @@ public class PTData {
return ptData;
}
public static PTData IntoStock(String SRMNumber,String taskId,String goodsLocation,String picPath){
StringBuffer contentSB = new StringBuffer();
contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(picPath);
PTData ptData = new PTData(contentSB.toString(),FLOW_NO_NEED_RES,Into_Stock_02);
return ptData;
}
public static PTData IntoStock04(String SRMNumber,String taskId,String goodsLocation,String picPath,String code){
StringBuffer contentSB = new StringBuffer();
contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(picPath).append(",").append(code);
PTData ptData = new PTData(contentSB.toString(),FLOW_NO_NEED_RES,Into_Stock_04);
return ptData;
}
public static PTData EmptyStatusResponse(PTEmptyCheckContent ptEmptyCheckContent){
return new PTData(ptEmptyCheckContent.toString(),FLOW_NO_NEED_RES,EMPTY_CHECK_03);
}
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append(this.FlowControl).append(SPLIT).append(Type).append(SPLIT).append(Content).append(END_STRING);
return sb.toString();
}
public PTData(String content,String Flow,String type){
this.FlowControl = Flow;
this.Content = content;
this.Type = type;
}
}

@ -29,15 +29,16 @@ public class PTDecoder extends LineBasedFrameDecoder {
* @param stripDelimiter true
* @param failFast
*/
public PTDecoder(int maxLength, boolean stripDelimiter, boolean failFast) {
public PTDecoder(int maxLength, boolean stripDelimiter, boolean failFast,EmptyCheckService emptyCheckService) {
super(maxLength, stripDelimiter, failFast);
this.emptyCheckService = emptyCheckService;
}
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
in = (ByteBuf) super.decode(ctx, in);
if(in != null){
String body = in.toString(Charset.forName("UTF-8"));
tcpLogger.info(body);
tcpLogger.info("received from PT:{}",body);
PTData ptData = new PTData(body);
if(ptData.getType().equals(PTData.HEART_TYPE)){
@ -45,14 +46,14 @@ public class PTDecoder extends LineBasedFrameDecoder {
}else if(ptData.getType().equals(PTData.EMPTY_CHECK_01)){
log.info("空货位检测开始");
PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(body);
PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
emptyCheckService.emptyCheckStart(checkContent.getSRMNUmber(), checkContent.getTaskNo(), checkContent.getRow());
String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(checkContent.getSRMNUmber());
//通知客户端开始检测
ClientChanel.write(startEmptyCheckStr,checkContent.getSRMNUmber());
}else if(ptData.getType().equals(PTData.EMPTY_CHECK_02)){
log.info("空货位检测结束");
PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(body);
PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
String endEmptyCheckStr = ECTransmission.toEmptyCheckEndString(checkContent.getSRMNUmber());
//通知客户端结束检测
ClientChanel.write(endEmptyCheckStr,checkContent.getSRMNUmber());

@ -37,6 +37,13 @@ public class PTEmptyCheckContent {
*/
private String type;
private String shelve;
/**
*
*/
private String emptyStatus;
public static PTEmptyCheckContent EmptyCheck(String data){
PTEmptyCheckContent ptContent = new PTEmptyCheckContent();
@ -49,4 +56,18 @@ public class PTEmptyCheckContent {
ptContent.setType(strings[5]);
return ptContent;
}
public static PTEmptyCheckContent emptyCheckResponse(String SRMNUmber,String taskId,int row,int startColumn,int endColumn,String shelve,String emptyStatus){
PTEmptyCheckContent ptContent = new PTEmptyCheckContent();
ptContent.setSRMNUmber(SRMNUmber);
ptContent.setTaskNo(taskId);
ptContent.setRow(row);
ptContent.setStartColumn(startColumn);
ptContent.setEndColumn(endColumn);
ptContent.setShelve(shelve);
ptContent.setEmptyStatus(emptyStatus);
return ptContent;
}
}

@ -1,5 +1,6 @@
package com.zhehekeji.web.service.putian;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.ksec.*;
import io.netty.buffer.ByteBuf;
@ -21,11 +22,14 @@ public class PTFilter extends ChannelInitializer<SocketChannel> {
private PlcService plcService;
private EmptyCheckService emptyCheckService;
private PuTianNettyClient nettyClient;
public PTFilter(PlcService plcService, PuTianNettyClient nettyClient){
public PTFilter(PlcService plcService, PuTianNettyClient nettyClient,EmptyCheckService emptyCheckService){
this.plcService = plcService;
this.nettyClient = nettyClient;
this.emptyCheckService = emptyCheckService;
}
@Override
@ -34,7 +38,7 @@ public class PTFilter extends ChannelInitializer<SocketChannel> {
//30秒发一次心跳
ph.addLast(new IdleStateHandler(0, 30, 0, TimeUnit.SECONDS));
ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes());
ph.addLast(new PTDecoder(1000,false,true));
ph.addLast(new PTDecoder(1000,false,true,emptyCheckService));
ph.addLast(new PtEncoder());
ph.addLast(new PTNettyHandler(nettyClient));
}

@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class PTNettyHandler extends ChannelInboundHandlerAdapter {
/** 客户端请求的心跳命令 */
private PTData heart;
private PTData heart = PTData.HeartBeat();
private PuTianNettyClient nettyClient;
@ -32,7 +32,7 @@ public class PTNettyHandler extends ChannelInboundHandlerAdapter {
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info("upPc connected ");
log.info("Pt connected ");
StreetConn.conn(1);
ctx.fireChannelActive();
}
@ -42,7 +42,7 @@ public class PTNettyHandler extends ChannelInboundHandlerAdapter {
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.info("upPc closed");
log.info("Pt closed");
StreetConn.disConn(1);
log.info(" streetId reconnect......");
nettyClient.reconnect(1);
@ -55,7 +55,7 @@ public class PTNettyHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception {
if (obj instanceof IdleStateEvent) {
log.debug("upPc send heart");
log.debug("Pt send heart");
ctx.channel().writeAndFlush(heart);
}

@ -3,6 +3,8 @@ package com.zhehekeji.web.service.putian;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
@ -11,9 +13,12 @@ import java.nio.charset.StandardCharsets;
*/
public class PtEncoder extends MessageToByteEncoder<PTData> {
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, PTData data, ByteBuf byteBuf) throws Exception {
String body = data.toString();
tcpLogger.info("send to PT:{}",body);
byteBuf.writeBytes(body.getBytes(StandardCharsets.UTF_8));
}
}

@ -1,6 +1,7 @@
package com.zhehekeji.web.service.putian;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.client.Decoder;
import com.zhehekeji.web.service.client.Encoder;
@ -28,6 +29,8 @@ public class PuTianNettyClient {
private PlcService plcService;
@Resource
private ConfigProperties configProperties;
@Resource
private EmptyCheckService emptyCheckService;
/**
*
@ -43,7 +46,8 @@ public class PuTianNettyClient {
Bootstrap client = new Bootstrap();
client.group(group);
client.channel(NioSocketChannel.class);
client.handler(new PTNettyHandler(this));
client.handler(new PTFilter(plcService,this,emptyCheckService));
// 连接服务端
channel = client.connect(ksec.getIp(), ksec.getPort()).sync().channel();
}
@ -84,9 +88,9 @@ public class PuTianNettyClient {
}
}
public static void write(KsecInfo ksecInfo){
public static void write(PTData ptData){
if(channel != null){
channel.writeAndFlush(ksecInfo);
channel.writeAndFlush(ptData);
}else {
log.error(" no connected upPc");
}

@ -34,35 +34,17 @@ cameraConfig:
videoServer: 127.0.0.1:8083
#相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
delayCaptureTime: 3500
#随行模式下的相机抓图延迟 毫秒,这个延迟是等待球机球机转动到位,然后拍照的
# 发了C1之后多久拍照
C1DelayCaptureTime: 1500
# 内侧货架 发了C2 之后多久拍照
C2DelayCaptureTime: 1500
# 外侧货架 发了C2 之后多久拍照
C2OutDelayCaptureTime: 2500
# 发了C3之后多久拍照
C3DelayCaptureTime: 1500
C4DelayCaptureTime: 1500
C4OutDelayCaptureTime: 1500
# 发了B2之后多久转原点位
B2DelayTime: 2000
# 外侧货架发了B2多久转原点位
B2OutDelayTime: 2000
# 下载mp4延迟 海康的下载mp4需要2分钟
# 利珀延迟10s就可
# 单位毫秒
delayDownloadMp4: 10000
# ------------
# -----图片 mp4下载地址
savePath:
mediaPath: d:\\data\media\
mp4Path: d://data/mp4/
# ------------服务端类型 0TCP(罗伯泰克) 1:KSEC(JSON)(昆船)
serverMode: 1
# 普天上位地址
ksec:
ip: 172.18.96.1
ip: 192.168.125.5
port: 3000
# 服务端TCP端口
serverPort: 3001
# ------------ 实时视频流 全部页面的格式 行列数量
videoStyleConfig:
videoStyleRow: 4
@ -77,13 +59,7 @@ lightSource:
index: 1
# -----tray 托盘
# -----goods 货物
# 扫码模式 0:此处不盘点 1球机扫码 2sick扫码枪 3:南北达RFID
scanCodeMode:
tray: 1
goods: 0
goodsCodeTypes:
- 14
trayCodeTypes:
- 14
# 照片 視頻保存多久
deleteFileDays: 365
# 服务端IP
IP: 192.168.1.1

@ -128,6 +128,7 @@
<!-- additivity属性为false表示此logger的打印信息不再向上级传递(注该值默认为truelogger的日志信息会依次向上级传递最高级logger为root如果不加则至少打印2次本身一次root一次)-->
<logger name="tcp" additivity="false" level="INFO">
<appender-ref ref="tcpAppender"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="sick" additivity="false" level="INFO">

Loading…
Cancel
Save