安卓海康sdk踩的坑(保姆级排坑)

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

起因:

公司买了某公司机芯,该公司技术支持给的sdk是海康的,集成进自己的项目后出现了一系列问题,现办理后为各人一一排坑。
问题一:将sdk中的jar包和abi包复制进项目后,实行HCNetSDK.getInstance()这行代码直接瓦解闪退。



问题一办理步调:

第一步:jar包和abi包最好分开复制,不要复制到一个文件夹中(实在也可以,只是很乱)

- jar包放进app/libs路径下

- abi包放进app/src/main/jniLibs路径下(没有这个包就自建一个,有的话留意不要覆盖之前的文件​​​​​​) 

第二步:打开build.gradle文件进行设置

- 在文件中的android设置项中添加这一坨,作用是指定abi包中的so库文件路径
ps:要结合自己的路径,我这里和上面保持一致的

 - 同样是android设置项中,如果没有就添加,如果有就和上面导入的abi包目次保持一致。(比如我导入的是三个架构的包:arm64-v8a、armeabi-v7a、armeabi,那么这里就和导入的三个架构包保持一致,如果只有其中两个那就只保留两个)

第三步:在jar包上单击右键,选择add as library,就会主动在设置文件中天生依赖

ps:实在我第一行依赖就导入了libs中全部的aar包和jar包,但还是喜欢自己add一下

第四步:同步一下全部依赖

- 点这个大象就行,或者各人在工具栏的File->sync project with gradle files也可以找到

至此,sdk包导入完成,问题一办理(或者我有做错的地方,也请大佬们指出)
———————————————————————————————————————————
 问题二:sdk初始化成功后,注册设备不停失败,调用NET_DVR_Login_V30后返回-1,打印错误码显示7(7对应的错误信息是设备不在线之类的反正就是毗连失败)


问题二办理步调:

第一步:查抄ip和端口,我是被某厂家的技术支持坑了,所以端口设置错了,实在海康设备的sdk端口默认是8000,一般没改过。


 第二步:一般人改了正确的端口应该可以了,但我还是返回-1,于是咱们开启一个sdk记载日记的功能,调用NET_DVR_SetLogToFile函数。


ps:三个参数分别是↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 第三步:打开咱们安卓设备上存放的日记,开始分析



 - 最告急的提示就是带DBG、ERR的。分析出来发现说无效的路径,找不到对应的库文件。
   [DBG] CCoreGlobalCtrlBase:oadDSo, HPR_LoadDSo, hHandleRet[0], path[libcrypto.so.1.1], syserror[2]
[ERR] Load BASE_DLL_LIBEAY failed[syserr: 2]
[DBG] CCoreGlobalCtrlBase:oadDSo, HPR_LoadDSo, hHandleRet[c44ed0c5], path[libcryptoPrivate.so], syserror[2]
[DBG] CCoreGlobalCtrlBase:oadDSo, HPR_LoadDSo, hHandleRet[50b62a63], path[libsslPrivate.so], syserror[2]
[ERR]  GetCAPath, Failed, Invalid pPath
[ERR]  GetCAPath, Failed, Invalid pPath
  - 那么这个问题怎么产生的呢,我问技术支持,人家在群里不甩我,于是我想“既然你是海康的sdk,那我就找海康的技术支持是一样的”,于是我给海康技术支持写邮件形貌问题,将日记也作为附件发送了出去,于是得到以下回复:

- 上面几条排查过后,来到了最紧张的一条,版本过低!!!!! 随即醍醐灌顶,某厂家技术支持给的sdk版本太低,设备版本比较高,所以缺少需要的so库文件。并且利用人家海康的电脑版测试工具后发现最新版sdk是可以用在我的设备上的。于是立马去官网下载最新版sdk(相关资料会放末端)。下载后重复上面导入sdk的步调,再测试,发现注册设备没问题了,也可以控制相机变倍。
至此,问题算是完全办理了0.0
———————————————————————————————————————————
 本次办理问题所利用到的相关资料:

