第一篇:iwebshop开发总结
Iwebshop总结
1.C端(C控制器)有数据,V端(模板)收不到数据,一般可能的情况。
控制器名和模板名不一致,无法收到数据。
Foreach items=XX Item
2.控制器给模板数据的方式 $this->xx,setRenderData()1,必须是数组 2,因为iwebshop 在其 控制器基础类 IControllerBase 使用了 extract,可以直接使用数组的键名(key)做变量名。
3.Iwebshop可以没有action,但模板里面必须有同名的文件,如conf_base
4.后台新建控制器时,要在themeroute中的$syscontroller中添加一个键值
5.数组序列化写入配置文件时,需要在classes/config.php的$safeKey中添加一个键值,添加转义符。
6.图片不能上传,多数原因是因为临时路径无法写入
编辑php.ini文件,去掉upload_tmp_dir前面的分号并将其修改为: upload_tmp_dir =“C:/windows/temp”
大多数Windows环境下的临时文件夹位置是:
C:/windows/temp,为这个临时文件夹加入网站匿名访问用户组的读写权限,对于上层目录windows设置users用户的“列出目录”的权限。大多数情况下,只需要设置临时文件夹的访问权限,而不需要更改php配置。
7.数据库操作 Imodel update($where)add之前,setData 打印sql 在$sql后面echo $sql
getObj($where = false,$cols = '*')打印语句的在query方法中
query($where=false,$cols='*',$orderBy=false,$desc='DESC',$limit=50000)
Iquery 联表 分组 having 取唯一值
联表查询 要注意起别名 //关联商品
$relationObj = new IQuery('relation as r');$relationObj->join = ' left join goods as go on r.goods_id = go.id ';$relationObj->where = ' r.article_id = '.$this->article_id.' and go.id is not null ';
第二篇:开发总结
西博会总结
一. 提倡的地方
1. 数据方面:
利用Toad Data Modeler来设计数据模型;能够非常清晰方便的了解整个系统表和表之间的关系。
整个项目的过程中,一直安排一个人来维护数据库和数据库模型。2.开发方面:
在项目周期相对比较短的情况下,可以分版本开发,每个版本完成一部分功能。我觉得这种方式值得提倡。
二. 改进的地方:
1.数据库方面:
西博会系统设计的最初,所有表的主键都是由数据的序列自动产生的。开发工程中,程序员之间并没有完全按照数据模型中的序列名来生成表的主键,导致了一个表有多个序列来生成主键,从而产生了数据库主键唯一的冲突。2.开发方面:
西博会整个系统大部分都是前台的工作,尤其像表单。每提交一份表单就得在前台写一套验证规则,这样重复性的工作很大。可以考虑将一些公共的验证规则在项目开始之初就提取出来,这样可以减少很大一部分工作,而且也便于后期维护。
第三篇:开发轮岗总结
开发部轮岗总结
到公司报到的第一天,知道了自己的轮岗安排,第一个月在开发部,第二个月在销售策划部,是专业类轮岗安排。
上班的第一天,我主动请求周总安排我在开发部轮岗期间的工作任务。知道我是新人,对开发部的业务还未了解,周总先耐心地给我讲解相关业务流程,接着帮我细分为6个步骤进行学习。主线是“看资料熟悉流程”,“六步走”分别是:①项目概况,要对富力城这个项目有大致的了解,只有知道项目情况后,才能制定开发报建计划,才能更好展开工作;②开发项目建设计划,就是时间计划,每个在建项目都有时间控制节点,清楚各个时间节点,有利于开发报建工作的展开和顺利完成;③开发报建大流程,我们知道开发需办五大证:国有土地使用证、建设用地规划许可证、建设工程规划许可证、建设工程施工许可证、商品预售许可证,开发主要分规划类和市政类,报建的工作会结合工程进度要求、销售进度要求;④办事流程,这是一份“秘籍”,周总在20年从事开发工作经验的基础上整理出来的一份办事指引,里面详细介绍了给规划、市政专业类报建工作介入的时间节点,报建审批需提交的资料以及大体上的办事流程;⑤综合管网和市政台帐,综合管网是各类管线综合图,包括给水管线、排水管线、燃气管线、雨水管线等,搞市政开发要学会看综合管网图,市政台帐是便携式工作计划表,能够清晰的显示近期的工作安排以及 相关工作的完成情况;⑥个人工作节点,在熟悉开发部的工作内容之后,结合个人办事能力和习惯,学会制作自己的工作台帐,结合工程进度要求,倒排工作计划。
根据周总给出的工作安排指引,同时也结合专业类轮岗任务书,我制定出了轮岗学习阶段性的工作计划,概括了自己在开发部轮岗一个月需要完成的“工作任务”,第一个月的轮岗学习就围绕这个工作计划展开。制订月度总控计划后,新的问题又出来了,要如何落实到每一周每一天呢?这个时候,公司的一个制度——周报便派上用场了,周报即总结了上一周工作任务的完成情况,又对下一周工作任务做出更为细致的安排。所以在月工作计划的大框架下又制定了周报,将这一个月的学习任务合理地、可行地安排到每一周去,通过合理地制定计划,自己就可以更好的把握第一个月的学习任务进度和完成情况。工作计划制订了之后,要做的就是按照计划去执行。第一个星期,我给自己定的目标是用一周的时间,采用前面说到的“六步走”策略,从整体上去了解熟悉开发部的相关工作,由开始的项目概况到专业报建工作都要去学习的。一个星期下来,总的感觉就是累而充实,这里所说的累不是指上班很辛苦、身体很劳累,而是指大脑的疲劳。在学习的过程中,可以发现开发部的工作事项是很多的,一个项目从头到尾,我们需要办证、报建、验收等等,而且有些工作还是很繁琐的,非常考验耐性。前辈们总结以往工作经验整理出来的资料有厚厚的几百页纸,作为“插班生”的我首要任务就是仔细阅读这些文案资料,只有了解了这个班集体,认真学习班集体的各项工作内容,知道我们的工作有几个业务模块、每个业务模块的具体工作内容是什么之后,才能更好地融入到这个集体中去。
通过第一个星期的学习,对开发部的工作有大概的了解。为此,在查看资料之余,有时也作为学习人员跟着部门前辈外出办事,在实践的过程中体验开发报建。通过这种实践性的学习,可以给自己反馈出很多问题,带给自己一些思考。最直接的就是一堆资料看完之后自己消化了多少,体现出对业务的真正了解程度。另外,在外出办事的过程中,前辈会跟我交流很多,传授他们自己的工作经验和感悟。我不是一个擅长交谈的人,但在有限的交流中也学到了很多,在公司上班与在学校读书是有很大区别的,工作也会有不顺心的事,但不能像在学校那样不顺心了就可以什么不做、不顺心了就不理会其他人,我们在思想上不能再有以前学生时代那种“坏”想法了,要有一个好的心态。作为一个新人,更多得应该展现出自己独特的优点,不要过早的“沦陷”在社会的大熔炉中,给公司注入真正意义上的新鲜血液。前辈的经验感悟,值得新人学习的道理还有很多,这里不一一赘述了,说多了反而成为空谈。
举个例子说,之前现场参与了市政DN400管接驳工程施工验收,是由我通知工程部的范工,简单的小事也能体现办事技巧和学问,通知的语言表达的条理性及合理性都是自己应该考虑的问题。还有一次是跟着去住建局开会,诚实地说整个会议下来没听懂多少,没有抓住讨论的核心问题,这就说明自己对业务仍不够熟悉,对报建的工作进度没有一个整体上的把握。反思过后,清楚地知道自己还有很多东西要去学习,事多事难不足惧,关键是要知道如何开始着手去做。但同时也必须告诫自己,不能盲目,做事不能操之过急,自己先主动思考,找到问题再主动快速出击。我想这也就是杰哥告诉我的:心态要慢,动作要快的吧。
细节决定成败。8月12日,第一次参加部门例会,此次会议主要是对前期工作中遇到并存在的问题予于解决,以及对后续工作进行合理安排。这次的会议纪要是由我这个菜鸟来整理,后来周总夸我会议纪要做得好,可功劳不是我一个人的。在提交给周总之前我请教前辈们很多次,他们提出了很多很好的修改意见。直到我呈报给周总,还是存在不少问题,也提出了一些修改意见,这足以说明周总的要求是多么严格,语言表达的准确性,文字、文本格式,标点符号等等都必须追求标准化。这些就是细节,就是简单的一次会议纪要整理,细细的思考,可以发现有很多值得学习。很明显的,你可以学到如何去做会议纪要,对文字性的东西要对自己提出怎样的要求才是高标准,更为重要的是,可以从中体会工作的态度——细致,曾经的一位老师说过,将平凡的事做到极致就是伟大,对于这点自己还远远达不到要求。
一个月的时间太短,时间又总是过的太快,开发部的轮岗学习步入尾声,回顾之前制作的轮岗学习工作计划表,这一个月就是紧紧围绕它展开学习开发报建的业务知识,相对来说对部门工作有了比较全面的了解。从表中可以看出,除了针对部门的学习任务之外,也安排了其他的学习任务,我认为在很多方面自己都需要去学习、去了解的,刚步入职场,先把自己掏空,才能学到更多。同时在这里也对工作任务表做个简单说明,工作事项中红色标记部分,是我认为自己在本阶段完成比较差的,而在完成时间一栏,我认为黄色标记部分是分阶段持续学习的,在下阶段的轮岗中仍须继续完成。
总结这个月的学习,给自己打分是75分,首先必须肯定自己是有表现好地方,但自己还是不够积极主动,没有发挥个人最大的主观能动性,我觉得用周总的话来说就是如何克服客家人理念上的保守,有时候顾虑过多。我没有参与到部门后两次例会就很能说明问题,有一次是因为我不知道,暂且不去讨论,但8月25日开部门例会自己是知道的,明明听到了周总说待会开例会,仅仅是没有点名让我去参与,难道就因为这样不参与了么?自己的迟疑,自己的犹豫不决,顾虑自己是否合适主动参与,就这样与两次例会擦肩而过,与学习的机会擦肩而过,也就是因为自己的优柔寡断将自己孤立、让自己成为边缘人。那一天自己一直在反思,思考如何更好地融入团队中去,成为其中的一员,思考如何将在集团培训时所认知的团队意识运用到自己的工作中去。
最后,真的很感谢开发部的每一位,在这一个月的轮岗学习期间主动、耐心地指导我学习开发报建的业务知识,以及对我这个“插班生”诸多错误的包容。我觉得自己就是这美丽世界的幸运儿,刚从学校走出来,就可以在这样的一个部门跟着前辈们学习,更幸运的是遇到周总这样的领导,跟周总的每一次交流都能学到很多,无论是在业务知识,还是工作态度上,以及做人做事的人生道理,概括来说这个月能从周总那带走几句话就能收益良多了:
1、敬业,踏实的工作,做事有头有尾。
2、公德心,学会感恩。
3、细节注定成败,做事细致,目的要明确。
4、做事应追求“守正出奇,惠人达己”。
5、在工作中克服客家人理念上的保守。
摆脱平庸的标准,才能成为真正的精英。
第四篇:NET 开发总结
.NET 开发总结
Web窗体的简单说明:
这次作业都有一个共同点就是连接数据库,对数据连接函数不是很熟悉,弄了好久,最后还是请教同学才实现数据库的连接,连接代码如下图:
数据库连接完成后,开始进行数据的整体的查询,将查询到的数据转换成参数,利用参数进行分页,将数据显示在web上去。
对于分页,我是按照每页显示是个数据来显示的,本来还打算弄一个下拉窗口,当窗口下拉式可以选择多少个数据分页显示,这一部分的功能还没来得及去实现。
分页的部分代码
对于web 的查询功能,用的是模糊查询,代码如图
本次的.net开发技术作业,我选择做webForm的分页,之前一直没有写过web的代码,只自学过一点脚本语言,对C#也不太了解,所以当做起来的时候比较困难,自己上网找了不少资料,到图书馆借了一些关于asp.net web开发的书,对C#开发的平台还不是很熟悉,当程序调试起来非常困难,经常因为小问题而浪费许多的时间,开发过程中请教过一些有过web开发经验的同学,也有帮助我进行程序的调试。由于不熟悉浪费了许多时间,没有对代码没有时间去整理,使得代码看起来很凌乱,很累赘,看起来显得麻烦,还是一些功能还没有实现,像查询后的数据进行分页,以及数据的修改和删除。
第五篇:ONVIF开发总结
ONVIF开发经验总结
ONVIF开发经验总结.......................................................................................................................1
一、利用gsoap2.8.14生成Onvif相关源代码...........................................................................2
1.生成onvif.h头文件的方法.............................................................................................2
1)wsdl2h相关命令参数..............................................................................................2 2)链接网络生成...........................................................................................................2 3)下载到本地生成.......................................................................................................2 4)备注说明...................................................................................................................2 2.生成onvif源代码............................................................................................................3
1)整理相关的文件.......................................................................................................3 2)通过以下命令生成相关源文件...............................................................................3 3)Soapcpp2相关命令参数..........................................................................................3 4)备注说明...................................................................................................................3 3.利用gsoap2.8.8生成源代码和gsoap2.8.14生成的差异.............................................3
1)typemap.dat文件中需要添加相关信息................................................................3 2)wsa5.h中无 SOAP_ENV__Fault函数.....................................................................4
二、新建工程,调试代码.................................................................................................................4
三、设备发现main函数说明........................................................................................................5
四、遇到的问题和注意事项...........................................................................................................7
五、经验总结................................................................................................................................15
一、利用gsoap2.8.14生成Onvif相关源代码
1.生成onvif.h头文件的方法
产生头文件有两种方法:链接网络生成和本地生成。1)wsdl2h相关命令参数
-c
产生c语言的代码,否则产生C++
-s
不使用STL代码
-t
指定typemap.dat文件
-o
指定生成的头文件名
2)链接网络生成
将wsdl2.exe和typemap.dat文件放入同一个文件夹 利用cmd或批处理执行以下dos命令: wsdl2h.exe-c-s-t typemap.dat-o onvif.h
http://www.xiexiebang.com/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.xiexiebang.com/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.xiexiebang.com/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.xiexiebang.com/onvif/ver10/analyticsdevice.wsdl http://www.xiexiebang.com/onvif/ver10/media/wsdl/media.wsdl http://www.xiexiebang.com/onvif/ver10/deviceio.wsdl http://www.xiexiebang.com/onvif/ver10/display.wsdl http://www.xiexiebang.com/onvif/ver10/event/wsdl/event.wsdl http://www.xiexiebang.com/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.xiexiebang.com/onvif/ver10/recording.wsdl http://www.xiexiebang.com/onvif/ver10/replay.wsdl http://www.xiexiebang.com/onvif/ver10/search.wsdl http://www.xiexiebang.com/onvif/ver10/receiver.wsdl http://www.xiexiebang.com/onvif/ver20/ptz/wsdl/ptz.wsdl 3)下载到本地生成
从ONVIF官网上把相关的WSDL文档下载到本地,下载地址(详细参见备注说明),此外还需下载样式表,下载地址见WSDL文档中的schemaLocation。
将wsdl2.exe、typemap.dath、WSDL文档和样式表放入同一文件夹中。
将相关WSDL文档中的样式表引入路径(schemaLocation)修改为本地实际地址,如:event.wsdl中schemaLocation=“http://www.xiexiebang.com/2005/08/addressing/ws-addr.xsd修改为schemaLocation = ws-addr.xsd 利用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.wsdl 4)备注说明
wsdl2.exe位于gsoap_2.8.14gsoap-2.8gsoapbin typemap.dat位于gsoap_2.8.14gsoap-2.8gsoap
wsdl下载地址:http://www.xiexiebang.com/Documents/Specifications.aspx 各url之间用空格隔开 typemap.dat不需要修改
链接网络生成方法的优点是不用考虑以上文件对其它文件的依赖关系,不用修改引 入路径。该方法的缺点跟网速有关,因此中途可能会中断,如果超过5分钟未生成,可重新执行命令, 通过代理上网则无法生成,不推荐用此方法。
下载本地生成方法的优缺点和链接网络方法生成相反,代理网推荐使用此方法。2.生成onvif源代码 1)整理相关的文件
把刚生成的onvif.h与soapcpp2.exe、import和custom放入同一文件夹,其中: soapcpp2.exe位于gsoap_2.8.14gsoap-2.8gsoapbin import位于gsoap_2.8.14gsoap-2.8gsoap custom位于gsoap_2.8.14gsoap-2.8gsoap 2)通过以下命令生成相关源文件
soapcpp2.exe-2 –c onvif.h-I import 3)Soapcpp2相关命令参数-2 采用SOAP1.2,-x 不产生xml文件(不推荐使用此命令,因为xml文档很有用)-I 为引入路径
-C 只产生客户端代码(注意:C是大写)4)备注说明
需要在onvif.h中加入#import ”wsse.h,用来做安全验证
需要将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 = “http://www.xiexiebang.com/ver10/device/wsdl” tev = “http://www.xiexiebang.com/ver10/events/wsdl” tls = “http://www.xiexiebang.com/ver10/display/wsdl” tmd = “http://www.xiexiebang.com/ver10/deviceIO/wsdl” timg = “http://www.xiexiebang.com/ver20/imaging/wsdl” trt = “http://www.xiexiebang.com/ver10/media/wsdl” tptz = “http://www.xiexiebang.com/ver20/ptz/wsdl” trv = “http://www.xiexiebang.com/ver10/receiver/wsdl” trc = “http://www.xiexiebang.com/ver10/recording/wsdl” tse = “http://www.xiexiebang.com/ver10/search/wsdl” trp = “http://www.xiexiebang.com/ver10/replay/wsdl” tan = “http://www.xiexiebang.com/ver20/analytics/wsdl” tad = “http://www.xiexiebang.com/ver10/analyticsdevice/wsdl” tdn = “http://www.xiexiebang.com/ver10/network/wsdl” tt = “http://www.xiexiebang.com/ver10/schema”
# OASIS recommended prefixes wsnt = “http://docs.oasis-open.org/wsn/b-2” wsntw = “http://docs.oasis-open.org/wsn/bw-2” wsrfbf = “http://docs.oasis-open.org/wsrf/bf-2” wsrfr = “http://docs.oasis-open.org/wsrf/r-2” wsrfrw = “http://docs.oasis-open.org/wsrf/rw-2” wstop = “http://docs.oasis-open.org/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 library stdsoap2.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 sources soapC.c
//Serializers and deserializers for the specfied data structures soapClient.c
//Client stub routines for remote operations
soapStub.h
A modi_ed and annotated header file produced from the input header file
三、设备发现main函数说明
#include
struct soap *soap;//soap环境变量 struct wsdd__ProbeType req;//客户端发送的Probe struct __wsdd__ProbeMatches resp;//服务端回的Probematchs struct 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 buf[64] = {0};//用来保存guid号
GUID guid;/*声明guid为GUID结构体变量,包含4个变量,分别是 unsigned longData1;unsigned short Data2;unsigned short Data3;unsigned char Data4[ 8 ];{ _snprintf(buf,sizeof(buf), “urn:uuid:%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X” , guid.Data1 , guid.Data2 , guid.Data3 , guid.Data4[0], guid.Data4[1] */ if(S_OK == CoCreateGuid(&guid))//如果guid生成成功,则将其转为字符串,保存在buf中 , guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5] , guid.Data4[6], guid.Data4[7]);} soap = soap_new();//初始化soap
if(soap==NULL){ }
//设置接收Probematchs时间,超过5秒钟没有数据就退出 return-1;soap_set_namespaces(soap, namespaces);//设置命名空间
soap->recv_timeout = 5;/*****给头赋值******/
header.wsa__MessageID = buf;header.wsa__To= “urn:schemas-xmlsoap-org:ws:2005:04:discovery”;header.wsa__Action= “http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe”;soap->header = &header;/*设置所需寻找设备的类型和范围,二者至少设定一个,否则可能收到非ONVIF设备,出现异常*/ soap_default_wsdd__ScopesType(soap, &sScope);sScope.__item = “onvif://www.xiexiebang.com”;//设置所需设备的sScope soap_default_wsdd__ProbeType(soap, &req);req.Scopes = &sScope;req.Types = “tdn:NetworkVideoTransmitter”;/*设置所需设备的类型,tdn
为命名空间前缀,为
wsdd.nsmap
文件中soap_default_SOAP_ENV__Header(soap, &header);//将header设置为soap消息的头属性
{“tdn”,“http://www.xiexiebang.com/ver10/network/wsdl”}的tdn,如过不是tdn,而是其它,如ns1这里也要随之改为ns1*/
//通过组播发送Probe探针,发送成功返回0,否则-1 result = soap_send___wsdd__Probe(soap, “soap.udp://239.255.255.250:3702”, NULL, &req);if(result==-1){
cout<<“soap error:”< result = soap_recv___wsdd__ProbeMatches(soap, &resp);if(result==-1){ cout<<“共发现”< //接收ProbeMatches,成功返回0,否则-1 }else { count++; cout<<“UUID:”<<“ ”< cout<<“Type:”<<“ ”< } cout<<“Scopes:”<<“ ”<< resp.wsdd__ProbeMatches-> ProbeMatch->Scopes->__item< ProbeMatch->XAddrs< cout<<“Device Service Address:”<<“ ”< }while(1);/********清除变量************/ soap_destroy(soap);// remove deserialized class instances(C++ only)soap_end(soap);soap_done(soap);return result; // clean up and remove deserialized data 四、调试过程遇到的问题和注意事项 1.出现如下语法错误: error C2143: 语法错误 : 缺少“{”(在“:”的前面)error C2059: 语法错误 : “:” error C2143: 语法错误 : 缺少“{”(在“:”的前面)需要将工程中的.c文件改成.cpp文件即可。 2.无法解析的外部命令错误soap_check_faultsubcode 在stdsoap2.h中声明的soap_check_faultsubcode(struct 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->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文件中http://www.xiexiebang.com/ver10/network/wsdl“所对应的命名空间前缀,YYYY与后面YYYY:ProbeMatchesType中的前缀相同,都是http://schemas.xmlsoap.org/ws/2005/04/discovery所对应的命名空间前缀名。 7.抓包实验问题 利用gsoap生成的wsdd.namsp如下: #include ”soapH.h“ SOAP_NMAC struct Namespace namespaces[] = { {”SOAP-ENV“, ”http://schemas.xmlsoap.org/soap/envelope/“, ”http://www.xiexiebang.com/*/soap-envelope“, NULL}, {”SOAP-ENC“, ”http://schemas.xmlsoap.org/soap/encoding/“, ”http://www.xiexiebang.com/*/soap-encoding“, NULL}, {”xsi“, ”http://www.xiexiebang.com/2001/XMLSchema-instance“, ”http://www.xiexiebang.com/*/XMLSchema-instance“, NULL}, {”xsd“, ”http://www.xiexiebang.com/2001/XMLSchema“, ”http://www.xiexiebang.com/*/XMLSchema“, NULL}, {”wsa“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL, NULL}, {”wsdd“, ”http://schemas.xmlsoap.org/ws/2005/04/discovery“, NULL, NULL}, {”chan“, ”http://schemas.microsoft.com/ws/2005/02/duplex“, NULL, NULL}, {”wsa5“, ”http://www.xiexiebang.com/2005/08/addressing“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL}, {”xmime“, ”http://tempuri.org/xmime.xsd“, NULL, NULL}, {”xop“, ”http://www.xiexiebang.com/2004/08/xop/include“, NULL, NULL}, {”tt“, ”http://www.xiexiebang.com/ver10/schema“, NULL, NULL}, {”wsrfbf“, ”http://docs.oasis-open.org/wsrf/bf-2“, NULL, NULL}, {”wstop“, ”http://docs.oasis-open.org/wsn/t-1“, NULL, NULL}, {”wsrfr“, ”http://docs.oasis-open.org/wsrf/r-2“, NULL, NULL}, {”tad“, ”http://www.xiexiebang.com/ver10/analyticsdevice/wsdl“, NULL, NULL}, {”tan“, ”http://www.xiexiebang.com/ver20/analytics/wsdl“, NULL, NULL}, {”tdn“, ”http://www.xiexiebang.com/ver10/network/wsdl“, NULL, NULL}, {”tds“, ”http://www.xiexiebang.com/ver10/device/wsdl“, NULL, NULL}, {”tev“, ”http://www.xiexiebang.com/ver10/events/wsdl“, NULL, NULL}, {”wsnt“, ”http://docs.oasis-open.org/wsn/b-2“, NULL, NULL}, {”timg“, ”http://www.xiexiebang.com/ver20/imaging/wsdl“, NULL, NULL}, {”tls“, ”http://www.xiexiebang.com/ver10/display/wsdl“, NULL, NULL}, {”tmd“, ”http://www.xiexiebang.com/ver10/deviceIO/wsdl“, NULL, NULL}, {”tptz“, ”http://www.xiexiebang.com/ver20/ptz/wsdl“, NULL, NULL}, {”trc“, ”http://www.xiexiebang.com/ver10/recording/wsdl“, NULL, NULL}, {”trp“, ”http://www.xiexiebang.com/ver10/replay/wsdl“, NULL, NULL}, {”trt“, ”http://www.xiexiebang.com/ver10/media/wsdl“, NULL, NULL}, {”trv“, ”http://www.xiexiebang.com/ver10/receiver/wsdl“, NULL, NULL}, {”tse“, ”http://www.xiexiebang.com/ver10/search/wsdl“, NULL, NULL}, {NULL, NULL, NULL, NULL} }; 1)通过编写面函数之后,调试运行结果如下: 其中http://192.168.106.112:80/onvif/device_service为本地模拟的设备 通过抓包工具获得信息如下: 2).保留以下命名空间,删除其它信息: #include ”soapH.h“ SOAP_NMAC struct Namespace namespaces[] = { {”SOAP-ENV“, ”http://schemas.xmlsoap.org/soap/envelope/“, ”http://www.xiexiebang.com/*/soap-envelope“, NULL}, {”SOAP-ENC“, ”http://schemas.xmlsoap.org/soap/encoding/“, ”http://www.xiexiebang.com/*/soap-encoding“, NULL}, {”xsi“, ”http://www.xiexiebang.com/2001/XMLSchema-instance“, ”http://www.xiexiebang.com/*/XMLSchema-instance“, NULL}, {”xsd“, ”http://www.xiexiebang.com/2001/XMLSchema“, ”http://www.xiexiebang.com/*/XMLSchema“, NULL}, {”wsa“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL, NULL}, {”wsdd“, ”http://schemas.xmlsoap.org/ws/2005/04/discovery“, NULL, NULL}, {”wsa5“,”http://www.xiexiebang.com/2005/08/addressing“, ”http://schemas.xmlsoap.org/ws/2004/08/addressing“, NULL}, {”xmime“, ”http://tempuri.org/xmime.xsd“, NULL, NULL}, {”xop“, ”http://www.xiexiebang.com/2004/08/xop/include“, NULL, NULL}, {”tt“, ”http://www.xiexiebang.com/ver10/schema", NULL, NULL}, {NULL, NULL, NULL, NULL} };调试运行结果如下: 抓包工具抓到信息如下: 3)测试工具信息如下 抓包信息如下: 4)多次实验显示: wsdd.namsp文件太大时,将会被拆包,192.168.106.164将始终不会回消息,减小命名空间大小,保证只发送一个UDP包,192.168.106.164将始终能回消息 5)通过抓包发现,做设备管理功能时客户端已能构与设备端通信,只是涉及到安全,设备端没有返回信息 6)在程序运行时,可能会出现一下信息 这是由于Type和Scopes都没有赋值,接收了非ONVIF的设备 它的body中没有我们需要的值,所以在输出时会引起中断 五、经验总结 1.对于利用gsoap工具实现基于ONVIF标准的功能,尽量按照如下顺序: 了解所需实现的功能原理,参考< 根据所需实现的功能查看对应的xml文档(生成源代码时产生的,)因为生成的xml文档是客户端和服务端通信时所发送的模板结构,通过它可以了解编码时所需要填充的信息 了解工程中.h和.cpp的功能 查看别人写的例子,理解原理,要学会从原理上去分析碰到的问题并解决问题 自己写代码验证,事实求是,替自己负责,替用户负责。 2.善于利用抓包工具 从原理上分析问题,能大大提高效率,如果利用测试工具跟客户端通信,然后进行抓包,能构很好的分析出客户端需发送的消息,服务端回的消息,非常利于编码。