OneNET文档中心

设备接入SDK 示例介绍

SDK下载地址:[https://github.com/cm-heclouds/video_sdk](https://github.com/cm-heclouds/video_sdk) ### 1.此文内容介绍 此文围绕video sdk中的sample示例,介绍接入OneNET视频云的相关内容。此文从sample目录结构开始,逐步过渡到接入OneNET视频云的主题。读者可跳过与接入OneNET视频云不直接相关的内容。同时也希望此文中的额外内容能起到辅助理解 接入OneNET视频云的作用。 ### 2.sample目录结构 sample是遵循接入OneNET视频云原理的一个示例,其包含如何接入OneNET视频云、向OneNET视频云推送实时/直播视频流的功能。以下是sample相关的目录结构。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/9331942642a7aba9472d1c4d686fb382.png)
Figure 2 sample相关目录结构
各目录、文件简介: bin:可执行文件及其运行时所需配置文件所在目录; include:video sdk接口声明头文件所在目录; lib:可执行文件运行时依赖库 所在目录,目前包括windows、Linux、arm三个平台; platforms:实现跟平台相关的代码(如会调用系统调用的代码),此处主要涉及网络编程的系统调用,目前支持windows和posix两种平台; **sample**:一个调用video sdk接口接入OneNET视频云的示例,并通过开源库实现获取视频源和向OneNET视频云 推流 的功能(该目录下包含三个子目录,在4.7小节简要介绍); src:和视频云通信协议(ODVP)等代码所在目录(该目录下包含三个子目录,在4.7小节简要介绍); test:使用ODVP协议接入OneNET视频云的示例; tools:包含在各平台下构建sample生成可执行程序的脚本文件; CMakeLists.txt:指导cmake生成makefile或project的文件; linux-arm.txt:包含linux-arm平台交叉编译器信息; README.md:sample构建介绍。 接下来介绍设备接入OneNET视频云的原理。 ### 3.sample接入OneNET视频云原理 为帮助理解sample接入OneNET视频云的开发工作,可再 理解下设备接入OneNET视频云的原理吧。也可将这部分内容理解为sample的应用场景。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/a6b70761e8a2fce7b22227aca3c1ea90.png)
Figure 3 sample接入OneNET视频云原理
在OneNET视频云背景下,sample(终端设备侧)接入OneNET视频云和播放视频原理/过程如下: [1] 设备连接鉴权到OneNET视频云; [2] OneNET视频云将所连接设备的信息与前端播放器关联在一起;在设备与OneNET视频云保持连接的情况下,前端播放器可向OneNET视频云发起视频播放请求; [3] OneNet视频云 收到播放器的播放请求后,立即向相应设备下发推送视频流的指令(ODVP); [4] 设备接收到OneNET视频云 推流指令后,在获取视频源后通过rtmp协议将视频流推送到OneNET视频云; [5] OneNET视频云 收到视频流后,会将视频流分发播放器以播放视频。 对于设备侧开发者,可自定义实现上图序号4中所涉及内容。设备连接鉴权接入OneNET视频云和接收OneNET视频云消息相关功能,video sdk提供了接口,可直接调用。 附:浏览了以上介绍,若仍旧不太明白设备接入OneNET视频云的原理,又觉得这部分内容会对后期开发造成影响,那么可以根据以下步骤以实践形式进一步理解设备接入OneNET视频云的原理。 [1] 创建OneNET视频云产品,具体见[https://open.iot.10086.cn/doc/art435.html#104](https://open.iot.10086.cn/doc/art435.html#104)(设备接入协议需选择RTMP)。 [2] 参考“video sdk sample 在Linux和windows下的构建参考”构建出sample样例(bin目录下)。 [3] 准备配置文件,将所创建产品的正式环境注册码赋值给配置文件中的pass字段;并在配置文件中配置视频源。 [4] 运行样例。参考Figure 1中步骤视频播放步骤,大概体会下设备接入OneNET视频云和播放视频的原理。 ### 4.sample源码介绍 **4.1配置信息** 设备侧的配置信息涉及产品配置信息、通道配置信息或本地视频配置信息。 产品配置信息是开发者在OneNET开发者中心所创建产品的基本信息, sample通过产品配置信息连接OneNET视频云。该配置信息是必需的。 通道配置信息用于描述含onvif协议的IPC,sample通过通道配置信息以onvif协议访问IPC,以获取实时视频源。同理,本地视频配置信息用于描述本地视频文件。这两个配置信息为sample提供视频源的描述。 从原理上讲,只要传输给OneNET视频云的配置信息符合规定格式[``` 见《OneNET视频服务Http API接口文档.docx》4.5小节,或sample中的_ont_videcmd_rvod_query函数。```],关于这三类配置信息的组织完全可以由开发者自由发挥。sample提供了通过配置文件包含这三类配置信息的实现方式。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/d205f6411573b6968f1392313cff9651.png)
Figure 4 产品配置信息
各字段含义: - productid: 产品号 - deviceid: 设备号,可为0 - pass: 产品注册码 - id: 设备描述 只要产品注册码准确,设备成功连接OneNET视频云后,在开发者中心设备管理下就可看到id所描述的设备处于在线状态。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/f784ec2972d58bfa20ea4c11e42d1b83.png)
通道配置信息和本地视频配置信息。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/d95911f5a954032aa5a4c255af53ce38.png)
Figure 5 通道配置信息以及本地视频配置信息
通道配置信息主要字段含义: - Channel_id:通道编号,对应一个摄像头 - url: onvif设备对应的访问地址 - user:onvif设备对应的用户名 - passwd:onvif设备对应的访问密码 - defaultlevel: onvif设备默认的码率播放级别(1:流畅 2:标清 3:高清 4:超清) 可以进一步对应OneNET视频云 在前端对这些字段的解析 以理解这些字段的含义:
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/30455c20555f8907cc47eeed0da47ad7.png)
Figure 6 配置文件各字段含义
本地视频配置信息主要字段含义: - channel_id:本地视频通道编号 - location:本地存储路径 - beginTime:视频开始时间 - endTime:视频结束时间 - videoTitle:视频名称 **4.2设备接入OneNET视频云步骤** 此节以注释的方式对sample接入OneNET视频云 所调用接口稍加注释。 4.2.1 配置信息初始化
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/14401716b6e93304531755afcc9d33da.png)
头文件:~video_sdk \sample\ sample_config.h 4.2.2 创建设备 为设备挂载回调函数
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/01aa6c98fccde1957e521349bc67a4b2.png)
所在头文件:~video_sdk \include\ device.h 4.2.3 从引导机处获取接入机地址以及token
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/3de4695e4cc2aea9f8e2c25b30ce4a0c.png)
所在头文件:~video_sdk \include\ device.h 4.2.4 与接入机建立tcp连接并验证token
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/bebffa170198633891ba8ded93f2f8f3.png)
~video_sdk/include/device.h 4.2.5 设备与OneNET视频云互递rsa公钥
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/e4a0e91c0106fb1ac06c9714251fc725.png)
~video_sdk/include/device.h 4.2.6 设备向OneNET视频云注册 鉴权
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/24f9a56517646dd82913adb0c3057a5a.jpg)
4.2.7 向OneNET视频云上传视频通道信息
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/f73471dbd3d6b7a1772a2286a8167390.jpg)
~video_sdk/include/device.h **4.3 设备连接保活 接收OneNET视频云消息 rtmp推流**
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/b8946c49f91f7c846a9647b59da2bf6c.png)
ont_video_playlist_singlestep所涉及的流程比较复杂,这些复杂的流程主要涉及 “获取视频源” “使用rtmp向rtmp服务器推送视频流” “管理设备的多个视频源” 3件事;除“管理设备多个视频源”外,另外两部分通过包装开源库实现。 **4.4 接收及处理OneNET视频云消息** 再介绍下设备接收并处理OneNET视频云 消息的函数,他们之间通过ODVP协议[``` 见OneNET视频服务_设备接入协议.docx```]进行消息传输。设备接收并处理OneNET设备消息的函数为:
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/036bd31602dc7fc64ae8319ea730841d.png)
所在头文件: ~video_sdk/include/device.h 该函数从设备dev所连接的OneNET视频云处接收消息,并根据消息类型调用相应回调函数处理消息。 开发者可只需重新挂载dev的回调函数来自定义处理OneNET视频云下发的消息,dev目前支持挂载的回调函数有:
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/6f00afcc2c62626616bd200422f55103.png)
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/52fde054897f8243b970186040a9aa45.png)
关于各个 回调函数类型和作用的注释,请参考~video_sdk/include/device.h中对。 **4.5 设备向OneNET视频云发送消息** 设备向OneNET发送消息同样遵循ODVP协议,在设备端按照ODVP协议组织好消息内容后可调用ont_device_msg_sendmsg接口发送。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/a9acfa05d3455bbbab452b3487033fb3.jpg)
该接口所在头文件:~video_sdk_issue\src\protocol.h。 **4.6 sample和src下的三个子目录** 这三个子目录下所包含的是开源代码,sample依靠他们实现了 获取视频源 向OneNET视频云推送视频流的功能。 sample ![](//upfiles.heclouds.com/123/ueditor/2018/09/13/a25ad971e696b91c7acc3ed6070ca111.png) |名称|sdk路径|说明| |:---|:---|:---| |live555|video_sdk\sample\live|用于从onvif设备中读取rtsp流,并结合sdk中rtmp推流接口实现推流.| |onvif|video_sdk\sample\onvif|用于访问onvif设备| |mp4v2|video_sdk\sample\mp4v2|用于历史视频(示例中用的mp4)的读取解析| src ![](//upfiles.heclouds.com/123/ueditor/2018/09/13/2b79e68939615a82c00af24ed209e70a.png) |名称|sdk路径|说明| |:---|:---|:---| |cJSON|vide_sdk\src\cJSON|用于解析配置文件| |librtmp|video_sdk\src\librtmp|用于与rtmp服务器建立建立,实现rtmp推送视频流| |mbedtls-2.6.0|video_sdk\src\ mbedtls-2.6.0|用于加密| ### 5.video sdk sample 在Linux和windows下的构建参考 关于video sdk sample在Linux和windows下的构建,可参考以下内容。 构建:根据video_sdk sample源码生成可执行文件的过程。 **5.1 Linux** 5.1.1 video sdk sample相关准备 [0] 准备Linux环境,如VMware + Ubuntu这样的虚拟机。 [1] 安装git及安装验证 ``` sudo apt-get install git git --version ``` [2] 安装cmake及安装验证 ``` sudo apt-get install cmake cmake --version ``` cmake版本需大于等于2.8 [3] 安装编译器及相关软件包 ``` sudo apt-get install g++ //sudo apt-get install gcc build-essentail ``` 由于安装cmake时已经安装了gcc及相关库,所以还只需安装g++ [4] 下载video_sdk ``` mkdir workspace cd workspace git clone https://github.com/cm-heclouds/video_sdk video_sdk ``` [5] 准备构建video_sdk sample ``` cd /video_sdk/tools chmod +x videosamplebuild.sh ./videosamplebuild.sh ``` 若存在不识别windows的 \r现象,则在Linux下按照videosamplebuild.sh抄写一份新的再运行。 5.1.2 构建video sdk sample 对于新安装的linux系统,运行./videosamplebuild.sh构建video_sdk demo极有可能会失败.需要根据构建错误提示解决这些错误。以下是可能出现的错误提示。 *(1) xlocale.h: No such file or directory* … video_sdk/sample/live/liveMedia/include/Locale.hh:47:10: fatal error: xlocale.h: No such file or directory
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/879ef97600739a7f2ae422f840a6383d.png)
解法参考:打开 …video_sdk/sample/live/CMakelist.txt,添加以下行:
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/aa660ef52ce49f40d4c858e01013ca49.png)
该行可达到的效果是定义XLOCALE_NOT_USED宏。 ``` ./videosamplebuild.sh ``` *(2) /usr/bin/x86_64-linux-gnu-ld: cannot find -lssl -lcrypto* -l表链接某库前缀,不属于实际库名。 按照链接原理,可能原因有:[1] 没有ssl/crypto库;[2] ssl/crypto库不在链接器ld默认搜索路径下,且该路径没有告知给ld。 这是刚安装的系统,第[1]种可能性更大。使用命令安装相应库。 ``` sudo apt-get install libssl-dev /* “lib” + “库名” + “-dev” */ ``` 安装libssl-dev后,libssl.*和libcrypto.*被安装到了此ld默搜路径之下:
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/e6fc301465c6e1fa171ee7b7e364a09b.jpg)
``` ./videosamplebuild.sh ``` *(3) …. undefined reference to `SSL_library_init'等系列错误* libssl.*和libcrypto.*是根据openssl生成的库。虽然刚刚已经安装了这两个库,但是这两个库中并不包含诸如SSL_library_init这样的函数定义,这可能是版本的问题。我们根据openssl源码手动安装这两个库来解决该错误。 [1] 既然刚刚安装的libssl/libcrypto没有起到作用,先把二者还回去。 ``` sudo apt-get remove libssl-dev ``` 然后查看刚安装的库是否被移除。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/b41aa809ccc11727211bd130c7a933c6.png)
libssl3.so可能是系统自带的,不用管它。 [2] 现在问题回到(2)。 因为video_sdk用的是openssl-1.0.1g,保险起见,本该安装相同版本,可这个版本在ubuntu 18中不能安装,所以选择openssl-1.0.2g。可以在windows上下载然后拷贝到Linux中,为方便linux和windows之间的文件拷贝,可安装一个vmware tools。 ``` 源码包:openssl-1.0.2g.tar.gz tar -xzf openssl-1.0.2g.tar.gz cd openssl-1.0.2g.tar.gz ``` ``` ./config --prefix=/usr/local/openssl --openssldir=/usr/lib/openssl make depend make sudo make install ``` 以上操作安装了静态库libssl.a/libcrypto.a,它们在/usr/local/openssl/lib/下:
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/4722a9c6e4f007c6c6d2cc8499ff02fa.png)
默认安装的链接器的默搜静态/动态库的路径有/usr/lib、/lib,现将openssl静态库路径告知链接器ld,让带-lssl/-lcrypto参数的链接器还到/usr/local/openssl/lib/下搜索: 在profile末尾输入以下内容保存并退出。 ``` sudo vi /etc/profile export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/openssl/lib/ source /etc/profile ``` 注:LIBRARY_PATH用于设置链接器的链接库路径;LD_LIBRARY_PATH用于程序运行期间链接/加载动态库的路径。 再运行./videosamplebuild.sh继续构建video_sdk的sample。 *(4) libmbedcrypto.a(bignum.c.o): recompile with –fPIC* ``` relocation R_X86_64_32S against `.rodata' can not be used when making a PIE object; recompile with -fPIC ``` libmbedcrypto.a在..video_sdk/lib/linux/下,是提前根据mbedtls源码在另一台Linux上编译好的静态库。mbedtls是一个类似于openssl的开源加密库。这个错误提示大概是指在编译libmbedcrypto.a的时候没有指定-fPIC参数,不是位置无关的二进制代码段,所以它不能在本机中被链接。 解法参考:在本机中编译libmbed库并替换掉..video_sdk/lib/linux/libmbedcrypto.a。 mbedtls的下载和安装参考[https://github.com/ARMmbed/mbedtls](https://github.com/ARMmbed/mbedtls)。 video sdk tool目录下有mbedtls源码包,可以直接使用它。 ``` tar zxvf mbedtls-2.6.0-apache.tgz cd mbedtls-2.6.0 make sudo make install ll /usr/local/lib/ ```
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/57e160187779cc04ecd70a4c6edd0e94.png)
``` cp /usr/local/lib/libmbedcrypto.a ../lib/linux/ ``` ``` ./videosamplebuild.sh ``` *(5) undefined reference to mbedtls_platform_set_calloc_free* ``` video_sdk/src/security_mbedtls.c:39: undefined reference to mbedtls_platform_set_calloc_free … ``` 该错误是指在libmbedcrypto.a无mbedtls_platform_set_calloc_free函数的定义。 因为mbedtls库是根据mbedtls/include/config.h中的宏定义生成具体目标代码,所以需要根据具体需求修改config.h以得到包含相应函数定义的库。 mbedtls_platform_set_calloc_free是跟内存相关的代码,需要在config.h中开启包含这部分函数定义/代码的开关。 ``` vi include/mbedtls/config.h ```
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/d0d8603537a115913d2ca536dd18df0f.png)
然后重新生成libmbedcrypto.a库。 ``` make clean make make install ``` 再覆盖原有的libmbedcrypto.a。 ``` cp /usr/local/lib/libmbedcrypto.a ../lib/linux/ ./videosamplebuild.sh ``` 若没其他问题,则构建成功。在~/video_sdk/bin目录下生成可执行文件,目前叫sample_video_s。 *(6) Relocations in generic ELF (EM: 40)* 清除已有的编译(在build目录内执行make clean;删除已有的build目录),重新编译即可。 **5.2 Windows** 5.2.1 使用cmake生成vs工程 video sdk sample下载地址同[https://github.com/cm-heclouds/video_sdk](https://github.com/cm-heclouds/video_sdk)。 下载并安装cmake和visual studio。下载可能比较缓慢,请提前进行下载并耐心等待。 cmake下载地址:[https://cmake.org/](https://cmake.org/) (cmake-3.12.0-rc1-win64-x64.msi) visual studio下载地址:[https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs) 成功安装visual studio后(此文为vs2015),注意应将其安装路径(bin)添加到环境变量中,以避免cmake找不到visual studio的提示。 准备好cmake和VS后,开始构建sample。 [1] 运行cmake,按提示进行配置。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/25f251af721ab497408da43ae1aba5d1.png)
注意visual studio的版本选择,比如这里安装的是visual studio 2015,那么这里应该选择相应的版本,否则会出错。 [2] 选择sample功能,可与sample搭配的功能模块有 MP4V2/ONVIF/PROTOCOL_RTMP_CRYPT/PROTOCOL_SECURITY_MBEDTLS/PROTOCOL_SECURITY_OPENSSL。如果只是利用sample熟悉sample的应用场景,可不比理会其余选项。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/732eadf7c0d9f4ba3ef72755b18351ff.png)
[3] 使用vs2015打开Cmake构建的vs项目工程。
![](//upfiles.heclouds.com/123/ueditor/2018/09/13/a96f13607a033d3956c5276473e3d884.png)
到此,就可以在windows平台下用vs打开sample了。 5.2.2 构建video sdk sample *(1) C1900 “P1”(第“20161212”版)和“P2”(第“20150812”版)之间 Il 不匹配* 若 勾选_PROTOCOL_SECURIY_MBEDTLS选项,VS编译时中遇到类似以上错误,可通过重新编译video_sdk/tools/mbedtls重新生成库,然后将相应库拷贝到~video_sdk/lib/win目录下。 [1] 解压mbedtls,将~mbedtls-2.6.0\include\mbedtls\config.h下的以下两个宏的注释去掉以配置sample所需功能: ``` //#define MBEDTLS_PLATFORM_MEMORY //#define MBEDTLS_HAVEGE_C ``` [2] 进入~\video_sdk\tools\mbedtls-2.6.0-apache\mbedtls-2.6.0\visualc\VS2010目录,用vs打开mbedTLS.sln;使用vs编译(使用F5即可)mbedtls以生成相应的库。编译完成后,在~\mbedtls-2.6.0\visualc\VS2010\Debug或~\mbedtls-2.6.0\visualc\VS2010\Release目录下生成mbedTLS.lib库文件,将该文件拷贝到~video_sdk/lib/win目录下。 编译成功后,将配置文件config.json拷贝到bin\Debug或bin\Release目录下,双击生成的sample_video_s即可运行。将config.json拷贝到vs所设置的目录下还可进行在线调试。 (2) 其他问题待遇更新