|
|
|
package com.zhonglai.luhui.smart.feeder.service.device.handle;
|
|
|
|
|
|
|
|
import com.ruoyi.common.utils.ByteUtil;
|
|
|
|
import com.sun.jna.Pointer;
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.config.OperatingData;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.dto.HCCameraRepose;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.service.PushVideo;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.service.device.CameraHandle;
|
|
|
|
import com.zhonglai.luhui.smart.feeder.service.device.CameraService;
|
|
|
|
import org.bytedeco.ffmpeg.global.avutil;
|
|
|
|
import org.bytedeco.javacv.*;
|
|
|
|
import org.bytedeco.opencv.opencv_core.IplImage;
|
|
|
|
import org.opencv.core.Mat;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import javax.swing.*;
|
|
|
|
import java.io.File;
|
|
|
|
import java.net.*;
|
|
|
|
import java.util.Enumeration;
|
|
|
|
import java.util.Random;
|
|
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
public class CameraRtspHandle implements CameraHandle {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(CameraRtspHandle.class);
|
|
|
|
private FFmpegFrameGrabber grabber;
|
|
|
|
private String ip = "192.168.0.198";
|
|
|
|
|
|
|
|
private OpenCVFrameConverter.ToOrgOpenCvCoreMat converter2;
|
|
|
|
|
|
|
|
|
|
|
|
private FFmpegFrameFilter filter;
|
|
|
|
|
|
|
|
public static Mat mat;
|
|
|
|
|
|
|
|
public CameraRtspHandle()
|
|
|
|
{
|
|
|
|
init();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void init() {
|
|
|
|
public boolean init() {
|
|
|
|
if(isOpen())
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
FFmpegFrameGrabber.tryLoad();
|
|
|
|
|
|
|
|
switch (OperatingData.cameraConfig.getCameraInterfaceType().toLowerCase())
|
|
|
|
{
|
|
|
|
case "rtsp":
|
|
|
|
if(!initRtsp())
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "local":
|
|
|
|
if(!iniLocal())
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
// 创建一个FFmpegFrameFilter对象,用于图像压缩
|
|
|
|
filter = new FFmpegFrameFilter("scale=640:-1", grabber.getImageWidth(), grabber.getImageHeight());
|
|
|
|
try {
|
|
|
|
filter.start();
|
|
|
|
} catch (FFmpegFrameFilter.Exception e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
}
|
|
|
|
converter2 = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();
|
|
|
|
Thread.sleep(3000);
|
|
|
|
Thread thread = new Thread(() -> {
|
|
|
|
while (isOpen()) {
|
|
|
|
try {
|
|
|
|
mat = getMat();
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("抓取摄像头帧失败",e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
thread.start();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("摄像头初始化失败",e);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean iniLocal() throws FFmpegFrameGrabber.Exception, InterruptedException {
|
|
|
|
File file = new File("2.pm4");
|
|
|
|
if(!file.exists())
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
grabber = new FFmpegFrameGrabber(file);
|
|
|
|
avutil.av_log_set_level(avutil.AV_LOG_ERROR);
|
|
|
|
grabber.start();
|
|
|
|
while (!grabber.hasAudio() || !grabber.hasVideo())
|
|
|
|
{
|
|
|
|
Thread.sleep(1000);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean initRtsp() throws FFmpegFrameGrabber.Exception, InterruptedException {
|
|
|
|
String ip = findCameraIp();
|
|
|
|
if(StringUtils.isEmpty(ip))
|
|
|
|
{
|
|
|
|
logger.error("未找到摄像头");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
String rtspUrl = "rtsp://admin:Luhui586@"+ip+":554/h264/ch1/main/av_stream";
|
|
|
|
grabber = new FFmpegFrameGrabber(rtspUrl);
|
|
|
|
// grabber.setOption("framerate", "30"); // 设置帧率为30帧/秒
|
|
|
|
// grabber.setOption("skip_frame", "nokey"); // 只抓取关键帧
|
|
|
|
// grabber.setOption("skip_initial_bytes", "1"); // 跳过初始字节直到第一个关键帧
|
|
|
|
grabber.setVideoOption("fflags", "nobuffer");
|
|
|
|
grabber.setVideoOption("-vf", "nobuffer");
|
|
|
|
// grabber.setOption("buffer_size", "4096"); // 设置缓冲区大小为1024字节
|
|
|
|
grabber.setVideoOption("rtsp_transport", "tcp");
|
|
|
|
grabber.setOption("stimeout", "2000000");
|
|
|
|
avutil.av_log_set_level(avutil.AV_LOG_ERROR);
|
|
|
|
grabber.start();
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("摄像头初始化失败",e);
|
|
|
|
while (!grabber.hasAudio() || !grabber.hasVideo())
|
|
|
|
{
|
|
|
|
Thread.sleep(1000);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isOpen()
|
|
|
|
{
|
|
|
|
if(null == grabber)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(grabber.isDeinterlace())
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(grabber.isCloseInputStream())
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(grabber.isTriggerMode())
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(!grabber.hasAudio())
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if(!grabber.hasVideo())
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Mat getMat() {
|
|
|
|
Frame frame = getFrame();
|
|
|
|
if(null == frame)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return converter2.convert(frame);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
// CameraRtspHandle cameraRtspHandle = new CameraRtspHandle();
|
|
|
|
// cameraRtspHandle.init();
|
|
|
|
// FFmpegFrameGrabber grabber = cameraRtspHandle.grabber;
|
|
|
|
//
|
|
|
|
// CanvasFrame previewCanvas = new CanvasFrame("摄像头预览", CanvasFrame.getDefaultGamma() / grabber.getGamma());
|
|
|
|
// previewCanvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
// previewCanvas.setAlwaysOnTop(true);
|
|
|
|
//
|
|
|
|
// // 创建一个FFmpegFrameFilter对象,用于图像压缩
|
|
|
|
// FFmpegFrameFilter filter = new FFmpegFrameFilter("scale=640:-1", grabber.getImageWidth(), grabber.getImageHeight());
|
|
|
|
// try {
|
|
|
|
// filter.start();
|
|
|
|
// } catch (FFmpegFrameFilter.Exception e) {
|
|
|
|
// throw new RuntimeException(e);
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// while (true)
|
|
|
|
// {
|
|
|
|
// logger.info("当前grabber状态:hasAudio {},hasVideo {},isCloseInputStream {},isDeinterlace {},isTriggerMode {}",grabber.hasAudio(),grabber.hasVideo(),grabber.isCloseInputStream(),grabber.isDeinterlace(),grabber.isTriggerMode());
|
|
|
|
// try {
|
|
|
|
// filter.push(grabber.grabImage());
|
|
|
|
// Frame filteredFrame = filter.pull();
|
|
|
|
// if(null != filteredFrame)
|
|
|
|
// {
|
|
|
|
// previewCanvas.showImage(filteredFrame);
|
|
|
|
// }
|
|
|
|
// } catch (FFmpegFrameGrabber.Exception e) {
|
|
|
|
// logger.info("无法显示");
|
|
|
|
// } catch (FFmpegFrameFilter.Exception e) {
|
|
|
|
// throw new RuntimeException(e);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// 创建UDP Socket
|
|
|
|
MulticastSocket socket = null;
|
|
|
|
try {
|
|
|
|
socket = new MulticastSocket (37020);
|
|
|
|
socket.setTimeToLive(1);
|
|
|
|
// socket.setSoTimeout(10000);
|
|
|
|
socket.joinGroup( InetAddress.getByName("239.255.255.250"));
|
|
|
|
} catch (SocketException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
} catch (UnknownHostException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
} catch (IOException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
public Frame toFram(Mat mat) {
|
|
|
|
if(null == mat)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return converter2.convert(mat);
|
|
|
|
}
|
|
|
|
|
|
|
|
private Frame getFrame() {
|
|
|
|
Frame frame = null;
|
|
|
|
try {
|
|
|
|
frame = grabber.grabImage();
|
|
|
|
if (frame == null || frame.imageHeight==0) {
|
|
|
|
//TODO:连续n次为null,进行重连
|
|
|
|
logger.info("读取不到画面,当前grabber状态:hasAudio {},hasVideo {},isCloseInputStream {},isDeinterlace {},isTriggerMode {}",grabber.hasAudio(),grabber.hasVideo(),grabber.isCloseInputStream(),grabber.isDeinterlace(),grabber.isTriggerMode());
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("抓取摄像头帧失败",e);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i=0;i<3;i++)
|
|
|
|
}
|
|
|
|
|
|
|
|
public Frame compress(Frame frame)
|
|
|
|
{
|
|
|
|
UUID uuid = UUID.randomUUID();
|
|
|
|
String uuidString = uuid.toString().toUpperCase();
|
|
|
|
// 构造sadp请求数据包
|
|
|
|
String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Probe><Uuid>"+uuidString+"</Uuid><Types>inquiry</Types></Probe>";
|
|
|
|
try {
|
|
|
|
filter.push(frame);
|
|
|
|
Frame filteredFrame = filter.pull();
|
|
|
|
return filteredFrame;
|
|
|
|
} catch (FFmpegFrameFilter.Exception e) {
|
|
|
|
logger.error("压缩失败",e);
|
|
|
|
}
|
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
|
|
|
|
byte[] requestData = str.getBytes();
|
|
|
|
DatagramPacket requestPacket = new DatagramPacket(requestData, requestData.length, InetAddress.getByName("239.255.255.250"), 37020);
|
|
|
|
public void pushVideo(PushVideo pushVideo)
|
|
|
|
{
|
|
|
|
logger.info("当前grabber状态:hasAudio {},hasVideo {},isCloseInputStream {},isDeinterlace {},isTriggerMode {}",grabber.hasAudio(),grabber.hasVideo(),grabber.isCloseInputStream(),grabber.isDeinterlace(),grabber.isTriggerMode());
|
|
|
|
if(grabber.hasAudio() && grabber.hasVideo())
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
Frame filteredFrame = compress(grabber.grabImage());
|
|
|
|
if(null != filteredFrame)
|
|
|
|
{
|
|
|
|
pushVideo.display(filteredFrame);
|
|
|
|
}
|
|
|
|
} catch (FFmpegFrameGrabber.Exception e) {
|
|
|
|
logger.info("无法显示");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Thread.sleep(1000);
|
|
|
|
// 发送请求数据包
|
|
|
|
socket.send(requestPacket);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
ConfigurationParameterService.initConfigurationParameter();
|
|
|
|
CameraRtspHandle cameraRtspHandle = new CameraRtspHandle();
|
|
|
|
if(cameraRtspHandle.isOpen())
|
|
|
|
{
|
|
|
|
CanvasFrame previewCanvas = new CanvasFrame("摄像头预览", CanvasFrame.getDefaultGamma() / cameraRtspHandle.grabber.getGamma());
|
|
|
|
previewCanvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
previewCanvas.setAlwaysOnTop(true);
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
// 接收响应数据包
|
|
|
|
byte[] responseData = new byte[4096];
|
|
|
|
DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length);
|
|
|
|
socket.receive(responsePacket);
|
|
|
|
cameraRtspHandle.pushVideo(filteredFrame -> previewCanvas.showImage(filteredFrame));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static String getLocalIp()
|
|
|
|
{
|
|
|
|
Enumeration<NetworkInterface> interfaces = null;
|
|
|
|
try {
|
|
|
|
interfaces = NetworkInterface.getNetworkInterfaces();
|
|
|
|
while (interfaces.hasMoreElements()) {
|
|
|
|
NetworkInterface networkInterface = interfaces.nextElement();
|
|
|
|
if (networkInterface.isLoopback() || !networkInterface.isUp()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
|
|
|
|
while (addresses.hasMoreElements()) {
|
|
|
|
InetAddress addr = addresses.nextElement();
|
|
|
|
if (addr.isSiteLocalAddress()) { // Checks if this address is a "site local" address.
|
|
|
|
|
|
|
|
if(addr.getHostAddress().contains("192.168"))
|
|
|
|
{
|
|
|
|
return addr.getHostAddress();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (SocketException e) {
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 解析响应数据包
|
|
|
|
String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
|
|
|
|
System.out.println("Response: " + response);
|
|
|
|
public static String findCameraIp() {
|
|
|
|
String localIP = getLocalIp();
|
|
|
|
if(null == localIP)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
final String[] ip = new String[1];
|
|
|
|
final Object lock = new Object();
|
|
|
|
|
|
|
|
Thread thread1 = new Thread(() -> {
|
|
|
|
try {
|
|
|
|
synchronized (lock) {
|
|
|
|
ip[0] = getCameraIp(localIP);
|
|
|
|
lock.notify();
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}finally {
|
|
|
|
try {
|
|
|
|
socket.leaveGroup( InetAddress.getByName("239.255.255.250"));
|
|
|
|
} catch (IOException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
}
|
|
|
|
// 关闭Socket
|
|
|
|
socket.close();
|
|
|
|
});
|
|
|
|
|
|
|
|
Thread thread2 = new Thread(() -> {
|
|
|
|
try {
|
|
|
|
while (StringUtils.isEmpty(ip[0]))
|
|
|
|
{
|
|
|
|
findCamera(localIP);
|
|
|
|
Thread.sleep(1000);
|
|
|
|
}
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
public static String formatUuid(String uuid) {
|
|
|
|
return uuid.substring(0, 8) + "-" +
|
|
|
|
uuid.substring(8, 12) + "-" +
|
|
|
|
uuid.substring(12, 16) + "-" +
|
|
|
|
uuid.substring(16, 20) + "-" +
|
|
|
|
uuid.substring(20);
|
|
|
|
thread1.start();
|
|
|
|
thread2.start();
|
|
|
|
|
|
|
|
synchronized (lock) {
|
|
|
|
lock.wait(5000);
|
|
|
|
}
|
|
|
|
return ip[0];
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void sendudp()
|
|
|
|
private static void findCamera(String ip)
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
// 创建组播Socket
|
|
|
|
InetAddress group = InetAddress.getByName("239.255.255.250"); // 组播地址
|
|
|
|
int port = 37020; // 组播端口
|
|
|
|
|
|
|
|
MulticastSocket multicastSocket = new MulticastSocket(new InetSocketAddress(InetAddress.getByName(ip), 37020));
|
|
|
|
|
|
|
|
// 发送消息
|
|
|
|
String uuid = UUID.randomUUID().toString().toUpperCase();
|
|
|
|
String message = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
|
|
|
|
"<Probe>" +
|
|
|
|
" <Uuid>" + uuid + "</Uuid>" +
|
|
|
|
" <Types>inquiry</Types>" +
|
|
|
|
"</Probe>";
|
|
|
|
byte[] buffer = message.getBytes();
|
|
|
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, group, port);
|
|
|
|
multicastSocket.send(packet);
|
|
|
|
|
|
|
|
multicastSocket.close();
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static String getCameraIp(String ip) throws Exception {
|
|
|
|
// 1.创建组播socket,加入指定的组播地址和端口
|
|
|
|
InetAddress group = InetAddress.getByName("239.255.255.250");
|
|
|
|
MulticastSocket socket = new MulticastSocket(37020);
|
|
|
|
MulticastSocket multicastSocket = new MulticastSocket(37020);
|
|
|
|
|
|
|
|
// 加入组播组
|
|
|
|
socket.joinGroup(group);
|
|
|
|
multicastSocket.joinGroup(new InetSocketAddress(group,37020),NetworkInterface.getByInetAddress(InetAddress.getByName(ip)));
|
|
|
|
multicastSocket.setSoTimeout(100000);
|
|
|
|
// 2.创建接收的数据包
|
|
|
|
byte[] buf = new byte[1024];
|
|
|
|
|
|
|
|
while (socket.isConnected())
|
|
|
|
|
|
|
|
// 4.解析数据包,并打印出来
|
|
|
|
HCCameraRepose probe = null;
|
|
|
|
while (ObjectUtil.isEmpty(probe))
|
|
|
|
{
|
|
|
|
DatagramPacket dpReceive = new DatagramPacket(buf, buf.length);
|
|
|
|
// 3.调用socket对象的接收方法接收数据包
|
|
|
|
multicastSocket.receive(dpReceive);
|
|
|
|
String receivedXml = new String(dpReceive.getData(), 0, dpReceive.getLength());
|
|
|
|
|
|
|
|
String startTag = "<IPv4Address>";
|
|
|
|
String endTag = "</IPv4Address>";
|
|
|
|
int start = receivedXml.indexOf(startTag);
|
|
|
|
int end = receivedXml.indexOf(endTag);
|
|
|
|
if(start<0)
|
|
|
|
{
|
|
|
|
// 接收消息
|
|
|
|
byte[] buffer = new byte[4096];
|
|
|
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
|
|
|
socket.receive(packet);
|
|
|
|
// 解析消息并处理
|
|
|
|
String message = new String(packet.getData(), 0, packet.getLength());
|
|
|
|
System.out.println("Received message: " + message);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// 检查是否找到标签
|
|
|
|
if (start == -1 || end == -1) {
|
|
|
|
return "No IPv4Address tag found.";
|
|
|
|
}
|
|
|
|
|
|
|
|
// 计算开始位置(包含开始标签的长度,因为我们想要从标签后面开始截取)
|
|
|
|
start = start + startTag.length();
|
|
|
|
|
|
|
|
// 截取并返回结果
|
|
|
|
return receivedXml.substring(start, end);
|
|
|
|
}
|
|
|
|
|
|
|
|
return probe.getIPv4Address();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void close()
|
|
|
|
{
|
|
|
|
if(null != grabber)
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
grabber.release();
|
|
|
|
grabber.close();
|
|
|
|
grabber = null;
|
|
|
|
} catch (FrameGrabber.Exception e) {
|
|
|
|
logger.info("摄像头关闭失败",e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(null !=converter2)
|
|
|
|
{
|
|
|
|
converter2.close();
|
|
|
|
}
|
|
|
|
// 退出组播组
|
|
|
|
socket.leaveGroup(group);
|
|
|
|
|
|
|
|
// 关闭Socket
|
|
|
|
socket.close();
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}finally {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 生成UUID的方法
|
|
|
|
* @return 返回 UUID 字符串
|
|
|
|
*/
|
|
|
|
public static String generateUUID() {
|
|
|
|
// 获取当前时间戳
|
|
|
|
long timeMillis = 1697789348000l;
|
|
|
|
// 获取机器MAC地址
|
|
|
|
String macAddress = "G24198441";
|
|
|
|
// 生成随机数
|
|
|
|
int randomInt = new Random().nextInt();
|
|
|
|
// 获取个人或组织的标识码(这里设为 001)
|
|
|
|
int nodeId = 001;
|
|
|
|
// 组合 UUID 字符串
|
|
|
|
String uuid = String.format("%016x", timeMillis) //
|
|
|
|
+ String.format("%016x", randomInt) //
|
|
|
|
+ String.format("%016x", nodeId) //
|
|
|
|
+ macAddress;
|
|
|
|
// 返回 UUID 字符串
|
|
|
|
return uuid;
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|