剪裁Onvif:减小soapC.cpp文件的大小(一)

背景介绍:

1、本人是目前在公司是负责产品中安防设备接入的,Onvif和GB28181均是客户端,不用做服务器,所以关于服务器的细节不是很了解;
2、去年根据需求完成了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,若无需要不要给自己找麻烦,后面维护人会感谢你一辈子的!


参考资料:
1、WSDL : 描述你的Web服务;

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值