Merge branch 'feature-sick-saomaqiang' into 'master'

Feature sick saomaqiang

See merge request duoji/backend-duoji-monitor!4
merge-requests/5/merge
wang.yiming 4 years ago
commit ce3f60b43a

@ -33,6 +33,8 @@ public class ConfigProperties {
private LightSource lightSource; private LightSource lightSource;
private Sensor sensor;
@Data @Data
public static class CameraConfig{ public static class CameraConfig{
@ -45,6 +47,11 @@ public class ConfigProperties {
private Integer cameraPort; private Integer cameraPort;
private String videoServer; private String videoServer;
private Long delayCaptureTime;
private Long delayScanTime;
} }
@Data @Data
@ -70,4 +77,9 @@ public class ConfigProperties {
private Integer type; private Integer type;
private String info; private String info;
} }
@Data
public static class Sensor{
private Integer type;
}
} }

@ -1,6 +1,7 @@
package com.zhehekeji.web.controller; package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonParser;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.zhehekeji.common.util.ValidatorUtil; import com.zhehekeji.common.util.ValidatorUtil;
import com.zhehekeji.core.pojo.Result; import com.zhehekeji.core.pojo.Result;
@ -151,6 +152,7 @@ public class CameraController {
}); });
jsonObject.put("streams",streams); jsonObject.put("streams",streams);
Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
write.write(jsonObject.toJSONString()); write.write(jsonObject.toJSONString());
write.flush(); write.flush();
write.close(); write.close();

@ -0,0 +1,31 @@
package com.zhehekeji.web.controller;
import com.alibaba.fastjson.JSONObject;
import com.zhehekeji.common.util.HttpUtil;
import com.zhehekeji.core.pojo.Result;
import com.zhehekeji.core.util.Assert;
import com.zhehekeji.web.pojo.IndexVO;
import com.zhehekeji.web.service.sick.SickConnMap;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@Api( tags = "传感器")
@RequestMapping(value = "/sensor")
@RestController()
@Slf4j
public class SensorController {
@GetMapping("/start")
@ApiOperation(value = "sick扫码枪开始扫")
public Result userCenter() {
SickConnMap.write(1);
return Result.success();
}
}

@ -89,6 +89,8 @@ public class StreetController {
JYDamHelper.openDO(equip,obj.getInteger("index")); JYDamHelper.openDO(equip,obj.getInteger("index"));
Integer status = JYDamHelper.ReadStatus(equip,obj.getInteger("num"),obj.getInteger("index")); Integer status = JYDamHelper.ReadStatus(equip,obj.getInteger("num"),obj.getInteger("index"));
log.info("ip:{},status:{}",lightSource.getIp(),status); log.info("ip:{},status:{}",lightSource.getIp(),status);
equip.DisConnect();
} }
}); });

@ -0,0 +1,20 @@
package com.zhehekeji.web.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class SensorGun {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer streetId;
private Integer direction;
private String ip;
private Integer port;
}

@ -0,0 +1,7 @@
package com.zhehekeji.web.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhehekeji.web.entity.SensorGun;
public interface SensorGunMapper extends BaseMapper<SensorGun> {
}

