java dvr_java实现海康NVR/DVR设备工作状态获取

该功能需要到JNA的知识。

通过查阅海康设备网络SDK编程指南(DVR&NVR)可以知道海康SDK的调用方法都要同过如下过程:

0818b9ca8b590ca3270a3433284dd417.png

虚线框的流程是可选部分,不会影响其他流程和模块的功能使用。具体的模块说明可以自行参考SDK开发文件。

主要功能代码:

测试例子,因此虚线部分功能不实现

1.初始化设备SDK:对整个网络SDK 系统的初始化,内存预分配等操作。

代码:HCNetSDK sdk = HCNetSDK.INSTANCE;

sdk.NET_DVR_Init();//返回booleaan值

2.注册设备:实现用户的注册功能,注册成功后,返回的用户ID 作为其他功能操作的唯一标识

代码: NativeLong uid=new  NativeLong(-1);

NET_DVR_DEVICEINFO_V30 devinfo=new NET_DVR_DEVICEINFO_V30();//设备信息

uid=sdk.NET_DVR_Login_V30((string)IP,(short)PORT,(string)user,string()pwd,devinfo);//返回一个用户编号,同时将设备信息写入devinfo

3.设备工作状态获取(参数配置模块):

代码:NET_DVR_WORKSTATE_V30 devwork=new NET_DVR_WORKSTATE_V30();

sdk.NET_DVR_GetDVRWorkState_V30(uid, devwork);//返回Boolean值,判断是否获取设备能力

IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数

NET_DVR_IPPARACFG ipcfg=new  NET_DVR_IPPARACFG();

ipcfg.write();

Pointer lpIpParaConfig =ipcfg.getPointer();

sdk.NET_DVR_GetDVRConfig(uid,sdk.NET_DVR_GET_IPPARACFG,new NativeLong(0),lpIpParaConfig,ipcfg.size(),ibrBytesReturned);

ipcfg.read();

4.注销设备:

代码:sdk.NET_DVR_Logout(uid);

5.释放SDK

代码:sdk.NET_DVR_Cleanup();

详细例子:

