3

onvif クライアント アプリケーションで、gsoap と wsddapi.c を使用して WS-Discovery を実装しようとしていますが、ハンドラーに問題があります。soap_wsdd_probe (wsddapi.c) を使用して UDP 経由でマルチキャスト メッセージを送信できます。soap_bind、listen、および wsdd_event_probematches を実装しましたが、サービスからメッセージを受信しません。


/*MY CLIENT*/

#include "wsdd.nsmap"
#include "soapH.h"
#include "wsddapi.h"

int main () {
    struct soap* soap=soap_new();
    struct soap* serv=soap_new(); //for the listner and the event handler
    int time=100, port=53881;

    if (!soap_valid_socket(soap_bind(soap, NULL, port, 100)))
    { soap_print_fault(soap, stderr);
      exit(0);
    }

    soap->connect_flags=SO_BROADCAST;

    const char * msg_uuid = NULL;
    msg_uuid=soap_wsa_rand_uuid(soap);
    soap_wsdd_Probe(soap, SOAP_WSDD_ADHOC, SOAP_WSDD_TO_TS,"soap.udp://239.255.255.250:3702",msg_uuid, NULL,"dp0:NetworkVideoTransmitter","", NULL);

    soap_wsdd_listen(serv, 2); // listen for messages

    soap_destroy(soap);
    soap_end(soap);
    soap_done(soap);
    return 0;
}

wsddapi.c のイベント ハンドラーを実装しました。wsdd_event_probematches()

void wsdd_event_ProbeMatches(struct soap *soap, unsigned int InstanceId, const char *SequenceId, unsigned int MessageNumber, const char *MessageID, const char *RelatesTo, struct wsdd__ProbeMatchesType *matches){
    printf("MessageID:%s",MessageID);
    printf("%s",matches->ProbeMatch->XAddrs);
}
4

1 に答える 1

1

UDP を受信するには、soap インスタンスを作成する必要があります。soap_new1(SOAP_IO_UDP)

gSOAP のドキュメントは、WS-Discovery プラグインについて非常にわかりにくく、リクエストを送信するための SOAP インスタンスと、回答を収集するための SOAP インスタンスについて混乱しました。
マルチキャスト リクエストのユニキャスト応答を受信するには、同じ SOAP インスタンスを使用する必要があります。

int main(int argc, char** argv)
{
        struct soap* serv = soap_new1(SOAP_IO_UDP);
        if (!soap_valid_socket(soap_bind(serv, NULL, 0, 1000)))
        {
                soap_print_fault(serv, stderr);
                exit(1);
        }
        int res = soap_wsdd_Probe(serv, 
                                  SOAP_WSDD_ADHOC, 
                                  SOAP_WSDD_TO_TS,
                                  "soap.udp://239.255.255.250:3702",
                                  soap_wsa_rand_uuid(serv), 
                                  NULL, 
                                  NULL, 
                                  NULL, 
                                  "");
        if (res != SOAP_OK)
        {
                soap_print_fault(serv, stderr);
                exit(1);
        }
        soap_wsdd_listen(serv, 1);
        soap_destroy(serv);
        soap_end(serv);
        soap_done(serv);
        return 0;
}
于 2014-11-27T08:22:50.883 に答える