soapC.c裁减方法

背景介绍:

去年根据需求完成了Onvif设备的接入,但不灵活和健壮,且so文件很大(Debug版本有18M,说到都是泪),所以剪裁Onvif的计划早已规划,今年产品系统重构刚好逮着机会试着剪裁Onvif。上一周花了三天时间终于完成了这一目标,首先得感谢Q群 167113262的群主拥军大哥,和群里其他经常发言朋友们的指导和帮助!也欢迎其他做Onvif相关的朋友加入~


下面开始介绍如何剪裁onvif~

一 、WSDL文件和gsoap工具

         一般情况下,多数朋友根据Onvif官网提供的WSDL文件,并结合gsoap工具来生成开发文件,大致流程如下:
soapC.c裁减方法_第1张图片
        那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元素的对象结构示意图:
soapC.c裁减方法_第2张图片
        我贴出ptz.wsdl文件里的内容方便进一步理解:(注:这是已被我剪裁之后的内容,原始ptz.wsdl内容很多不方便全面的贴出)
soapC.c裁减方法_第3张图片soapC.c裁减方法_第4张图片
        文件里的内容就是WSDL规范的那几个元素,对吧?那现在你明白如何剪裁Onvif了吧?就简单的一句话:把wsdl文件里定义的,但自己开发过程中使用不到的元素信息去掉。建议剪裁时注重统一性,例如去掉Stop,那就要把文中关于Stop的全部去掉,这样wsdl2h.exe和soapcpp2.exe就不会提示warning和error。
        那下面贴出生成的生成开发文件效果:
soapC.c裁减方法_第5张图片soapC.c裁减方法_第6张图片

        技巧:由于wsdl文件内容较多,建议过程中尽量细心些,且边剪裁边使用wsdl2h.exe和soapcpp2.exe,观察生成过程的提示信息。另建议借助git仓库哟!!!哪一步改错了reset即可,不用手动去备份的。

2、处理onvif.xsd文件

        也许你已经发现了,即使成功剪裁wsdl文件,生成的函数接口减少了但soapC.cpp并没有减小很多,因为还没剪裁onvif.xsd文件。
        观察wsdl2h.exe生成的onvif.h文件,里面基本全是结构体与类,wsdl文件里并没有看到这些定义啊?对,这些定义全部来自onvif.xsd文件,打开它看看吧!
soapC.c裁减方法_第7张图片

        注意,”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

你可能感兴趣的:(soapC.c裁减方法)