输出:

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是连接海康摄像头并抓取图像的Java示例代码: ```java import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.win32.StdCallLibrary; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class HkCameraDemo extends JFrame implements StdCallLibrary.StdCallCallback { private static final int WIDTH = 640; // 图像宽度 private static final int HEIGHT = 480; // 图像高度 private static final int CHANNEL = 1; // 通道数 private static final int BUFFER_SIZE = 2 * WIDTH * HEIGHT * CHANNEL; // 缓存大小 private NativeLong userId; // 用户ID private NativeLong realPlayHandle; // 实时预览句柄 private BufferedImage image; // 图像数据 public interface PlayCtrl extends StdCallLibrary { PlayCtrl INSTANCE = (PlayCtrl) com.sun.jna.Native.loadLibrary("PlayCtrl", PlayCtrl.class); interface PlayM4CallBack extends StdCallCallback { void invoke(NativeLong lPort, Pointer pBuf, int nSize, Pointer pUser); } boolean PlayM4_GetPort(NativeLongByReference nPort); boolean PlayM4_OpenStream(NativeLong nPort, Pointer pBuf, int nSize, int nBufPoolSize); boolean PlayM4_SetDecodeParam(NativeLong nPort, Pointer pDecodeParam); boolean PlayM4_Play(NativeLong nPort, HWND hWnd); boolean PlayM4_Stop(NativeLong nPort); boolean PlayM4_CloseStream(NativeLong nPort); boolean PlayM4_FreePort(NativeLong nPort); } interface HCNetSDK extends StdCallLibrary { HCNetSDK INSTANCE = (HCNetSDK) com.sun.jna.Native.loadLibrary("HCNetSDK", HCNetSDK.class); boolean NET_DVR_Init(); boolean NET_DVR_Cleanup(); NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, Pointer lpDeviceInfo); boolean NET_DVR_Logout(NativeLong lUserID); NativeLong NET_DVR_RealPlay_V30(NativeLong lUserID, HCNetSDK.NET_DVR_CLIENTINFO lpClientInfo, PlayCtrl.PlayM4CallBack fRealDataCallBack_V30, Pointer pUser, boolean bBlocked); boolean NET_DVR_StopRealPlay(NativeLong lRealHandle); boolean NET_DVR_GetLastError(); boolean NET_DVR_CaptureJPEGPicture(NativeLong lUserID, NativeLong lChannel, HCNetSDK.NET_DVR_JPEGPARA lpJpegPara, String sPicFileName); boolean NET_DVR_SaveRealData(NativeLong lRealHandle, String sFileName); public static class NET_DVR_DEVICEINFO_V30 extends Structure { public byte[] sSerialNumber = new byte[48]; // 序列号 public byte byAlarmInPortNum; // 模拟报警输入个数 public byte byAlarmOutPortNum; // 模拟报警输出个数 public byte byDiskNum; // 硬盘个数 public byte byDVRType; // 设备类型 public byte byChanNum; // 设备模拟通道个数 public byte byStartChan; // 起始通道号,从1开始计数 public byte byAudioChanNum; // 设备语音对讲通道数 public byte byIPChanNum; // 设备最大数字通道个数 public byte[] byRes2 = new byte[24]; // 保留 } public static class NET_DVR_JPEGPARA extends Structure { public int wPicSize; // 图片尺寸 public int wPicQuality; // 图片质量 } public static class NET_DVR_CLIENTINFO extends Structure { public NativeLong lChannel; // 预览通道号 public NativeLong hPlayWnd; // 播放窗口的句柄 public int lLinkMode; // 连接方式:0-TCP,1-UDP,2-MCAST,3-RTP public Pointer sMultiCastIP; // 多播地址 } } public HkCameraDemo() { setTitle("海康摄像头"); setBounds(100, 100, WIDTH, HEIGHT + 50); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton btnCapture = new JButton("抓图"); btnCapture.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 抓图保存为文件 if (image != null) { String fileName = System.currentTimeMillis() + ".jpg"; File file = new File(fileName); try { javax.imageio.ImageIO.write(image, "jpg", file); JOptionPane.showMessageDialog(null, "抓图成功,保存为:" + file.getAbsolutePath()); } catch (IOException ex) { ex.printStackTrace(); } } } }); getContentPane().add(btnCapture); setVisible(true); // 初始化SDK HCNetSDK.INSTANCE.NET_DVR_Init(); // 登录设备 HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); String ipAddress = "192.168.1.64"; // 摄像头IP地址 short port = 8000; // 摄像头端口 String userName = "admin"; // 登录用户名 String password = "admin123456"; // 登录密码 userId = HCNetSDK.INSTANCE.NET_DVR_Login_V30(ipAddress, port, userName, password, deviceInfo); if (userId.intValue() < 0) { JOptionPane.showMessageDialog(null, "登录设备失败"); return; } // 预览 HCNetSDK.NET_DVR_CLIENTINFO clientInfo = new HCNetSDK.NET_DVR_CLIENTINFO(); clientInfo.lChannel = new NativeLong(1); // 预览通道号 clientInfo.hPlayWnd = Pointer.createConstant(0); // 播放窗口的句柄 clientInfo.lLinkMode = 0; // 连接方式:0-TCP,1-UDP,2-MCAST,3-RTP clientInfo.sMultiCastIP = Pointer.createConstant(""); // 多播地址 PlayCtrl.PlayM4CallBack callback = this; // 回调函数 realPlayHandle = HCNetSDK.INSTANCE.NET_DVR_RealPlay_V30(userId, clientInfo, callback, null, true); } @Override public void invoke(NativeLong lPort, Pointer pBuf, int nSize, Pointer pUser) { // 解码显示图像 byte[] bytes = pBuf.getByteArray(0, nSize); image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_GRAY); image.getRaster().setDataElements(0, 0, WIDTH, HEIGHT, bytes); repaint(); } @Override public void paint(java.awt.Graphics g) { // 显示图像 if (image != null) { g.drawImage(image, 0, 0, null); } } public static void main(String[] args) { new HkCameraDemo(); } } ``` 注意,上述代码中需要替换以下内容: 1. `ipAddress`:摄像头IP地址; 2. `port`:摄像头端口; 3. `userName`:登录用户名; 4. `password`:登录密码; 5. `clientInfo.lChannel`:预览通道号。 该代码中,使用海康SDK登录设备并进行实时预览,通过回调函数获得图像数据并解码显示。同时,还提供了抓图功能,将当前图像保存为JPG格式的文件。 需要注意的是,该代码使用了JNA库调用海康SDK和PlayCtrl库,需要将对应的DLL文件放到程序运行路径下。另外,该代码仅适用于海康摄像头,不适用于其他品牌的摄像头。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值