调测Onvif事件总结解决办法
主要在调测事件用例的过程中,发现了大量的信息,和未曾碰到的场景和非法错误等信息,先总结解决办法如下:
(1)测试过程中发现以前的一个难题解决了,原先在生成soap空间命名的文件中有部分需要下载,离线生成则失败,不能打开文件。其实在生成过程中wsdl增加了导入命名空间的机制,要指定本地离线文件路径即可。但有个注意的地方是,相同扩展名的文件居然可以自动推导,不用加相对路径,增加反而出错。
(2)熟读typemap.dat定义自生成的文件,发现xsd:duration类型文件放开的是类型LONG64,这样导致测试用例时发现client发送的实际时string类型,根本走不通,所以需要屏蔽该类型定义,同时删除duration.c的编译,就会恢复string类型的处理。
(3)事件服务功能接口有基本订阅和拉点订阅,还有暂停订阅等管理,这些接口存在相互重合的地方,只能保留一个,否则订阅请求过来,几个服务都会接收并处理,这样就会有多条相应消息回复给客户端,那么客户端会直接报错。
(4)Gsoap生成的框架比较死,不能直接使用,需要修改,比如所有客户端的请求消息都是放在header中以request的路径出现,但是框架响应的时候原封不动返回request,实际上是需要返回Response,否则客户端会报错。自己封装一个共同接口实现修改返回响应去处理。
(5)旧版和新版onvif协议变化很大,有些定义的命名空间网上搜索url都是空白,已经不用了,所以根本通不过,自己追踪查找才发现挪到另外的命名空间地址中了,有的已经合并成新的地址空间,需要去寻找才能对应上,没有可一目了然的地方,需要仔细查找,比较耗时。
(6)Onvif里面处理的基本都是utc+0的时间,所以不能直接当本地时间处理,但是设备的time时间系统函数中缺少mkgmtime的接口,无法直接转换iso8601的utc时间,所以自己封装了个接口单独处理utc时间的转换,比较奏效。
(7)topic命名空间找不到,无法添加到soap namespace中。
实在添加不上名字空间,不过找到了一些信息,就是gsoap名字空间有不一样的,有的维护多张映射表nsmap,然后动态选择某个名字空间表,为了避免一张表过大,然后也是有动态获取某个名字空间来set名字空间的,和张俊商讨后采用此方法,追加error和topic的名字空间函数放到ServiceContext中作为接口,需要的地方直接ctx->patch_ns加上,结果测试成功。其实客户端也不可能打开每个名字空间地址去爬虫一样搜索有没有那个信息,也只是验证名字前缀是否包含在xmlns当中,但这只是想想,后来在w3c协议文档中看到有三个参数设定,就是strict,lax和skip,客户端针对不同类型会做判别。
(8)如果拉点订阅中带有如下信息:
<tev:SubscriptionReference xmlns:tev="http://www.onvif.org/ver10/events/wsdl">
<wsa5:Address xmlns:wsa5="http://www.w3.org/2005/08/addressing">http://192.168.5.106:80/onvif/eventing_service?id=urn:uuid:834c5a9a-b936-7965-07d4-8c37214e9c62</wsa5:Address> <wsa5:ReferenceParameters xmlns:wsa5="http://www.w3.org/2005/08/addressing">
<SubscriptionId xmlns="urn:schemas-pelco-com:ws:addressing:1">urn:uuid:834c5a9a-b936-7965-07d4-8c37214e9c62</SubscriptionId>
</wsa5:ReferenceParameters>
</tev:SubscriptionReference>
请记住每个供应商都不一样,所以,需要pullmessage是放到header中,如果有security的认证信息,情报站security信息在header的最后,同时address放到action中,referenceparameters中的subscriptionid直接放到header中。
(9)创建拉点订阅的终止时间响应,到点没有进一步拉取将结束拉点;拉取消息的终止时间一致;拉取支持至少一分钟的超时等待,没有返回空msg,有就返回。单进程单线程处理会阻塞,而拉取消息特殊有个超时等待的过程,很显然不能阻挡其他消息处理,所以单独处理创建线程去处理,现在这种线程处理方式有弊端,虽然创建处理完消息后会释放退出,但是动态创建过多线程本身也是一种资源消耗,目前先实现功能,日后可以优化,比如单线程处理队列方式等。
调测Onvif事件总结解决办法的更多相关文章
- FileSystemWatcher触发多次Change事件的解决办法 .
最近要用到FileSystemWatcher来监控某个目录中的文件是否发生改变,如果改变就执行相应的操作.但在开发过程中,发现FileSystemWatcher在文件创建或修改后,会触发多个Creat ...
- append()方法生成的元素绑定的事件失效解决办法
我使用append()方法动态生成的a链接的click事件没有起效果,查找了资料,了解到,我使用的onclick方法绑定的事件对动态生成的元素是无效的,解决办法如下: 使用事件委托,并且要用on来绑定 ...
- 关于UIScrollView不能响应UITouch事件的解决办法
原因是:UIView的touch事件被UIScrollView捕获了. 解决办法:让UIScrollView将事件传递过去.于是最简单的解决办法就是加一个UIScrollView的category.这 ...
- input输入框file类型第二次不触发onchange事件的解决办法,简单有效
在网上看了很多办法,现在将网上大部分说法总结如下: 网上说法: 原因:选择一次后onchange事件没有绑定到input标签上: 解决办法:拷贝一份input标签的副本,每次选择后对原input ...
- ToolStrip控件在窗体没有焦点的情况下,需要单击二次才能够激发事件的解决办法
protected override void WndProc(ref Message m) { if (m.Msg == 0x210) { Control control = Control.Fro ...
- img的onerror事件(瑕疵+解决办法)【转】
显示图片的时候,为了更好的用户体验,可能会把一些没有图片的内容也用图片样式显示出来,此时我们就要用到IMG的onerror事件了,注意MyEclipse的快捷键alt+/是没有的. < img ...
- Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法
本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...
- mysql事件关闭解决办法
Mysql 事件event_scheduler是OFF 开启 Event Scheduler,以下4种方式等效 SET GLOBAL event_scheduler = ON; SET @@globa ...
- Android Listview中Button按钮点击事件冲突解决办法
今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...
随机推荐
- GRPC 截止时间与元数据
截止时间 gRPC 允许客户端在调用一个远程方法前指定一个最后期限值.这个值指定了在客户端可以等待服务端多长时间来应答,超过这个时间值 RPC 将结束并返回DEADLINE_EXCEEDED错误.在服 ...
- XTOJ 1267:Highway(树的直径)***
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1267 题意:给出一棵树,每条树边有权值,现在要修建n-1条边,边的权值为边 ...
- scrapy基础知识之 CrawlSpiders(爬取腾讯校内招聘):
import scrapyfrom scrapy.spider import CrawlSpider,Rulefrom scrapy.linkextractors import LinkExtract ...
- django执行mysql恢复的时候出现“The request's session was deleted before the request completed. The user may have logged out in a concurrent request, for example.”
版本: django:2.1.7 python:3.7 mysql:5.7.25 今天在用django做mysql备份和恢复的时候,备份没问题,恢复时出现如下错误提示: The request's s ...
- 聊聊C语言的预编译指令include
"include"相信大家不会陌生,在我们写代码时,开头总会来一句"include XXX".include是干嘛用的,很多教材都提到了,因此这里不会再详细解释 ...
- EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式
目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...
- JavaScript函数及闭包
前面一片文章讲到过一点函数,了解到每声明一个函数就会产生一个作用域.而外面的作用域访问不了里面的作用域(把里面的变量和函数隐藏起来),而里面的可以访问到外面的.对于隐藏变量和函数是一个非常有用的技术. ...
- NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解
题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...
- Excel催化剂开源第36波-图片Exif信息提取,速度超快,信息超全
Excel催化剂在文件处理方面,功能做到极致,但其实很大功劳都是引用一些开源社区的轮子库,不敢独占好处,此篇给大家分享下抓取图片的Exif信息的好用的轮子. 此篇对应的Excel催化剂功能实现:第83 ...
- Hadoop值Partition分区
分区操作 为什么要分区? 要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按 照手机归属地不同省份输出到不同文件中(分区) 默认 partition 分区 /** 源码中:numRed ...