参考:http://blog.youkuaiyun.com/gubenpeiyuan/article/details/25618177
http://blog.youkuaiyun.com/saloon_yuan/article/details/24901597
1.下载gsoap
下载地址:http://sourceforge.net/projects/gsoap2/files/gSOAP/
2.生成onvif.h
可以离线或在线生成。离线速度快,在线是最新版。
离线生成:
下载离线文件:http://download.youkuaiyun.com/detail/u011597695/5875143 (非本人生成,感谢分享的大侠)
将里面的内容解压到gsoap-2.8/gsoap/bin/win32
开启cmd,cd到gsoap-2.8/gsoap/bin/win32,执行
wsdl2h -o onvif.h -s -t ../../typemap.dat devicemgmt.wsdl media.wsdl event.wsdl display.wsdl deviceio.wsdl imaging.wsdl ptz.wsdl receiver.wsdl recording.wsdl search.wsdl remotediscovery.wsdl replay.wsdl analytics.wsdl analyticsdevice.wsdl actionengine.wsdl accesscontrol.wsdl doorcontrol.wsdl
在线生成:
开启cmd,cd到gsoap-2.8/gsoap/bin/win32,执行
wsdl2h -o onvif.h -s -t ../../typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl http://www.onvif.org/ver10/actionengine.wsdl http://www.onvif.org/ver10/pacs/accesscontrol.wsdl http://www.onvif.org/ver10/pacs/doorcontrol.wsdl
3.生成onvif开发框架
打开gsoap-2.8/gsoap/import/wsa5.h,将277行的结构体SOAP_ENV__Fault注释掉
若要添加对openssl的支持,给onvif.h加上#include<wsse.h>
接着在cmd里执行
soapcpp2 onvif.h -x -I../../import -I../../
4.实现设备查找
新建空项目,将下列文件拷贝到工程目录里并添加到工程。
onvif.h
soapH.h
soapStub.h
stdsoap2.h(在gsoap-2.8/gsoap文件夹里)
wsdd.h(将生成的wsdd.nsmap后缀改为.h)
duration.cpp(在gsoap-2.8/gsoap/custon文件夹里有.c文件,改后缀为.cpp)
soapC.cpp
soapClient.cpp
stdsoap2.cpp(在gsoap-2.8/gsoap文件夹里)
新建mian.cpp,贴入下面代码。代码参考:http://blog.youkuaiyun.com/zsl461975543/article/details/8971143
#include "wsdd.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int main(void )
{
struct soap *soap;
struct SOAP_ENV__Header header;
struct wsdd__ScopesType sScope;
struct wsdd__ProbeType req;
struct __wsdd__ProbeMatches resp;
int count = 0;
//初始化
soap = soap_new();
soap_set_namespaces(soap,namespaces);
//头
soap_default_SOAP_ENV__Header(soap,&header);
static char cguid[64] = {0};
GUID guid;
CoCreateGuid(&guid);
_snprintf(cguid, sizeof(cguid), "urn:uuid:%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X",
guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2],
guid.Data4[3], guid.Data4[4],guid.Data4[5], guid.Data4[6], guid.Data4[7]);
header.wsa__MessageID = cguid;
header.wsa__To = "urn:schemas-xmlsoap-org:ws:2005:04:discovery";
header.wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe";
soap->header = &header;
//设置所需寻找设备的类型和范围
soap_default_wsdd__ScopesType(soap,&sScope);
sScope.__item ="onvif://www.onvif.org";
soap_default_wsdd__ProbeType(soap,&req);
req.Scopes = &sScope;
req.Types ="tdn:NetworkVideoTransmitter";
//通过组播发送Probe探针,发送成功返回0,否则-1
soap_send___wsdd__Probe(soap,"soap.udp://239.255.255.250:3702", NULL, &req);
do{
//接收ProbeMatches,成功返回0,否则-1
soap_recv___wsdd__ProbeMatches(soap,&resp);
count++;
cout<<"______________________第"<<count<<"个______________________________"<<endl;
cout<<"UUID:"<<""<<resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.Address<<endl;
cout<<"Type:"<<""<<resp.wsdd__ProbeMatches->ProbeMatch->Types<<endl;
cout<<"Scopes:"<<""<< resp.wsdd__ProbeMatches->ProbeMatch->Scopes->__item<<endl;
cout<<"DeviceService Address:"<<""<<resp.wsdd__ProbeMatches->ProbeMatch->XAddrs<<endl;
cout<<"MetadataVersion:"<<""<<resp.wsdd__ProbeMatches->ProbeMatch->MetadataVersion<<endl;
}while(1);
/********清除变量************/
soap_destroy(soap);
soap_end(soap);
soap_done(soap);
return 0;
}
打开项目->属性->c/c++->命令行,在其它选项里输入/bigobj(由于soapC太大,不加这句会出错)