天天看點

ONVIF專題--生成ONVIF開發架構1 onvif協定wsdl檔案擷取2 onvif協定開發架構源碼産生

1 onvif協定wsdl檔案擷取

onvif标準的通訊協定基于soap協定。onvif官網可以下載下傳定義其協定内容的wsdl檔案,這些檔案描述了onvif通訊協定正文格式、資料類型等。wsdl檔案下載下傳位址:https://www.onvif.org/profiles/specifications/。

ONVIF專題--生成ONVIF開發架構1 onvif協定wsdl檔案擷取2 onvif協定開發架構源碼産生

有了描述協定的wsdl檔案,我們利用gsoap工具,便可以自動産生基于onvif協定的通訊軟體開發架構。

2 onvif協定開發架構源碼産生

本地産生方式将下載下傳的wsdl按照如下目錄結構存放

OnvifFramework/
| level1/
| | level2/
| | | GenerateSource/
| | | | typemap.dat
| | | | wsdl2h.exe
| | | | soapcpp2.exe
| | | | remotediscovery.wsdl
| | | | devicemgmt.wsdl
| | | | analytics.wsdl
| | | | analyticsdevice.wsdl
| | | | media.wsdl
| | | | deviceio.wsdl
| | | | display.wsdl
| | | | event.wsdl
| | | | imaging.wsdl
| | | | recording.wsdl
| | | | replay.wsdl
| | | | search.wsdl
| | | | receiver.wsdl
| | | | ptz.wsdl
| | | ver10/
| | | | device/
| | | | | wsdl/
| | | | | | devicemgmt.wsdl
| | | | media/
| | | | | wsdl/
| | | | | | media.wsdl
| | | | schema/
| | | | | onvif.xsd
|ver10/
| | schema/
| | | onvif.xsd
           

wsdl的是對協定接口的定義,可用于産生頭檔案onvif.h,wsdl根據使用者需要的功能輸入。

使用gsoap的wsdl2h指令:

# 線上方式生成
wsdl2h -o onvif.h -c -s -t ./typemap.dat
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl
http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
http://www.onvif.org/onvif/ver10/display.wsdl
http://www.onvif.org/onvif/ver10/deviceio.wsdl 
http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl 
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl 
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl  
http://www.onvif.org/onvif/ver10/receiver.wsdl 
http://www.onvif.org/onvif/ver10/recording.wsdl  
http://www.onvif.org/onvif/ver10/search.wsdl 
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl 
http://www.onvif.org/onvif/ver10/replay.wsdl 
http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl 
http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl  
http://www.onvif.org/onvif/ver10/schema/onvif.xsd  
http://www.onvif.org/ver10/actionengine.wsdl

# 本地方式生成
wsdl2h -o onvif.h -x -c -s -t ./typemap.dat devicemgmt.wsdl media.wsdl
           

onvif.h檔案中将wsdl描述的協定接口轉換為c++接口,并根據wsdl産生協定正文對應資料結構。

接下來,可以使用soapcpp2指令根據頭檔案生成源碼架構實作代碼

soapcpp2 -c onvif.h -x -d ./ -I.../gsoap-2.8/gsoa
p/import -I.../gsoap-2.8/gsoap/
           

使用gsoap産生的協定架構,是帶協定封包建構 + 網絡傳輸的,即開箱即用。

onvif架構測試代碼

int main(int argc, char **argv)  
{  
  int m, s;  
  struct soap add_soap;  
  int server_udp;

  server_udp = create_server_socket_udp();
  //bind_server_udp1(server_udp);
  pthread_t thrHello;
  pthread_t thrProbe;
  //pthread_create(&thrHello,NULL,main_Hello,server_udp);
  //sleep(2);
  pthread_create(&thrProbe,NULL,main_Probe,server_udp);

  soap_init(&add_soap);  
  soap_set_namespaces(&add_soap, namespaces);  

  if (argc < 0) {  
    printf("usage: %s <server_port> \n", argv[0]);  
    exit(1);  
  } else {  
    m = soap_bind(&add_soap, NULL, 80, 100);  
    if (m < 0) {  
      soap_print_fault(&add_soap, stderr);  
      exit(-1);  
    }  
    fprintf(stderr, "Socket connection successful: master socket = %d\n", m);  
    for (;;) {  
      s = soap_accept(&add_soap);  
      if (s < 0) {  
        soap_print_fault(&add_soap, stderr);  
        exit(-1);  
      }  
      fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);  
      soap_serve(&add_soap);  
      soap_end(&add_soap);  
    }  
  }  
  return 0;  
} 
           

繼續閱讀