2014-11-21 8 views
2

내 onvif 클라이언트 응용 프로그램에서 gsoap 및 wsddapi.c를 사용하여 WS-Discovery를 구현하려고하지만 처리기에 문제가 있습니다. 내가 soap_wsdd_probe (wsddapi.c)와 UDP를 통해 멀티 캐스트 메시지를 보낼 수 있습니다, 나는 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; 
} 

이벤트 처리기가 wsddapi.c에 내가 UDP를 받기 위해 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

를 구현 한, soap_new1(SOAP_IO_UDP)

문서와 비누 인스턴스를 생성하는 데 필요한 gSOAP는 WS-Discovery 플러그인에 대해 아주 모호하며 요청을 보내기위한 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; 
} 
+0

나는 ... 작업 코드를 시도하지만 한 그 이벤트 핸들러 wsddapi.c의 probmatches는 SOAP_WSDD_MANAGED가 아닌 SOAP_WSDD_ADHOC를 사용하는 경우에만 호출됩니다 ... 더 이상합니다. soap_wsdd_Probe()에서 이벤트 처리기를 호출 할 때 wsddapi.c에서 (;;)과 같은 루프를 사용하면 대상 서비스의 모든 probematches를 볼 수 있습니다. 내가 옳은 길로 생각하는 것이 더 이상하다. – 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에서 예제를 사용하고 있습니다. 정상적으로 prob를 사용했습니다. 그러나 server.cpp를 컴파일하면 오류가 발생합니다. 오류 : 'setsockopt (serv-> master, IPPROTO_IP, int)'에 대해 'ip_mreq *'를 'const char *'로 '4'에서 'int setsockopt (SOCKET, int, int, const char *, int)'로 변환 할 수 없습니다. IP_ADD_MEMBERSHIP, mcast, sizeof (mcast)) <0) ' 어떻게 해결할 수 있습니까? –

관련 문제