1 onvif協議wsdl文件獲取
onvif標準的通訊協議基於soap協議。onvif官網可以下載定義其協議內容的wsdl文件,這些文件描述了onvif通訊協議正文格式、數據類型等。wsdl文件下載地址:https://www.onvif.org/profiles/specifications/。
有了描述協議的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;
}