修改通讯方式,web端tcp服务端接收wcs发送的命令,客户端给wcs发送结果信息;更新通讯报文格式

nanjing-yancao-wuliuzhongxin-qsl
QuShuailong 3 years ago
parent e371363744
commit 6ea541fb2a

@ -35,6 +35,11 @@ public class PathUtil {
String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
return cameraId+"/"+row+"-"+column+"/"+date + "/" +now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss-"))+row+"-"+column + "."+fileType;
}
public static String createFileNameByRowColumn(String fileType,Integer cameraId,Integer row,Integer column, String goodsLocation){
LocalDateTime now = LocalDateTime.now();
String date = now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
return cameraId+"/"+row+"-"+column+"/"+date + "/" +now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss-"))+ goodsLocation + "."+fileType;
}
/**
*

@ -92,6 +92,8 @@ public class ConfigProperties {
public static class KSEC{
private String ip;
private Integer port;
// private Integer reconnectNum = 10;
// private long reconnectInterval = 10000;
}
@Data

@ -38,8 +38,9 @@ public class ClientTestController {
@GetMapping("/emptyCheck/start")
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,startColumn,endColumn);
String msg = ECTransmission.toEmptyCheckStartString(SRMNumber,taskId,row,startColumn,endColumn);
// emptyCheckService.emptyCheckStart(SRMNumber,taskId,row,startColumn,endColumn);
// String msg = ECTransmission.toEmptyCheckStartString(SRMNumber,taskId,row,startColumn,endColumn);
String msg = "";
ClientChanel.write(msg, SRMNumber);
return Result.success(msg);
}
@ -48,7 +49,8 @@ public class ClientTestController {
@GetMapping("/emptyCheck/stop")
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,taskId,row,startColumn,endColumn);
// String msg = ECTransmission.toEmptyCheckEndString(SRMNumber,taskId,row,startColumn,endColumn);
String msg = "";
ClientChanel.write(msg,SRMNumber);
//获取空货位的结果信息
// 返回给普天
@ -56,11 +58,11 @@ public class ClientTestController {
//String shevel = null;
Map<String,String> map = emptyCheckService.getAllEmptyStatus(SRMNumber,row,startColumn,endColumn);
map.forEach((k,v)->{
PTEmptyCheckContent ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,k,v);
PTData ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
PuTianNettyClient.write(ptData);
});
// map.forEach((k,v)->{
// PTEmptyCheckContent ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(SRMNumber,taskId,row,startColumn,endColumn,k,v);
// PTData ptData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// PuTianNettyClient.write(ptData);
// });
// if(street.getLeftType() == 0){
// //单伸
// String SingleLeft = emptyCheckService.getEmptyStatus(SRMNumber,taskId,1,1,row,startColumn,endColumn);
@ -129,7 +131,7 @@ public class ClientTestController {
String picPath = plcService.IntoStock(SRMNumber,taskId,goodsLocation);
//返回普天
PTData ptData = PTData.IntoStock(SRMNumber,taskId,goodsLocation,picPath);
PTData ptData = PTData.IntoStock02(SRMNumber,taskId,goodsLocation,picPath);
PuTianNettyClient.write(ptData);
return Result.success(ptData.toString());
}

@ -112,8 +112,8 @@ public class EmptyCheckService {
*
* @param
*/
public void emptyCheckStart(String SRMNUmber,String taskId,Integer row,Integer startColumn,Integer endColumn){
log.info("空托盘检测 按行开始SRMNUmber:{},taskNo:{},row:{},startColumn:{},endColumn:{}",SRMNUmber,taskId,row,startColumn,endColumn);
public void emptyCheckStart(String SRMNUmber,String taskId){
log.info("空托盘检测 按行开始SRMNUmber:{},taskNo:{}",SRMNUmber,taskId);
Street street = streetService.getStreetByPlcId(SRMNUmber);
if(street == null){
log.error(" no SRMNumer:{}",SRMNUmber);
@ -129,12 +129,12 @@ public class EmptyCheckService {
Map<String,Object> map = new HashMap<>();
//将这些位置的旧数据清空
UpdateWrapper<EmptyCheck> wrapper = new UpdateWrapper<>();
wrapper.eq("street_id",street.getId()).eq("`row`",row).ge("`column`",startColumn).le("`column`",endColumn);
// wrapper.eq("street_id",street.getId()).eq("`row`",row).ge("`column`",startColumn).le("`column`",endColumn);
emptyCheckMapper.delete(wrapper);
//新增空的盘点统计
List<CheckStreetSummary> checkStreetSummaries = checkStreetSummaryMapper.selectList(new QueryWrapper<CheckStreetSummary>().eq("street_id",street.getId()).eq("task_id",taskId));
if(checkStreetSummaries.size() == 0){
log.info("新增盘点统计SRMNUmber:{},taskNo:{},row:{}",SRMNUmber,taskId,row);
log.info("新增盘点统计SRMNUmber:{},taskNo:{}",SRMNUmber,taskId);
CheckStreetSummary checkStreetSummary = new CheckStreetSummary();
checkStreetSummary.setTaskId(taskId);
checkStreetSummary.setStartTime(LocalDateTime.now());
@ -215,7 +215,7 @@ public class EmptyCheckService {
String L02 = getEmptyStatus(street.getId(),2,1,row,startColumn,endColumn);
map.put("L02",L02);
}
if(street.getRightType() == 2){
if(street.getRightType() == 1){
String R02 = getEmptyStatus(street.getId(),2,2,row,startColumn,endColumn);
map.put("R02",R02);
}

@ -254,6 +254,7 @@ public class PlcService {
}else {
cameraControlModule.pic(cameraId,0,realPath);
}
log.info("capture the photo: {}", realPath);
return path;
}
@ -446,10 +447,10 @@ public class PlcService {
public Stock checkStart(TMTransmission tmTransmission){
log.info("【开始盘点货位】save stock info ,taskId:{},SRMNumber:{}goodsLocation:{}",tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),tmTransmission.getGoodsLocation());
Street street = streetService.getStreetByPlcId(tmTransmission.getSRMNumber());
Integer row = Integer.valueOf(tmTransmission.getGoodsLocation().substring(3,7));
Integer column = Integer.valueOf(tmTransmission.getGoodsLocation().substring(7));
Integer leftRight = tmTransmission.getGoodsLocation().substring(0,1).equals("L")?1:2;
Integer inout = Integer.valueOf(tmTransmission.getGoodsLocation().substring(1,3));
Integer row = Integer.valueOf(tmTransmission.getGoodsLocation().substring(5,8));
Integer column = Integer.valueOf(tmTransmission.getGoodsLocation().substring(8,10));
Integer leftRight = Integer.valueOf(tmTransmission.getGoodsLocation().substring(4,5));
Integer inout = Integer.valueOf(tmTransmission.getGoodsLocation().substring(10,12));
Stock old = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),leftRight,inout,row,column);
if(old == null){
old = new Stock();
@ -488,10 +489,10 @@ public class PlcService {
public Stock checkEnd(TMTransmission tmTransmission){
log.info("【盘点货位结果返回】update stock info ,taskId:{},SRMNumber:{},goodsLocation:{}",tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),tmTransmission.getGoodsLocation());
Street street = streetService.getStreetByPlcId(tmTransmission.getSRMNumber());
Integer row = Integer.valueOf(tmTransmission.getGoodsLocation().substring(3,7));
Integer column = Integer.valueOf(tmTransmission.getGoodsLocation().substring(7));
Integer leftRight = tmTransmission.getGoodsLocation().substring(0,1).equals("L")?1:2;
Integer inout = Integer.valueOf(tmTransmission.getGoodsLocation().substring(1,3));
Integer row = Integer.valueOf(tmTransmission.getGoodsLocation().substring(5,8));
Integer column = Integer.valueOf(tmTransmission.getGoodsLocation().substring(8,10));
Integer leftRight = Integer.valueOf(tmTransmission.getGoodsLocation().substring(4,5));
Integer inout = Integer.valueOf(tmTransmission.getGoodsLocation().substring(10,12));
Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn(street.getId(),leftRight,inout,row,column);
if(stock != null){
stock.setCount(tmTransmission.getCount());
@ -580,12 +581,16 @@ public class PlcService {
*/
public String IntoStock(String SRMNumber,String taskId,String goodsLocation){
Street street = streetService.getStreetByPlcId(SRMNumber);
if (street == null){
log.error("SRMNum: {} 对应的巷道不存在");
}
//南京烟草物流只有一个相机
Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id();
Integer row = Integer.valueOf(goodsLocation.substring(3,7));
Integer column = Integer.valueOf(goodsLocation.substring(7));
Integer leftRight = goodsLocation.substring(0,1).equals("L")?1:2;
Integer inout = Integer.valueOf(goodsLocation.substring(1,3));
Integer row = Integer.valueOf(goodsLocation.substring(8,10));
Integer column = Integer.valueOf(goodsLocation.substring(5,8));
Integer leftRight = Integer.valueOf(goodsLocation.substring(4,5));
Integer inout = Integer.valueOf(goodsLocation.substring(11,12));
log.info("camera id:{}, row:{}, column:{}, direction:{}, inout:{}", cameraId, row, column, leftRight, inout);
//转动拍照
gyrateCameraByCode(cameraId,"C1");
@ -596,7 +601,8 @@ public class PlcService {
e.printStackTrace();
}
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column);
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column, goodsLocation);
Order oldOrder = orderMapper.getOneByOrderNum(taskId);
Order order = new Order();
order.setStreetId(street.getId());
order.setOrderNum(taskId);
@ -606,9 +612,13 @@ public class PlcService {
order.setIntoStockTime(LocalDateTime.now());
order.setRow1(row);
order.setColumn1(column);
if (oldOrder != null){
orderMapper.updateById(order);
}else{
orderMapper.insert(order);
}
cameraCapture(cameraId,false,0l,path);
return configProperties.getIP()+":9007/"+path;
return configProperties.getIP()+":9007/api/pic/"+path;
}
/**
@ -620,10 +630,11 @@ public class PlcService {
Street street = streetService.getStreetByPlcId(SRMNumber);
//南京烟草物流只有一个相机
Integer cameraId = street.getCamera1Id() == null ? street.getCamera2Id():street.getCamera1Id();
Integer row = Integer.valueOf(goodsLocation.substring(3,7));
Integer column = Integer.valueOf(goodsLocation.substring(7));
Integer leftRight = goodsLocation.substring(0,1).equals("L")?1:2;
Integer inout = Integer.valueOf(goodsLocation.substring(1,3));
Integer row = Integer.valueOf(goodsLocation.substring(8,10));
Integer column = Integer.valueOf(goodsLocation.substring(5,8));
Integer leftRight = Integer.valueOf(goodsLocation.substring(4,5));
Integer inout = Integer.valueOf(goodsLocation.substring(11,12));
log.info("camera id:{}, row:{}, column:{}, direction:{}, inout:{}", cameraId, row, column, leftRight, inout);
String inoutString = inout == 1 ? "IN" : "OUT";
String leftRightString = leftRight == 1 ? "L":"R";
//转动拍照
@ -636,7 +647,7 @@ public class PlcService {
e.printStackTrace();
}
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column);
String path = PathUtil.createFileNameByRowColumn("jpg",cameraId,row,column, goodsLocation);
Order order = orderMapper.getOneByOrderNum(taskId);
if(order != null){
Order upd = new Order();
@ -646,7 +657,6 @@ public class PlcService {
orderMapper.updateById(upd);
}
cameraCapture(cameraId,false,0l,path);
return configProperties.getIP()+":9007/"+path;
return configProperties.getIP()+":9007/api/pic/"+path;
}
}

@ -9,11 +9,12 @@ import lombok.Data;
public class CETransmission {
private static String HEADER = "CE";
private static String Split = "&";
private String SRMNumber;
public String toString(){
return HEADER + "," + SRMNumber;
return HEADER + Split + SRMNumber;
}
public static String getHEADER(){
@ -21,7 +22,7 @@ public class CETransmission {
}
public CETransmission(String body){
String [] strings = body.split(",");
String [] strings = body.split(Split);
if(strings != null && strings.length == 2 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
}

@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@ -42,7 +43,7 @@ public class ClientChanel {
}
public static void putSRMNUmber_Ip(String ID,String ip){
SRMNumber_IPMap.put(ip,ID);
SRMNumber_IPMap.put(ID,ip);
}
public static String getIpFromId(String ID){
@ -57,13 +58,15 @@ public class ClientChanel {
return IP_SRMNumberMap.get(ip);
}
public static void connect(String key, Channel channel){
channelMap.put(key,channel);
public static void connect(String SRMNumber, Channel channel){
channelMap.put(SRMNumber,channel);
InetSocketAddress socketAddress = (InetSocketAddress) channel.remoteAddress();
String clientIp = socketAddress.getAddress().getHostAddress();
putSRMNUmber_Ip(SRMNumber, clientIp);
}
public static void disConnect(String key){
channelMap.remove(key);
}
public static Set<String> keys(){

@ -1,10 +1,10 @@
package com.zhehekeji.web.service.client;
import com.sun.org.apache.bcel.internal.generic.PUTFIELD;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.putian.PTData;
import com.zhehekeji.web.service.putian.PuTianNettyClient;
import com.zhehekeji.web.service.putian.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
@ -14,6 +14,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@ -26,13 +27,21 @@ public class Decoder extends DelimiterBasedFrameDecoder {
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
public static String PT_CLIENT = "PT";
private static String WCS_CLIENT = "WCS";
private static String EMPTY_CLIENT = "EMPTY";
private static String END_STRING = "$";
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,15,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
private EmptyCheckService emptyCheckService;
private PlcService plcService;
public Decoder(PlcService plcService,EmptyCheckService emptyCheckService) {
super(200,true,false, Unpooled.copiedBuffer(";".getBytes()));
super(20000,true,false, Unpooled.copiedBuffer(">".getBytes()),
Unpooled.copiedBuffer("$".getBytes()));
this.plcService = plcService;
this.emptyCheckService = emptyCheckService;
}
@ -69,7 +78,94 @@ public class Decoder extends DelimiterBasedFrameDecoder {
@Override
public void run() {
String body = in.toString(Charset.forName("UTF-8"));
tcpLogger.info("client:{}",body);
tcpLogger.info("receive client:{}, data length:{}",body, body.length());
//普天发送的报文里带"#"
if(body.contains("#")){
ClientChanel.connect(WCS_CLIENT, ctx.channel());
tcpLogger.info("client:{} connect", WCS_CLIENT);
PTData ptData = new PTData(body+END_STRING);
if(ptData.getType().equals(PTData.HEART_TYPE) ||
ptData.getFlowControl().equals(PTData.FLOW_A)){
//心跳 什么都不处理,因为netty长链接断开会感知
//普天回复的消息也不用处理
}
// else if (ptData.getType().equals(PT_CLIENT)){
// ClientChanel.connect(WCS_CLIENT, ctx.channel());
// tcpLogger.info("client:{} connect", WCS_CLIENT);
// }
else if (ptData.getType().equals(PTData.EMPTY_CHECK_01)){
log.info("空货位检测开始");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.EMPTY_CHECK_01);
PuTianNettyClient.write(ptDataSend);
PTEmptyCheckContent emptyCheckContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(emptyCheckContent.getSRMNUmber(),emptyCheckContent.getTaskNo());
//通知客户端开始检测
ClientChanel.write(startEmptyCheckStr,emptyCheckContent.getSRMNUmber());
in.release();
}
else if (ptData.getType().equals(PTData.EMPTY_CHECK_02)){
log.info("空货位检测结束");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.EMPTY_CHECK_02);
PuTianNettyClient.write(ptDataSend);
PTEmptyCheckContent emptyCheckContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
String endEmptyCheckStr = ECTransmission.toEmptyCheckEndString(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo());
// //通知客户端结束检测
ClientChanel.write(endEmptyCheckStr, emptyCheckContent.getSRMNUmber());
in.release();
}
else if (ptData.getType().equals(PTData.STOCK_CHECK_01)){
log.info("具体货位盘点");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.STOCK_CHECK_01);
PuTianNettyClient.write(ptDataSend);
//发送给客户端
PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC01(ptData.getContent());
TMTransmission tmTransmission = new TMTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo(),ptCheckContent.getGoodsLocation(),ptCheckContent.getCode(), ptCheckContent.getCount(), "N");
// plcService.checkStart(tmTransmission);
String tmTransmissionStr = tmTransmission.toString();
ClientChanel.write(tmTransmissionStr,ptCheckContent.getSRMNUmber());
in.release();
}
else if (ptData.getType().equals(PTData.STOCK_CHECK_02)){
log.info("盘点具体货位 ,货物已取到载货台");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.STOCK_CHECK_02);
PuTianNettyClient.write(ptDataSend);
PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC02(ptData.getContent());
TMTransmission tmTransmission = new TMTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo());
String tmTransmissionStr = tmTransmission.toSC02String();
ClientChanel.write(tmTransmissionStr,ptCheckContent.getSRMNUmber());
}
else if (ptData.getType().equals(PTData.Into_Stock_01)){
log.info("入库顶部拍照");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.Into_Stock_01);
PuTianNettyClient.write(ptDataSend);
//保存order标表
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent());
String srmNumber = ptOrderContent.getSRMNUmber();
if (srmNumber.length() < 3){
Integer number = Integer.valueOf(srmNumber);
srmNumber = String.format("%03d", number);
}
String picPath = plcService.IntoStock(srmNumber, ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
//返回普天
PTData resData = PTData.IntoStock02(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath);
PuTianNettyClient.write(resData);
}
else if (ptData.getType().equals(PTData.Into_Stock_03)){
log.info("入库侧面拍照");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.Into_Stock_03);
PuTianNettyClient.write(ptDataSend);
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent());
String srmNumber = ptOrderContent.getSRMNUmber();
if (srmNumber.length() < 3){
Integer number = Integer.valueOf(srmNumber);
srmNumber = String.format("%03d", number);
}
String picPath = plcService.IntoStockOver(srmNumber, ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
PTData resData = PTData.IntoStock04(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(), picPath, ptOrderContent.getGoodsLocation());
PuTianNettyClient.write(resData);
}
}
else{
if(body.startsWith(HBTransmission.getHEADER())) {
//心跳
HBTransmission hbTransmission = new HBTransmission(body);
@ -82,45 +178,62 @@ public class Decoder extends DelimiterBasedFrameDecoder {
TMTransmission tmTransmission = new TMTransmission(body);
if(tmTransmission.isCollectOver()){
//给普天发送数据采集完毕指令
PTData ptData = PTData.StockCheck03(tmTransmission.getSRMNumber(),tmTransmission.getTaskNo(),tmTransmission.getGoodsLocation(),"Y");
PTData ptData = PTData.StockCheck03(tmTransmission.getSRMNumber(),tmTransmission.getTaskNo(),"1");
PuTianNettyClient.write(ptData);
}else {
//收到盘点结果
Stock stock = plcService.checkEnd(tmTransmission);
// Stock stock = plcService.checkEnd(tmTransmission);
//将盘点结果发给普天
PTData ptData = PTData.StockCheck04(tmTransmission.getSRMNumber(),tmTransmission.getTaskNo(),tmTransmission.getGoodsLocation(),stock);
PTData ptData = PTData.StockCheck04(tmTransmission);
PuTianNettyClient.write(ptData);
//添加到实时信息里
RealtimeCheckMap.put(tmTransmission.getSRMNumber(),tmTransmission.checkInfo());
// RealtimeCheckMap.put(tmTransmission.getSRMNumber(),tmTransmission.checkInfo());
//更新盤點統計
emptyCheckService.updateCheckLastTime(tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),stock.getCode());
// emptyCheckService.updateCheckLastTime(tmTransmission.getTaskNo(),tmTransmission.getSRMNumber(),stock.getCode());
}
in.release();
}else if(body.startsWith(CETransmission.getHEADER())){
//客户端建立连接
CETransmission ceTransmission = new CETransmission(body);
//回复客户端,建立连接完成
ctx.channel().writeAndFlush(ceTransmission.toString());
ClientChanel.connect(ceTransmission.getSRMNumber(), ctx.channel());
tcpLogger.info("client:{} connect", ceTransmission.getSRMNumber());
in.release();
}else if(body.startsWith(ECTransmission.getHEADER())){
}
else if(body.startsWith(ECTransmission.getHEADER())){
//空货位盘点
ECTransmission ecTransmission = new ECTransmission(body);
log.info("empty result: {}", body);
//将库位的盘点结果发给普天
StringBuffer strBff = new StringBuffer(ecTransmission.getSRMNumber());
strBff.append("*").append(ecTransmission.getTaskId()).append("*").append(ecTransmission.getEmptyMsg());
// strBff.append(",").append(ecTransmission.getIsEmpty());
String content = strBff.toString();
PTData ptData = new PTData(content, PTData.FLOW_R, PTData.EMPTY_CHECK_03);
PuTianNettyClient.write(ptData);
//保存空货位条码
EmptyCheckCodeInfo.addCode(ecTransmission.getSRMNumber(),ecTransmission.getRow(),ecTransmission.getStartColumn(), ecTransmission.getEndColumn(), ecTransmission.getOriginCode());
//保存空货位信息
emptyCheckService.emptyCheckLog(ecTransmission);
in.release();
}else if(body.startsWith("DC")){
}
else if(body.startsWith("DC")){
//客户端断开连接
String [] strings = body.split(",");
String [] strings = body.split("&");
if(strings != null && strings.length == 2){
tcpLogger.info("client:{} disConnect", strings[1]);
ClientChanel.disConnect(strings[1]);
}
in.release();
}
// else if (body.contains("EMPTY_CLIENT")){
// ClientChanel.connect(EMPTY_CLIENT_NAME, ctx.channel());
// tcpLogger.info("client:{} connect", EMPTY_CLIENT_NAME);
// in.release();
// }
}
}
}

@ -14,8 +14,9 @@ import lombok.Data;
public class ECTransmission {
private static String HEADER = "EC";
private static String Split = "&";
private static String Split = ",";
// private static String Split = ",";
private String SRMNumber;
@ -27,6 +28,8 @@ public class ECTransmission {
private String isEmpty;
private String emptyMsg;
/**
* 1: 2
*/
@ -50,25 +53,26 @@ public class ECTransmission {
*/
private String originCode;
public String toString(){
return HEADER + "," + SRMNumber;
}
// public String toString(){
// return HEADER + Split + SRMNumber;
// }
public static String getHEADER(){
return HEADER;
}
public ECTransmission(String body){
String [] strings = body.split(",");
String [] strings = body.split(Split);
if(strings != null && strings.length == 4 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
taskId = strings[2];
goodsLocation = strings[3];
isEmpty = strings[4];
direction = goodsLocation.substring(0).equals("L") ? 1:2;
side = Integer.valueOf(goodsLocation.substring(2,3));
row = Integer.valueOf(goodsLocation.substring(3,6));
column = Integer.valueOf(goodsLocation.substring(6,9));
// goodsLocation = strings[3];
// isEmpty = strings[4];
emptyMsg = strings[3];
// direction = goodsLocation.substring(0).equals("L") ? 1:2;
// side = Integer.valueOf(goodsLocation.substring(2,3));
// row = Integer.valueOf(goodsLocation.substring(3,6));
// column = Integer.valueOf(goodsLocation.substring(6,9));
}else if(strings != null && strings.length == 8 && HEADER.equals(strings[0])){
//todo length == 9
SRMNumber = strings[1];
@ -90,9 +94,9 @@ public class ECTransmission {
*
* @return
*/
public static String toEmptyCheckStartString(String SRMNumber,String taskId,Integer row,Integer startColumn,Integer endColumn){
public static String toEmptyCheckStartString(String SRMNumber, String taskId){
StringBuffer sb = new StringBuffer(HEADER);
sb.append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append(row).append(Split).append(startColumn).append(Split).append(endColumn).append(Split).append("START");
sb.append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append("START");
return sb.toString();
}
@ -100,9 +104,9 @@ public class ECTransmission {
*
* @return
*/
public static String toEmptyCheckEndString(String SRMNumber,String taskId,Integer row,Integer startColumn,Integer endColumn){
public static String toEmptyCheckEndString(String SRMNumber, String taskId){
StringBuffer sb = new StringBuffer(HEADER);
sb.append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append(row).append(Split).append(startColumn).append(Split).append(endColumn).append(Split).append("END");
sb.append(Split).append(SRMNumber).append(Split).append(taskId).append(Split).append("END");
return sb.toString();
}
}

@ -15,8 +15,8 @@ public class EmptyCheckCodeInfo {
private static Map<String, Set<String>> allCode = new HashMap<>();
public static void start(String SRMNumber,Integer row,Integer startColumn,Integer endColumn){
String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn);
public static void start(String SRMNumber, String taskNo){
String key = String.format("{}-{}",SRMNumber, taskNo);
allCode.remove(key);
}
@ -29,8 +29,8 @@ public class EmptyCheckCodeInfo {
codes.add(code);
}
public static Set<String> getAllCode(String SRMNumber,Integer row,Integer startColumn,Integer endColumn){
String key = String.format("{}-{}-{}-{}",SRMNumber,row,startColumn,endColumn);
public static Set<String> getAllCode(String SRMNumber, String taskNo){
String key = String.format("{}-{}",SRMNumber, taskNo);
return allCode.get(key);
}

@ -12,12 +12,13 @@ import java.nio.charset.StandardCharsets;
*
*/
public class Encoder extends MessageToByteEncoder<String> {
private static String END_STRING = ">";
private static final Logger tcpLogger = LoggerFactory.getLogger("tcp");
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, String data, ByteBuf byteBuf) throws Exception {
data = data + ";";
tcpLogger.info("send to client:{}",data);
data = data + END_STRING;
tcpLogger.info("send to client:{}, length:{}",data, data.length());
byteBuf.writeBytes(data.getBytes(StandardCharsets.UTF_8));
}
}

@ -9,11 +9,12 @@ import lombok.Data;
public class HBTransmission {
private static String HEADER = "HB";
private static String Split = "&";
private String SRMNumber;
public String toString(){
return HEADER + "," + SRMNumber;
return HEADER + Split + SRMNumber;
}
public static String getHEADER(){
@ -21,7 +22,7 @@ public class HBTransmission {
}
public HBTransmission(String body){
String [] strings = body.split(",");
String [] strings = body.split(Split);
if(strings != null && strings.length == 2 && HEADER.equals(strings[0])){
SRMNumber = strings[1];
}

@ -22,7 +22,8 @@ public class NettyConnectHandler extends ChannelInboundHandlerAdapter {
public void channelActive(ChannelHandlerContext ctx) throws Exception {
InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
String clientIp = socketAddress.getAddress().getHostAddress();
log.info("ip:{} connected",clientIp);
int clientPort = socketAddress.getPort();
log.info("ip:{} port:{} connected",clientIp, clientPort);
ctx.fireChannelActive();
}
@ -33,7 +34,8 @@ public class NettyConnectHandler extends ChannelInboundHandlerAdapter {
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
String clientIp = socketAddress.getAddress().getHostAddress();
log.info("ip:{} disconnected",clientIp);
int clientPort = socketAddress.getPort();
log.info("ip:{} port:{} disconnected",clientIp, clientPort);
String ID = ClientChanel.getIDFromIp(clientIp);
//设置客户端下线
ClientChanel.disConnect(ID);

@ -36,10 +36,22 @@ public class TMTransmission {
private Integer count;
/**
*
*/
private String rstCode;
private String rstCount;
private String visualTest;
private String isDisConnect;
/**
*
*/
private String checkRst;
/**
* 1: 2
*/
@ -50,14 +62,14 @@ public class TMTransmission {
*/
private Integer side;
private static String Split = ",";
private static String Split = "&";
private boolean collectOver;
public String toString(){
StringBuffer sb = new StringBuffer(header);
sb.append(Split).append(SRMNumber).append(Split).append(taskNo).append(Split)
.append(goodsLocation).append(Split).append(trayNo).append(Split).append(code)
sb.append(Split).append(SRMNumber).append(Split).append(goodsLocation).append(Split)
.append(taskNo).append(Split).append(code)
.append(Split).append(count).append(Split).append(visualTest);
return sb.toString();
}
@ -70,25 +82,52 @@ public class TMTransmission {
return header;
}
// public TMTransmission(String body){
// String [] strings = body.split(Split);
// if(strings != null && strings.length >= 9 && strings[0].equals(header)){
// if(strings.length == 9){
// SRMNumber = strings[1];
// taskNo = strings[2];
// goodsLocation = strings[3];
// trayNo = strings[4];
// code = strings[5];
// count = Integer.valueOf(strings[6]);
// visualTest = strings[7];
// isDisConnect = strings[8];
// direction = goodsLocation.substring(0).equals("L") ? 1:2;
// side = Integer.valueOf(goodsLocation.substring(2,3));
// //checkType = strings[7];
// collectOver = false;
// if("Y".equals(isDisConnect)){
// //需要拆分之前的
// }
// }
//
// }else if(strings.length == 3){
// //是盘点数据采集完成的信号
// collectOver = true;
// SRMNumber = strings[1];
// taskNo = strings[2];
// //goodsLocation = strings[3];
// }
// }
public TMTransmission(String body){
String [] strings = body.split(Split);
if(strings != null && strings.length >= 9 && strings[0].equals(header)){
if(strings.length == 9){
SRMNumber = strings[1];
taskNo = strings[2];
goodsLocation = strings[3];
trayNo = strings[4];
code = strings[5];
count = Integer.valueOf(strings[6]);
visualTest = strings[7];
isDisConnect = strings[8];
direction = goodsLocation.substring(0).equals("L") ? 1:2;
side = Integer.valueOf(goodsLocation.substring(2,3));
//checkType = strings[7];
goodsLocation = strings[2];
taskNo = strings[3];
code = strings[4];
count = Integer.valueOf(strings[5]);
rstCode = strings[6];
rstCount = strings[7];
checkRst = strings[8];
collectOver = false;
if("Y".equals(isDisConnect)){
//需要拆分之前的
}
// if("Y".equals(isDisConnect)){
// //需要拆分之前的
// }
}
}else if(strings.length == 3){

@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class JYDamHelper {
public static JYDAMEquip Connect(String ip,int port){
JYDAMEquip equip = new JYDAMEquip();
equip.Init(ip,port,254);

@ -1,6 +1,5 @@
package com.zhehekeji.web.service.ksec;
import com.zhehekeji.common.util.FileUtil;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.service.PlcService;
@ -71,9 +70,16 @@ public class KsecNettyClient {
try {
createClient(ksec);
} catch (Exception e) {
channel.close();
//没连上 继续
log.error("reconnect error num:{}", num);
//关闭当前链接
num++;
// try{
// Thread.sleep(ksec.getReconnectInterval());
// }catch (Exception ex){
// throw new RuntimeException(ex);
// }
continue;
}
isConnected = true;

@ -23,8 +23,8 @@ public class PTCheckContent {
PTCheckContent ptContent = new PTCheckContent();
String [] strings = data.split(",");
ptContent.setSRMNUmber(strings[0]);
ptContent.setTaskNo(strings[1]);
ptContent.setGoodsLocation(strings[2]);
ptContent.setGoodsLocation(strings[1]);
ptContent.setTaskNo(strings[2]);
ptContent.setCode(strings[3]);
ptContent.setCount(Integer.valueOf(strings[4]));
return ptContent;

@ -1,7 +1,9 @@
package com.zhehekeji.web.service.putian;
//import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import com.zhehekeji.web.entity.Stock;
import com.zhehekeji.web.service.client.ClientChanel;
import com.zhehekeji.web.service.client.TMTransmission;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -11,10 +13,12 @@ public class PTData {
protected static String SPLIT = "#";
private static String END_STRING = "\n";
private static String END_STRING = "$";
public static String HEART_TYPE = "HB";
private static String STREET_HEAD = "SRM";
/**
*
*/
@ -23,12 +27,12 @@ public class PTData {
/**
*
*/
protected static String FLOW_R = "R";
public static String FLOW_R = "R";
/**
*
*/
protected static String FLOW_A = "A";
public static String FLOW_A = "A";
/**
* 1.EmptyCheck01 EC01
@ -60,13 +64,20 @@ public class PTData {
private String Type;
private static int IOrderNum = 0;
private String SOrderNum;
private String Content;
// private String MachineName;
public PTData(String data){
String[] strings = data.split(SPLIT);
FlowControl = strings[0];
Type = strings[1];
Content = strings[2];
SOrderNum = strings[1];
Type = strings[2];
String content = strings[3];
Content = content.substring(0, content.length()-1);
// Content = convertContent(content);
}
public static PTData HeartBeat(){
@ -77,7 +88,7 @@ public class PTData {
return ptData;
}
public static PTData IntoStock(String SRMNumber,String taskId,String goodsLocation,String picPath){
public static PTData IntoStock02(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);
@ -91,10 +102,10 @@ public class PTData {
return ptData;
}
public static PTData StockCheck03(String SRMNumber,String taskId,String goodsLocation,String YN){
public static PTData StockCheck03(String SRMNumber,String taskId,String YN){
StringBuffer contentSB = new StringBuffer();
contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(YN);
PTData ptData = new PTData(contentSB.toString(),FLOW_NO_NEED_RES,STOCK_CHECK_03);
contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(YN);
PTData ptData = new PTData(contentSB.toString(),FLOW_R,STOCK_CHECK_03);
return ptData;
}
@ -105,30 +116,59 @@ public class PTData {
* @param goodsLocation
* @return
*/
public static PTData StockCheck04(String SRMNumber, String taskId, String goodsLocation, Stock stock){
// public static PTData StockCheck04(String SRMNumber, String taskId, String goodsLocation, Stock stock){
// StringBuffer contentSB = new StringBuffer();
// String status = stock.getStatus().equals("2")?"Y":"N";
// String ip ="http://"+ClientChanel.getIpFromId(SRMNumber)+":9009/pic/"+stock.getCode()+"/"+stock.getCheckNum()+"/"+stock.getCheckNum()+"/";
// String pic1 = ip + 1 + ".png";
// String pic2 = ip + 2 + ".png";
// String pic3 = ip + 3 + ".png";
// String pic4 = ip + 4 + ".png";
// String pic5 = ip + 5 + ".png";
// String pic6 = ip + 6 + ".png";
// contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(stock.getWmsCode()).append(",").append(stock.getWmsCount())
// .append(",").append(stock.getCode()).append(",").append(stock.getCount()).append(",").append(status).append(",").append(pic1)
// .append("$").append(pic2).append("$").append(pic3).append("$").append(pic4).append("$").append(pic5).append("$").append(pic6);
// PTData ptData = new PTData(contentSB.toString(),FLOW_R,STOCK_CHECK_04);
// return ptData;
// }
public static PTData StockCheck04(TMTransmission tmTransmission){
StringBuffer contentSB = new StringBuffer();
String status = stock.getStatus().equals("2")?"Y":"N";
String ip ="http://"+ClientChanel.getIpFromId(SRMNumber)+":9009/pic/"+stock.getCode()+"/"+stock.getCheckNum()+"/"+stock.getCheckNum()+"/";
String SRMNumber = tmTransmission.getSRMNumber();
String goodsLocation = tmTransmission.getGoodsLocation();
String taskId = tmTransmission.getTaskNo();
String smokeCode = tmTransmission.getCode();
String smokeCount = tmTransmission.getCount().toString();
String checkSmokeCode = tmTransmission.getRstCode();
String checkSmokeCount = tmTransmission.getRstCount();
String checkRst = tmTransmission.getCheckRst().equals("1")?"Y":"N";
String ip ="http://"+ClientChanel.getIpFromId(tmTransmission.getSRMNumber())+":9009/pic/"+tmTransmission.getGoodsLocation()+"/"
+tmTransmission.getTaskNo()+"/";
String pic1 = ip + 1 + ".png";
String pic2 = ip + 2 + ".png";
String pic3 = ip + 3 + ".png";
String pic4 = ip + 4 + ".png";
String pic5 = ip + 5 + ".png";
String pic6 = ip + 6 + ".png";
contentSB.append(SRMNumber).append(",").append(taskId).append(",").append(goodsLocation).append(",").append(stock.getWmsCode()).append(",").append(stock.getWmsCount())
.append(",").append(stock.getCode()).append(",").append(stock.getCount()).append(",").append(status).append(",").append(pic1)
.append("$").append(pic2).append("$").append(pic3).append("$").append(pic4).append("$").append(pic5).append("$").append(pic6);
PTData ptData = new PTData(contentSB.toString(),FLOW_NO_NEED_RES,STOCK_CHECK_04);
contentSB.append(SRMNumber).append(",").append(goodsLocation).append(",").append(taskId).append(",").append(smokeCode).append(",").append(smokeCount)
.append(",").append(checkSmokeCode).append(",").append(checkSmokeCount).append(",").append(checkRst).append(",").append(pic1)
.append("*").append(pic2).append("*").append(pic3).append("*").append(pic4).append("*").append(pic5).append("*").append(pic6);
PTData ptData = new PTData(contentSB.toString(),FLOW_R,STOCK_CHECK_04);
return ptData;
}
public static PTData EmptyStatusResponse(PTEmptyCheckContent ptEmptyCheckContent){
return new PTData(ptEmptyCheckContent.toResponseString(),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);
sb.append(this.FlowControl).append(SPLIT).append(String.format("%04d", IOrderNum)).append(SPLIT).append(Type).append(SPLIT).append(Content).append(END_STRING);
IOrderNum++;
if(IOrderNum > 9999)
{
IOrderNum = 0;
}
return sb.toString();
}
@ -137,6 +177,16 @@ public class PTData {
this.Content = content;
this.Type = type;
}
private String convertContent(String content){
if (content.contains(STREET_HEAD)) {
return content;
}
else {
String [] strs = content.split(",");
Integer streetNum = Integer.parseInt(strs[0]);
String srmNumber = STREET_HEAD+String.format("%3d", streetNum);
return content.replace(strs[0], srmNumber);
}
}
}

@ -29,8 +29,6 @@ public class PTDecoder extends LineBasedFrameDecoder {
private PlcService plcService;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(7,21,30, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(20000));
/**
* failFast maxLength 使 failFast TooLongFrameException
* Netty failFast=true maxLength TooLongFrameException
@ -48,13 +46,12 @@ public class PTDecoder extends LineBasedFrameDecoder {
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
in = (ByteBuf) super.decode(ctx, in);
if(in == null){
log.debug("no data");
log.info("no data");
}else {
PTRunnable ptRunnable = new PTRunnable(ctx,in,emptyCheckService,plcService);
threadPoolExecutor.execute(ptRunnable);
}
return null;
}
public static class PTRunnable implements Runnable{
@ -79,90 +76,96 @@ public class PTDecoder extends LineBasedFrameDecoder {
if(ptData.getType().equals(PTData.HEART_TYPE)){
//心跳 什么都不处理,因为netty长链接断开会感知
}else if(ptData.getType().equals(PTData.EMPTY_CHECK_01)){
log.info("空货位检测开始");
PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
emptyCheckService.emptyCheckStart(checkContent.getSRMNUmber(), checkContent.getTaskNo(), checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(checkContent.getSRMNUmber(),checkContent.getTaskNo(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
//通知客户端开始检测
ClientChanel.write(startEmptyCheckStr,checkContent.getSRMNUmber());
EmptyCheckCodeInfo.start(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.EMPTY_CHECK_01);
// PuTianNettyClient.write(ptDataSend);
// PTEmptyCheckContent emptyCheckContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
// emptyCheckService.emptyCheckStart(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo());
// String startEmptyCheckStr = ECTransmission.toEmptyCheckStartString(emptyCheckContent.getSRMNUmber(),emptyCheckContent.getTaskNo());
// //通知客户端开始检测
// ClientChanel.write(startEmptyCheckStr,emptyCheckContent.getSRMNUmber());
// EmptyCheckCodeInfo.start(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo());
}else if(ptData.getType().equals(PTData.EMPTY_CHECK_02)){
log.info("空货位检测结束");
PTEmptyCheckContent checkContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
String endEmptyCheckStr = ECTransmission.toEmptyCheckEndString(checkContent.getSRMNUmber(),checkContent.getTaskNo(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
//通知客户端结束检测
ClientChanel.write(endEmptyCheckStr,checkContent.getSRMNUmber());
//等待2s把空货位盘点的结果发给普天
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
emptyCheckService.updateEmptyCheckLastTime(checkContent.getTaskNo(),checkContent.getSRMNUmber());
Map<String,String> map = emptyCheckService.getAllEmptyStatus(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
map.forEach((k,v)->{
PTEmptyCheckContent ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(checkContent.getSRMNUmber(),checkContent.getTaskNo(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn(),k,v);
PTData sendData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
//返回普天该行的盘点结果
PuTianNettyClient.write(sendData);
});
//打印空货位的所有条码
Set<String> codes = EmptyCheckCodeInfo.getAllCode(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
log.info("【空货位扫描到的所有条码】,SRMNumber:{},row:{},startColumn:{},endColumn:{},taskId:{},\ncodes:{}",checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn(),checkContent.getTaskNo(),codes);
//清空所有的条码
EmptyCheckCodeInfo.stop(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
}else if(ptData.getType().equals(PTData.STOCK_CHECK_01)){
log.info("盘点具体货位");
//发送给客户端
PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC01(ptData.getContent());
TMTransmission tmTransmission = new TMTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo(),ptCheckContent.getGoodsLocation(),ptCheckContent.getCode(), ptCheckContent.getCount(), "N");
plcService.checkStart(tmTransmission);
String msg = tmTransmission.toString();
ClientChanel.write(msg,ptCheckContent.getSRMNUmber());
PTData ptDataSendEnd = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.EMPTY_CHECK_02);
// PuTianNettyClient.write(ptDataSendEnd);
// PTEmptyCheckContent emptyCheckContent = PTEmptyCheckContent.EmptyCheck(ptData.getContent());
// String endEmptyCheckStr = ECTransmission.toEmptyCheckEndString(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo());
// //通知客户端结束检测
// ClientChanel.write(endEmptyCheckStr, emptyCheckContent.getSRMNUmber());
//
// //等待2s把空货位盘点的结果发给普天
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// emptyCheckService.updateEmptyCheckLastTime(emptyCheckContent.getTaskNo(), emptyCheckContent.getSRMNUmber());
// Map<String,String> map = emptyCheckService.getAllEmptyStatus(emptyCheckContent.getSRMNUmber(), checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
// map.forEach((k,v)->{
// PTEmptyCheckContent ptEmptyCheckContent = PTEmptyCheckContent.emptyCheckResponse(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn(),k,v);
// PTData sendData = PTData.EmptyStatusResponse(ptEmptyCheckContent);
// //返回普天该行的盘点结果
// PuTianNettyClient.write(sendData);
// });
// //打印空货位的所有条码
// Set<String> codes = EmptyCheckCodeInfo.getAllCode(emptyCheckContent.getSRMNUmber(), emptyCheckContent.getTaskNo());
// log.info("【空货位扫描到的所有条码】,SRMNumber:{},row:{},startColumn:{},endColumn:{},taskId:{},\ncodes:{}",checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn(),checkContent.getTaskNo(),codes);
// //清空所有的条码
// EmptyCheckCodeInfo.stop(checkContent.getSRMNUmber(),checkContent.getRow(),checkContent.getStartColumn(),checkContent.getEndColumn());
// }else if(ptData.getType().equals(PTData.STOCK_CHECK_01)){
// log.info("盘点具体货位");
// PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.STOCK_CHECK_01);
// //发送给客户端
// PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC01(ptData.getContent());
// TMTransmission tmTransmission = new TMTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo(),ptCheckContent.getGoodsLocation(),ptCheckContent.getCode(), ptCheckContent.getCount(), "N");
// plcService.checkStart(tmTransmission);
// String msg = tmTransmission.toString();
// ClientChanel.write(msg,ptCheckContent.getSRMNUmber());
}else if(ptData.getType().equals(PTData.STOCK_CHECK_02)){
log.info("盘点具体货位 ,货物已取到载货台");
PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC02(ptData.getContent());
TMTransmission tmTransmission = new TMTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo());
String msg = tmTransmission.toSC02String();
ClientChanel.write(msg,ptCheckContent.getSRMNUmber());
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.STOCK_CHECK_02);
// PTCheckContent ptCheckContent = PTCheckContent.CheckContentSC02(ptData.getContent());
// TMTransmission tmTransmission = new TMTransmission(ptCheckContent.getSRMNUmber(),ptCheckContent.getTaskNo());
// String msg = tmTransmission.toSC02String();
// ClientChanel.write(msg,ptCheckContent.getSRMNUmber());
}else if(ptData.getType().equals(PTData.Into_Stock_01)){
log.info("入库顶部拍照");
PTData ptDataSend = new PTData(ptData.getContent(), PTData.FLOW_A, PTData.Into_Stock_01);
//保存order标表
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent());
String picPath = plcService.IntoStock(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
//返回普天
PTData resData = PTData.IntoStock(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath);
PTData resData = PTData.IntoStock02(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath);
PuTianNettyClient.write(resData);
}else if(ptData.getType().equals(PTData.Into_Stock_02)){
log.info("入库完成拍照");
PTOrderContent ptOrderContent = PTOrderContent.OrderContentIS01And03(ptData.getContent());
String picPath = plcService.IntoStockOver(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
//向客户端发送读码指令,等待客户端返回条码
ISTransmission isTransmission = new ISTransmission(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
//为防万一先清除code
ClientCodeMap.removeCode(ptOrderContent.getSRMNUmber());
ClientChanel.write(isTransmission.toString(),ptOrderContent.getSRMNUmber());
//发送结果给普天
//若1分钟内仍为收到 则放弃
Long start = System.currentTimeMillis();
while (ClientCodeMap.getCode(ptOrderContent.getSRMNUmber()) == null && (System.currentTimeMillis()-start)<60000){
try {
Thread.sleep(300l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String code = ClientCodeMap.getCode(ptOrderContent.getSRMNUmber());
PTData resData = PTData.IntoStock04(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath,code);
PuTianNettyClient.write(resData);
//
// //向客户端发送读码指令,等待客户端返回条码
// ISTransmission isTransmission = new ISTransmission(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation());
// //为防万一先清除code
// ClientCodeMap.removeCode(ptOrderContent.getSRMNUmber());
// ClientChanel.write(isTransmission.toString(),ptOrderContent.getSRMNUmber());
// //发送结果给普天
// //若1分钟内仍为收到 则放弃
// Long start = System.currentTimeMillis();
// while (ClientCodeMap.getCode(ptOrderContent.getSRMNUmber()) == null && (System.currentTimeMillis()-start)<60000){
// try {
// Thread.sleep(300l);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// String code = ClientCodeMap.getCode(ptOrderContent.getSRMNUmber());
// PTData resData = PTData.IntoStock04(ptOrderContent.getSRMNUmber(), ptOrderContent.getTaskNo(), ptOrderContent.getGoodsLocation(),picPath,code);
// PuTianNettyClient.write(resData);
}
}
}
}

@ -24,18 +24,18 @@ public class PTEmptyCheckContent {
private String taskNo;
private Integer row;
// private Integer row;
private Integer startColumn;
// private Integer startColumn;
private Integer endColumn;
// private Integer endColumn;
/**
* Start OR END
*/
private String type;
private String shelve;
// private String shelve;
/**
*
@ -48,31 +48,36 @@ public class PTEmptyCheckContent {
String [] strings = data.split(",");
ptContent.setSRMNUmber(strings[0]);
ptContent.setTaskNo(strings[1]);
ptContent.setRow(Integer.valueOf(strings[2]));
ptContent.setStartColumn(Integer.valueOf(strings[3]));
ptContent.setEndColumn(Integer.valueOf(strings[4]));
ptContent.setType(strings[5]);
// ptContent.setRow(Integer.valueOf(strings[2]));
// ptContent.setStartColumn(Integer.valueOf(strings[3]));
// ptContent.setEndColumn(Integer.valueOf(strings[4]));
// ptContent.setType(strings[5]);
ptContent.setType(strings[2]);
return ptContent;
}
// public String toResponseString(){
// StringBuffer sb = new StringBuffer();
// sb.append(SRMNUmber).append(",").append(taskNo).append(",").append(row).append(",")
// .append(startColumn).append(",").append(endColumn).append(",").append(emptyStatus);
// return sb.toString();
// }
public String toResponseString(){
StringBuffer sb = new StringBuffer();
sb.append(SRMNUmber).append(",").append(taskNo).append(",").append(row).append(",")
.append(startColumn).append(",").append(endColumn).append(",").append(emptyStatus);
sb.append(SRMNUmber).append(",").append(taskNo).append(",").append(goodsLocation).append(emptyStatus);
return sb.toString();
}
public static PTEmptyCheckContent emptyCheckResponse(String SRMNUmber,String taskId,int row,int startColumn,int endColumn,String shelve,String emptyStatus){
public static PTEmptyCheckContent emptyCheckResponse(String SRMNUmber,String taskId, String goodsLocation, 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.setRow(row);
// ptContent.setStartColumn(startColumn);
// ptContent.setEndColumn(endColumn);
ptContent.setGoodsLocation(goodsLocation);
ptContent.setEmptyStatus(emptyStatus);
return ptContent;
}
}

@ -37,8 +37,8 @@ public class PTFilter extends ChannelInitializer<SocketChannel> {
ChannelPipeline ph = ch.pipeline();
//30秒发一次心跳
ph.addLast(new IdleStateHandler(0, 30, 0, TimeUnit.SECONDS));
ByteBuf byteBuf = Unpooled.copiedBuffer(">".getBytes());
ph.addLast(new PTDecoder(1000,false,true,emptyCheckService,plcService));
ByteBuf byteBuf = Unpooled.copiedBuffer("$".getBytes());
ph.addLast(new PTDecoder(1000,true,true,emptyCheckService,plcService));
ph.addLast(new PtEncoder());
ph.addLast(new PTNettyHandler(nettyClient));
}

@ -45,6 +45,7 @@ public class PuTianNettyClient {
}
Bootstrap client = new Bootstrap();
client.group(group);
client.channel(NioSocketChannel.class);
client.handler(new PTFilter(plcService,this,emptyCheckService));
@ -70,13 +71,21 @@ public class PuTianNettyClient {
} catch (InterruptedException e) {
e.printStackTrace();
}
// while (ksec.getReconnectNum() == -1 || num < ksec.getReconnectNum() && !isConnected) {
while (num < RECONNECT_NUM && !isConnected) {
try {
createClient(ksec);
} catch (Exception e) {
// channel.close();
//没连上 继续
log.error("reconnect error num:{}", num);
//关闭当前链接
num++;
// try{
// Thread.sleep(ksec.getReconnectInterval());
// }catch (Exception ex){
// throw new RuntimeException(ex);
// }
continue;
}
isConnected = true;

@ -37,10 +37,12 @@ savePath:
mp4Path: d://data/mp4/
# 普天上位地址
ksec:
ip: 192.168.125.5
ip: 127.0.0.1
port: 3000
# 服务端IP
IP: 127.0.0.1
# 服务端TCP端口
serverPort: 3001
serverPort: 4000
# ------------ 实时视频流 全部页面的格式 行列数量
videoStyleConfig:
videoStyleRow: 4
@ -57,5 +59,3 @@ lightSource:
# -----goods 货物
# 照片 視頻保存多久
deleteFileDays: 365
# 服务端IP
IP: 192.168.1.1

@ -14,16 +14,16 @@ spring:
testWhileIdle: false
timeBetweenEvictionRunsMillis: 60000
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/lia_duoji_nanjing_wuliu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:mysql://115.236.65.98:12004/lia_duoji_nanjing_wuliu?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号
server:
port: 8099
Port: 8099
# ----默认摄像头的连接信息
cameraConfig:
# ------------球機選擇--- 0:利珀 1海康
cameraType: 0
cameraType: 1
cameraPassword: a1234567
cameraUser: admin
cameraPort: 37777
@ -59,6 +59,14 @@ serverMode: 1
ksec:
ip: 127.0.0.1
port: 3000
#断点重连的次数:-1->不断重连
# reconnectNum: -1
# #断点重连的时间间隔(单位ms)
# reconnectInterval: 10000
# 服务端IP
IP: 127.0.0.1
# 服务端TCP端口
serverPort: 3001
# ------------ 实时视频流 全部页面的格式 行列数量
videoStyleConfig:
videoStyleRow: 4

Loading…
Cancel
Save