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

起因:

公司买了某公司机芯,该公司技术支持给的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::LoadDSo, HPR_LoadDSo, hHandleRet[0], path[libcrypto.so.1.1], syserror[2]
[ERR] Load BASE_DLL_LIBEAY failed[syserr: 2]
[DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo, hHandleRet[c44ed0c5], path[libcryptoPrivate.so], syserror[2]
[DBG] CCoreGlobalCtrlBase::LoadDSo, 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类:(因为我们需求只是控制相机变倍,所以封装得很简单,但其实其它功能也是调用对应的方法就可以了)

import com.blankj.utilcode.util.ToastUtils
import com.hcnetsdk.jna.HCNetSDKByJNA.NET_DVR_DEVICEINFO_V40
import com.hikvision.netsdk.HCNetSDK
import com.hikvision.netsdk.NET_DVR_ACTIVATECFG
import com.hikvision.netsdk.NET_DVR_DEVICEINFO_V30

class CameraManager {
    /**
     * 作用:调用sdk中的函数的集合
     */
    var sdk:HCNetSDK = HCNetSDK.getInstance()
    var ip:String = "自己设备的ip"
    var port:Int = 8000
    var userName:String = "admin"
    var password:String = "激活设备设置的密码"
    var userIdLocal:Int = -1
    val deviceInfo30 = NET_DVR_DEVICEINFO_V30()
    //初始化sdk
    init{
        // 初始化SDK
        if (!sdk.NET_DVR_Init()) {
            ToastUtils.showShort("相机初始化失败")
            throw RuntimeException("SDK初始化失败")
        }else{
            //初始化成功
            //设置超时时间
            sdk.NET_DVR_SetConnectTime(5000)
            //开启写日志功能
            sdk.NET_DVR_SetLogToFile(3, "/sdcard/gfsdklog/", true)
            userIdLocal = login(ip,port,userName,password)
        }
    }
    //注册设备
    fun login(deviceIp: String, devicePort: Int, userName: String, password: String): Int {

        try{
            val userId = sdk.NET_DVR_Login_V30(deviceIp, devicePort, userName, password, deviceInfo30)
            if (userId < 0) {
                var errorcode = sdk.NET_DVR_GetLastError()
                ToastUtils.showShort("相机登录失败,错误码:$errorcode")
                return -1
            }else{
                return userId
            }
        }catch (e:Exception){
            ToastUtils.showShort("相机登录失败")
            return -1
        }
    }

    //云台控制操作
    fun control(userId:Int,channel:Int,command:Int,stop:Int){
        if(userIdLocal != -1){
            //可以开始控制云台
            var flag = sdk.NET_DVR_PTZControl_Other(userId, channel, command, stop)
            if(flag){
                //控制成功
            }else{
                //控制失败
                val errorCode = sdk.NET_DVR_GetLastError()
                ToastUtils.showShort("云台控制失败,错误码:$errorCode")
            }
        }
        else{
            var errorcode = sdk.NET_DVR_GetLastError()
            ToastUtils.showShort("相机登录失败,错误码:$errorcode")
        }
    }

    //释放sdk资源
    fun release() {
        if(userIdLocal!=-1){
            sdk.NET_DVR_Logout_V30(userIdLocal)
        }
        sdk.NET_DVR_Cleanup()
    }
}

4.激活设备用到的工具:Docs

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值