ONVIF專題--Onvif標準解讀(2)--Core Spec::Device Discovery(3)

前文
ONVIF專題--Onvif標準解讀(2)--Core Spec::Device Discovery(1)
ONVIF專題--Onvif標準解讀(2)--Core Spec::Device Discovery(2)

1 gsoap產生代碼文件分析

經過 Onvif標準解讀(2)--Core Spec::Device Discovery(2) 步驟產生了代碼文件如下:

stdsoap2.h 

stdsoap2.cpp
soapC.cpp

soapH.h

soapClient.cpp

soapClientLib.cpp

soapServer.cpp

soapServerLib.cpp

soapStub.h

wsdd.nsmap

其中,stdsoap2.h,stdsoap2.cpp是gsoap提供的傳輸層接口和操作系統通用接口的封裝,不是gsoap產生的,用戶直接從.../gsoap路徑下拷貝到工程即可。

而soapC.cpp,soapH.h中定義了與wsdl文件中定義協議相關的接口,協議解析、協議請求報文處理、回覆報文處理、數據序列化操作等,屬於協議棧的會話層、表示層接口。

soapStub.h、soapClient.cpp、soapServer.cpp 屬於應用層接口,與wsdl定義的某條協議相對應。soapStub.h中申明瞭客戶端和服務端的接口,但沒有實現。客戶端的接口,如soap_send___wsdd__Probe() 客戶端發送詢問請求是現在soapClient.cpp中;服務端接口如soap_serve___wsdd__Probe() 服務端收到詢問請求的回調函數是現在soapServer.cpp中。

另外soapStub.h中還聲明瞭服務端用戶回調函數的原型,這一部分接口需要開發者手動實現:

__wsdd__Hello

__wsdd__Bye

__wsdd__Probe

...

2 示例

服務端示例:

// 實現協議用戶回調SOAP_FMAC5 int SOAP_FMAC6 SOAP_ENV__Fault(struct soap*, char *faultcode, char *faultstring, char *faultactor, struct SOAP_ENV__Detail *detail, struct SOAP_ENV__Code *SOAP_ENV__Code, struct SOAP_ENV__Reason *SOAP_ENV__Reason, char *SOAP_ENV__Node, char *SOAP_ENV__Role, struct SOAP_ENV__Detail *SOAP_ENV__Detail) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Hello(struct soap*, struct wsdd__HelloType *wsdd__Hello) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Bye(struct soap*, struct wsdd__ByeType *wsdd__Bye) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Probe(struct soap*, struct wsdd__ProbeType *wsdd__Probe){return 0;}
SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ProbeMatches(struct soap*, struct wsdd__ProbeMatchesType *wsdd__ProbeMatches) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __wsdd__Resolve(struct soap*, struct wsdd__ResolveType *wsdd__Resolve) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __wsdd__ResolveMatches(struct soap*, struct wsdd__ResolveMatchesType *wsdd__ResolveMatches) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __tdn__Hello(struct soap*, struct wsdd__HelloType tdn__Hello, struct wsdd__ResolveType &tdn__HelloResponse) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __tdn__Bye(struct soap*, struct wsdd__ByeType tdn__Bye, struct wsdd__ResolveType &tdn__ByeResponse) { return 0; }
SOAP_FMAC5 int SOAP_FMAC6 __tdn__Probe(struct soap*, struct wsdd__ProbeType tdn__Probe, struct wsdd__ProbeMatchesType &tdn__ProbeResponse) { return 0; }

int main()
{
  // 設置網絡地址
  struct soap *serv = soap_new1(SOAP_IO_UDP);
  serv->bind_flags = SO_REUSEADDR;
  if (!soap_valid_socket(soap_bind(serv, NULL, 3702, 1000))) {
    soap_print_fault(serv, stderr);
    printf("group membership failed:%s\n", strerror(errno));
    getchar();
    exit(1);
  }
  ip_mreq mcast;
  mcast.imr_multiaddr.s_addr = inet_addr("239.255.255.250");
  mcast.imr_interface.s_addr = htonl(INADDR_ANY);
  if (setsockopt(serv->master, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mcast, sizeof(mcast)) < 0) {
    getchar();
    exit(1);
  }
  // 啓動服務
  soap_serve(serv);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章