gsoap -onvif编译过程

最近工作需要用到onvif协议,整理一下编译过程遇到的问题:

编译工具是: gsoap, 版本gsoap-2.8.50; 可在官网下载;
WSDL文件: 下载地址:https://www.onvif.org/profiles/specifications/

编译命令:
第一步生成 onvif.h 文件:
wsdl2h -o onvif.h -t ./typemap.dat remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl media2.wsdl

其中remotediscovery.wsdl是关于设备搜索的,但是官网主页上面没有找到,非常奇怪,我是通过别人博客找到的==;
remotediscovery.wsdl :用于发现设备
devicemgmt.wsdl :用于获取设备参数
media.wsdl:用于获取视频流地址
ptz.wsdl:用于设备的PTZ控制

需要修改的地方(坑很多,所以要改):

  1. 后续编译源代码需要用到 duration.c 文件,但是会遇到类型LONG64报错的问题;
    需要 生成头文件时,在 typemap.dat 文件中重新生成代码

xsd__duration = #import “custom/duration.h” | xsd__duration
查看typemap.dat文件发现该段代码是被注释掉的,取消注释就行了;

  1. onvif.h 添加:
    #import “wsse.h”
    网上的资料说onvif 如果需要鉴权就需要加上这段代码,只能吐槽一下,这个工具不能自己添加吗??

  2. 新增支持h265的代码行 在typemap.data文件中添加
    tr2 = http://www.onvif.org/ver20/media/wsdl
    tr2 可以自己随便命名,以后关于h265接口的都会以tr2名字出现。这段也是网上某博主说的,和h265相关,我自己还没验证;反正官网上面media.wsdl的确是有2个文件;所以我就添加了;

  3. 在使用 wsdl2h的时候可以加一些参数,最开始我是用-c -s生成 c的代码,但是后续编译源文件始终报错,所以我就去掉了 –c –s ,然后报错就没了==,具体原因还没查到;

第二步 生成源代码文件:
soapcpp2 -2 -X onvif.h -I .\custom -I .\import -I …\gsoap
(这个命令的参数有点忘记了,之前记录的txt文件找不到了==)
-X 表示生成时不产生 xml文件;
需要把custom目录以及 import 目录拷贝到 soapcpp2执行目录下(\gsoap\bin\win32文件夹下), 还有一个plugin文件夹,具体需不需要也不是特别清楚,没有他也能编译过

执行完后,会在执行路径下生成源代码:
取出来编译; 最后我这边一共是22个文件;

编译时 会报一个错:
需要吧 soapStub.h 文件中的一个宏注释掉:
// #define SOAP_WSA_2005

然后在项目使用时:
需要自己添加宏定义(很多这方面的说明都在生成的源文件的注释中,所以很坑,别的开源项目至少会有一个ReadMe文件指导你编译==):
add_definitions(-DWITH_OPENSSL)
add_definitions(-DWITH_DOM)

以上就是编译的全过程;编译后的源代码如果需要可以直接下载:
https://download.csdn.net/download/liuliu0322/11253243

发布了19 篇原创文章 · 获赞 7 · 访问量 2万+
展开阅读全文

onvif 获取摄像头uri问题

09-26

昨天提了问题,找不到了,重新提问 onvif版本2.8.17 海康摄像头 代码如下: void UserGetUri(struct soap *soap, char *token_name, _tds__GetCapabilitiesResponse *capa_resp) { //获取指定通道的流媒体地址 rtsp://192.168.15.240:554/Streaming/Channels/2?transportmode=unicast int result=0 ; printf("\n\n---------------Getting Uri----------------\n"); _trt__GetStreamUri *trt__GetStreamUri = soap_new__trt__GetStreamUri(soap,-1); _trt__GetStreamUriResponse *trt__GetStreamUriResponse = soap_new__trt__GetStreamUriResponse(soap,-1); trt__GetStreamUri->StreamSetup = soap_new_tt__StreamSetup(soap,-1); trt__GetStreamUri->StreamSetup->Stream = (tt__StreamType)0;//tt__StreamType__RTP_Unicast; trt__GetStreamUri->StreamSetup->Transport = soap_new_tt__Transport(soap,-1); trt__GetStreamUri->StreamSetup->Transport->Protocol =tt__TransportProtocol__RTSP;//(tt__TransportProtocol)0;// tt__TransportProtocol__UDP; //RTSP协议 trt__GetStreamUri->StreamSetup->Transport->Tunnel = 0; trt__GetStreamUri->StreamSetup->__size = 1; trt__GetStreamUri->StreamSetup->__any = NULL; trt__GetStreamUri->StreamSetup->__anyAttribute =NULL; trt__GetStreamUri->ProfileToken = token_name; printf("channel token:%s\n",trt__GetStreamUri->ProfileToken); printf("address:%s\n",capa_resp->Capabilities->Media->XAddr); soap_wsse_add_UsernameTokenDigest(soap,"user", "admin", "qwer1234"); //http://100.100.100.248:80/onvif/device_service //capa_resp->Capabilities->Media->XAddr result = soap_call___trt__GetStreamUri(soap,capa_resp->Capabilities->Media->XAddr, NULL, trt__GetStreamUri, trt__GetStreamUriResponse); if (soap->error) { printf("soap error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap)); result = soap->error; return; } else { printf("!!!!NOTE: RTSP Addr Get Done is :%s \n",trt__GetStreamUriResponse->MediaUri->Uri); } } soap_call___trt__GetStreamUri 函数返回2 用wireshark抓包,服务端发来的包信息为 env:sender the xml format error 希望大神帮忙! 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览