宇视抓拍图片
This commit is contained in:
@@ -1,17 +1,57 @@
|
|||||||
package top.wms.admin.controller.ys;
|
package top.wms.admin.controller.ys;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.sun.jna.Pointer;
|
import com.sun.jna.Pointer;
|
||||||
import com.sun.jna.ptr.IntByReference;
|
import com.sun.jna.ptr.IntByReference;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import top.wms.admin.controller.ys.lib.NetDEVSDKLib;
|
import top.wms.admin.controller.ys.lib.NetDEVSDKLib;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
public class NetDemo {
|
@Slf4j
|
||||||
|
public class NetCommon {
|
||||||
|
|
||||||
public static Pointer lpUserID = null;
|
public static Pointer lpUserID = null;
|
||||||
public static String strPicturePath = "." + File.separator + "Picture" + File.separator;
|
public static String strPicturePath = "." + File.separator + "Picture" + File.separator;
|
||||||
public static NetDEVSDKLib netdevsdk = NetDEVSDKLib.NETDEVSDK_INSTANCE;
|
public static NetDEVSDKLib netdevsdk = NetDEVSDKLib.NETDEVSDK_INSTANCE;
|
||||||
public static int ChannelID = 0;
|
public static int ChannelID = 0;
|
||||||
|
private static Timer captureTimer = null;
|
||||||
|
// 状态标志
|
||||||
|
private static boolean sdkInitialized = false;
|
||||||
|
private static boolean deviceLoggedIn = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化SDK
|
||||||
|
*/
|
||||||
|
public static boolean initSDK() {
|
||||||
|
String strLogPath = "./sdklog/";
|
||||||
|
boolean bRet = netdevsdk.NETDEV_SetLogPath(strLogPath);
|
||||||
|
if (!bRet) {
|
||||||
|
log.error("NETDEV_SetLogPath failed:{}", netdevsdk.NETDEV_GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bRet = netdevsdk.NETDEV_Init();
|
||||||
|
if (!bRet) {
|
||||||
|
log.error("Initialize failed:{}", netdevsdk.NETDEV_GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建图片保存目录
|
||||||
|
File file = new File(strPicturePath);
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.mkdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置SDK初始化标志
|
||||||
|
sdkInitialized = true;
|
||||||
|
log.info("SDK初始化成功");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Launch the application.
|
* Launch the application.
|
||||||
@@ -29,7 +69,7 @@ public class NetDemo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 抓拍图片
|
// 抓拍图片
|
||||||
captureImage();
|
captureImage(null);
|
||||||
|
|
||||||
// 登出设备
|
// 登出设备
|
||||||
logoutDevice();
|
logoutDevice();
|
||||||
@@ -40,37 +80,13 @@ public class NetDemo {
|
|||||||
System.out.println("程序执行完成");
|
System.out.println("程序执行完成");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化SDK
|
|
||||||
*/
|
|
||||||
private static void initSDK() {
|
|
||||||
String strLogPath = "./sdklog/";
|
|
||||||
boolean bRet = netdevsdk.NETDEV_SetLogPath(strLogPath);
|
|
||||||
if (false == bRet) {
|
|
||||||
System.out.printf("NETDEV_SetLogPath failed:%d", netdevsdk.NETDEV_GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
bRet = netdevsdk.NETDEV_Init();
|
|
||||||
if (false == bRet) {
|
|
||||||
System.out.printf("Initialize failed:%d", netdevsdk.NETDEV_GetLastError());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建图片保存目录
|
|
||||||
File file = new File(strPicturePath);
|
|
||||||
if (!file.exists()) {
|
|
||||||
file.mkdir();
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println("SDK初始化成功");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登录设备
|
* 登录设备
|
||||||
*
|
*
|
||||||
* @return 登录是否成功
|
* @return 登录是否成功
|
||||||
*/
|
*/
|
||||||
private static boolean loginDevice() {
|
public static boolean loginDevice() {
|
||||||
// 设备信息
|
// 设备信息
|
||||||
String strUserName = "admin";
|
String strUserName = "admin";
|
||||||
String strPassword = "admin@123";
|
String strPassword = "admin@123";
|
||||||
@@ -90,17 +106,19 @@ public class NetDemo {
|
|||||||
stDevLoginInfo.dwLoginProto = dwLoginProto;
|
stDevLoginInfo.dwLoginProto = dwLoginProto;
|
||||||
|
|
||||||
// 登录设备
|
// 登录设备
|
||||||
System.out.println("正在登录设备...");
|
log.info("正在登录设备...");
|
||||||
lpUserID = netdevsdk.NETDEV_Login_V30(stDevLoginInfo, stSELogInfo);
|
lpUserID = netdevsdk.NETDEV_Login_V30(stDevLoginInfo, stSELogInfo);
|
||||||
|
|
||||||
if (null != lpUserID) {
|
if (null != lpUserID) {
|
||||||
System.out.println("登录成功");
|
// 设置设备登录标志
|
||||||
|
deviceLoggedIn = true;
|
||||||
|
log.info("登录成功");
|
||||||
|
|
||||||
// 查询通道信息
|
// 查询通道信息
|
||||||
queryChannels();
|
queryChannels();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
System.out.printf("登录失败, 错误码:%d\n", netdevsdk.NETDEV_GetLastError());
|
log.error("登录失败, 错误码:{}", netdevsdk.NETDEV_GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,71 +126,134 @@ public class NetDemo {
|
|||||||
/**
|
/**
|
||||||
* 查询通道信息
|
* 查询通道信息
|
||||||
*/
|
*/
|
||||||
private static void queryChannels() {
|
public static void queryChannels() {
|
||||||
int nMaxChlCount = 256;
|
int nMaxChlCount = 256;
|
||||||
IntByReference dwChlCount = new IntByReference(nMaxChlCount);
|
IntByReference dwChlCount = new IntByReference(nMaxChlCount);
|
||||||
NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S[] stVideoChlList = (NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S[]) new NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S().toArray(nMaxChlCount);
|
NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S[] stVideoChlList = (NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S[]) new NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S().toArray(nMaxChlCount);
|
||||||
boolean bRet = netdevsdk.NETDEV_QueryVideoChlDetailListEx(lpUserID, dwChlCount, stVideoChlList);
|
boolean bRet = netdevsdk.NETDEV_QueryVideoChlDetailListEx(lpUserID, dwChlCount, stVideoChlList);
|
||||||
|
|
||||||
if (bRet) {
|
if (bRet) {
|
||||||
System.out.println("通道查询成功,通道数量: " + dwChlCount.getValue());
|
log.info("通道查询成功,通道数量: {}", dwChlCount.getValue());
|
||||||
for (int i = 0; i < dwChlCount.getValue(); i++) {
|
for (int i = 0; i < dwChlCount.getValue(); i++) {
|
||||||
System.out.println("通道ID: " + stVideoChlList[i].dwChannelID + ", 状态: " + (stVideoChlList[i].enStatus == 1 ? "在线" : "离线") + ", 名称: " + new String(stVideoChlList[i].szChnName).trim());
|
System.out.println("通道ID: " + stVideoChlList[i].dwChannelID + ", 状态: " + (stVideoChlList[i].enStatus == 1 ? "在线" : "离线") + ", 名称: " + new String(stVideoChlList[i].szChnName).trim());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
System.out.printf("通道查询失败, 错误码:%d\n", netdevsdk.NETDEV_GetLastError());
|
log.error("通道查询失败, 错误码:{}", netdevsdk.NETDEV_GetLastError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 抓拍图片
|
* 抓拍图片
|
||||||
*/
|
*/
|
||||||
private static void captureImage() {
|
public static boolean captureImage(String strPicPath) {
|
||||||
if (null == lpUserID) {
|
if (null == lpUserID) {
|
||||||
System.out.println("请先登录设备");
|
log.error("请先登录设备");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置通道为1
|
// 设置通道为1
|
||||||
ChannelID = 1;
|
ChannelID = 1;
|
||||||
String strPicPath = "D:\\test\\ys\\carousel.jpg";
|
if (StrUtil.isBlank(strPicPath)) {
|
||||||
|
strPicPath = "D:\\test\\ys\\carousel";
|
||||||
// 创建保存目录
|
// 创建保存目录
|
||||||
File picDir = new File("D:\\test\\ys");
|
File picDir = new File("D:\\test\\ys");
|
||||||
if (!picDir.exists()) {
|
if (!picDir.exists()) {
|
||||||
picDir.mkdir();
|
picDir.mkdir();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
File picDir = new File("D:\\test\\ys\\workOrder");
|
||||||
|
if (!picDir.exists()) {
|
||||||
|
picDir.mkdir();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 使用NETDEV_CaptureNoPreview直接保存图片文件
|
// 使用NETDEV_CaptureNoPreview直接保存图片文件
|
||||||
System.out.println("正在抓拍图片...");
|
|
||||||
boolean bRet = netdevsdk.NETDEV_CaptureNoPreview(lpUserID, ChannelID, 0, strPicPath, 1);
|
boolean bRet = netdevsdk.NETDEV_CaptureNoPreview(lpUserID, ChannelID, 0, strPicPath, 1);
|
||||||
|
|
||||||
if (bRet) {
|
if (bRet) {
|
||||||
System.out.println("抓图成功! 保存路径: " + strPicPath);
|
return true;
|
||||||
} else {
|
} else {
|
||||||
System.out.printf("抓图失败, 错误码:%d\n", netdevsdk.NETDEV_GetLastError());
|
log.error("抓图失败, 错误码:{}", netdevsdk.NETDEV_GetLastError());
|
||||||
System.out.println("请确认设备是否支持非预览抓图功能");
|
log.error("请确认设备是否支持非预览抓图功能");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始定时抓拍(每2秒一次)
|
||||||
|
*/
|
||||||
|
public static void startCaptureTimer() {
|
||||||
|
if (captureTimer != null) {
|
||||||
|
stopCaptureTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
captureTimer = new Timer();
|
||||||
|
captureTimer.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
captureImage(null);
|
||||||
|
}
|
||||||
|
}, 0, 2000); // 立即开始,每2秒执行一次
|
||||||
|
log.info("定时抓拍已启动,每2秒一次");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止定时抓拍
|
||||||
|
*/
|
||||||
|
public static void stopCaptureTimer() {
|
||||||
|
if (captureTimer != null) {
|
||||||
|
captureTimer.cancel();
|
||||||
|
captureTimer = null;
|
||||||
|
log.info("定时抓拍已停止");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登出设备
|
* 登出设备
|
||||||
*/
|
*/
|
||||||
private static void logoutDevice() {
|
public static void logoutDevice() {
|
||||||
|
// 先停止定时抓拍
|
||||||
|
stopCaptureTimer();
|
||||||
|
|
||||||
if (null != lpUserID) {
|
if (null != lpUserID) {
|
||||||
System.out.println("正在登出设备...");
|
log.info("正在登出设备...");
|
||||||
netdevsdk.NETDEV_Logout(lpUserID);
|
netdevsdk.NETDEV_Logout(lpUserID);
|
||||||
lpUserID = null;
|
lpUserID = null;
|
||||||
System.out.println("设备登出成功");
|
// 清除设备登录标志
|
||||||
|
deviceLoggedIn = false;
|
||||||
|
log.info("设备登出成功");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 释放SDK
|
* 释放SDK
|
||||||
*/
|
*/
|
||||||
private static void cleanupSDK() {
|
public static void cleanupSDK() {
|
||||||
System.out.println("正在释放SDK...");
|
// 先停止定时抓拍
|
||||||
|
stopCaptureTimer();
|
||||||
|
|
||||||
|
log.info("正在释放SDK...");
|
||||||
netdevsdk.NETDEV_Cleanup();
|
netdevsdk.NETDEV_Cleanup();
|
||||||
System.out.println("SDK释放成功");
|
// 清除SDK初始化标志
|
||||||
|
sdkInitialized = false;
|
||||||
|
// 清除设备登录标志
|
||||||
|
deviceLoggedIn = false;
|
||||||
|
// 清除登录ID
|
||||||
|
lpUserID = null;
|
||||||
|
log.info("SDK释放成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查SDK是否已初始化
|
||||||
|
*/
|
||||||
|
public static boolean isSDKInitialized() {
|
||||||
|
return sdkInitialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查设备是否已登录
|
||||||
|
*/
|
||||||
|
public static boolean isDeviceLoggedIn() {
|
||||||
|
return deviceLoggedIn && lpUserID != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,106 @@
|
|||||||
package top.wms.admin.controller.ys;
|
package top.wms.admin.controller.ys;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import top.continew.starter.log.annotation.Log;
|
||||||
|
import top.continew.starter.web.model.R;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/ys")
|
||||||
|
@Slf4j
|
||||||
|
@Log(ignore = true)
|
||||||
public class ysNetController {
|
public class ysNetController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前端进入称重页面时调用
|
||||||
|
*/
|
||||||
|
@GetMapping("/enter-weigh-page")
|
||||||
|
public R enterWeighPage() {
|
||||||
|
try {
|
||||||
|
// 检查SDK是否已初始化
|
||||||
|
if (!NetCommon.isSDKInitialized()) {
|
||||||
|
// 初始化SDK
|
||||||
|
boolean initSuccess = NetCommon.initSDK();
|
||||||
|
if (!initSuccess) {
|
||||||
|
log.error("初始化SDK失败");
|
||||||
|
return R.fail("500", "初始化SDK失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查设备是否已登录
|
||||||
|
if (!NetCommon.isDeviceLoggedIn()) {
|
||||||
|
// 登录设备
|
||||||
|
boolean loginSuccess = NetCommon.loginDevice();
|
||||||
|
if (!loginSuccess) {
|
||||||
|
return R.fail("500", "登录设备失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 开始定时抓拍(每2秒一次)
|
||||||
|
NetCommon.startCaptureTimer();
|
||||||
|
|
||||||
|
return R.ok("进入称重页面成功,开始定时抓拍");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return R.fail("500", "进入称重页面失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前端离开称重页面时调用
|
||||||
|
*/
|
||||||
|
@GetMapping("/leave-weigh-page")
|
||||||
|
public R leaveWeighPage() {
|
||||||
|
try {
|
||||||
|
// 登出设备
|
||||||
|
NetCommon.logoutDevice();
|
||||||
|
|
||||||
|
// 释放SDK
|
||||||
|
NetCommon.cleanupSDK();
|
||||||
|
|
||||||
|
return R.ok("离开称重页面成功,已释放资源");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return R.fail("500", "离开称重页面失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手动触发一次抓图
|
||||||
|
*/
|
||||||
|
@GetMapping("/capture-image")
|
||||||
|
public R captureImage(@RequestParam String imgName) {
|
||||||
|
try {
|
||||||
|
// 检查设备是否已登录
|
||||||
|
if (!NetCommon.isDeviceLoggedIn()) {
|
||||||
|
return R.fail("500", "设备未登录,请先进入称重页面");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行抓图
|
||||||
|
long l = System.currentTimeMillis();
|
||||||
|
imgName = imgName + "_" + l;
|
||||||
|
boolean success = NetCommon.captureImage("D:\\test\\ys\\workOrder\\" + imgName);
|
||||||
|
if (success) {
|
||||||
|
return R.ok("http://localhost:6609/file/ys/workOrder/" + imgName + ".jpg");
|
||||||
|
} else {
|
||||||
|
return R.fail("500", "抓图失败:抓图失败");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return R.fail("500", "抓图失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查SDK状态
|
||||||
|
*/
|
||||||
|
@GetMapping("/status")
|
||||||
|
public R checkStatus() {
|
||||||
|
try {
|
||||||
|
boolean isSDKInitialized = NetCommon.isSDKInitialized();
|
||||||
|
boolean isDeviceLoggedIn = NetCommon.isDeviceLoggedIn();
|
||||||
|
|
||||||
|
return R.ok("SDK初始化状态:" + (isSDKInitialized ? "已初始化" : "未初始化") + "," +
|
||||||
|
"设备登录状态:" + (isDeviceLoggedIn ? "已登录" : "未登录"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
return R.fail("500", "检查状态失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user