camera_merge
王一鸣 5 years ago
parent 8713a1ddcb
commit 73f8dee58b

@ -0,0 +1,40 @@
package com.zhehekeji.web.controller;
import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.mapper.StreetMapper;
import com.zhehekeji.web.pojo.street.StreetSearch;
import com.zhehekeji.web.pojo.street.StreetVO;
import com.zhehekeji.web.service.ClientMap;
import com.zhehekeji.web.service.StreetService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Api(value = "PLCController",tags = "PLC管理")
@RestController(value = "PLCController")
@RequestMapping("/plc")
public class PLCController {
@Resource
private StreetService streetService;
@Resource
private StreetMapper streetMapper;
@GetMapping("/heart")
@ApiOperation(value = "心跳")
public Result heart(@RequestParam Integer id) throws InterruptedException {
Street street = streetMapper.selectById(id);
Assert.isTrue(street!= null && street.getPlcIp() != null && street.getPlcPort() != null,"未配置IP");
ClientMap.createClient(street);
return Result.success();
}
}

@ -19,6 +19,10 @@ public class Street {
@ApiModelProperty("PLC标识") @ApiModelProperty("PLC标识")
private String plcId; private String plcId;
private String plcIp;
private Integer plcPort;
@ApiModelProperty("左货架类型 0单伸 1双伸") @ApiModelProperty("左货架类型 0单伸 1双伸")
private Integer leftType; private Integer leftType;

@ -0,0 +1,37 @@
package com.zhehekeji.web.service;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Street;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class ClientMap {
private static Map<Integer, ChannelFuture> channelFutureMap = new HashMap<>();
private static EventLoopGroup group = new NioEventLoopGroup();
public static void createClient(Street street) throws InterruptedException {
Bootstrap client = new Bootstrap();
// 第1步 定义线程组处理读写和链接事件没有了accept事件
client.group(group);
// 第2步 绑定客户端通道
client.channel(NioSocketChannel.class);
// 第3步 给NIoSocketChannel初始化handler 处理读写事件
client.handler(new HeartNettyClientFilter(street.getId()));
// 连接服务端
client.connect(street.getPlcIp(), street.getPlcPort()).sync().channel();
}
public static void close() {
group.shutdownGracefully();
}
}

@ -0,0 +1,34 @@
package com.zhehekeji.web.service;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.timeout.IdleStateHandler;
import java.util.concurrent.TimeUnit;
/**
*
*
* @author Administrator
*
*/
public class HeartNettyClientFilter extends ChannelInitializer<SocketChannel> {
private Integer streetId;
public HeartNettyClientFilter(Integer streetId){
this.streetId = streetId;
}
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline ph = ch.pipeline();
//因为服务端设置的超时时间是5秒所以客户端设置4秒
ph.addLast(new IdleStateHandler(0, 4, 0, TimeUnit.SECONDS));
//处理客户端的业务逻辑
ph.addLast(new HeartNettyClientHandler(streetId));
}
}

