主要在调测事件用例的过程中,发现了大量的信息,和未曾碰到的场景和非法错误等信息,先总结解决办法如下:

(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事件总结解决办法的更多相关文章

  1. FileSystemWatcher触发多次Change事件的解决办法 .

    最近要用到FileSystemWatcher来监控某个目录中的文件是否发生改变,如果改变就执行相应的操作.但在开发过程中,发现FileSystemWatcher在文件创建或修改后,会触发多个Creat ...

  2. append()方法生成的元素绑定的事件失效解决办法

    我使用append()方法动态生成的a链接的click事件没有起效果,查找了资料,了解到,我使用的onclick方法绑定的事件对动态生成的元素是无效的,解决办法如下: 使用事件委托,并且要用on来绑定 ...

  3. 关于UIScrollView不能响应UITouch事件的解决办法

    原因是:UIView的touch事件被UIScrollView捕获了. 解决办法:让UIScrollView将事件传递过去.于是最简单的解决办法就是加一个UIScrollView的category.这 ...

  4. input输入框file类型第二次不触发onchange事件的解决办法,简单有效

    在网上看了很多办法,现在将网上大部分说法总结如下: 网上说法: 原因:选择一次后onchange事件没有绑定到input标签上:    解决办法:拷贝一份input标签的副本,每次选择后对原input ...

  5. ToolStrip控件在窗体没有焦点的情况下,需要单击二次才能够激发事件的解决办法

    protected override void WndProc(ref Message m) { if (m.Msg == 0x210) { Control control = Control.Fro ...

  6. img的onerror事件(瑕疵+解决办法)【转】

    显示图片的时候,为了更好的用户体验,可能会把一些没有图片的内容也用图片样式显示出来,此时我们就要用到IMG的onerror事件了,注意MyEclipse的快捷键alt+/是没有的. < img ...

  7. Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

    本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...

  8. mysql事件关闭解决办法

    Mysql 事件event_scheduler是OFF 开启 Event Scheduler,以下4种方式等效 SET GLOBAL event_scheduler = ON; SET @@globa ...

  9. Android Listview中Button按钮点击事件冲突解决办法

    今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...

随机推荐

  1. CentOS 7出现Failed to start firewalld.service: Unit is masked的解决办法和firewalld 防火墙开关

    说明:刚刚使用systemctl start firewalld命令开启防火墙的时候,却开不成功,出现Failed to start firewalld.service: Unit is masked ...

  2. C# 连接数据库等

    SqlConnection连接池:可以通过连接字符串配置连接池.对象池技术:HttpApplication :Asp.Net生产者 消费者. 线程.应用程序跟数据连接非常耗时,而且连接使用非常频繁,使 ...

  3. mac vim 配色

    syntax on set nu set noic set t_Co=256 set tabstop=4 set nocompatible set shiftwidth=4 set softtabst ...

  4. C语言中const的用法总结

          const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...

  5. c++学习书籍推荐《数据结构C++语言描述:应用标准模板库STL(第2版)》下载

    本书是Ford和Topp两位教授于1996看出版的名著Data Structures with C++的第2版,在全球范围内已经有数以万计的学生从中受益.作者将C++语言作为算法描述语言,应用包含规范 ...

  6. 开源FTP/SFTP客户端 FileZilla v3.31.0 绿色便携版

    下载地址:点我 基本介绍 FileZilla是一种快速.可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色.直觉的接口.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端 ...

  7. .Net Core 学习依赖注入自定义Service

    1. 定义一个服务,包含一个方法 public class TextService { public string Print(string m) { return m; } } 2. 写一个扩展方法 ...

  8. 扫描线——POJ1151

    平面上有若干个矩形,求矩形相互覆盖的面积.为方便起见,矩形的边均平行于坐标轴. 我们根据容斥原理,矩形相互覆盖的面积即为所有矩形的面积和减去所有矩形所覆盖的面积即可. 而现在问题是如何求得所有矩形所覆 ...

  9. 【NOIP2017】图书管理员-C++

    描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那么这 ...

  10. Spring Bean 的装配方式

    Spring Bean 的装配方式 装配 Bean 的三种方式 一个程序中,许多功能模块都是由多个为了实现相同业务而相互协作的组件构成的.而代码之间的相互联系又势必会带来耦合.耦合是个具有两面性的概念 ...