【随笔】基于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编译过程 编译报错指南

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值