@ -10,9 +10,11 @@ import com.zhehekeji.web.lib.joyware.JoywareCameraControlModuleImpl;
import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl; import com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl;
import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.lib.joyware.NetSDKLib;
import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.CameraMapper;
import com.zhehekeji.web.mapper.SensorGunMapper;
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.sick.SickNettyClient;
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;
@ -107,7 +109,6 @@ public class InitService implements ApplicationRunner {
} }
} }
TaskDelayExecutor.runMp4DownloadExecutor(); TaskDelayExecutor.runMp4DownloadExecutor();
} }
class loginThread extends Thread{ class loginThread extends Thread{

@ -205,7 +205,7 @@ public class PlcService {
if(code.startsWith("C1") || code.startsWith("C3")){ if(code.startsWith("C1") || code.startsWith("C3")){
delay = true; delay = true;
} }
path = cameraCapture(cameraId,delay,2000L); path = cameraCapture(cameraId,delay,configProperties.getCameraConfig().getDelayCaptureTime());
} }
//update order info after capture //update order info after capture
if (path != null && needCapture) { if (path != null && needCapture) {
@ -438,16 +438,16 @@ public class PlcService {
} }
public void check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode){ public void check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode){
long startTime = System.currentTimeMillis();
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId());
Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1()); Integer cameraId = getCameraByPlcCmd(plcCmdInfo,plcCmdInfo.getLeftRight1());
gyrateCameraByCode(cameraId, cmdCode); gyrateCameraByCode(cameraId, cmdCode);
String path = cameraCapture(cameraId,true,3000L); String path = cameraCapture(cameraId,true,configProperties.getCameraConfig().getDelayCaptureTime());
OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode); OrderInfo orderInfo = new OrderInfo(street,plcCmdInfo,1,cmdCode);
Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn()); Stock stock = stockMapper.getByShelveIdAndRowColumn(orderInfo.getShelveId(),orderInfo.getRow(),orderInfo.getColumn());
log.info("pic path:{}",configProperties.getSavePath().getMediaPath()+path);
System.out.println(configProperties.getSavePath().getMediaPath()+path);
try { try {
Thread.sleep(3500L); Thread.sleep(configProperties.getCameraConfig().getDelayScanTime());
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -455,7 +455,7 @@ public class PlcService {
if(StringUtils.isEmpty(scanCode)){ if(StringUtils.isEmpty(scanCode)){
scanCode = "识别异常"; scanCode = "识别异常";
} }
System.out.println(scanCode); log.info("code:{}",scanCode);
//核对正确 //核对正确
Integer status = 2; Integer status = 2;
if(!wmsCode.equals(scanCode)){ if(!wmsCode.equals(scanCode)){
@ -483,6 +483,9 @@ public class PlcService {
stockMapper.updateById(stock); stockMapper.updateById(stock);
} }
checkLog(stock); checkLog(stock);
long end = System.currentTimeMillis();
long s = end - startTime;
log.info("time:{}millisecond",s);
} }

@ -100,7 +100,7 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
tcpLogger.info("info:{}",body); tcpLogger.info("info:{}",body);
//盘点 //盘点
//转球机到盘点位 然后拍照 //转球机到盘点位 然后拍照
plcService.check(plcCmdInfo,Cmd.E1.name(), dataInfo.getCode()); plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode());
//找到该货位的最后一张照片与现在的照片比照 //找到该货位的最后一张照片与现在的照片比照
//plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0); //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);
} }

@ -0,0 +1,47 @@
package com.zhehekeji.web.service.sick;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
/**
* PLC
*
* @author Administrator
*
*/
@Slf4j
public class SickClientHandler extends ChannelInboundHandlerAdapter {
private SickNettyClient nettyClient;
private Integer sensorId;
public SickClientHandler(Integer sensorId, SickNettyClient nettyClient){
this.nettyClient = nettyClient;
this.sensorId = sensorId;
}
/**
*
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
log.info("sensorId:{}连接成功",sensorId);
SickConnMap.conn(sensorId,ctx);
ctx.fireChannelActive();
}
/**
*
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
log.info("sensorId:{} closed",sensorId);
SickConnMap.disConn(sensorId);
log.info(" streetId reconnect......");
//nettyClient.reconnect(sensorId);
}
}

@ -0,0 +1,45 @@
package com.zhehekeji.web.service.sick;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class SickConnMap {
private static Map<Integer, ChannelHandlerContext> connChanel = new HashMap<>();
public static void conn(Integer id,ChannelHandlerContext channel){
connChanel.put(id,channel);
}
public static void disConn(Integer id){
connChanel.remove(id);
}
public static ChannelHandlerContext getChannel(Integer id){
return connChanel.get(id);
}
/**
* sick
* return
* @param sensorId
*/
public static Boolean write(Integer sensorId){
if(connChanel.get(sensorId) != null){
try {
connChanel.get(sensorId).channel().writeAndFlush("start");
return true;
}catch (Exception e){
log.error(""+e);
}
}
return false;
}
}

@ -0,0 +1,65 @@
package com.zhehekeji.web.service.sick;
import com.zhehekeji.web.service.PlcService;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LineBasedFrameDecoder;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class SickDecoder extends LineBasedFrameDecoder {
private static final Logger tcpLogger = LoggerFactory.getLogger("sick");
private static Map<Integer,String> OCRMap = new ConcurrentHashMap<>();
private PlcService plcService;
private Integer sensorId;
public SickDecoder(PlcService plcService,Integer sensorId) {
super(1000);
this.plcService = plcService;
this.sensorId = sensorId;
}
/**
* TCP
*
* @param ctx
* @param in
* @return
* @throws Exception
*/
@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
in = (ByteBuf) super.decode(ctx, in);
if (in == null) {
return null;
}
String code = in.toString(StandardCharsets.UTF_8);
code = code.replace("\\n","");
if(!code.equals("NoRead")){
System.out.println(code);
OCRMap.put(sensorId,code);
//todo 更改stock
}else {
log.warn("no read");
OCRMap.put(sensorId,null);
}
in.release();
ctx.channel().close();
return null;
}
}

