camera_merge
王一鸣 5 years ago
parent a58e748aea
commit e45ec50b9e

@ -38,7 +38,11 @@
<artifactId>common</artifactId> <artifactId>common</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.50.Final</version>
</dependency>
<dependency> <dependency>
<groupId>com.zhehekeji</groupId> <groupId>com.zhehekeji</groupId>
<artifactId>filter</artifactId> <artifactId>filter</artifactId>

@ -44,21 +44,21 @@ public class LoginModule {
//Res res = Res.string(); //Res res = Res.string();
//打开日志,可选 //打开日志,可选
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); // NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
File path = new File("./sdklog/"); // File path = new File("./sdklog/");
if (!path.exists()) { // if (!path.exists()) {
path.mkdir(); // path.mkdir();
} // }
String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log"; // String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log";
setLog.nPrintStrategy = 0; // setLog.nPrintStrategy = 0;
setLog.bSetFilePath = 1; // setLog.bSetFilePath = 1;
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); // System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
System.out.println(logPath); // System.out.println(logPath);
setLog.bSetPrintStrategy = 1; // setLog.bSetPrintStrategy = 1;
bLogopen = netsdk.CLIENT_LogOpen(setLog); // bLogopen = netsdk.CLIENT_LogOpen(setLog);
if(!bLogopen ) { // if(!bLogopen ) {
System.err.println("Failed to open NetSDK log"); // System.err.println("Failed to open NetSDK log");
} // }
// 设置断线重连回调接口设置过断线重连成功回调函数后当设备出现断线情况SDK内部会自动进行重连操作 // 设置断线重连回调接口设置过断线重连成功回调函数后当设备出现断线情况SDK内部会自动进行重连操作
// 此操作为可选操作,但建议用户进行设置 // 此操作为可选操作,但建议用户进行设置

@ -21,10 +21,27 @@ public class InitService implements ApplicationRunner {
@Resource @Resource
private CameraMapper cameraMapper; private CameraMapper cameraMapper;
@Resource
private TcpListener tcpListener;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0)); List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
loginThread loginThread = new loginThread(cameras);
loginThread.start();
tcpListener.run();
}
class loginThread extends Thread{
List<Camera> cameras;
public loginThread(List<Camera> cameras){
this.cameras = cameras;
}
@Override
public void run() {
cameras.forEach(camera -> { cameras.forEach(camera -> {
NetSDKLib.LLong lLong = LoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword(),camera.getId()); NetSDKLib.LLong lLong = LoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword(),camera.getId());
if(lLong.longValue() <= 0){ if(lLong.longValue() <= 0){
@ -34,6 +51,6 @@ public class InitService implements ApplicationRunner {
log.debug("初始相机登录成功 cameraId:{}",camera.getId()); log.debug("初始相机登录成功 cameraId:{}",camera.getId());
} }
}); });
}
} }
} }