@ -0,0 +1,73 @@
package com.zhehekeji.web.service;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
*
* @author Administrator
*
*/
@Slf4j
public class HeartNettyClientHandler extends ChannelInboundHandlerAdapter {
/** 客户端请求的心跳命令 */
private static final SendHeart s = new SendHeart();
private Integer streetId;
public HeartNettyClientHandler(Integer streetId){
this.streetId = streetId;
}
/**
*
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelActive();
}
/**
*
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.error("streetId:{}连接被关闭",streetId);
}
/**
* 4;
*
*/
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object obj) throws Exception {
log.debug("streetId:{}心跳",streetId);
if (obj instanceof IdleStateEvent) {
IdleStateEvent event = (IdleStateEvent) obj;
if (IdleState.WRITER_IDLE.equals(event.state())) { // 如果写通道处于空闲状态就发送心跳命令
ctx.channel().writeAndFlush(s);
}
}
}
/**
*
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
log.debug("streetId:{},client receive msg:{}",streetId,msg.toString());
}
}

@ -5,6 +5,7 @@ import com.zhehekeji.web.lib.CameraConnMap;
import com.zhehekeji.web.lib.LoginModule; import com.zhehekeji.web.lib.LoginModule;
import com.zhehekeji.web.lib.NetSDKLib; import com.zhehekeji.web.lib.NetSDKLib;
import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.CameraMapper;
import com.zhehekeji.web.mapper.StreetMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
@ -23,6 +24,8 @@ public class InitService implements ApplicationRunner {
private CameraMapper cameraMapper; private CameraMapper cameraMapper;
@Resource @Resource
private TcpListener tcpListener; private TcpListener tcpListener;
@Resource
private StreetMapper streetMapper;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {

@ -0,0 +1,26 @@
package com.zhehekeji.web.service;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import java.nio.charset.Charset;
public class MyProtocolEncoder extends MessageToByteEncoder<SendHeart> {
@Override
protected void encode(ChannelHandlerContext ctx, SendHeart msg, ByteBuf out) throws Exception {
if(msg == null){
throw new Exception("msg is null");
}
out.writeChar(msg.getL());
out.writeChar(msg.getP());
out.writeShort(msg.getLength());
out.writeCharSequence(msg.getPlcId(), Charset.defaultCharset());
out.writeCharSequence(msg.getType(), Charset.defaultCharset());
out.writeCharSequence(msg.getId(),Charset.defaultCharset());
out.writeChar(msg.getMaohao());
out.writeChar(msg.getH());
out.writeBytes(msg.getEmp());
}
}

@ -0,0 +1,26 @@
package com.zhehekeji.web.service;
import lombok.Data;
@Data
public class SendHeart {
private char l = 'L';
private char p = 'P';
private short length = 43;
private String plcId = "ABC000";
private String type = "0A";
private String id = "0101010101";
private char maohao = ':';
private char h = 'H';
private byte[]emp = new byte[]{10};
}

@ -3,6 +3,7 @@ package com.zhehekeji.web.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.entity.Street; import com.zhehekeji.web.entity.Street;
import com.zhehekeji.web.entity.StreetShelve; import com.zhehekeji.web.entity.StreetShelve;
import com.zhehekeji.web.mapper.OrderLastMediaMapper; import com.zhehekeji.web.mapper.OrderLastMediaMapper;
@ -12,6 +13,7 @@ import com.zhehekeji.web.pojo.street.StreetSearch;
import com.zhehekeji.web.pojo.street.StreetType; import com.zhehekeji.web.pojo.street.StreetType;
import com.zhehekeji.web.pojo.street.StreetVO; import com.zhehekeji.web.pojo.street.StreetVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -40,7 +42,12 @@ public class StreetService {
List<String> shelves = check(street); List<String> shelves = check(street);
street.setCreateTime(LocalDateTime.now()); street.setCreateTime(LocalDateTime.now());
street.setUpdateTime(LocalDateTime.now()); street.setUpdateTime(LocalDateTime.now());
streetMapper.insert(street); try {
streetMapper.insert(street);
}catch (DuplicateKeyException e){
Assert.isTrue(false,"PLC ID已存在");
}
streetShelve(shelves,street.getId()); streetShelve(shelves,street.getId());
return street.getId(); return street.getId();
} }
@ -90,7 +97,11 @@ public class StreetService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void edit(Street street){ public void edit(Street street){
List<String> shelves = check(street); List<String> shelves = check(street);
streetMapper.updateById(street); try {
streetMapper.updateById(street);
}catch (DuplicateKeyException e){
Assert.isTrue(false,"PLC ID已存在");
}
delStreetShelve(street.getId()); delStreetShelve(street.getId());
streetShelve(shelves,street.getId()); streetShelve(shelves,street.getId());
} }

Loading…
Cancel
Save