@ -0,0 +1,20 @@
package com.zhehekeji.web.service.sick;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import java.nio.charset.StandardCharsets;
public class SickEncoder extends MessageToByteEncoder<String> {
@Override
protected void encode(ChannelHandlerContext ctx, String msg, ByteBuf out) throws Exception {
if(msg == null){
throw new Exception("msg is null");
}
out.writeBytes(msg.getBytes(StandardCharsets.UTF_8));
}
}

@ -0,0 +1,80 @@
package com.zhehekeji.web.service.sick;
import com.zhehekeji.web.entity.SensorGun;
import com.zhehekeji.web.mapper.SensorGunMapper;
import com.zhehekeji.web.service.PlcService;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
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 SickNettyClient {
private static EventLoopGroup group = new NioEventLoopGroup();
@Resource
private SensorGunMapper sensorGunMapper;
@Resource
private PlcService plcService;
/**
*
*/
private static int RECONNECT_NUM = 5;
public void createClient(SensorGun sensorGun) throws InterruptedException {
if (StringUtils.isEmpty(sensorGun.getIp()) || sensorGun.getPort() == null) {
return;
}
Bootstrap client = new Bootstrap();
client.group(group);
client.channel(NioSocketChannel.class);
client.handler(new SickNettyClientFilter(sensorGun.getId(),plcService,this));
// 连接服务端
Channel channel = client.connect(sensorGun.getIp(), sensorGun.getPort()).sync().channel();
channel.writeAndFlush("start");
}
/**
* 线 RECONNECT_NUM
*
* @param sensorId
*/
public void reconnect(Integer sensorId) {
Boolean isConnected = false;
int num = 0;
SensorGun sensorGun = sensorGunMapper.selectById(sensorId);
if (sensorGun == null) {
log.error("reconnect ,sensorGun is null ,id:{}", sensorId);
return;
}
while (num < RECONNECT_NUM && !isConnected) {
try {
createClient(sensorGun);
} catch (Exception e) {
//没连上 继续
log.error("sensorGun reconnect error num:{}", num);
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
num++;
continue;
}
isConnected = true;
}
if (isConnected) {
log.info("sensorGun reconnect success");
} else {
log.error("sensorGun reconnect error .sensorGunId:{},reconnect num:{},ip:{},port:{}", sensorId, num,sensorGun.getIp(),sensorGun.getPort());
}
}
}

@ -0,0 +1,39 @@
package com.zhehekeji.web.service.sick;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.robotic.*;
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 SickNettyClientFilter extends ChannelInitializer<SocketChannel> {
private Integer sensorId;
private PlcService plcService;
private SickNettyClient nettyClient;
public SickNettyClientFilter(Integer sensorId, PlcService plcService, SickNettyClient nettyClient){
this.sensorId = sensorId;
this.plcService = plcService;
this.nettyClient = nettyClient;
}
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline ph = ch.pipeline();
ph.addLast(new SickDecoder(this.plcService,this.sensorId));
ph.addLast(new SickClientHandler(sensorId,nettyClient));
ph.addLast(new SickEncoder());
}
}

@ -0,0 +1,70 @@
package com.zhehekeji.web.service.sick;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/**
* sick
*/
@Slf4j
public class SickSocket {
public static void main(String[] args) {
String code = readOCR("192.168.8.236", 2002);
System.out.println(code);
}
public static String readOCR(String ip,int port){
Socket socket = new Socket();
String code = null;
OutputStream os = null;
InputStream is = null;
try {
socket.connect(new InetSocketAddress(ip,port),3000);
os = socket.getOutputStream();
writeCmd(os);
is = socket.getInputStream();
code = read(is);
} catch (IOException e) {
log.error("sick time out,ip:{},info:{}",ip,e);
}finally {
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
return code;
}
}
private static void writeCmd(OutputStream os) throws IOException {
String startCmd = "start";
byte[]bytes = startCmd.getBytes(StandardCharsets.UTF_8);
os.write(bytes);
}
private static String read(InputStream inStream) throws IOException {
BufferedReader bd = new BufferedReader(new InputStreamReader(inStream));
return bd.readLine();
}
}

