一种多NVT事件处理方法、NVC及安防监控平台
技术领域
本发明属于计算机安防监控技术领域,尤其涉及一种多NVT事件处理方法、NVC及安防监控平台。
背景技术
近年来,随着数字视频监控市场的发展,各安防企业生产的不同网络监控设备间的兼容性问题越来越严峻,关于业界统一标准问题的讨论也越来越多。
开放性网络视频接口论坛(OpenNetworkVideoInterfaceForum,Onvif)在2008年由Axis、Bosch和Sony三家企业联合推出,是全球影响力最大的网络视频监控行业标准组织,其目的是以公开、开放的原则共同制定开放性网络视频监控行业标准。Onvif标准为网络监控设备之间的信息交换定义通用协议,包括设备发现、实时视频、音频、元数据和控制信息等。网络监控设备对Onvif标准的遵循,使终端用户、集成商和生产厂商能够轻松地获得更高的性价比、更灵活的解决方案、更大的市场扩张机会以及更低的风险。
在安防监控平台中,对前端网络摄像机(在Onvif标准中简称NVT,NetworkVideoTransmitter)告警的采集、管理是一项重要组成部分。Onvif对告警的处理通过事件(event)方式实现,NVT将其产生的告警(例如移动侦测,开关量报警输入)描述为事件并传向后端设备(在Onvif标准中简称NVC,NetworkVideoClient),NVC再对各类事件分析处理并产生相应联动。Onvif标准中提供了两种事件处理接口,BasicNotificationInterface和Real-timePull-PointNotificationInterface。其中因为更高的实时性和更好的防火墙穿透能力,Pull-Point方式更受推荐。
在Onvif标准的核心规范中对Pull-Point方式的工作过程进行了描述:
步骤1:NVC使用CreatePullPointSubscriptionRequest向NVT注册感兴趣的事件主题。
步骤2:NVT评估注册信息并向NVC返回注册成功应答CreatePullPointSubscriptionResponse或者注册错误信息。
步骤3:NVC根据NVT返回的应答中包含的代表其生成的SubscriptionManager的WS-EndpointReference向NVT发送PullMessages请求。
步骤4:当NVT检测到有事件发生时,立即通过PullMessages应答向NVC返回事件描述;如果指定时间内未发生事件,返回超时。NVC在接收到应答后可立即发起新的PullMessages请求。
步骤5:NVC使用UnSubscribeRequest向NVT注销事件主题,NVT销毁SubscriptionManager并使用UnSubscribeResponse向NVC返回应答。
上述步骤描述了NVC与NVT之间一对一的Pull-Point方式工作流程,但是实际应用中仍存在几点问题:
1.实际安防监控平台中,一台NVC往往接入多路NVT(例如256路),而在Onvif标准中并未阐述如何对这种一对多的模型进行有效的事件管理。
2.标准中描述的工作流程采用同步阻塞方式的网络连接,NVC在发起PullMessages请求后阻塞等待NVT的应答。
发明内容
本发明实施例提供了一种多NVT事件处理方法、NVC及安防监控平台,旨在解决现有的Onvif标准未涵盖多路NVT的问题。
一方面,提供一种多NVT事件处理方法,所述方法包括:
向前端网络摄像机NVT注册感兴趣的事件主题;
注册成功后,创建一个事件注册节点,并将所述事件注册节点加入事件注册池中,所述事件注册节点中包括:NVT事件主题、NVT事件服务地址、租约期限和NVT返回的代表其生成的SubscriptionManager的WS-EndpointReference;
根据所述WS-EndpointReference向NVT发送PullMessages连接请求;
连接成功后,创建一个包含连接上下文信息的事件连接节点,所述事件连接节点中包括连接套接字socket、NVT事件服务地址和代表NVT生成的SubscriptionManager的WS-EndpointReference,并将所述事件连接节点加入事件连接池中;
以异步多路复用方式监听事件连接池中的所有socket;
当接收到NVT发送的事件消息时,从接收到事件消息的socket上读取所述事件消息并断开与NVT的PullMessages连接;
对所述事件消息进行处理;
根据所述事件连接节点中包含的连接上下文信息重建与NVT的PullMessages连接;
如果重建连接成功,则根据当前的连接套接字socket更新事件连接池中相应的事件连接节点;
如果重建连接失败,则从事件连接池中删除相应的事件连接节点。
另一方面,提供一种NVC,所述NVC包括:
注册单元,用于向前端网络摄像机NVT注册感兴趣的事件主题;
事件注册池创建单元,用于注册成功后,创建一个事件注册节点,并将所述事件注册节点加入事件注册池中,所述事件注册节点中包括:NVT事件主题、NVT事件服务地址、租约期限和NVT返回的代表其生成的SubscriptionManager的WS-EndpointReference;
连接请求单元,用于根据所述WS-EndpointReference向NVT发送PullMessages连接请求;
事件连接池创建单元,用于连接成功后,创建一个包含连接上下文信息的事件连接节点,所述事件连接节点中包括连接套接字socket、NVT事件服务地址和代表NVT生成的SubscriptionManager的WS-EndpointReference,并将所述事件连接节点加入事件连接池中;
监听单元,用于以异步多路复用方式监听事件连接池中的所有socket;
连接断开单元,用于当接收到NVT发送的事件消息时,从接收到事件消息的socket上读取所述事件消息并断开与NVT的PullMessages连接;
事件处理单元,用于对所述事件消息进行处理;
第一连接重建单元,用于根据所述事件连接节点中包含的连接上下文信息重建与NVT的PullMessages连接;
事件连接节点更新单元,用于如果重建连接成功,则根据当前的连接套接字socket更新事件连接池中相应的事件连接节点;
事件连接节点删除单元,用于如果重建连接失败,则从事件连接池中删除相应的事件连接节点。
再一方面,提供一种安防监控平台,所述安防监控平台包括多个NVT和如上所述的NVC。
在本发明实施例中,通过创建事件注册池对注册事件统一管理,创建事件连接池对活跃PullMessages连接统一管理,很好地提出了以异步方式同时监听多路NVT事件的模型。该方法工作于NVC端,通用、可靠,可对各类遵循Onvif标准的前端网络摄像机进行事件管理。
附图说明
图1是本发明实施例一提供的多NVT事件处理方法的实现流程图;
图2是本发明实施例二提供的NVC的结构框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明实施例中,通过创建事件注册池对注册事件统一管理,创建事件连接池对活跃PullMessages连接统一管理,很好地提出了以异步方式同时监听多路NVT事件的模型。
以下结合具体实施例对本发明的实现进行详细描述:
实施例一
图1示出了本发明实施例一提供的多NVT事件处理方法的实现流程,以NVC为例进行说明,详述如下:
在步骤S101中,向前端网络摄像机NVT注册感兴趣的事件主题。
在本实施例中,后端设备NVC调用CreatePullPointSubscriptionRequest向NVT注册感兴趣的事件主题,如果注册成功,则执行步骤S102。
在步骤S102中,注册成功后,则创建一个事件注册节点,并将所述事件注册节点加入事件注册池中,所述事件注册节点中包括:NVT事件主题、NVT事件服务地址、租约期限和NVT返回的代表其生成的SubscriptionManager的WS-EndpointReference。
在本实施例中,当NVC调用CreatePullPointSubscriptionRequest向NVT注册感兴趣的事件主题时,如果注册成功,则创建一个包含注册信息的事件注册节点,然后将该事件注册节点添加到事件注册池中去。该事件注册节点中包括的信息有:NVT事件服务地址、注册事件主题、租约期限和NVT返回的代表其生成的SubscriptionManager的WS-EndpointReference。NVC使用事件注册池保存所有注册成功的事件信息。
其中,事件注册节点的ONVIF_EventSubNode_t结构体定义如下:
事件注册池定义如下:
map<string,ONVIF_EventSubNode>g_PPSubNodePool;
其中map的string类型的键存储NVT返回的代表其生成的SubscriptionManager的WS-EndpointReference,对NVT注册一次,NVT会返回一个WS-EndpointReference值,ONVIF_EventSubNode类型的值存储事件注册节点的固有信息,包括NVT事件服务地址、注册事件主题和租约期限,对一个NVT的一次注册,ONVIF_EventSubNode类型的值固定。在C++的关联容器map类型中,健、值是成对存储的。这里一个<string,ONVIF_EventSubNode>类型的<键,值>对代表一个完整的事件注册节点。所以一个事件注册节点包括NVT事件服务地址、注册事件主题、租约期限和WS-EndpointReference这4项内容。
另外,通过以下方法向事件注册池g_PPSubNodePool添加、删除和查询事件注册节点,一个事件注册池中可以包括多个事件注册节点:
voidAddEventSubNodePool(conststring&addrs,ONVIF_EventSubNodenode);//添加事件注册节点
voidDelEventSubNodePool(conststring&addrs);//删除事件注册节点
constONVIF_EventSubNode*FindNodeFromEventSubNodePool(conststring&addrs);//查询事件注册节点
当NVC调用CreatePullPointSubscriptionRequest向NVT注册事件主题时,如果注册成功,创建一个ONVIF_EventSubNode类型的事件注册节点,并调用AddEventSubNodePool()将该事件注册节点加入事件注册池g_PPSubNodePool中。
在步骤S103中,根据所述WS-EndpointReference向NVT发送PullMessages连接请求。
在本实施例中,NVC注册事件成功后,根据事件注册节点中保存的WS-EndpointReference向NVT发送PullMessages连接请求。如果成功创建PullMessages连接,则执行步骤S104。
在步骤S104中,连接成功后,则创建一个包含连接上下文信息的事件连接节点,所述事件连接节点中包括连接套接字socket、NVT事件服务地址和代表NVT生成的SubscriptionManager的WS-EndpointReference,并将所述事件连接节点加入事件连接池中。
在本实施例中,如果成功创建PullMessages连接,则NVC创建一个ONVIF_PullMessagesContext类型的事件连接节点,并调用AddPullMsgConnection()将该事件连接节点加入事件连接池g_connectionPool中。
其中,事件连接节点的ONVIF_PullMessagesContext_t结构体定义如下:
事件连接池定义如下,可以包括多个事件连接节点:
map<string,ONVIF_PullMessagesContext*>g__connectionPool;
其中map的string类型的键存储SubscriptionManager的WS-EndpointReference,ONVIF_PullMessagesContext类型的值存储事件连接节点的上下文信息,包括soap通信环境、NVT事件服务地址。
另外,可以通过以下方法向事件连接池g_connectionPool添加、删除和查询事件连接节点:
voidAddPullMsgConnection(conststring&addrs,ONVIF_PullMessagesContext*ctx);//向事件连接池添加、事件连接节点
voidDelPullMsgConnection(conststring&addrs);//向事件连接池添加、事件连接节点
ONVIF_PullMessagesContext*FindPullMsgConnection(conststring&addrs);//向事件连接池查询事件连接节点
NVC注册事件主题成功后,根据WS-EndpointReference向NVT发送PullMessages连接请求。如果成功创建PullMessages连接,则创建一个ONVIF_PullMessagesContext类型的事件连接节点,并调用AddPullMsgConnection()将该事件连接节点加入事件连接池g_connectionPool中。
在步骤S105中,以异步多路复用方式监听事件连接池中的所有socket。
在本实施例中,NVC使用select()系统调用实现异步多路复用监听事件连接池中的所有socket,并通过Msg_Handler结构将socket句柄与注册的回调函数相关联。
其中,Msg_Handler结构如下:
处理事件消息的回调函数原型为:
intRecvPPEventMsg(inthandle,void*pData);
其中,handle传入连接socket句柄,pData传入事件连接节点ONVIF_PullMessagesContext类型结构指针。
在步骤S106中,当接收到NVT发送的事件消息时,接收到事件消息的socket上读取所述事件消息并断开与NVT的PullMessages连接。
在本实施例中,当NVT产生事件并返回事件消息时,select()在相应socket上检测到有事件消息到达,通过socket句柄找到与该事件消息对应的Msg_Handler,进而触发回调函数RecvPPEventMsg()执行。RecvPPEventMsg()从socket上读取事件消息并断开与NVT的PullMessages连接。
在步骤S107中,对所述事件消息进行处理。
在本实施例中,NVC读取到事件消息并断开与NVT的PullMessages连接后,对读取到的事件消息解析、处理。
进一步地,NVC对事件消息处理完毕后,可以根据事件连接节点中包含的连接上下文信息重建与NVT的PullMessages连接。如果重建连接成功,则根据当前的连接套接字socket更新事件连接池中相应的事件连接节点;如果重建连接失败,则从事件连接池中删除相应的事件连接节点,具体可以调用DelPullMsgConnection()从事件连接池g_connectionPool中删除该事件连接节点。需要说明的是,在具体实施时,上述步骤都是通过回调函数RecvPPEventMsg()执行完成的。
另外,对于连接的超时返回和错误返回,不执行事件消息的读取、解析和处理过程,但同样要进行重建PullMessages连接的操作。
另外,作为本发明的一个优选实施例,NVC还可以通过定期监测事件注册池和事件连接池完成以下操作:
如果监测到事件注册池中的事件注册节点的剩余的租约期限小于设定阈值,则对所述事件注册节点进行续约,具体通过RenewPPSubNodePool()遍历事件注册池g_PPSubNodePool,如果某个事件注册节点的租约期限Node.lease<设定阈值,则用该事件注册节点保存的WS-EndpointReference调用Renew操作对该事件注册节点进行续约,并更新该事件注册节点的租约期限;
对于已经注册但未连接的NVT事件主题,则重建与NVT的PullMessages连接,其中,已经注册但未连接的NVT事件主题指的是该事件的WS-EndpointReference在事件注册池中存在但在事件连接池中不存在的NVT事件主题。如果连接成功,则NVC创建事件连接节点并将所述事件连接节点加入事件注册连接池中。
其中,定义事件连接池检测函数voidRefreshPullMsgConnections(void),通过RefreshPullMsgConnections()对比事件连接池g_connectionPool与事件注册池g_PPSubNodePool,如果某SubscriptionManager的WS-EndpointReference在g_PPSubNodePool中存在但在g_connectionPool中不存在,说明该事件已被注册但没有活跃的PullMessages连接。
另外,作为本发明的又一个优选实施例,NVC还可以检测是否有NVT重新上线,如果监测到有NVT重新上线,则尝试对与该NVT关联的事件续约并重建与该NVT的PullMessages连接。
其中,尝试对与该NVT关联的事件续约并重建与该NVT的PullMessages连接具体包括:
步骤1、遍历事件注册池,查找与该NVT关联的且未处理的事件注册节点,则记该事件注册节点为node,并标记node为已处理,并执行步骤2,否则结束。
步骤2、对该事件注册节点进行续约,其中,对该事件注册节点保存的WS-EndpointReference调用Renew操作,操作成功则执行步骤3,否则执行步骤4,其中,具体操作时,NVC根据node对应的WS-EndpointReference调用Renew操作来进行续约。
步骤3、如果续约成功,则根据该事件注册节点中保存的WS-EndpointReference重建与该NVT的PullMessages连接,如果连接成功,则创建对应事件连接节点,并将该事件连接节点加入事件连接池中。其中,NVC根据node对应的WS-EndpointReference向NVT发起PullMessages连接请求。
步骤4、如果续约失败,则对该事件注册节点中保存的NVT事件主题、NVT事件服务地址重新注册,如果注册失败,则转执行步骤1,如果注册成功,则根据该NVT返回的代表其新生成的SubscriptionManager的WS-EndpointReference更新该事件注册节点,并根据该新生成的WS-EndpointReference重建与该NVT的PullMessages连接,如果连接成功,则创建对应事件连接节点,并将该事件连接节点加入事件连接池中。其中,使用node.eventsXaddr和node.topic调用CreatePullPointSubscriptionRequest进行重新注册。
另外,作为本发明的第三个优选实施例,NVC中包括数据库,如表1所示,使用该数据库记录所有注册成功的事件的信息。
表1
当NVT重新上线时,NVC首先从数据库中依次读取注册事件信息,创建事件注册节点ONVIF_EventSubNode并加入事件注册池g_PPSubNodePool中。然后遍历事件注册池g_PPSubNodePool,对每一个事件注册节点尝试发起PullMessages连接请求,如果PullMessages连接成功,则创建对应事件连接节点ONVIF_PullMessagesContext并加入事件连接池g_connectionPool。
另外,NVC还可以注销事件,作为本发明的第四个优选实施例,NVC注销事件时,先断开与NVT之间的PullMessages连接,再依次从事件连接池和事件注册池中删除相应的节点,可以实现对多个事件进行注销。具体工作过程是:当NVC调用UnSubscribe进行注销事件时,首先查询g_connectionPool,如果有其对应的事件连接节点,则关闭socket断开PullMessages连接,并调用DelPullMsgConnection()从g_connectionPool中将该事件连接节点删除。其次查询g_PPSubNodePool,如果g_PPSubNodePool中存在对应的事件注册节点,则调用DelEventSubNodePool()从g_PPSubNodePool中将该事件注册节点删除。
本实施例,通过创建事件注册池对注册事件统一管理,创建事件连接池对活跃PullMessages连接统一管理,很好地提出了以异步方式同时监听多路NVT事件的模型。该方法工作于NVC端,通用、可靠,可对各类遵循Onvif标准的前端网络摄像机进行事件管理。
实施例二
图2示出了本发明实施例二提供的NVC的具体结构框图,为了便于说明,仅示出了与本发明实施例相关的部分。该NVC可以和多个NVT依次通过网络连接形成一个安防监控平台,该NVC2包括:注册单元21、事件注册池创建单元22、连接请求单元23、事件连接池创建单元24、监听单元25、连接断开单元26和事件处理单元27。
其中,注册单元21,用于向前端网络摄像机NVT注册感兴趣的事件主题;
事件注册池创建单元22,用于注册成功后,创建一个事件注册节点,并将所述事件注册节点加入事件注册池中,所述事件注册节点中包括:NVT事件主题、NVT事件服务地址、租约期限和NVT返回的代表其生成的SubscriptionManager的WS-EndpointReference;
连接请求单元23,用于根据所述WS-EndpointReference向NVT发送PullMessages连接请求;
事件连接池创建单元24,用于连接成功后,创建一个包含连接上下文信息的事件连接节点,所述事件连接节点中包括连接套接字socket、NVT事件服务地址和代表NVT生成的SubscriptionManager的WS-EndpointReference,并将所述事件连接节点加入事件连接池中;
监听单元25,用于以异步多路复用方式监听事件连接池中的所有socket;
连接断开单元26,用于当接收到NVT发送的事件消息时,从接收到事件消息的socket上读取所述事件消息并断开与NVT的PullMessages连接;
事件处理单元27,用于对所述事件消息进行处理。
进一步地,所述NVC2还包括:
第一连接重建单元,用于根据所述事件连接节点中包含的连接上下文信息重建与NVT的PullMessages连接。
进一步地,所述NVC2还包括:
事件连接节点更新单元,用于如果重建连接成功,则根据当前的连接套接字socket更新事件连接池中相应的事件连接节点;
事件连接节点删除单元,用于如果重建连接失败,则从事件连接池中删除相应的事件连接节点。
进一步地,所述NVC2还包括:
监测单元,用于定期监测事件注册池和事件连接池;
续约单元,用于如果事件注册池中的事件注册节点的剩余的租约期限小于设定阈值,则对所述事件注册节点进行续约;
第二连接重建单元,用于对于已经注册但未连接的NVT事件主题,则重建与NVT的PullMessages连接;
如果连接成功,则创建事件连接节点并将所述事件连接节点加入事件连接池中。
进一步地,所述NVC2还包括:
上线监测单元,用于监测NVT是否重新上线;
第三连接重建单元,用于如果有NVT重新上线,则尝试对与该NVT关联的事件续约并重建与该NVT的PullMessages连接。
具体的,所述第三连接重建单元包括:
遍历模块,用于遍历事件注册池,查找与该NVT关联的事件注册节点;
续约模块,用于对该事件注册节点进行续约;
第一连接重建模块,用于如果续约成功,则直接根据该事件注册节点中保存的WS-EndpointReference重建与该NVT的PullMessages连接;
第二连接重建模块,用于如果续约失败,则对该事件注册节点中保存的NVT事件主题、NVT事件服务地址重新注册,如果注册成功,则根据该NVT返回的代表其新生成的SubscriptionManager的WS-EndpointReference更新该事件注册节点,并根据该新生成的WS-EndpointReference重建与该NVT的PullMessages连接。
进一步地,所述NVC2还包括:
数据库单元,用于使用数据库记录所有注册成功的事件的信息,当NVC重新上线时,根据所述数据库中记录的事件的信息重建事件注册池和事件连接池。
进一步地,所述NVC2还包括:
事件注销单元,用于注销事件时,先断开与NVT之间的PullMessages连接,再依次从事件连接池和事件注册池中删除相应的节点。
本发明实施例提供的NVC可以应用在前述对应的方法实施例一中,详情参见上述实施例一的描述,在此不再赘述。
值得注意的是,上述系统实施例中,所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
另外,本领域普通技术人员可以理解实现上述各实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,相应的程序可以存储于一计算机可读取存储介质中,所述的存储介质,如ROM/RAM、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。