海康威視后臺(tái)監(jiān)控布防
由于公司業(yè)務(wù)的需要,前端時(shí)間一直在折騰??禂z像頭的對(duì)接。在這期間踩過許多坑,做一記錄分享。
大致的業(yè)務(wù)場(chǎng)景,主要用到的是??档?Ai 攝像頭與高清攝像頭,實(shí)現(xiàn)監(jiān)控布防與實(shí)時(shí)畫面在 web 頁面展示預(yù)覽。
對(duì)于 Ai 攝像頭內(nèi)部已經(jīng)上傳了訓(xùn)練好的模型,直接調(diào)用??堤峁?SDK 接口即可,對(duì)于高清攝像則是調(diào)用???SDK 提供的抓拍功能,保存圖片到本地,調(diào)用訓(xùn)練好的 Python 模型進(jìn)行本地圖片的算法分析。 實(shí)時(shí)畫面展示只是 Vue 與海康官方提供的 Web3.2 源碼進(jìn)行整合通過 Nginx 代理完成實(shí)時(shí)畫面的同步展示,由于一部分?jǐn)z像頭硬件是不支持 websocket 流傳輸?shù)?,所以前端的頁面登錄展示并未直接通過攝像頭 ip 的方式進(jìn)行登錄,而是配合超腦主機(jī)不同的通道號(hào)進(jìn)行登錄預(yù)覽的。
??倒倬W(wǎng)
視頻布防與抓拍
視頻的抓拍與布防可以參考,??堤峁┑木W(wǎng)絡(luò)設(shè)備SDK資料中的 **設(shè)備網(wǎng)絡(luò)SDK編程指南(抓拍機(jī))**文檔
視頻布防
可以看到的是(布防)流程是比較簡單的
-
初始化 SDK (由于所有的接口都是使用 C++ 語言編寫的,所以這里需要將這些開發(fā)包初始化為本地的 Java 可以調(diào)用執(zhí)行的程序)
/** * 初始化 hCNetSDK */ public void init(){ /*加載SDK的動(dòng)態(tài)庫*/ if (hCNetSDK == null) { if (!CreateSDKInstance()) { System.out.println("Load SDK fail"); } } /*初始化*/ hCNetSDK.NET_DVR_Init(); /*加載日志*/ hCNetSDK.NET_DVR_SetLogToFile(3, "../sdklog", false); //設(shè)置報(bào)警回調(diào)函數(shù) Pointer pUser = null; if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) { System.out.println("設(shè)置回調(diào)函數(shù)失敗!"); } else { System.out.println("設(shè)置回調(diào)函數(shù)成功!"); } }
這里的
hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)
是報(bào)警回調(diào)函數(shù),需要進(jìn)行提前的設(shè)置。/** * 動(dòng)態(tài)依賴庫加載 * @return */ private static boolean CreateSDKInstance() { if (hCNetSDK == null) { synchronized (HCNetSDK.class) { String strDllPath = ""; try { if (osSelect.isWindows()) { //win系統(tǒng)加載庫路徑 Resource resource = new ClassPathResource("hikvision/windows/HCNetSDK.dll"); // strDllPath = resource.getFile().getPath(); strDllPath = "D:\\windows\\HCNetSDK.dll"; } else if (osSelect.isLinux()) //Linux系統(tǒng)加載庫路徑 strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so"; hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); } catch (Exception ex) { System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); return false; } } } return true; }
-
登錄設(shè)備(這里只需根據(jù)??堤峁┑?Dome 調(diào)用 login_v40 或者 login 進(jìn)行登錄獲取登錄成功的用戶 Id 號(hào))文章來源:http://www.zghlxwxcb.cn/news/detail-459752.html
/** * * @param ip 設(shè)備IP * @param port SDK端口 * @param user 設(shè)備用戶名 * @param psw 設(shè)備密碼 */ public static int login_V40(String ip, short port, String user, String psw) { //注冊(cè) HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//設(shè)備登錄信息 HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//設(shè)備信息 // String m_sDeviceIP = "192.168.0.100";//設(shè)備ip地址 m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; System.arraycopy(ip.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, ip.length()); // String m_sUsername = "admin";//設(shè)備用戶名 m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; System.arraycopy(user.getBytes(), 0, m_strLoginInfo.sUserName, 0, user.length()); // String m_sPassword = "hzyjy123";//設(shè)備密碼 m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; System.arraycopy(psw.getBytes(), 0, m_strLoginInfo.sPassword, 0, psw.length()); // m_strLoginInfo.wPort = 8085; m_strLoginInfo.wPort = port; m_strLoginInfo.bUseAsynLogin = false; //是否異步登錄:0- 否,1- 是 m_strLoginInfo.write(); int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); if (lUserID == -1) { log.debug("登錄失敗,錯(cuò)誤碼為" + hCNetSDK.NET_DVR_GetLastError()); return lUserID; } log.debug(ip + ":設(shè)備登錄成功!"); return lUserID; }
-
報(bào)警布放(這里的 lUserID 就是之前登錄成功后返回的用戶 ID,這個(gè) ID 在登錄成功的情況下是唯一的)文章來源地址http://www.zghlxwxcb.cn/news/detail-459752.html
/** * 報(bào)警布防接口 * * @param lUserID */ public static int setAlarm(int lUserID) { //報(bào)警布防參數(shù)設(shè)置 HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM(); m_strAlarmInfo.dwSize = m_strAlarmInfo.size(); m_strAlarmInfo.byLevel = 0; //布防等級(jí) m_strAlarmInfo.byAlarmInfoType = 1; // 智能交通報(bào)警信息上傳類型:0- 老報(bào)警信息(NET_DVR_PLATE_RESULT),1- 新報(bào)警信息(NET_ITS_PLATE_RESULT) m_strAlarmInfo.byDeployType = 0; //布防類型:0-客戶端布防,1-實(shí)時(shí)布防 m_strAlarmInfo.write(); int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo); System.out.println("lAlarmHandle: " + lAlarmHandle); if (lAlarmHandle == -1) { logout(lUserID); log.debug("布防失敗,錯(cuò)誤碼為" + hCNetSDK.NET_DVR_GetLastError()); return lAlarmHandle; } log.debug("布防成功"); return lAlarmHandle; }
到了這里,關(guān)于??低暫笈_(tái)監(jiān)控布防的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!