@ -0,0 +1,118 @@
package com.zhehekeji.web.service;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import lombok.extern.slf4j.Slf4j;
import java.nio.charset.Charset;
import java.util.concurrent.ThreadPoolExecutor;
@Slf4j
public class MyProtocolDecoder extends LengthFieldBasedFrameDecoder {
private ThreadPoolExecutor threadPoolExecutor;
private OrderService orderService;
/**
*
* @param maxFrameLength
* @param lengthFieldOffset length
* @param lengthFieldLength length
* @param lengthAdjustment ,,
* @param initialBytesToStrip
* @param failFast trueframemaxFrameLengthTooLongFrameExceptionfalse
*/
public MyProtocolDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip, boolean failFast, ThreadPoolExecutor threadPoolExecutor, OrderService orderService) {
super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip, failFast);
this.threadPoolExecutor = threadPoolExecutor;
this.orderService = orderService;
}
@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
in = (ByteBuf) super.decode(ctx,in);
if(in == null){
return null;
}
//包头 `L` `P`
char l = in.readChar();
char p = in.readChar();
if(l != 76 && p != 80){
//不是包头 丢
return null;
}
short length = in.readShort();
log.debug("length:{}",length);
CharSequence charSequence = in.readCharSequence(6, Charset.defaultCharset());
String plcId = charSequence.toString();
log.debug("plcId:{}",plcId);
// OA=心跳 OB=工单 OC=任务 OD=告警
CharSequence charSequence1 = in.readCharSequence(2,Charset.defaultCharset());
String type = charSequence1.toString();
log.debug("type:{}",type);
CharSequence charSequence2 = in.readCharSequence(20,Charset.defaultCharset());
String orderNum = charSequence2.toString();
log.debug("订单号:{}",orderNum);
char maohao = in.readChar();
log.debug("冒号:{}",maohao);
char leixing = in.readChar();
log.debug("---{}",leixing);
in.readBytes(8);
// //读取type字段
// byte header1 = in.readByte();
// byte header2 = in.readByte();
// byte header3 = in.readByte();
// byte header4 = in.readByte();
// byte header5 = in.readByte();
// byte header6 = in.readByte();
// if(header1 != 20 && header2 != 20 && header3 != 9 && header4 != 7 && header5 != 11 && header6 != 30){
// //不是包头 直接丢弃
// return null;
// }
// long length = in.readUnsignedInt();
// if(in.readableBytes()!=length){
// throw new Exception("标记的长度不符合实际长度");
// }
// //读取body
// byte []bytes = new byte[in.readableBytes()];
// in.readBytes(bytes);
// String string = new String(bytes,"UTF-8");
// String substring = string.substring(string.indexOf("{"), string.lastIndexOf("}") + 1);
// JSONObject jsonObject = JSONObject.parseObject(substring);
// String deviceId = jsonObject.getString("device_id");
// log.debug("tcp deviceId:{}",deviceId);
// String dataLength = jsonObject.getString("data_length");
// Integer flawType = jsonObject.getInteger("msg");
// String detectStatus = "";
// if(flawType > 0){
// detectStatus = "NG";
// }else {
// detectStatus = "OK";
// }
// String result = jsonObject.getString("result");
// if(!StringUtils.isEmpty(result) && !"{}".equals(result)){
// log.debug(result);
// AdaptData adaptData = JSONObject.parseObject(result,AdaptData.class);
// if(adaptData != null){
// FlawRunnable flawRunnable = new FlawRunnable(jdbcTemplate,deviceId,"flaw",adaptData);
// threadPoolExecutor.execute(flawRunnable);
// }
// }else {
// log.warn("result为空{}",result);
// }
// String s2 = string.substring(string.lastIndexOf("}") + 1, string.length());
// WebSocketMapUtil.send(deviceId,s2,detectStatus);
in.release();
return null;
}
}

@ -0,0 +1,57 @@
package com.zhehekeji.web.service;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class TcpListener {
@Value("${tcpPort}")
private Integer tcpPort;
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 100, 200,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10000000));
@Resource
private OrderService orderService;
public void run(){
EventLoopGroup boss = new NioEventLoopGroup();
EventLoopGroup work = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss,work).channel(NioServerSocketChannel.class).localAddress(tcpPort).childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ch.pipeline().addLast("handler", new MyProtocolDecoder(1000*10000,6,4,0,0,false,threadPoolExecutor,orderService)); // 自定义业务逻辑处理器
}
}).childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture future = bootstrap.bind().sync();
log.info("netty server started Listening on " + tcpPort);
future.channel().closeFuture().sync();
}catch (Exception e){
log.error("netty出错{}"+e);
e.printStackTrace();
}finally {
work.shutdownGracefully();
boss.shutdownGracefully();
}
}
}

@ -38,3 +38,4 @@ cameraUser: admin
cameraPort: 37777 cameraPort: 37777
mediaPath: d:\\media\ mediaPath: d:\\media\
mp4Path: d:\\mp4\ mp4Path: d:\\mp4\
tcpPort: 2021

@ -36,5 +36,6 @@ picPort: 8544
cameraPassword: hzleaper123 cameraPassword: hzleaper123
cameraUser: admin cameraUser: admin
cameraPort: 37777 cameraPort: 37777
mediaPath: d:\\media\ mediaPath: /home/test/lia/media/
mp4Path: d:\\media_mp4\ mp4Path: /home/test/lia/mp4/
tcpPort: 2021

@ -88,32 +88,8 @@
<appender-ref ref="STDOUT"/> <appender-ref ref="STDOUT"/>
</root> </root>
</springProfile> </springProfile>
<springProfile name="loc">
<root level="INFO">
<appender-ref ref="FILEINFO"/>
<appender-ref ref="FILEWARN"/>
<appender-ref ref="FILEERROR"/>
<appender-ref ref="STDOUT"/>
</root>
</springProfile>
<springProfile name="sit">
<root level="INFO">
<appender-ref ref="FILEINFO"/>
<appender-ref ref="FILEWARN"/>
<appender-ref ref="FILEERROR"/>
</root>
</springProfile>
<springProfile name="uat">
<root level="INFO">
<appender-ref ref="FILEINFO"/>
<appender-ref ref="FILEWARN"/>
<appender-ref ref="FILEERROR"/>
</root>
</springProfile>
<springProfile name="prd"> <springProfile name="prod">
<root level="INFO"> <root level="INFO">
<appender-ref ref="FILEINFO"/> <appender-ref ref="FILEINFO"/>
<appender-ref ref="FILEWARN"/> <appender-ref ref="FILEWARN"/>

Loading…
Cancel
Save