前言
因為網(wǎng)上關(guān)于海康威視SDK這塊的開發(fā)資源比較少,自己也是一步一步摸索過來,知道那種痛苦,
所以把自己的一些過來人的經(jīng)驗寫出來供大家學(xué)習(xí)參考
1.對接??低暤腟DK
進(jìn)入海康威視官網(wǎng)
下載你所需要的SDK開發(fā)包(這里我就用windows來作為案列)
下載完SDK解壓
里面有開發(fā)文檔和SDK的動態(tài)庫文件,有各種開發(fā)語言的Demo案列。(可以參考一下他的接口調(diào)用)
注:這里需要注意的是開發(fā)文檔,很重要!里面有一份文檔接口的API,和各種編程指南
運行Demo示例
這里我使用的語言是Java,通過他的提示導(dǎo)入所需要的dll文件
這里可以參考一下我導(dǎo)入的文件
注:這兩個jar包需要編譯
注:導(dǎo)入成功之后如果能正確運行Demo并且能夠通過海康威視的攝像頭進(jìn)行預(yù)覽的話說明導(dǎo)入的文件是正確的
開發(fā)接口之前的環(huán)境配置
現(xiàn)在就可以進(jìn)行自己的開發(fā)節(jié)奏了。記住上面那兩個jar包,和lib文件夾里面的那些文件。
-
創(chuàng)建一個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
不導(dǎo)入的話也可以直接編譯到項目中去,或者使用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庫
注:這個接口就是后面開發(fā)用到的??低暤腟DK
在這里添加這句代碼
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(CommonKit.getWebPath() + "HCNetSDK.dll", HCNetSDK.class);
這里我才用的是用動態(tài)獲取路徑的方式來加載的。
注:這里的路徑很重要,如果不行的話可以配置為絕對路徑
public class CommonKit { /** * 獲取項目webapp目錄 * @return String */ public static String getWebPath() { return CommonKit.class.getClassLoader().getResource("").getPath().substring(1) + "lib/ } }
開始基于??低昐DK的開發(fā)
注:這里面的SDK其實是一個大雜燴,里面有很多接口其中有攝像頭的預(yù)覽,視頻的下載和語言的播報等接口
-
編寫工具類
通過讀取海康威視的開發(fā)文檔我們得知調(diào)用??低暤腟DK接口的時候需要初始化,完成操作之后需要釋放資源。
在實際開發(fā)中項目一般是一直運行的,所以這里我用了spring的兩個注解,在項目啟動時候初始化,結(jié)束項目運行
的時候釋放資源。這樣就不用每一次操作都去初始化和釋放資源了。
注:這兩個方法是必須的,所有的接口執(zhí)行都需要初始化
這里只是初始化和釋放資源的代碼,其他的方法按照自己的業(yè)務(wù)邏輯來進(jìn)行完善。
@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("攝像頭關(guān)閉資源" + message); } }
-
如何排錯?
新手在開發(fā)的時候可能會發(fā)生很多錯誤,這里我的建議是通過打印報錯編碼和日志來進(jìn)行排查錯誤
這個接口能夠返回你上一次失敗操作的錯誤碼
hcNetSDK.NET_DVR_GetLastError()
得到錯誤碼,拿到報錯的海康SDK接口去他的文檔進(jìn)行查閱
這里我用登錄接口來舉一個例子
通過錯誤碼就能夠正確的找到錯誤的原因。
2.總結(jié)??低暤拈_發(fā)
第一次對接SDK的常見問題
-
怎么完善海康威視的后續(xù)開發(fā)?
一般的情況都是基于攝像頭進(jìn)行開發(fā),在對攝像頭進(jìn)行開發(fā)的話建議查看此文檔,里面有接口調(diào)用順序和參數(shù)說明,基于文檔完善上面的工具類。
-
如何部署到Linux服務(wù)器上面?
首先HCNetSDK接口類需要繼承Library,經(jīng)過本人的嘗試最新版本的SDK,
繼承Library可以同時支持windows和Linux兩種環(huán)境
如果需要部署到Linux服務(wù)器上面的話,需要下載Linux那一套SDK
下載SDK
注:Linux下面是so文件
-
對接海康攝像頭出現(xiàn) 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])
注:這個問題是因為??礿na.jar比較老,結(jié)構(gòu)體定義沒有g(shù)etFiledOrder,可創(chuàng)建一個類繼承 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 接口中的靜態(tài)類里面,所有繼承 Structure 替換為 HIKSDKStructure 即可
3.后續(xù)完善
攝像頭在前端的預(yù)覽
攝像頭的截圖功能
攝像頭的手動錄像功能
攝像頭的回放下載功能
目前就寫這么多吧,本文是一篇入門介紹文,因為網(wǎng)上關(guān)于這塊的資料很少,
所以真心幫助那些和我一樣一開始就接觸對接硬件開發(fā)的程序員了解大概開發(fā)的流程。
注:一定要多看文檔,??低曃臋n算比較詳細(xì)的那種了。
有后續(xù)有開發(fā)問題的話可以在下方留言,或者咨詢本人的163郵箱18375669585@163.com。文章來源:http://www.zghlxwxcb.cn/news/detail-846592.html
最后:七夕節(jié)還在寫博客,寫文不易求大家給小弟個贊??文章來源地址http://www.zghlxwxcb.cn/news/detail-846592.html
到了這里,關(guān)于基于??低暤腟DK實現(xiàn)二次開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!