首页 > 代码库 > onvif client Discovery实现
onvif client Discovery实现
省略:onvif client soapRemoteDiscoveryBindingProxy 由 gsoap C++ 方式生成
#include "soapRemoteDiscoveryBindingProxy.h"
#include "RemoteDiscoveryBinding.nsmap"
#include<string>
using namespace std;
SOAP_FMAC5 int SOAP_FMAC6 soap_send___wsdd__Probe(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct wsdd__ProbeType *wsdd__Probe)
{ struct __wsdd__Probe soap_tmp___wsdd__Probe;
if (soap_action == NULL)
soap_action = "http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Probe";
soap_tmp___wsdd__Probe.wsdd__Probe = wsdd__Probe;
soap_begin(soap);
soap_set_version(soap, 2); /* SOAP1.2 */
soap->encodingStyle = NULL;
soap_serializeheader(soap);
soap_serialize___wsdd__Probe(soap, &soap_tmp___wsdd__Probe);
if (soap_begin_count(soap))
return soap->error;
if (soap->mode & SOAP_IO_LENGTH)
{ if (soap_envelope_begin_out(soap)
|| soap_putheader(soap)
|| soap_body_begin_out(soap)
|| soap_put___wsdd__Probe(soap, &soap_tmp___wsdd__Probe, "-wsdd:Probe", "")
|| soap_body_end_out(soap)
|| soap_envelope_end_out(soap))
return soap->error;
}
if (soap_end_count(soap))
return soap->error;
if (soap_connect(soap, soap_endpoint, soap_action)
|| soap_envelope_begin_out(soap)
|| soap_putheader(soap)
|| soap_body_begin_out(soap)
|| soap_put___wsdd__Probe(soap, &soap_tmp___wsdd__Probe, "-wsdd:Probe", "")
|| soap_body_end_out(soap)
|| soap_envelope_end_out(soap)
|| soap_end_send(soap))
return soap_closesock(soap);
return SOAP_OK;
}
SOAP_FMAC5 int SOAP_FMAC6 soap_recv___wsdd__ProbeMatches(struct soap *soap, struct __wsdd__ProbeMatches *_param_1)
{
soap_default___wsdd__ProbeMatches(soap, _param_1);
soap_begin(soap);
if (soap_begin_recv(soap)
|| soap_envelope_begin_in(soap)
|| soap_recv_header(soap)
|| soap_body_begin_in(soap))
return soap_closesock(soap);
soap_get___wsdd__ProbeMatches(soap, _param_1, "-wsdd:ProbeMatches", NULL);
if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
soap->error = SOAP_OK;
if (soap->error
|| soap_body_end_in(soap)
|| soap_envelope_end_in(soap)
|| soap_end_recv(soap))
return soap_closesock(soap);
return soap_closesock(soap);
}
int main()
{
struct soap *soap;
struct wsdd__ProbeType req;
struct __wsdd__ProbeMatches resp;
struct wsdd__ScopesType sScope;
struct SOAP_ENV__Header header;
int count = 0;
int result = 0;
char guid_string[100];
soap = soap_new();
if (soap == NULL)
{
return -1;
}
soap_set_namespaces(soap, namespaces);
soap->recv_timeout = 3; //超过x秒钟没有数据就退出
soap_default_SOAP_ENV__Header(soap, &header);
header.wsa__MessageID = guid_string;
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 = "";
soap_default_wsdd__ProbeType(soap, &req);
req.Scopes = &sScope;
req.Types = "dn:NetworkVideoTransmitter";
result = soap_send___wsdd__Probe(soap, "soap.udp://239.255.255.250:3702", NULL, &req);
int i = 0,nFindDev=0;
while (i++<10)
{
printf("soap_discovery_recv...\n");
result = soap_recv___wsdd__ProbeMatches(soap,&resp);
if (result == SOAP_OK)
{
if (!(soap->header))
{
printf("continue++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
continue;
}
nFindDev++;
cout << "=========================================" << endl;
cout << "Match size:" << resp.wsdd__ProbeMatches->__sizeProbeMatch << endl;
cout << "xsd-unsignedInt:" << resp.wsdd__ProbeMatches->ProbeMatch->MetadataVersion << endl;
cout << "scopes item:" << resp.wsdd__ProbeMatches->ProbeMatch->Scopes->__item << endl;
cout << "QName:" << resp.wsdd__ProbeMatches->ProbeMatch->Types << endl;
cout << "xsd:string:" << resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.Address << endl;
cout << "xsd:QName:" << resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.PortType << endl;
cout << "wsa:ServiceNameType:" << resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.ServiceName << endl;
cout << "sequence of elements:" << resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.__size << endl;
cout << "xsd:anyType:" << resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.__anyAttribute << endl;
cout << "endpoint any:" << resp.wsdd__ProbeMatches->ProbeMatch->wsa__EndpointReference.__any << endl;
cout << "wsdd:UriListType:" << resp.wsdd__ProbeMatches->ProbeMatch->XAddrs << endl;
}
else
{
printf("2soap error: %d, %s, %s@@@@@@@@@@@\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
break;
}
}
printf("exit while,find dev:%d\n", nFindDev);
// remove deserialized class instances (C++ only)
soap_destroy(soap);
// clean up and remove deserialized data
soap_end(soap);
////////////////////////////////////////////////////////////////////////////
soap_free(soap);//detach and free runtime context
soap_done(soap); // detach context (last use and no longer in scope)
return result;
}
onvif client Discovery实现