1.sdk最新版下载地址:海康开放平台

2.sdk利用手册: 设备网络SDK编程指南(Android).pdf - 飞书云文档

(由于没看到咋上传文件,所以搞了个在线文档,实在下载的sdk中也是有的,方便各人打开就转成在线文档了)
3.我封装的sdk类:(由于我们需求只是控制相机变倍,所以封装得很简单,但实在其它功能也是调用对应的方法就可以了)

  1. import com.blankj.utilcode.util.ToastUtils
  2. import com.hcnetsdk.jna.HCNetSDKByJNA.NET_DVR_DEVICEINFO_V40
  3. import com.hikvision.netsdk.HCNetSDK
  4. import com.hikvision.netsdk.NET_DVR_ACTIVATECFG
  5. import com.hikvision.netsdk.NET_DVR_DEVICEINFO_V30
  6. class CameraManager {
  7.     /**
  8.      * 作用:调用sdk中的函数的集合
  9.      */
  10.     var sdk:HCNetSDK = HCNetSDK.getInstance()
  11.     var ip:String = "自己设备的ip"
  12.     var port:Int = 8000
  13.     var userName:String = "admin"
  14.     var password:String = "激活设备设置的密码"
  15.     var userIdLocal:Int = -1
  16.     val deviceInfo30 = NET_DVR_DEVICEINFO_V30()
  17.     //初始化sdk
  18.     init{
  19.         // 初始化SDK
  20.         if (!sdk.NET_DVR_Init()) {
  21.             ToastUtils.showShort("相机初始化失败")
  22.             throw RuntimeException("SDK初始化失败")
  23.         }else{
  24.             //初始化成功
  25.             //设置超时时间
  26.             sdk.NET_DVR_SetConnectTime(5000)
  27.             //开启写日志功能
  28.             sdk.NET_DVR_SetLogToFile(3, "/sdcard/gfsdklog/", true)
  29.             userIdLocal = login(ip,port,userName,password)
  30.         }
  31.     }
  32.     //注册设备
  33.     fun login(deviceIp: String, devicePort: Int, userName: String, password: String): Int {
  34.         try{
  35.             val userId = sdk.NET_DVR_Login_V30(deviceIp, devicePort, userName, password, deviceInfo30)
  36.             if (userId < 0) {
  37.                 var errorcode = sdk.NET_DVR_GetLastError()
  38.                 ToastUtils.showShort("相机登录失败,错误码:$errorcode")
  39.                 return -1
  40.             }else{
  41.                 return userId
  42.             }
  43.         }catch (e:Exception){
  44.             ToastUtils.showShort("相机登录失败")
  45.             return -1
  46.         }
  47.     }
  48.     //云台控制操作
  49.     fun control(userId:Int,channel:Int,command:Int,stop:Int){
  50.         if(userIdLocal != -1){
  51.             //可以开始控制云台
  52.             var flag = sdk.NET_DVR_PTZControl_Other(userId, channel, command, stop)
  53.             if(flag){
  54.                 //控制成功
  55.             }else{
  56.                 //控制失败
  57.                 val errorCode = sdk.NET_DVR_GetLastError()
  58.                 ToastUtils.showShort("云台控制失败,错误码:$errorCode")
  59.             }
  60.         }
  61.         else{
  62.             var errorcode = sdk.NET_DVR_GetLastError()
  63.             ToastUtils.showShort("相机登录失败,错误码:$errorcode")
  64.         }
  65.     }
  66.     //释放sdk资源
  67.     fun release() {
  68.         if(userIdLocal!=-1){
  69.             sdk.NET_DVR_Logout_V30(userIdLocal)
  70.         }
  71.         sdk.NET_DVR_Cleanup()
  72.     }
  73. }
复制代码
4.激活设备用到的工具:Docs

5.邮件中提到的电脑测试工具:Docs


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表