基于海康威視的SDK實現二次開發
標簽: Java 海康威視 java spring boot spring
文章目錄
前言
因為網上關于海康威視SDK這塊的開發資源比較少,自己也是一步一步摸索過來,知道那種痛苦,
所以把自己的一些過來人的經驗寫出來供大家學習參考
1.對接海康威視的SDK
進入海康威視官網
下載你所需要的SDK開發包(這里我就用windows來作為案列)
下載完SDK解壓
里面有開發文檔和SDK的動態庫文件,有各種開發語言的Demo案列。(可以參考一下他的接口調用)
注:這里需要注意的是開發文檔,很重要!里面有一份文檔接口的API,和各種編程指南
運行Demo示例
這里我使用的語言是Java,通過他的提示導入所需要的dll文件
這里可以參考一下我導入的文件
注:這兩個jar包需要編譯
注:導入成功之后如果能正確運行Demo并且能夠通過海康威視的攝像頭進行預覽的話說明導入的文件是正確的
開發接口之前的環境配置
現在就可以進行自己的開發節奏了。記住上面那兩個jar包,和lib文件夾里面的那些文件。
-
創建一個springboot項目
-
把lib包放到springboot項目中的resources文件中
-
編譯那兩個jar包(這里建議是使用mvn的命令把jar包打入到自己的maven倉庫會比較好一點)
mvm install:install-file -Dfile=你jar包的路徑\examples.jar -DgroupId=com.xx.xx -DartifactId=examples -Dversion=1.0-SNAPSHOT -Dpackaging=jar
不導入的話也可以直接編譯到項目中去,或者使用maven的路徑引用
<dependency> <groupId>examples</groupId> <artifactId>examples</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${basedir}/src/main/resources/lib/examples.jar</systemPath> </dependency> <dependency> <groupId>jna</groupId> <artifactId>jna</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${basedir}/src/main/resources/lib/jna.jar</systemPath> </dependency>
-
加載SDK庫
注:這個接口就是后面開發用到的海康威視的SDK
在這里添加這句代碼
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(CommonKit.getWebPath() + "HCNetSDK.dll", HCNetSDK.class);
這里我才用的是用動態獲取路徑的方式來加載的。
注:這里的路徑很重要,如果不行的話可以配置為絕對路徑
public class CommonKit { /** * 獲取項目webapp目錄 * @return String */ public static String getWebPath() { return CommonKit.class.getClassLoader().getResource("").getPath().substring(1) + "lib/ } }
開始基于海康威視SDK的開發
注:這里面的SDK其實是一個大雜燴,里面有很多接口其中有攝像頭的預覽,視頻的下載和語言的播報等接口
-
編寫工具類
通過讀取海康威視的開發文檔我們得知調用海康威視的SDK接口的時候需要初始化,完成操作之后需要釋放資源。
在實際開發中項目一般是一直運行的,所以這里我用了spring的兩個注解,在項目啟動時候初始化,結束項目運行
的時候釋放資源。這樣就不用每一次操作都去初始化和釋放資源了。
注:這兩個方法是必須的,所有的接口執行都需要初始化
這里只是初始化和釋放資源的代碼,其他的方法按照自己的業務邏輯來進行完善。
@Slf4j @Component public class HikvisionUtil { private static final HCNetSDK hcNetSDK = HCNetSDK.INSTANCE; /** * 初始化 */ @PostConstruct public void init() { boolean flag = hcNetSDK.NET_DVR_Init(); String message = flag ? "成功" : "失敗"; log.info("攝像頭初始化" + message); } /** * 釋放資源 */ @PreDestroy public void leanup() { boolean flag = hcNetSDK.NET_DVR_Cleanup(); String message = flag ? "成功" : "失敗"; log.info("攝像頭關閉資源" + message); } }
-
如何排錯?
新手在開發的時候可能會發生很多錯誤,這里我的建議是通過打印報錯編碼和日志來進行排查錯誤
這個接口能夠返回你上一次失敗操作的錯誤碼
hcNetSDK.NET_DVR_GetLastError()
得到錯誤碼,拿到報錯的海康SDK接口去他的文檔進行查閱
這里我用登錄接口來舉一個例子
通過錯誤碼就能夠正確的找到錯誤的原因。
2.總結海康威視的開發
第一次對接SDK的常見問題
-
怎么完善海康威視的后續開發?
一般的情況都是基于攝像頭進行開發,在對攝像頭進行開發的話建議查看此文檔,里面有接口調用順序和參數說明,基于文檔完善上面的工具類。
-
如何部署到Linux服務器上面?
首先HCNetSDK接口類需要繼承Library,經過本人的嘗試最新版本的SDK,
繼承Library可以同時支持windows和Linux兩種環境
如果需要部署到Linux服務器上面的話,需要下載Linux那一套SDK
注:Linux下面是so文件
-
對接海康攝像頭出現 java.lang.Error: Structure.getFieldOrder()
Exception in thread "threadPoolTaskExecutor-1" java.lang.Error: Structure.getFieldOrder() on class com.ruoyi.web.equipment.hk.HCNetSDK$NET_DVR_USER_LOGIN_INFO does not provide enough names [0] ([]) to match declared fields [15] ([bUseAsynLogin, byHttps, byLoginMode, byProxyType, byRes2, byUseTransport, byUseUTCTime, byVerifyMode, cbLoginResult, iProxyID, pUser, sDeviceAddress, sPassword, sUserName, wPort])
注:這個問題是因為海康jna.jar比較老,結構體定義沒有getFiledOrder,可創建一個類繼承 Structure
import com.sun.jna.Structure; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; public class HIKSDKStructure extends Structure { protected List<String> getFieldOrder(){ List<String> fieldOrderList = new ArrayList<String>(); for (Class<?> cls = getClass(); !cls.equals(HIKSDKStructure.class); cls = cls.getSuperclass()) { Field[] fields = cls.getDeclaredFields(); int modifiers; for (Field field : fields) { modifiers = field.getModifiers(); if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) { continue; } fieldOrderList.add(field.getName()); } } return fieldOrderList; } }
然后對 HCNetSDK 接口中的靜態類里面,所有繼承 Structure 替換為 HIKSDKStructure 即可
3.后續完善
攝像頭在前端的預覽
攝像頭的截圖功能
攝像頭的手動錄像功能
攝像頭的回放下載功能
目前就寫這么多吧,本文是一篇入門介紹文,因為網上關于這塊的資料很少,
所以真心幫助那些和我一樣一開始就接觸對接硬件開發的程序員了解大概開發的流程。
注:一定要多看文檔,海康威視文檔算比較詳細的那種了。
有后續有開發問題的話可以在下方留言,或者咨詢本人的163郵箱[email protected]。
最后:七夕節還在寫博客,寫文不易求大家給小弟個贊??
智能推薦
關于海康威視網絡攝像機二次開發問題
最近一個星期一直在研究海康威視的網絡攝像機二次開發問題,糾結了很久。今天終于走通了一部分,記下來希望能夠幫助到更多人。現在是用的 VS2013 + opencv 進行測試。 首先推薦兩篇對我幫助很大的博文: http://blog.csdn.net/wanghuiqi2008/...
海康威視攝像頭web二次開發(angular)
海康威視官網有提供二次開發的web開發包,主要由js,html組成,但是開發包更新迭代太快了,甲方的攝像頭還是老版本,幸好甲方提供了它們的開發包(內涵demo,doc)。 測試環境 在web包里面里面有demo>cn文件夾,內含js、html、css文件,直接點擊html文件,在瀏覽器中打開,可以直接使用,輸入ip,port,username,password,點擊登錄,點擊預覽,可以查看對...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
猜你喜歡
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...