昆船协议
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