Onvif的的标准、规范在此不赘述,论坛讲的很多
开门见山,介绍Onvif的编译、移植全过程:
第一步:
下载 gsoap
通过网址 : https://sourceforge.net/projects/gsoap2/ 下载 gsoap2.8.107 , 或者最新版本
./configure --prefix=/home/‘’username‘’/Desktop/gsoap2.8.107/(自己的选择的安装路径,但生成时并未成功,却直接生成在安装包目录下)
sudo make
make install
第二步:
用wsdl2h 生成 onvif.h 头文件
wsdl2h 所在路径: /home/‘’username‘’/Desktop/gsoap2.8.107/gsoap/bin/linux/ ,此目录生成时未获得成功
后来回到 gsoap2.8.107/根目录执行命令,成功生成文件。
在此之前,有两处做以下修改:
1)duration.c 文件,但是会遇到类型LONG64报错的问题;
在 typemap.dat 文件中
xsd__duration = #import “custom/duration.h” | xsd__duration
取消注释;
2)
新增支持h265的代码行 在typemap.data文件中添加
trt = "http://www.onvif.org/ver10/media/wsdl"
trt2 = "http://www.onvif.org/ver20/media/wsdl"
做好以上两步修改之后,即可执行 onvif.h 文件生成命令
wsdl2h -P -x -c -s -t typemap.dat -o onvif.h \
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl \
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl \
http://www.onvif.org/ver20/media/wsdl/media.wsdl \
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl \
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
wsdl分别对应:
- 发现设备
- 获取设备参数
- 获取视频流地址
- 获取视频流地址
- PTZ控制
其中 option 选项对应如下:
- -P 不创建从xsd 继承的多态性。
- -x 不生成xml 文件
- -s 不生成STL代码
- -c 生成纯C风格的头文件,这将去除C++的一些特性
- -o 将wsdl转化为filename.h头文件。
第三步:
用soapcpp2 依赖 onvif.h 生成源文件代码:
在此之前,做以下修改:
onvif.h 添加: #import "wsse.h" //鉴权认证
#import "wsdd10.h" // wsdd10 = <http://schemas.xmlsoap.org/ws/2005/04/discovery>
#import "xop.h" // xop = <http://www.w3.org/2004/08/xop/include>
#import "wsa5.h" // wsa5 = <http://www.w3.org/2005/08/addressing>
#import "wsse.h" //鉴权认证
需要去import目录下修改wsa5.h,注释掉以下 这个 结构体 : SOAP_ENV__Fault
// Added
//gsoap SOAP_ENV service method-action: Fault http://www.w3.org/2005/08/addressing/soap/fault
/*int SOAP_ENV__Fault
( _QName faultcode, // SOAP 1.1
char *faultstring, // SOAP 1.1
char *faultactor, // SOAP 1.1
struct SOAP_ENV__Detail *detail, // SOAP 1.1
struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2
struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2
char *SOAP_ENV__Node, // SOAP 1.2
char *SOAP_ENV__Role, // SOAP 1.2
struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2
void
);
*/
做好以修改之后,即可执行 源文件生成命令
soapcpp2 -2 -c -x -L -I ../../import -I ../../import/custom -I ../../import/plugin -I ../../../gsoap/ onvif.h
其中 option 选项对应如下:
- -2 Generate SOAP1.2 Bindings
- -c 产生纯C代码,否则是C++代码
- -C 仅生成客户端client代码 (此处仅生成服务端代码)
- -S 仅生成服务端server代码
- -x 不生成xml文件。不用此项的话,将对头文件中定义的每个operation生成一个描述性的xml文件
- -L 不生成soapClientLib文件和soapServerLib文件
- -I 指定import路径
运行成功后,linux的命令窗口会显示successuf
在gosap2.8.107/目录下生成如下文件,如图高亮显示部分
第四步:
用生成的源文件创建工程
源文件编译使用过程中如果遇到LONG64 ,SOAP_ENV__Fault 错误,请对照文档内容的注意点,重新编译检查,其他错误还需要根据实际使用情况调试。
调试遇到的bug和解决方法,总结后将在下一篇幅介绍