【随笔】基于gsoap编译onvif代码框架开发记录

目录

1.gsoap下载安装

2.编译onvif框架代码

3.编译踩坑指南


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才能正常使用:

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代码框架

       

  • 修改完这两个文件后,正常编译即可

 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编译过程 编译报错指南

协议开发相关 涉及服务端和客户端

 

使用gSOAP生成ONVIF框架代码需要遵循以下步骤: 1. 下载gSOAP工具包并安装到本地。 2. 下载ONVIF设备WSDL文件,例如https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl。 3. 使用gSOAP工具包中的wsdl2h工具将WSDL文件转换为头文件。 4. 使用soapcpp2工具生成ONVIF框架代码,例如: ```bash soapcpp2 -Iimport devicemgmt.h ``` 5. 在生成的代码中实现ONVIF设备的具体操作。 以下是在Linux系统中使用gSOAP生成ONVIF框架代码的示例: 1. 下载gSOAP工具包并安装到本地: ```bash wget https://sourceforge.net/projects/gsoap2/files/gSOAP/gsoap_2.8.112.zip unzip gsoap_2.8.112.zip cd gsoap-2.8 ./configure make sudo make install ``` 2. 下载ONVIF设备WSDL文件: ```bash wget https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl ``` 3. 使用wsdl2h工具将WSDL文件转换为头文件: ```bash wsdl2h -o onvif.h devicemgmt.wsdl ``` 4. 使用soapcpp2工具生成ONVIF框架代码: ```bash soapcpp2 -Iimport onvif.h ``` 5. 在生成的代码中实现ONVIF设备的具体操作。 在生成的代码中,每个ONVIF操作都有对应的函数,例如`SOAP_FMAC5 int SOAP_FMAC6 __tds__GetDeviceInformation(struct soap* soap, _tds__GetDeviceInformation* tds__GetDeviceInformation, _tds__GetDeviceInformationResponse &tds__GetDeviceInformationResponse)`就是获取设备信息的函数。您可以在这些函数中实现具体的操作。 另外,生成的代码中还有一些辅助函数和结构体,您也可以根据需要使用它们。 例如,以下代码片段演示了如何创建一个SOAP客户端并调用`__tds__GetDeviceInformation`函数: ```c++ #include "soapDeviceBindingProxy.h" const char* endpoint = "http://192.168.1.100/onvif/device_service"; DeviceBindingProxy proxy; proxy.soap_endpoint = endpoint; _tds__GetDeviceInformation tds__GetDeviceInformation; _tds__GetDeviceInformationResponse tds__GetDeviceInformationResponse; proxy.__tds__GetDeviceInformation(&tds__GetDeviceInformation, tds__GetDeviceInformationResponse); // 处理返回值 ``` 在使用时,需要将`endpoint`替换为实际的设备IP地址和ONVIF服务端口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值