目录
1.gsoap下载安装
gSOAP官方网址:http://www.cs.fsu.edu/~engelen/soap.html
gSOAP开源版下载网址(最新版本):http://sourceforge.net/projects/gsoap2
gSOAP开源版下载网址(历史版本):https://sourceforge.net/projects/gsoap2/files/gSOAP/
我下载的版本是:2.8.109
./configure --prefix=/home/gsoap/
make
make install
gsoap虽然安装完成,但是你还要检查你的linux下是否也安装了以下内容,没有的话要安装一下,gsoap才能正常使用:
- .Bison或Yacc 安装:"https://www.gnu.org/software/bison/"
- Flex的安装:"https://github.com/westes/flex/releases"
- OpenSSL 的安装:"https://www.openssl.org/source/"
- 可选的Zlib支持:"http://www.zlib.net/"
2.编译onvif框架代码
首先,要编译onvif框架代码需要gsoap的两个工具:wsdl2h和soapcpp2;
并且,这两个工具在win32和macosx平台已经有现成的了(官方帮我们编译好了的),linux下的需要要自己编译。这两个工具就在gsoap\bin目录下。
如果,你是在linux下开发onvif,并且linux环境不能联网(无法联网下载wsdl文件),这里有一个投机的方法就是你可以在windows的环境下把onvif的代码框架编译好;再把代码拷入linux下开发。因为,已有大佬证明过linux和windows下生成的代码是一致的即跨平台通用。另外,本人就是采用windows编译代码框架,linux下开发实际业务,结果也是正常运行的。
这边网上也是有很多教程可以离线下载wsdl文件编译框架的,尝试过后,个人认为需要依赖的文件过多,需要逐一修改xsd文件内部的路径地址,较为吃力不讨好;
windows下编译流程,我把它写成两个脚本文件,直接双击运行就行了:点我下载
- wsdl2h的参数说明
-c : 生成c风格代码(注:后缀名还是.cpp ,但实际上是.c)
-c++:生成c++风格代码(注 : 默认是生成c++代码)
-x : 表示不生成xml 文件(注:生成的xml文件,有助于了解发送是SOAP是怎样的结构,建议不使用-x)
-l : 表示指定导入路径
-C : 表示生成客户端代码
-S : 表示生成服务端代码
-s : 不使用STL代码
-o: 生成.h文件叫什么名字
-t : 后面紧跟“typemap.dat”这个批处理文件
- 选择wsdl文件
(1)到ONVF官网:https://www.onvif.org/profiles/specifications/下载最新的wsdl文件
(2)通过网址链接:https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl
(3)onvif 常用的几个wsdl文件:
remotediscovery.wsdl :用于发现设备
devicemgmt.wsdl :用于获取设备参数
media.wsdl:用于获取视频流地址
注意:根据业务需求选择wsdl文件,如果对文件不熟悉,可以全部包含进去,防止出现函数找不到的情况,弊端是导致代码量过大,编译时间过长。
- soapcpp2参数简单说明
/soapcpp2命令的相关命令参数如下:(可以根据自己的实际需要添加不同参数)
-2 //采用SOAP1.2,和SOAP1.0版本不同,会导致搜索工具搜索不到
-x //不产生xml文件(可用可不用,xml有一定帮助,但是太多)
-I //为引入路径
-C //只产生客户端代码(注意:C是大写,不推荐用此命令)
-c //产生纯c框架代码
如需要了解工具全部参数可用 soapcpp2 -h 及 wsdl2h -h 了解
3.编译踩坑指南
3.1.编译纯c代码框架,需要在wsdl2h和soapcpp2都使用 "-c"
3.2.编译支持h265代码框架
- 需要添加相关wsdl文件:http://www.onvif.org/onvif/ver20/media/wsdl/media.wsdl
- 修改typemap.dat文件:在命名空间已经存在的trt下,新增支持h265的代码行 tr2 = http://www.onvif.org/ver20/media/wsdl ,tr2 可以自己随便命名,以后关于h265接口的都会以tr2名字出现。
- 修改完这两个文件后,正常编译即可
3.3.编译报错:fatal error: xlocale.h: No such file or directory :
- 可以在Makefile中添加宏定义:
-DWITH_NO_C_LOCALE
去除编译环境依赖locale环境的支持;这种情况一般是移植到arm开发板中常出现;
较新的gsoap版本会需要这个环境支持,经测试gsoap2.8.21编译则不存在此问题;
3.4.需要支持鉴权功能:需要在wsdl2h生成的头文件中添加 #import “wsse.h”,否则编译会出现报错:error C2039: “wsse__Security”: 不是“SOAP_ENV__Header”的成员
3.5.根据不同的gSOAP版本,这个过程你可能会遇到这样的错误:
wsa5.h(288): **ERROR**: service operation name clash: struct/class 'SOAP_ENV__Fault' already declared at wsa.h:273
之所以会出现这个错误,是因为onvif.h头文件中同时:
#import "wsdd10.h" // wsdd10.h中又#import "wsa.h"
#import "wsa5.h" // wsa.h和wsa5.h两个文件重复定义了int SOAP_ENV__Fault
解决方法:修改import\wsa5.h文件,将int SOAP_ENV__Fault修改为int SOAP_ENV__Fault_alex,再次使用soapcpp2工具编译就成功了,
3.6.关联自己的命名空间,修改stdsoap2.c文件
在samples\onvif\stdsoap2.h中有命名空间「namespaces变量」的定义声明,如下所示:
extern SOAP_NMAC struct Namespace namespaces[];
但「namespaces变量」的定义实现,是在samples\onvif\wsdd.nsmap文件中,为了后续应用程序要顺利编译,修改samples\onvif\stdsoap2.c文件,在开头加入:
#include "wsdd.nsmap"
当然,你可以在其他源码中(更上层的应用程序源码)include,也可以正常运行
3.7.LONG64编译报错
编译源代码需要用到 duration.c 文件,但是会遇到LONG64编译报错类型;
解决方法:需要生成头文件时,修改typemap.dat 文件,然后重新生成代码
查看typemap.dat文件发现下段代码是被注释掉的,取消注释就行了;(较新版本存在被注释的情况,gsoap2.8.21就存在)
xsd__duration = #import “custom/duration.h” | xsd__duration
3.8.如果需要链接openssl,需要在Makefile添加以下宏定义;否则会报一堆的链接错误
-DWITH_DOM -DWITH_OPENSSL //两个宏是链接openssl时要用的;
如果用到鉴权功能,其中调用次函数实现鉴权功能soap_wsse_add_UsernameTokenDigest(),则要安装依赖库openssl;
参考链接:
ONVIF协议网络摄像机 完整性高,利于初学者;不过只有客户端
gsoap -onvif编译过程 编译报错指南
协议开发相关 涉及服务端和客户端