vs2010构建onvif开发环境并实现设备查找

参考:http://blog.csdn.net/gubenpeiyuan/article/details/25618177

            http://blog.csdn.net/saloon_yuan/article/details/24901597

1.下载gsoap

下载地址:http://sourceforge.net/projects/gsoap2/files/gSOAP/

2.生成onvif.h

可以离线或在线生成。离线速度快,在线是最新版。

离线生成:

下载离线文件:http://download.csdn.net/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.csdn.net/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太大,不加这句会出错)



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值