|
|
|
package com.zhonglai.luhui.smart.feeder.service;
|
|
|
|
package com.zhonglai.luhui.smart.feeder.service.device;
|
|
|
|
|
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.config.OperatingData;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.opencv.OpenCVUtil;
|
|
|
|
import org.bytedeco.javacv.FrameGrabber;
|
|
|
|
import org.opencv.videoio.VideoCapture;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.net.DatagramSocket;
|
|
|
|
import java.io.File;
|
|
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
|
|
import java.util.concurrent.ScheduledFuture;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import java.net.DatagramPacket;
|
|
|
|
import java.net.InetAddress;
|
|
|
|
import java.net.MulticastSocket;
|
|
|
|
import java.io.IOException;
|
|
|
|
/**
|
|
|
|
* 摄像头
|
|
|
|
*/
|
|
...
|
...
|
@@ -24,23 +21,35 @@ import java.io.IOException; |
|
|
|
public class CameraService {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(CameraService.class);
|
|
|
|
|
|
|
|
@Value("${sys.network_camera_ip}")
|
|
|
|
private String ip;
|
|
|
|
@Value("${sys.mp4_file_path}")
|
|
|
|
private String MP4_FILE_PATH;
|
|
|
|
|
|
|
|
private VideoCapture videoCapture;
|
|
|
|
private boolean videoIsOpen;
|
|
|
|
|
|
|
|
private ScheduledFuture scheduledFuture;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private ScheduledExecutorService scheduledExecutorService;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
private ConfigurationParameterService configurationParameterService;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 初始化摄像头
|
|
|
|
*/
|
|
|
|
private void openCapture()
|
|
|
|
{
|
|
|
|
videoCapture = OpenCVUtil.readVideoCaptureForRtsp();
|
|
|
|
switch (OperatingData.cameraConfig.getCameraInterfaceType().toUpperCase())
|
|
|
|
{
|
|
|
|
case "USB":
|
|
|
|
videoCapture = readVideoCaptureForUSB();
|
|
|
|
break;
|
|
|
|
case "RTSP":
|
|
|
|
videoCapture = readVideoCaptureForRtsp();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
videoCapture = readVideoCaptureForFile();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(null == videoCapture)
|
|
|
|
{
|
|
|
|
return;
|
|
...
|
...
|
@@ -56,11 +65,10 @@ public class CameraService { |
|
|
|
{
|
|
|
|
// 检查视频是否成功打开
|
|
|
|
if (null !=videoCapture && videoCapture.isOpened()) {
|
|
|
|
videoIsOpen = true;
|
|
|
|
OperatingData.cameraData.setVideoIsOpen(true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
System.out.println("无法打开视频文件"+ configurationParameterService.getConfig(ConfigurationParameter.captureNumber));
|
|
|
|
videoIsOpen = false;
|
|
|
|
OperatingData.cameraData.setVideoIsOpen(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
...
|
...
|
@@ -71,8 +79,8 @@ public class CameraService { |
|
|
|
if(null == scheduledFuture || scheduledFuture.isDone())
|
|
|
|
{
|
|
|
|
scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
|
|
|
|
logger.info("摄像头状态{}",videoIsOpen);
|
|
|
|
if(!videoIsOpen)
|
|
|
|
logger.info("摄像头状态{}",OperatingData.cameraData.isVideoIsOpen());
|
|
|
|
if(!OperatingData.cameraData.isVideoIsOpen())
|
|
|
|
{
|
|
|
|
openCapture();
|
|
|
|
}
|
|
...
|
...
|
@@ -91,9 +99,9 @@ public class CameraService { |
|
|
|
scheduledFuture.cancel(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(videoIsOpen)
|
|
|
|
if(OperatingData.cameraData.isVideoIsOpen())
|
|
|
|
{
|
|
|
|
videoIsOpen = false;
|
|
|
|
OperatingData.cameraData.setVideoIsOpen(false);
|
|
|
|
// 释放资源
|
|
|
|
videoCapture.release();
|
|
|
|
}
|
|
...
|
...
|
@@ -105,9 +113,9 @@ public class CameraService { |
|
|
|
*/
|
|
|
|
public void clean()
|
|
|
|
{
|
|
|
|
if(videoIsOpen)
|
|
|
|
if(OperatingData.cameraData.isVideoIsOpen())
|
|
|
|
{
|
|
|
|
videoIsOpen = false;
|
|
|
|
OperatingData.cameraData.setVideoIsOpen(false);
|
|
|
|
// 释放资源
|
|
|
|
videoCapture.release();
|
|
|
|
}
|
|
...
|
...
|
@@ -118,130 +126,76 @@ public class CameraService { |
|
|
|
return videoCapture;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Boolean getVideoIsOpen()
|
|
|
|
{
|
|
|
|
return videoIsOpen;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) throws Exception{
|
|
|
|
|
|
|
|
MulticastSocket socket = null;
|
|
|
|
try {
|
|
|
|
// 创建 MulticastSocket 对象
|
|
|
|
socket = new MulticastSocket();
|
|
|
|
|
|
|
|
// 指定多播地址和端口
|
|
|
|
InetAddress group = InetAddress.getByName("239.255.255.250");
|
|
|
|
int port = 37020;
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
// 创建要发送的消息
|
|
|
|
String message = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>B0F5E9C7-EBD5-4A03-99F7-B069B141C619</Uuid><Types>inquiry</Types></Probe>";
|
|
|
|
byte[] buffer = message.getBytes();
|
|
|
|
|
|
|
|
// 创建 DatagramPacket 对象
|
|
|
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, group, port);
|
|
|
|
|
|
|
|
// 发送数据包
|
|
|
|
socket.send(packet);
|
|
|
|
|
|
|
|
Thread.sleep(10000);
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* 读取网络摄像头
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public VideoCapture readVideoCaptureForRtsp()
|
|
|
|
{
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
} finally {
|
|
|
|
if (socket != null) {
|
|
|
|
socket.close();
|
|
|
|
String rtspUrl = "rtsp://admin:Luhui586@"+ip+":554/h264/ch1/main/av_stream";
|
|
|
|
VideoCapture videoCapture = new VideoCapture(rtspUrl);
|
|
|
|
while (!videoCapture.isOpened())
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
Thread.sleep(1000);
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return videoCapture;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void sendclien()
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
// 创建组播Socket
|
|
|
|
MulticastSocket multicastSocket = new MulticastSocket();
|
|
|
|
|
|
|
|
// 创建组播地址
|
|
|
|
InetAddress group = InetAddress.getByName("239.255.255.250");
|
|
|
|
// 发送消息
|
|
|
|
String message = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>B0F5E9C7-EBD5-4A03-99F7-B069B141C619</Uuid><Types>inquiry</Types></Probe>";
|
|
|
|
byte[] buffer = message.getBytes();
|
|
|
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, group, 37020);
|
|
|
|
multicastSocket.send(packet);
|
|
|
|
// 关闭Socket
|
|
|
|
multicastSocket.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void onClien()
|
|
|
|
/**
|
|
|
|
* 读取USB口的摄像头
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public VideoCapture readVideoCaptureForUSB()
|
|
|
|
{
|
|
|
|
DatagramSocket socket = null;
|
|
|
|
try {
|
|
|
|
// 创建 DatagramSocket 对象,监听指定的端口
|
|
|
|
socket = new DatagramSocket(37020);
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
// 创建 DatagramPacket 对象,用于接收数据
|
|
|
|
byte[] buffer = new byte[1024];
|
|
|
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
|
|
|
|
|
|
|
// 接收数据
|
|
|
|
socket.receive(packet);
|
|
|
|
|
|
|
|
// 转换并打印接收到的数据
|
|
|
|
String received = new String(packet.getData(), 0, packet.getLength());
|
|
|
|
System.out.println("Received data: " + received);
|
|
|
|
for(int i=0;i<10;i++)
|
|
|
|
{
|
|
|
|
logger.info("初始化摄像头");
|
|
|
|
try {
|
|
|
|
Thread.sleep(3000);
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
}
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
} finally {
|
|
|
|
if (socket != null) {
|
|
|
|
socket.close();
|
|
|
|
VideoCapture videoCapture = new VideoCapture();
|
|
|
|
boolean isopen = videoCapture.open(i);
|
|
|
|
if(isopen)
|
|
|
|
{
|
|
|
|
logger.info("打开化摄像头"+i+"成功");
|
|
|
|
return videoCapture;
|
|
|
|
}else {
|
|
|
|
logger.info("打开化摄像头"+i+"失败");
|
|
|
|
}
|
|
|
|
if(null != videoCapture)
|
|
|
|
{
|
|
|
|
return videoCapture; //拿到的第一个摄像头返回
|
|
|
|
}
|
|
|
|
}
|
|
|
|
logger.info("未检测到USB摄像头!!!");
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void clien()
|
|
|
|
/**
|
|
|
|
* 读取本地视频文件
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private VideoCapture readVideoCaptureForFile()
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
// 创建组播Socket
|
|
|
|
MulticastSocket multicastSocket = new MulticastSocket(37020);
|
|
|
|
|
|
|
|
// 加入组播地址
|
|
|
|
InetAddress group = InetAddress.getByName("239.255.255.250");
|
|
|
|
multicastSocket.joinGroup(group);
|
|
|
|
|
|
|
|
boolean isip = true;
|
|
|
|
while (isip)
|
|
|
|
{
|
|
|
|
// 接收消息
|
|
|
|
byte[] buffer = new byte[1024];
|
|
|
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
|
|
|
multicastSocket.receive(packet);
|
|
|
|
|
|
|
|
// 处理消息
|
|
|
|
String message = new String(packet.getData(), packet.getOffset(), packet.getLength());
|
|
|
|
System.out.println("Received: " + message);
|
|
|
|
|
|
|
|
if(message.indexOf("ip")>=0)
|
|
|
|
{
|
|
|
|
isip = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 关闭Socket
|
|
|
|
multicastSocket.leaveGroup(group);
|
|
|
|
multicastSocket.close();
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
logger.info("未检测到摄像头{},尝试打开本地视频",MP4_FILE_PATH);
|
|
|
|
//如果找不到摄像头就找本地视频文件
|
|
|
|
File file = new File(MP4_FILE_PATH);
|
|
|
|
if(file.exists() && file.isFile())
|
|
|
|
{
|
|
|
|
VideoCapture videoCapture = new VideoCapture();
|
|
|
|
boolean isopen = videoCapture.open(MP4_FILE_PATH);
|
|
|
|
System.out.println(isopen);
|
|
|
|
return videoCapture;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
} |
...
|
...
|
|