@ -7,14 +7,14 @@ spring:
maxWait: 60000 maxWait: 60000
minEvictableIdleTimeMillis: 300000 minEvictableIdleTimeMillis: 300000
minIdle: 15 minIdle: 15
password: Leaper@123 password: ming1234
poolPreparedStatements: true poolPreparedStatements: true
testOnBorrow: true testOnBorrow: true
testOnReturn: false testOnReturn: false
testWhileIdle: false testWhileIdle: false
timeBetweenEvictionRunsMillis: 60000 timeBetweenEvictionRunsMillis: 60000
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://115.236.65.98:12004/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 url: jdbc:mysql://212.129.248.185:3306/lia_duoji?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root username: root
validationQuery: SELECT 1 FROM DUAL validationQuery: SELECT 1 FROM DUAL
# --------本服务端口号 # --------本服务端口号
@ -32,6 +32,10 @@ cameraConfig:
cameraUser: admin cameraUser: admin
cameraPort: 37777 cameraPort: 37777
videoServer: 192.168.8.140:8083 videoServer: 192.168.8.140:8083
#相机抓图延迟 毫秒
delayCaptureTime: 2000
#OCR识别延迟 毫秒
delayScanTime: 2000
# ------------ # ------------
# -----图片 mp4下载地址 # -----图片 mp4下载地址
@ -54,3 +58,7 @@ videoStyleConfig:
lightSource: lightSource:
type: 1 type: 1
info: "{'num':2,'index':0}" info: "{'num':2,'index':0}"
# -----------扫码枪
# ------------type 1: sick
sensor:
type: 1

@ -32,6 +32,10 @@ cameraConfig:
cameraUser: admin cameraUser: admin
cameraPort: 37777 cameraPort: 37777
videoServer: 127.0.0.1:8083 videoServer: 127.0.0.1:8083
#相机抓图延迟 毫秒
delayCaptureTime: 2000
#OCR识别延迟 毫秒
delayScanTime: 2000
# ------------ # ------------
# -----图片 mp4下载地址 # -----图片 mp4下载地址
savePath: savePath:
@ -51,4 +55,8 @@ videoStyleConfig:
# -----------1:JYDam 配置num和index # -----------1:JYDam 配置num和index
lightSource: lightSource:
type: 1 type: 1
info: "{'num':2,'index':0}" info: "{'num':2,'index':0}"
# -----------扫码枪
# ------------type 1: sick
sensor:
type: 1

@ -32,6 +32,10 @@ cameraConfig:
cameraUser: admin cameraUser: admin
cameraPort: 37777 cameraPort: 37777
videoServer: 127.0.0.1:8083 videoServer: 127.0.0.1:8083
#相机抓图延迟 毫秒
delayCaptureTime: 2000
#OCR识别延迟 毫秒
delayScanTime: 2000
# ------------ # ------------
# -----图片 mp4下载地址 # -----图片 mp4下载地址
savePath: savePath:
@ -51,4 +55,8 @@ videoStyleConfig:
# -----------1:JYDam 配置num和index # -----------1:JYDam 配置num和index
lightSource: lightSource:
type: 1 type: 1
info: "{'num':2,'index':0}" info: "{'num':2,'index':0}"
# -----------扫码枪
# ------------type 1: sick
sensor:
type: 1

@ -103,11 +103,37 @@
</filter> </filter>
</appender> </appender>
<appender name="sickTcpAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${logName}-sick-tcp.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${logName}-sick-tcp-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>
%d %p (%file:%line\)- %m%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- additivity属性为false表示此logger的打印信息不再向上级传递(注该值默认为truelogger的日志信息会依次向上级传递最高级logger为root如果不加则至少打印2次本身一次root一次)--> <!-- additivity属性为false表示此logger的打印信息不再向上级传递(注该值默认为truelogger的日志信息会依次向上级传递最高级logger为root如果不加则至少打印2次本身一次root一次)-->
<logger name="tcp" additivity="false" level="INFO"> <logger name="tcp" additivity="false" level="INFO">
<appender-ref ref="tcpAppender"/> <appender-ref ref="tcpAppender"/>
</logger> </logger>
<logger name="sick" additivity="false" level="INFO">
<appender-ref ref="sickTcpAppender"/>
</logger>
<logger name="com.zhehekeji.web.mapper" level="DEBUG" /> <logger name="com.zhehekeji.web.mapper" level="DEBUG" />
<!--info和error分开打印ERROR > WARN > INFO > DEBUG > TRACE--> <!--info和error分开打印ERROR > WARN > INFO > DEBUG > TRACE-->

Loading…
Cancel
Save