昆船协议
parent
b4a63d2090
commit
bc09910c91
@ -0,0 +1,24 @@
|
||||
package com.zhehekeji.web.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 昆船上位机信息
|
||||
*/
|
||||
@Data
|
||||
@TableName("ksec_up_pc_info")
|
||||
public class KsecUpPcInfo {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private String ip;
|
||||
|
||||
private Integer port;
|
||||
|
||||
private String name;
|
||||
|
||||
private LocalDateTime createTime;
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
package com.zhehekeji.web.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.zhehekeji.web.entity.KsecUpPcInfo;
|
||||
|
||||
public interface KsecUpPcMapper extends BaseMapper<KsecUpPcInfo> {
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
package com.zhehekeji.web.pojo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class IpInfo {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private String ip;
|
||||
|
||||
private Integer port;
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
package com.zhehekeji.web.service.ksec;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.zhehekeji.web.service.SendHeart;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.MessageToByteEncoder;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* 昆船JSON版发送 首尾加上 < >
|
||||
*/
|
||||
public class KescEncoder extends MessageToByteEncoder<KsecInfo> {
|
||||
|
||||
|
||||
@Override
|
||||
protected void encode(ChannelHandlerContext channelHandlerContext, KsecInfo ksecInfo, ByteBuf byteBuf) throws Exception {
|
||||
String body = "<" + JSONObject.toJSONString(ksecInfo) + ">";
|
||||
byteBuf.writeBytes(body.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
package com.zhehekeji.web.service.ksec;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class KsecDataInfo {
|
||||
|
||||
private String SRMNumber;
|
||||
|
||||
private String CmdName;
|
||||
|
||||
private String TaskId;
|
||||
|
||||
private Integer FromAddrType;
|
||||
|
||||
private Integer FromRow;
|
||||
|
||||
private Integer FromBay;
|
||||
|
||||
private Integer FromLevel;
|
||||
|
||||
private Integer ToAddrType;
|
||||
|
||||
private Integer ToRow;
|
||||
|
||||
private Integer ToBay;
|
||||
|
||||
private Integer ToLevel;
|
||||
|
||||
private String code;
|
||||
|
||||
private String WarnCode;
|
||||
|
||||
private Integer AckStatus;
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package com.zhehekeji.web.service.ksec;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class KsecInfo {
|
||||
|
||||
private String header;
|
||||
|
||||
private String Type;
|
||||
|
||||
private KsecDataInfo data;
|
||||
|
||||
/**
|
||||
* 心跳格式
|
||||
* @return
|
||||
*/
|
||||
public static KsecInfo heart(){
|
||||
return new KsecInfo("LP","A",null);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,93 @@
|
||||
package com.zhehekeji.web.service.ksec;
|
||||
|
||||
|
||||
import com.zhehekeji.web.entity.KsecUpPcInfo;
|
||||
import com.zhehekeji.web.mapper.KsecUpPcMapper;
|
||||
import com.zhehekeji.web.service.PlcService;
|
||||
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 KsecNettyClient {
|
||||
|
||||
private static EventLoopGroup group = new NioEventLoopGroup();
|
||||
@Resource
|
||||
private PlcService plcService;
|
||||
@Resource
|
||||
private KsecUpPcMapper ksecUpPcMapper;
|
||||
|
||||
/**
|
||||
* 重连最大次数
|
||||
*/
|
||||
private static int RECONNECT_NUM = 5;
|
||||
|
||||
private static Channel channel;
|
||||
|
||||
public void createClient(KsecUpPcInfo ksec){
|
||||
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 KescFilter(heart, plcService,this));
|
||||
// 连接服务端
|
||||
try {
|
||||
channel = client.connect(ksec.getIp(), ksec.getPort()).sync().channel();
|
||||
} catch (InterruptedException e) {
|
||||
channel = null;
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 断线重连 尝试 RECONNECT_NUM 次
|
||||
*
|
||||
* @param upId
|
||||
*/
|
||||
public void reconnect(Integer upId) {
|
||||
Boolean isConnected = false;
|
||||
int num = 0;
|
||||
KsecUpPcInfo ksec = ksecUpPcMapper.selectById(upId);
|
||||
if (ksec == null) {
|
||||
log.error("reconnect ,upPc is null ,id:{}", upId);
|
||||
return;
|
||||
}
|
||||
while (num < RECONNECT_NUM && !isConnected) {
|
||||
try {
|
||||
createClient(ksec);
|
||||
} catch (Exception e) {
|
||||
//没连上 继续
|
||||
log.error("reconnect error num:{}", num);
|
||||
num++;
|
||||
continue;
|
||||
}
|
||||
isConnected = true;
|
||||
}
|
||||
if (isConnected) {
|
||||
log.info("plc reconnect success");
|
||||
} else {
|
||||
log.error("plc reconnect error .upPcId:{},reconnect num:{},name:{},ip:{},port:{}", upId, num, ksec.getName(), ksec.getIp(), ksec.getPort());
|
||||
}
|
||||
}
|
||||
|
||||
public static void write(KsecInfo ksecInfo){
|
||||
if(channel != null){
|
||||
channel.writeAndFlush(ksecInfo);
|
||||
}else {
|
||||
log.error(" no connected upPc");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue