穿梭车连接

兰州-麒麟
LAPTOP-S9HJSOEB\昊天 1 year ago
parent 82e4f55d48
commit b6585973ca

@ -32,6 +32,7 @@ public class ConfigProperties {
private String userUrl; private String userUrl;
private KSEC ksec; private KSEC ksec;
private KSEC shuttleCar;
private LightSource lightSource; private LightSource lightSource;

@ -8,6 +8,7 @@ import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.service.*; import com.zhehekeji.web.service.*;
import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.robotic.NettyClient; import com.zhehekeji.web.service.robotic.NettyClient;
import com.zhehekeji.web.service.shuttleCar.ShuttleNettyClient;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -32,16 +33,28 @@ public class PLCController {
@Resource @Resource
private KsecNettyClient ksecNettyClient; private KsecNettyClient ksecNettyClient;
@Resource
private ShuttleNettyClient shuttleNettyClient;
@GetMapping("/tcp") @GetMapping("/tcp")
@ApiOperation(value = "连接plc,发起请求") @ApiOperation(value = "连接plc,发起请求")
public Result tcp(@RequestParam Integer id){ public Result tcp(@RequestParam Integer id){
if(configProperties.getServerMode() == 1){ if(configProperties.getServerMode() == 1){
if(id==1) {
try { try {
ksecNettyClient.createClient(configProperties.getKsec()); ksecNettyClient.createClient(configProperties.getKsec());
} catch (Exception e) { } catch (Exception e) {
Assert.isTrue(false, "连接失败ip" + configProperties.getKsec().getIp() + ",port:" + configProperties.getKsec().getPort()); Assert.isTrue(false, "连接失败ip" + configProperties.getKsec().getIp() + ",port:" + configProperties.getKsec().getPort());
} }
}else {
try {
shuttleNettyClient.createClient(configProperties.getShuttleCar());
} catch (Exception e) {
Assert.isTrue(false, "连接失败ip" + configProperties.getShuttleCar().getIp() + ",port:" + configProperties.getShuttleCar().getPort());
}
}
}else { }else {
Street street = streetMapper.selectById(id); Street street = streetMapper.selectById(id);

@ -11,6 +11,7 @@ import com.zhehekeji.web.mapper.CameraMapper;
import com.zhehekeji.web.mapper.StreetMapper; import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.robotic.NettyClient; import com.zhehekeji.web.service.robotic.NettyClient;
import com.zhehekeji.web.service.shuttleCar.ShuttleNettyClient;
import com.zhehekeji.web.service.sick.SickNettyClient; import com.zhehekeji.web.service.sick.SickNettyClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
@ -42,6 +43,10 @@ public class InitService implements ApplicationRunner {
@Resource @Resource
private KsecNettyClient ksecNettyClient; private KsecNettyClient ksecNettyClient;
@Resource
private ShuttleNettyClient shuttleNettyClient;
@Resource @Resource
private ConfigProperties configProperties; private ConfigProperties configProperties;
@ -85,6 +90,8 @@ public class InitService implements ApplicationRunner {
LoginThread loginThread = new LoginThread(camera); LoginThread loginThread = new LoginThread(camera);
loginThread.start(); loginThread.start();
}); });
TaskDelayExecutor.runMp4DownloadExecutor();
LPLicense.createLicKeyIfNotExist(); LPLicense.createLicKeyIfNotExist();
//plc连接 //plc连接
if(configProperties.getServerMode() == 0){ if(configProperties.getServerMode() == 0){
@ -101,6 +108,7 @@ public class InitService implements ApplicationRunner {
} }
}); });
}else if(configProperties.getServerMode() == 1){ }else if(configProperties.getServerMode() == 1){
Thread thread = new Thread(()->{
log.info("KESC JSON MODE"); log.info("KESC JSON MODE");
// 昆船协议 // 昆船协议
ConfigProperties.KSEC ksec = configProperties.getKsec(); ConfigProperties.KSEC ksec = configProperties.getKsec();
@ -109,13 +117,35 @@ public class InitService implements ApplicationRunner {
try { try {
ksecNettyClient.createClient(ksec); ksecNettyClient.createClient(ksec);
}catch (Exception e){ }catch (Exception e){
ksecNettyClient.reconnect(1);
log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort()); log.error("kesc connect error,url:{},port:{}",ksec.getIp(),ksec.getPort());
} }
}else { }else {
log.error("ksec no config"); log.error("ksec no config");
} }
});
thread.start();
Thread thread1 = new Thread(()->{
log.info("shuttleCar JSON MODE");
ConfigProperties.KSEC shuttleCar = configProperties.getShuttleCar();
if(shuttleCar != null){
StreetConn.init(0,"shuttleCar");
try {
shuttleNettyClient.createClient(shuttleCar);
}catch (Exception e){
shuttleNettyClient.reconnect(0);
log.error("shuttleCar connect error,url:{},port:{}",shuttleCar.getIp(),shuttleCar.getPort());
}
}else {
log.error("shuttleCar no config");
}
});
thread1.start();
} }
TaskDelayExecutor.runMp4DownloadExecutor();
} }
class LoginThread extends Thread{ class LoginThread extends Thread{

@ -87,7 +87,7 @@ public class PlcService {
private static String originalPoint = "C6"; private static String originalPoint = "C6";
public Integer plcStatus() { public Integer plcStatus() {
Integer count = 1; Integer count = 2;
if(configProperties.getServerMode() == 0){ if(configProperties.getServerMode() == 0){
count = streetMapper.selectCount(new QueryWrapper<>()); count = streetMapper.selectCount(new QueryWrapper<>());
} }

@ -9,6 +9,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* PLC * PLC
@ -16,7 +17,7 @@ import java.util.Map;
@Data @Data
public class StreetConn { public class StreetConn {
private static Map<Integer,PlcStatus> connMap = new HashMap<>(); private static Map<Integer,PlcStatus> connMap = new ConcurrentHashMap<>();
/** /**
* plc * plc

@ -74,7 +74,9 @@ public class KsecNettyClient {
} catch (Exception e) { } catch (Exception e) {
//没连上 继续 //没连上 继续
log.error("reconnect error num:{}", num); log.error("reconnect error num:{}", num);
if(channel != null) {
channel.close(); channel.close();
}
num++; num++;
try { try {
Thread.sleep(ksec.getReconnectInterval()*1000); Thread.sleep(ksec.getReconnectInterval()*1000);

@ -0,0 +1,108 @@
package com.zhehekeji.web.service.shuttleCar;
import com.zhehekeji.common.util.FileUtil;
import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.ksec.KsecDecoder;
import com.zhehekeji.web.service.ksec.KsecInfo;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
@Slf4j
@Component
public class ShuttleNettyClient {
private static EventLoopGroup group = new NioEventLoopGroup();
@Resource
private PlcService plcService;
@Resource
private ConfigProperties configProperties;
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;
}
Bootstrap client = new Bootstrap();
client.group(group);
client.channel(NioSocketChannel.class);
KsecInfo heart = KsecInfo.heart();
client.handler(new ShuttleNettyFilter(heart, plcService,this));
// 连接服务端
channel = client.connect(ksec.getIp(), ksec.getPort()).sync().channel();
}
/**
* 线 RECONNECT_NUM
*
* @param upId
*/
public void reconnect(Integer upId) {
Boolean isConnected = false;
int num = 0;
ConfigProperties.KSEC ksec = configProperties.getShuttleCar();
if (ksec == null) {
log.error("reconnect ,upPc is null ,id:{}", upId);
return;
}
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
*
*/
while ((ksec.getReconnectNum() == -1 || num < ksec.getReconnectNum() ) && !isConnected) {
try {
createClient(ksec);
} catch (Exception e) {
//没连上 继续
log.error("reconnect error num:{}", num);
if(channel != null) {
channel.close();
}
num++;
try {
Thread.sleep(ksec.getReconnectInterval()*1000);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
continue;
}
isConnected = true;
}
if (isConnected) {
log.info("plc reconnect success");
} else {
log.error("plc reconnect error .upPcId:{},reconnect num:{},ip:{},port:{}", upId, num, ksec.getIp(), ksec.getPort());
}
}
public static void write(KsecInfo ksecInfo){
if(channel != null){
channel.writeAndFlush(ksecInfo);
}else {
log.error(" no connected upPc");
}
}
}

@ -0,0 +1,45 @@
package com.zhehekeji.web.service.shuttleCar;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.ksec.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import java.util.concurrent.TimeUnit;
/**
*
*
* @author Administrator
*
*/
public class ShuttleNettyFilter extends ChannelInitializer<SocketChannel> {
private KsecInfo ksecInfo;
private PlcService plcService;
private ShuttleNettyClient nettyClient;
public ShuttleNettyFilter(KsecInfo ksecInfo, PlcService plcService, ShuttleNettyClient nettyClient){
this.ksecInfo = ksecInfo;
this.plcService = plcService;
this.nettyClient = nettyClient;
}
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline ph = ch.pipeline();
//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 KescEncoder());
ph.addLast(new ShuttleNettyHandler(ksecInfo,nettyClient));
}
}

@ -0,0 +1,71 @@
package com.zhehekeji.web.service.shuttleCar;
import com.zhehekeji.web.service.StreetConn;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;
/**
* PLC
*
* @author Administrator
*
*/
@Slf4j
public class ShuttleNettyHandler extends ChannelInboundHandlerAdapter {
/** 客户端请求的心跳命令 */
private KsecInfo heart;
private ShuttleNettyClient nettyClient;
public ShuttleNettyHandler(KsecInfo ksecInfo, ShuttleNettyClient nettyClient){
this.heart = ksecInfo;
this.nettyClient = nettyClient;
}
/**
*
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info("upPc connected ");
StreetConn.conn(0);
ctx.fireChannelActive();
}
/**
*
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.info("upPc closed");
StreetConn.disConn(0);
log.info(" streetId reconnect......");
nettyClient.reconnect(0);
}
/**
* 4;
*
*/
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception {
if (obj instanceof IdleStateEvent) {
log.debug("upPc send heart");
ctx.channel().writeAndFlush(heart);
IdleStateEvent event = (IdleStateEvent) obj;
// if (IdleState.WRITER_IDLE.equals(event.state())) { // 如果写通道处于空闲状态就发送心跳命令
//
// }
}
}
}

@ -67,6 +67,13 @@ ksec:
reconnectNum: -1 reconnectNum: -1
#重连间隔 默认10s #重连间隔 默认10s
reconnectInterval: 10 reconnectInterval: 10
shuttleCar:
ip: 127.0.0.1
port: 8002
#重连次数 默认10次
reconnectNum: -1
#重连间隔 默认10s
reconnectInterval: 10
# ------------ 实时视频流 全部页面的格式 行列数量 # ------------ 实时视频流 全部页面的格式 行列数量
videoStyleConfig: videoStyleConfig:
videoStyleRow: 4 videoStyleRow: 4

Loading…
Cancel
Save