2014-11-21 4 views
2

В моем клиентском приложении onvif я ищу для реализации WS-Discovery с gsoap и wsddapi.c, но у меня проблемы с обработчиком. Я могу отправить многоадресное сообщение через UDP с помощью soap_wsdd_probe (wsddapi.c), я внедрил soap_bind, прослушивание и wsdd_event_probematches, но я не получаю сообщение от Сервиса.ONVIF WS-Discover 1.0 - Обработчики клиентов и событий


/*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; 
} 

Event Handler в 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); 
} 

ответ

0

Для того чтобы получить UDP, нужно создать экземпляр мыло с soap_new1(SOAP_IO_UDP)

Документация, gSOAP довольно неясен в отношении плагинов WS-Discovery, и я был смущен о экземпляре мыла для отправки запроса и экземпляра мыла для сбора ответов.
Для полученных однонаправленных ответов запроса многоадресной рассылки это необходимо использовать тот же экземпляр мыла:

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; 
} 
+0

Я попробовал ваш код, но не работает ... если вы отладку вы можете увидеть, что обработчик событий ошибок в wsddapi.c является вызовом, только если вы используете SOAP_WSDD_MANAGED, а не SOAP_WSDD_ADHOC ... это более странно. и если вы используете цикл, как для (;;) в wsddapi.c, когда вызывается обработчик события в soap_wsdd_Probe(), вы можете увидеть все пробные номера из целевой службы. Это более странно, я думаю, это не правильный путь. – Luca84

+0

@ Luca84 в режиме SOAP_WSDD_ADHOC, обработчик wsdd_event_ProbeMatches называется обработкой сообщения ProbeMatches (из __wsdd__ProbeMatches). Вы можете найти мои попытки из github https://github.com/mpromonet/ws-discovery/tree/master/gsoap. Я успешно запускаю его с помощью gSOAP 2.8.7 и gSOAP 2.8.17. – mpromonet

+0

Привет @mpromonet, я использую ваш пример в gitHub. Обычно я использовал проблему. Но когда компилируется server.cpp, он дает ошибку. error: невозможно преобразовать 'ip_mreq *' в 'const char *' для аргумента '4' to 'int setsockopt (SOCKET, int, int, const char *, int)' if (setsockopt (serv-> master, IPPROTO_IP, IP_ADD_MEMBERSHIP, & mcast, sizeof (mcast)) <0) ' Как я могу решить эту проблему? –

 Смежные вопросы

  • Нет связанных вопросов^_^