天天看點

onvif 筆記五(discovery client)

onvif discovery 用戶端

其他部分源碼參見之前的博文。

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include "soapH.h"
#include "soapStub.h"


static char uuid[128] = {0};
static char probeType[128] = {0};
static char wsaTo[128] = {0};
static char wsaAction[128] = {0};


SOAP_FMAC5 int SOAP_FMAC6 soap_discovery_start(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct d__ProbeType *d__Probe)
{
        struct __dndl__Probe soap_tmp___dndl__Probe;

        if (!soap_action)
                soap_action = "http://www.onvif.org/ver10/network/wsdl/Probe";
        soap->encodingStyle = NULL;
        soap_tmp___dndl__Probe.d__Probe = d__Probe;
        soap_begin(soap);
        soap_serializeheader(soap);
        soap_serialize___dndl__Probe(soap, &soap_tmp___dndl__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___dndl__Probe(soap, &soap_tmp___dndl__Probe, "-dndl:Probe", NULL)
                                || 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___dndl__Probe(soap, &soap_tmp___dndl__Probe, "-dndl:Probe", NULL)
                        || 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_discovery_recv(struct soap *soap, struct d__ProbeMatchesType *d__ProbeMatches)
{
        if (!d__ProbeMatches)
        {
                soap_closesock(soap);
                return -1;
        }

        soap_default_d__ProbeMatchesType(soap, d__ProbeMatches);

        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_d__ProbeMatchesType(soap, d__ProbeMatches, "d:ProbeMatches", "d:ProbeMatchesType");
        if (soap->error)
        {
                soap_recv_fault(soap, 0);
                return -1;
        }
        if (soap_body_end_in(soap)
                        || soap_envelope_end_in(soap)
                        || soap_end_recv(soap))
        {
                soap_closesock(soap);
                return -1;
        }
        return SOAP_OK;
}

SOAP_FMAC5 int SOAP_FMAC6 soap_discovery_stop(struct soap *soap)
{
        return soap_closesock(soap);
}

int main()
{
        struct soap *soap;
        int result = 0;
        struct d__ProbeType req;
        struct d__ProbeMatchesType resp;
        struct d__ScopesType sScope;
        struct SOAP_ENV__Header header;
        int count = 0;

        soap = soap_new();
        if(soap == NULL)
        {
                printf("sopa new error\r\n");
                return -1;
        }

        soap_set_namespaces(soap, namespaces);

        soap->recv_timeout = 10;
        soap_default_SOAP_ENV__Header(soap, &header);

        getMyUuid(uuid);
        sprintf(wsaTo, "urn:schemas-xmlsoap-org:ws:2005:04:discovery");
        sprintf(wsaAction, "http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe");
        header.wsa__MessageID = uuid;
        header.wsa__To = wsaTo;
        header.wsa__Action = wsaAction;

        soap->header = &header;

        soap_default_d__ScopesType(soap, &sScope);
        sScope.__item = "";
        soap_default_d__ProbeType(soap, &req);
        req.Scopes = &sScope;
        req.Types = "";//"dn:NetworkVideoTransmitter";

        int i = 0;

        result = soap_discovery_start(soap, "soap.udp://239.255.255.250:3702", NULL, &req);
        while(result == SOAP_OK)
        {
                result = soap_discovery_recv(soap, &resp);
                if(result == SOAP_OK)
                {
                        if(soap->error)
                        {
                                printf("soap error 1: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
                                result = soap->error;
                        }
                        else
                        {
                                printf("====================================================================\r\n");
                                if(soap->header->wsa__MessageID)
                                {
                                        printf("MessageID   : %s\r\n", soap->header->wsa__MessageID);
                                }
                                if(soap->header->wsa__RelatesTo && soap->header->wsa__RelatesTo->__item)
                                {
                                        printf("RelatesTo   : %s\r\n", soap->header->wsa__RelatesTo->__item);
                                }
                                if(soap->header->wsa__To)
                                {
                                        printf("To          : %s\r\n", soap->header->wsa__To);
                                }
                                if(soap->header->wsa__Action)
                                {
                                        printf("Action      : %s\r\n", soap->header->wsa__Action);
                                }

                                for(i = 0; i < resp.__sizeProbeMatch; i++)
                                {
                                        printf("__sizeProbeMatch        : %d\r\n", resp.__sizeProbeMatch);
                                        printf("Target EP Address       : %p\r\n", resp.ProbeMatch[i].wsa__EndpointReference);
                                        printf("Target EP Address       : %s\r\n", resp.ProbeMatch[i].wsa__EndpointReference.Address);
                                        printf("Target Type             : %s\r\n", resp.ProbeMatch[i].Types);
                                        printf("Target Service Address  : %s\r\n", resp.ProbeMatch[i].XAddrs);
                                        printf("Target Metadata Version : %d\r\n", resp.ProbeMatch[i].MetadataVersion);
                                        if(resp.ProbeMatch[i].Scopes)
                                        {
                                                printf("Target Scopes Address   : %s\r\n", resp.ProbeMatch[i].Scopes->__item);
                                        }
                                }
                        }
                }
                else if (soap->error)
                {
                        printf("soap error 2: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
                        result = soap->error;
                }
        }
        soap_discovery_stop(soap);


        soap_destroy(soap); // remove deserialized class instances (C++ only)
        soap_end(soap); // clean up and remove deserialized data
        soap_free(soap);//detach and free runtime context
        soap_done(soap); // detach context (last use and no longer in scope)

        return result;
}
           

繼續閱讀