版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ONVIF开发经验总结 ONVIF开发经验总结1一、利用生成Onvif相关源代码21.生成onvif.h头文件的方法21)wsdl2h相关命令参数22)链接网络生成23)下载到本地生成24)备注说明32.生成onvif源代码31)整理相关的文件32)通过以下命令生成相关源文件33)Soapcpp2相关命令参数34)备注说明33.利用生成源代码和生成的差异41)typemap.dat文件中需要添加相关信息42)wsa5.h中无 SOAP_ENV_Fault函数5二、新建工程,调试代码5三、设备发现main函数说明5四、遇到的问题和注意事项9五、经验总结16一、 利用gsoap2.8.14生成On
2、vif相关源代码1. 生成onvif.h头文件的方法产生头文件有两种方法:链接网络生成和本地生成。1) wsdl2h相关命令参数 -c 产生c语言的代码,否则产生C+ -s 不使用STL代码 -t 指定typemap.dat文件 -o 指定生成的头文件名2) 链接网络生成l 将wsdl2.exe和typemap.dat文件放入同一个文件夹l 利用cmd或批处理执行以下dos命令:wsdl2h.exe -c -s -t typemap.dat -o onvif.h 3) 下载到本地生成l 从ONVIF官网上把相关的WSDL文档下载到本地,下载地址(详细参见备注说明),此外还需下载样式表,下载地址
3、见WSDL文档中的schemaLocation。l 将wsdl2.exe、typemap.dath、WSDL文档和样式表放入同一文件夹中。l 将相关WSDL文档中的样式表引入路径(schemaLocation)修改为本地实际地址,如:event.wsdl中修改为schemaLocation = ws-addr.xsdl 利用cmd或批处理执行以下命令wsdl2h.exe -c -s -t typemap.dat -o onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.ws
4、dl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl ecording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl4) 备注说明l wsdl2.exe位于gsoap_2.8.14gsoap-2.8gsoapbinl typemap.dat位于gsoap_2.8.14gsoap-2.8gsoapl wsdl下载地址:l 各url之间用空格隔开l typemap.dat不需要修改l 链接网络生成方法的优点是不用考虑以上文件对其它文件的依赖关系,不用修改引入路径。该方法的缺点跟网速有关,
5、因此中途可能会中断,如果超过5分钟未生成,可重新执行命令, 通过代理上网则无法生成,不推荐用此方法。l 下载本地生成方法的优缺点和链接网络方法生成相反,代理网推荐使用此方法。2. 生成onvif源代码1) 整理相关的文件把刚生成的onvif.h与soapcpp2.exe、import和custom放入同一文件夹,其中:soapcpp2.exe位于gsoap_2.8.14gsoap-2.8gsoapbinimport位于gsoap_2.8.14gsoap-2.8gsoap custom位于gsoap_2.8.14gsoap-2.8gsoap 2) 通过以下命令生成相关源文件soapcpp2.ex
6、e -2 c onvif.h -I import3) Soapcpp2相关命令参数 -2 采用SOAP1.2, -x 不产生xml文件(不推荐使用此命令,因为xml文档很有用) -I 为引入路径 -C 只产生客户端代码(注意:是大写)4) 备注说明l 需要在onvif.h中加入#import "wsse.h,用来做安全验证l 需要将import目录下的wsa5.h以下部分注释掉,否则编译时会报soap_xxxx_SOAP_ENV_Fault()函数重复定义。int SOAP_ENV_Fault( _QName faultcode,/ SOAP 1.1 char*faultstring
7、,/ SOAP 1.1 char*faultactor,/ SOAP 1.1 struct SOAP_ENV_Detail*detail,/ SOAP 1.1 struct SOAP_ENV_Code*SOAP_ENV_Code,/ SOAP 1.2 struct SOAP_ENV_Reason*SOAP_ENV_Reason,/ SOAP 1.2 char*SOAP_ENV_Node,/ SOAP 1.2 char*SOAP_ENV_Role,/ SOAP 1.2 struct SOAP_ENV_Detail*SOAP_ENV_Detail,/ SOAP 1.2 void);3. 利用gso
8、ap2.8.8生成源代码和gsoap2.8.14生成的差异利用gsoap2.8.8生成源代码方法跟gsoap2.8.14基本一致,但需注意以下区别:1) typemap.dat文件中需要添加相关信息tds= "/ver10/device/wsdl"tev= "/ver10/events/wsdl"tls= "/ver10/display/wsdl"tmd= "/ver10/d
9、eviceIO/wsdl"timg= "/ver20/imaging/wsdl"trt= "/ver10/media/wsdl"tptz= "/ver20/ptz/wsdl"trv= "/ver10/receiver/wsdl"trc= "/ver10/recording/wsdl"tse= &qu
10、ot;/ver10/search/wsdl"trp= "/ver10/replay/wsdl"tan= "/ver20/analytics/wsdl"tad= "/ver10/analyticsdevice/wsdl"tdn= "/ver10/network/wsdl"tt= "http:/www.onvif
11、.org/ver10/schema"#OASIS recommended prefixeswsnt= "/wsn/b-2"wsntw= "/wsn/bw-2"wsrfbf= "/wsrf/bf-2"wsrfr= "/wsrf/r-2"wsrfrw = "http:/docs.oasis-open.o
12、rg/wsrf/rw-2"wstop= "/wsn/t-1"# WS-Discovery 1.0 remapping wsdd10_HelloType = | wsdd_HelloType wsdd10_ByeType = | wsdd_ByeType wsdd10_ProbeType = | wsdd_ProbeType wsdd10_ProbeMatchesType = | wsdd_ProbeMatchesType wsdd10_ProbeMatchType = | wsdd_ProbeMatchType w
13、sdd10_ResolveType = | wsdd_ResolveType wsdd10_ResolveMatchesType = | wsdd_ResolveMatchesType wsdd10_ResolveMatchType = | wsdd_ResolveMatchType # SOAP-ENV mapping SOAP_ENV_Envelope = struct SOAP_ENV_Envelope struct SOAP_ENV_Header *SOAP_ENV_Header; _XML SOAP_ENV_Body; ; | struct SOAP_ENV_Envelope SOA
14、P_ENV_Header = | struct SOAP_ENV_Header SOAP_ENV_Fault = | struct SOAP_ENV_Fault SOAP_ENV_Detail = | struct SOAP_ENV_Detail SOAP_ENV_Code = | struct SOAP_ENV_Code SOAP_ENV_Subcode = | struct SOAP_ENV_Subcode SOAP_ENV_Reason = | struct SOAP_ENV_Reason 2) wsa5.h中无 SOAP_ENV_Fault函数由于wsa5.h中没有SOAP_ENV_F
15、ault因此不会产生代码重复,因此不用注释。二、新建工程,调试代码1. 新建一个项目将上面生成的soapH.h、 soapStub.h、 wsdd.nsmap、soapC.c、 soapClient.c,还有位于gsoap-2.8gsoap 的:stdsoap2.c、stdsoap2.h和位于custom中的:duration.c放入工程中,然后编写main函数,调试代码。2. 文件主要功能说明wsdd.nsmap 名空间定义,服务器端与客户端都要包含它,里面有很多,都是 相同的,只需导入一个进入工程就行stdsoap2.h Header _le of stdsoap2.cpp runtime
16、 librarystdsoap2.c Runtime C library with XML parser and run-time support routines soapStub.h soapH.h /Main header file to be included by all client and service sourcessoapC.c /Serializers and deserializers for the specfied data structuressoapClient.c /Client stub routines for remote operations soap
17、Stub.h A modi_ed and annotated header file produced from the input header file三、设备发现main函数说明#include <iostream>#include "wsdd.nsmap"#include "soapH.h"using namespace std;int main() /*声明变量*/struct soap *soap; /soap环境变量struct wsdd_ProbeType req; /客户端发送的Probestruct _wsdd_Probe
18、Matches resp; /服务端回的Probematchsstruct wsdd_ScopesType sScope; /Probe里面的范围struct SOAP_ENV_Header header; /SOAP的头int result = 0; /返回值 int count = 0; /获得的设信息备个数 /*获取guid(windows下叫guid,linux下叫uuid),格式为urn:uuid:8-4-4-4-12,由系统随机产生*/static char buf64 = 0; /用来保存guid号 GUID guid; /*声明guid为GUID结构体变量,包含4个变量,分别是
19、 unsigned longData1; unsigned short Data2; unsigned short Data3; unsigned char Data4 8 ; */if (S_OK = CoCreateGuid(&guid) /如果guid生成成功,则将其转为字符串,保存在buf中 _snprintf(buf,sizeof(buf) , "urn:uuid:%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X" , guid.Data1 , guid.Data2 , guid.Data3 , guid.D
20、ata40, guid.Data41 , guid.Data42, guid.Data43, guid.Data44, guid.Data45 , guid.Data46, guid.Data47 );soap = soap_new(); /初始化soap if(soap=NULL) return -1; soap_set_namespaces(soap, namespaces); /设置命名空间soap->recv_timeout = 5;/设置接收Probematchs时间,超过5秒钟没有数据就退出soap_default_SOAP_ENV_Header(soap, &hea
21、der); /将header设置为soap消息的头属性/*给头赋值*/header.wsa_MessageID = buf; header.wsa_To= "urn:schemas-xmlsoap-org:ws:2005:04:discovery"header.wsa_Action= "/ws/2005/04/discovery/Probe"soap->header = &header;/*设置所需寻找设备的类型和范围,二者至少设定一个,否则可能收到非ONVIF设备,出现异常*/ soap_
22、default_wsdd_ScopesType(soap, &sScope); sScope._item = "onvif:/" /设置所需设备的sScopesoap_default_wsdd_ProbeType(soap, &req); req.Scopes = &sScope;req.Types = "tdn:NetworkVideoTransmitter" /*设置所需设备的类型,tdn为命名空间前缀,为wsdd.nsmap文件中"tdn","http:/www.onv
23、/ver10/network/wsdl"的tdn,如过不是tdn,而是其它,如ns1这里也要随之改为ns1*/ /通过组播发送Probe探针,发送成功返回0,否则-1result = soap_send_wsdd_Probe(soap, "soap.udp:/50:3702", NULL, &req); if(result=-1) cout<<"soap error:"<<soap->error<<soap_faultcode(soap)<<&q
24、uot;-"<<soap_faultstring(soap)<<endl; else do result = soap_recv_wsdd_ProbeMatches(soap, &resp); /接收ProbeMatches,成功返回0,否则-1 if (result=-1) cout<<"共发现"<<count<<"个设备"<<endl;cout<<"soap error:"<<soap->error<<
25、;soap_faultcode(soap)<<"-"<<soap_faultstring(soap)<<endl; break; elsecount+; cout<<"="<<endl;cout<<"UUID:"<<" "<<resp.wsdd_ProbeMatches->ProbeMatch->wsa_EndpointReference.Address<<endl; cout<<&q
26、uot;Type:"<<" "<<resp.wsdd_ProbeMatches->ProbeMatch->Types<<endl; cout<<"Scopes:"<<" "<<resp.wsdd_ProbeMatches->ProbeMatch->Scopes->_item<<endl;cout<<"Device Service Address:"<<" &q
27、uot;<<resp.wsdd_ProbeMatches->ProbeMatch->XAddrs<<endl; cout<<"MetadataVersion:"<<" "<<resp.wsdd_ProbeMatches->ProbeMatch->MetadataVersion<<endl; while(1);/*清除变量*/soap_destroy(soap); / remove deserialized class instances (C+ only) s
28、oap_end(soap);/ clean up and remove deserialized datasoap_done(soap);return result;四、调试过程遇到的问题和注意事项1. 出现如下语法错误:error C2143: 语法错误 : 缺少“”(在“:”的前面)error C2059: 语法错误 : “:”error C2143: 语法错误 : 缺少“”(在“:”的前面)需要将工程中的.c文件改成.cpp文件即可。2. 无法解析的外部命令错误soap_check_faultsubcode在stdsoap2.h中声明的soap_check_faultsubcode(st
29、ruct soap *soap)函数在soapC.cpp中未实现, 可在soapC.cpp中添加如下实现:SOAP_FMAC3 const char * SOAP_FMAC4 soap_check_faultsubcode(struct soap *soap)soap_fault(soap);if (soap->version = 2)if (soap->fault->SOAP_ENV_Code && soap->fault->SOAP_ENV_Code->SOAP_ENV_Subcode && soap->fault-
30、>SOAP_ENV_Code->SOAP_ENV_Subcode)return soap->fault->SOAP_ENV_Code->SOAP_ENV_Subcode->SOAP_ENV_Value;return NULL;return soap->fault->faultcode;3. 无法解析的外部命令错误soap_check_faultdetail在stdsoap2.h中声明的soap_check_faultdetail(struct soap *soap)函数在soapC.cpp中未实现, 可在soapC.cpp中添加如下实现:SOAP
31、_FMAC3 const char * SOAP_FMAC4 soap_check_faultdetail(struct soap *soap)soap_fault(soap);if (soap->version = 2 && soap->fault->SOAP_ENV_Detail)return soap->fault->SOAP_ENV_Detail->_any;if (soap->fault->detail)return soap->fault->detail->_any;return NULL;4. 出现
32、无法解析的外部符号_soap_in_xsd_duration无法解析的外部符号_soap_in_xsd_duration,该符号在函数_soap_getelement 中被引用soapC.obj : error LNK2019: 无法解析的外部符号_soap_out_xsd_duration,该符号在函数_soap_putelement 中被引用soapC.obj : error LNK2019: 无法解析的外部符号_soap_default_xsd_duration,该符号在函数_soap_default_tse_FindMetadata 中被引用需要将custom文件夹下面的duratio
33、n.h和duration.c导入工程中。5. 在VS中出现fatal error C1128: 节数超过对象文件格式限制: 请使用/bigobj 进行编译的错误这是由于源代码文件太大的原因,需添加选项/bigobj,在项目属性 -> C/C+ ->命令行的附加选项中添加/bigobj。6. 如果是调用soap_call_XXXX_Probe()来实现设备发现时不能发现所有onvif设备该函数实现过程中只有一次接收过程,所以无法发现所有的设备的问题。如果使用该函数,还需要对函数的实现做以下更改:函数的接收部分,将原来的XXXX:Response该为YYYY:ProbeMatches,
34、其中XXXX是.nsmap文件中"所对应的命名空间前缀,YYYY与后面YYYY:ProbeMatchesType中的前缀相同,都是所对应的命名空间前缀名。7. 抓包实验问题利用gsoap生成的wsdd.namsp如下:#include "soapH.h"SOAP_NMAC struct Namespace namespaces ="SOAP-ENV", "/soap/envelope/", "/*/soap-envelope"
35、;, NULL,"SOAP-ENC", "/soap/encoding/", "/*/soap-encoding", NULL,"xsi", "/2001/XMLSchema-instance", "/*/XMLSchema-instance", NULL,"xsd", "http:/www.w3.or
36、g/2001/XMLSchema", "/*/XMLSchema", NULL,"wsa", "/ws/2004/08/addressing", NULL, NULL,"wsdd", "/ws/2005/04/discovery", NULL, NULL,"chan", " NULL, NULL,"wsa5"
37、;, "/2005/08/addressing", "/ws/2004/08/addressing", NULL,"xmime", "/xmime.xsd", NULL, NULL,"xop", "/2004/08/xop/include", NULL, NULL,"tt", "http:/www.o
38、/ver10/schema", NULL, NULL,"wsrfbf", "/wsrf/bf-2", NULL, NULL,"wstop", "/wsn/t-1", NULL, NULL,"wsrfr", "/wsrf/r-2", NULL, NULL,"tad", "ht
39、tp://ver10/analyticsdevice/wsdl", NULL, NULL,"tan", "/ver20/analytics/wsdl", NULL, NULL,"tdn", "/ver10/network/wsdl", NULL, NULL,"tds", "/ver10/device/wsdl", NULL, N
40、ULL,"tev", "/ver10/events/wsdl", NULL, NULL,"wsnt", "/wsn/b-2", NULL, NULL,"timg", "/ver20/imaging/wsdl", NULL, NULL,"tls", "/ver10/display/wsd
41、l", NULL, NULL,"tmd", "/ver10/deviceIO/wsdl", NULL, NULL,"tptz", "/ver20/ptz/wsdl", NULL, NULL,"trc", "/ver10/recording/wsdl", NULL, NULL,"trp", "http:/www.onvif.o
42、rg/ver10/replay/wsdl", NULL, NULL,"trt", "/ver10/media/wsdl", NULL, NULL,"trv", "/ver10/receiver/wsdl", NULL, NULL,"tse", "/ver10/search/wsdl", NULL, NULL,NULL, NULL, NULL, NULL;
43、1)通过编写面函数之后,调试运行结果如下:其中12:80/onvif/device_service为本地模拟的设备通过抓包工具获得信息如下:2).保留以下命名空间,删除其它信息:#include "soapH.h"SOAP_NMAC struct Namespace namespaces ="SOAP-ENV", "/soap/envelope/", "/*/soap-envelope", NUL
44、L,"SOAP-ENC", "/soap/encoding/", "/*/soap-encoding", NULL,"xsi", "/2001/XMLSchema-instance", "/*/XMLSchema-instance", NULL,"xsd", "/2001/XMLSchema", "
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年行政执法送达程序规范知识题
- 2026年审查调查业务面试常见题型及思路
- 2026年安全生产风险防控题库
- 2026年药师查房及药学监护工作内容知识试题
- 2026年群租房整治中城管职责与联合执法测试
- 军工企业2026校园招聘面试团队精神
- 2026年海底捞市场营销面试题
- 2026年宠物养护专业单招考试传染病学考点梳理
- 2026年心理学基础知识学习与测试题
- 2026年事业单位综合应用D类教育机智与应变能力情景题
- 急性胰腺炎护理流程
- QGDW11447-202410kV-500kV输变电设备交接试验规程
- 做最勇敢的自己
- 高考语文一轮复习:古诗文情景默写 专项练习题汇编(含答案)
- 色盲检测图(俞自萍第六版)
- 10年真题汇总内初班150分语文答案
- 斯科特标准邮票目录
- 高二【美术(人教版)5】客观看物体 (认知形体)-课件
- GB/T 15605-2008粉尘爆炸泄压指南
- 氮气系统验证方案计划
- 学前教育学 第4章 学前教育活动的组织与指导
评论
0/150
提交评论