起因:
公司买了某公司机芯,该公司技术支持给的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类:(由于我们需求只是控制相机变倍,所以封装得很简单,但实在其它功能也是调用对应的方法就可以了)
- 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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |