背景介绍:
去年根据需求完成了Onvif设备的接入,但不灵活和健壮,且so文件很大(Debug版本有18M,说到都是泪),所以剪裁Onvif的计划早已规划,今年产品系统重构刚好逮着机会试着剪裁Onvif。上一周花了三天时间终于完成了这一目标,首先得感谢Q群
167113262的群主拥军大哥,和群里其他经常发言朋友们的指导和帮助!也欢迎其他做Onvif相关的朋友加入~
下面开始介绍如何剪裁onvif~
一 、WSDL文件和gsoap工具
一般情况下,多数朋友根据Onvif官网提供的WSDL文件,并结合gsoap工具来生成开发文件,大致流程如下:
那WSDL(Web Services Description Language)是什么呢?这里有一个文件示例:
calc.wsdl,如果看不太懂那就看看
WSDL : 描述你的Web服务。
gsoap工具的简单介绍:gSOAP的使用。
二 、剪裁Onvif
以前刚开始做Onvif的时候,觉得这破玩意太麻烦,框架大且涉及到的内容太多,还不如国内设备厂商写的SDK简单直接,不过自从我这次稍微深入的了解其工作原理之后才发现Onvif工作组人员考虑得太有远见了,Onvif框架是十分灵活方便的。希望你成功剪裁Onvif之后也有很大的收获~~~
1、处理wsdl文件
Onvif的WSDL文件有10来个,每个文件单独一个主功能,所以我这里以最简单的
ptz.wsdl为例,其他的可以以此类推。如果现在对wsdl文件还没印象,建议点击上文的链接多看看噢,这样方便后面理解。
WSDL 文档在Web服务的定义中使用下列元素:
- Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
- Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
- Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
- PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
- Binding - 特定端口类型的具体协议和数据格式规范的绑定。
- Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
- Service - 相关服务访问点的集合。
WSDL元素的对象结构示意图:
我贴出ptz.wsdl文件里的内容方便进一步理解:(注:这是已被我剪裁之后的内容,原始ptz.wsdl内容很多不方便全面的贴出)
文件里的内容就是WSDL规范的那几个元素,对吧?那现在你明白如何剪裁Onvif了吧?就简单的一句话:把wsdl文件里定义的,但自己开发过程中使用不到的元素信息去掉。建议剪裁时注重统一性,例如去掉Stop,那就要把文中关于Stop的全部去掉,这样wsdl2h.exe和soapcpp2.exe就不会提示warning和error。
那下面贴出生成的生成开发文件效果:
技巧:由于wsdl文件内容较多,建议过程中尽量细心些,且边剪裁边使用wsdl2h.exe和soapcpp2.exe,观察生成过程的提示信息。另建议借助git仓库哟!!!哪一步改错了reset即可,不用手动去备份的。
2、处理onvif.xsd文件
也许你已经发现了,即使成功剪裁wsdl文件,生成的函数接口减少了但soapC.cpp并没有减小很多,因为还没剪裁onvif.xsd文件。
观察wsdl2h.exe生成的onvif.h文件,里面基本全是结构体与类,wsdl文件里并没有看到这些定义啊?对,这些定义全部来自onvif.xsd文件,打开它看看吧!
注意,”Generic Types“——通用类型!其实onvif.xsd也是wsdl文件内容吧?
另外,你向下会慢慢发现通篇都是类似的,同时还注意到了”End, Generic Types“。对,它表明通用类型定义完毕。后面每个定义范围都是如此,”Begin,XXX“开始,”End,XXX“结束。onvif工程组把onvif分成几个wsdl文件,同样xsd文件内部也是。你搜索”PTZ Related Types“试试!?
开始剪裁onvif.xsd了,方法和上面的类似,记得同样借助git仓库哟!同时要用wsdl2h.exe和soapcpp2.exe来辅助。
附上我剪裁之后的几个wsdl:剪裁onvif之后的wsdl文件示例
三 、结束语
1、也许有朋友会问,如果按照这种方法剪裁了onvif,后面如果要恢复onvi被剪裁f的功能那不是很麻烦?
答:当然很麻烦,所以剪裁前要询问经理你们在Onvif上要实现哪些功能。另外建议在剪裁过程中做好文档记录。
2、如果对生成的Onvif的so大小无强行要求,可以不剪裁吗?
答:肯定可以不用的。如果你没有强迫症,那剪裁只会增加你的额外工作,这会利人利己的。
3、剪裁过程中老是失败了怎么办?
答:请参见问题2,若无需要不要给自己找麻烦,后面维护人会感谢你一辈子的!
from: http://blog.csdn.net/stelalala/article/details/20837215