




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ONVIF开发经验总结 ONVIF开发经验总结1一、利用gsoap2.8.14生成Onvif相关源代码21.生成onvif.h头文件的方法21)wsdl2h相关命令参数22)链接网络生成23)下载到本地生成24)备注说明32.生成onvif源代码31)整理相关的文件32)通过以下命令生成相关源文件33)Soapcpp2相关命令参数34)备注说明33.利用gsoap2.8.8生成源代码和gsoap2.8.14生成的差异41)typemap.dat文件中需要添加相关信息42)wsa5.h中无 SOAP_ENV_Fault函数5二、新建工程,调试代码5三、设备发现main函数说明5四、遇到的问题和注意事项9五、经验总结16一、 利用gsoap2.8.14生成Onvif相关源代码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 /onvif/ver10/network/wsdl/remotediscovery.wsdl /onvif/ver10/device/wsdl/devicemgmt.wsdl /onvif/ver20/analytics/wsdl/analytics.wsdl /onvif/ver10/analyticsdevice.wsdl /onvif/ver10/media/wsdl/media.wsdl /onvif/ver10/deviceio.wsdl /onvif/ver10/display.wsdl /onvif/ver10/event/wsdl/event.wsdl /onvif/ver20/imaging/wsdl/imaging.wsdl /onvif/ver10/recording.wsdl /onvif/ver10/replay.wsdl /onvif/ver10/search.wsdl /onvif/ver10/receiver.wsdl /onvif/ver20/ptz/wsdl/ptz.wsdl3) 下载到本地生成l 从ONVIF官网上把相关的WSDL文档下载到本地,下载地址(详细参见备注说明),此外还需下载样式表,下载地址见WSDL文档中的schemaLocation。l 将wsdl2.exe、typemap.dath、WSDL文档和样式表放入同一文件夹中。l 将相关WSDL文档中的样式表引入路径(schemaLocation)修改为本地实际地址,如:event.wsdl中schemaLocation=/2005/08/addressing/ws-addr.xsd修改为schemaLocation = ws-addr.xsdl 利用cmd或批处理执行以下命令wsdl2h.exe -c -s -t typemap.dat -o onvif.h 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.wsdl4) 备注说明l wsdl2.exe位于gsoap_2.8.14gsoap-2.8gsoapbinl typemap.dat位于gsoap_2.8.14gsoap-2.8gsoapl wsdl下载地址:/Documents/Specifications.aspxl 各url之间用空格隔开l typemap.dat不需要修改l 链接网络生成方法的优点是不用考虑以上文件对其它文件的依赖关系,不用修改引入路径。该方法的缺点跟网速有关,因此中途可能会中断,如果超过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.exe -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,/ 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. 利用gsoap2.8.8生成源代码和gsoap2.8.14生成的差异利用gsoap2.8.8生成源代码方法跟gsoap2.8.14基本一致,但需注意以下区别:1) typemap.dat文件中需要添加相关信息tds= /ver10/device/wsdltev= /ver10/events/wsdltls= /ver10/display/wsdltmd= /ver10/deviceIO/wsdltimg= /ver20/imaging/wsdltrt= /ver10/media/wsdltptz= /ver20/ptz/wsdltrv= /ver10/receiver/wsdltrc= /ver10/recording/wsdltse= /ver10/search/wsdltrp= /ver10/replay/wsdltan= /ver20/analytics/wsdltad= /ver10/analyticsdevice/wsdltdn= /ver10/network/wsdltt= /ver10/schema#OASIS recommended prefixeswsnt= /wsn/b-2wsntw= /wsn/bw-2wsrfbf= /wsrf/bf-2wsrfr= /wsrf/r-2wsrfrw = /wsrf/rw-2wstop= /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 wsdd10_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 SOAP_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_Fault因此不会产生代码重复,因此不用注释。二、新建工程,调试代码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 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 soapStub.h A modi_ed and annotated header file produced from the input header file三、设备发现main函数说明#include #include wsdd.nsmap#include soapH.husing namespace std;int main() /*声明变量*/struct soap *soap; /soap环境变量struct wsdd_ProbeType req; /客户端发送的Probestruct _wsdd_ProbeMatches 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个变量,分别是 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.Data40, 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, &header); /将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_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,/ver10/network/wsdl的tdn,如过不是tdn,而是其它,如ns1这里也要随之改为ns1*/ /通过组播发送Probe探针,发送成功返回0,否则-1result = soap_send_wsdd_Probe(soap, soap.udp:/50:3702, NULL, &req); if(result=-1) coutsoap error:errorsoap_faultcode(soap)-soap_faultstring(soap)endl; else do result = soap_recv_wsdd_ProbeMatches(soap, &resp); /接收ProbeMatches,成功返回0,否则-1 if (result=-1) cout共发现count个设备endl;coutsoap error:errorsoap_faultcode(soap)-soap_faultstring(soap)endl; break; elsecount+; cout=endl;coutUUID: ProbeMatch-wsa_EndpointReference.Addressendl; coutType: ProbeMatch-Typesendl; coutScopes: ProbeMatch-Scopes-_itemendl;coutDevice Service Address: ProbeMatch-XAddrsendl; coutMetadataVersion: ProbeMatch-MetadataVersionversion = 2)if (soap-fault-SOAP_ENV_Code & soap-fault-SOAP_ENV_Code-SOAP_ENV_Subcode & soap-fault-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_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. 出现无法解析的外部符号_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文件夹下面的duration.h和duration.c导入工程中。5. 在VS中出现fatal error C1128: 节数超过对象文件格式限制: 请使用/bigobj 进行编译的错误这是由于源代码文件太大的原因,需添加选项/bigobj,在项目属性 - C/C+ -命令行的附加选项中添加/bigobj。6. 如果是调用soap_call_XXXX_Probe()来实现设备发现时不能发现所有onvif设备该函数实现过程中只有一次接收过程,所以无法发现所有的设备的问题。如果使用该函数,还需要对函数的实现做以下更改:函数的接收部分,将原来的XXXX:Response该为YYYY:ProbeMatches,其中XXXX是.nsmap文件中/ver10/network/wsdl所对应的命名空间前缀,YYYY与后面YYYY:ProbeMatchesType中的前缀相同,都是/ws/2005/04/discovery所对应的命名空间前缀名。7. 抓包实验问题利用gsoap生成的wsdd.namsp如下:#include soapH.hSOAP_NMAC struct Namespace namespaces =SOAP-ENV, /soap/envelope/, /*/soap-envelope, NULL,SOAP-ENC, /soap/encoding/, /*/soap-encoding, NULL,xsi, /2001/XMLSchema-instance, /*/XMLSchema-instance, NULL,xsd, /2001/XMLSchema, /*/XMLSchema, NULL,wsa, /ws/2004/08/addressing, NULL, NULL,wsdd, /ws/2005/04/discovery, NULL, NULL,chan, /ws/2005/02/duplex, NULL, NULL,wsa5, /2005/08/addressing, /ws/2004/08/addressing, NULL,xmime, /xmime.xsd, NULL, NULL,xop, /2004/08/xop/include, NULL, NULL,tt, /ver10/schema, NULL, NULL,wsrfbf, /wsrf/bf-2, NULL, NULL,wstop, /wsn/t-1, NULL, NULL,wsrfr, /wsrf/r-2, NULL, NULL,tad, /ver10/analyticsdevice/wsdl, NULL, NULL,tan, /ver20/analytics/wsdl, NULL, NULL,tdn, /ver10/network/wsdl, NULL, NULL,tds, /ver10/device/wsdl, NULL, NULL,tev, /ver10/events/wsdl, NULL, NULL,wsnt, /wsn/b-2, NULL, NULL,timg, /ver20/imaging/wsdl, NULL, NULL,tls, /ver10/display/wsdl, NULL, NULL,tmd, /ver10/deviceIO/wsdl, NULL, NULL,tptz, /ver20/ptz/wsdl, NULL, NULL,trc, /ver10/recording/wsdl, NULL, NULL,trp, /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;1)通过编写面函数之后,调试运行结果如下:其中12:80/onvif/device_service为本地模拟的设备通过抓包工具获得信息如下:2).保留以下命名空间,删除其它信息:#include soapH.hSOAP_NMAC struct Namespace namespaces =SOAP-ENV, /soap/envelope/, /*/soap-envelope, NULL,SOAP-ENC, /soap/encoding/, /*/soap-encoding, NULL,xsi, /2001/XMLSchema-instance, /*/XMLSchema-instance, NUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目投资回报的承诺函(6篇)
- 物业维修管理流程标准与案例分析
- 小学数学生活应用教学案例分析
- 企业办公用品申请流程表
- 常规维护保养服务保证承诺书4篇
- 2025年乡村医生考试题库:农村妇幼保健知识健康促进团队建设与能力提升试题
- 产品适用人群分析表
- 建筑设计师简历范本与写作要点
- 环保项目执行监测及数据分析
- 2025年医保知识考试题库及答案:医保定点医疗机构管理风险防控试题
- 北京市大兴区2024-2025学年高二上学期期中检测数学试题(解析版)
- 矿业权评估全参数确定指导意见
- 电梯司机培训内容大纲
- 渝22TS02 市政排水管道附属设施标准图集 DJBT50-159
- 从S国税局视角剖析转让定价反避税的实践与启示
- 图像几何变换讲解
- 分拣部管理制度
- 食堂不合格食品处置制度
- 光缆通信基础知识
- 德胜洋楼公司及德胜员工手册-员工守则
- TCUWA40055-2023排水管道工程自密实回填材料应用技术规程
评论
0/150
提交评论