Onvif事件处理模块之基本通知接口模式(NVC部分)

0 前言:事件处理(Event)是当后端设备NVR向前端IPC设备订阅某项告警属性,若前端设备检测到该属性发生改变时,将会对正处于监听状态的后端NVR上传告警信息告知该属性值发生变化,根据该信息,NVR系统做出告警处理,这就是事件处理的大致流程。支持ONVIF协议的产品必须实现事件服务,前后端设备都应支持WS-Addressing协议,以支持事件服务。
  1 设计: 在ONVIF事件处理规范中,告警是能被NVT探测到的事件或行为,而这些告警可以被用户预先订阅,其中告警必须由事件服务处理。事件处理是基于OASIS的WS-BaseNotification(WS-基本通知)[24]和WS-Topics(WS-主题)规范。这些规范允许重用丰富的通知框架而不需要重新定义事件处理规则、基本格式和通信模式。WS-基本通知规范为消费者(Notification Consumers)和生产者(Notification Producers)提供了标准的接口,主要着重于订阅和通知的操作。WS-主题规范建立了WS-主题的概念,其主要解释了用来定义和创建多个主题所使用的结构。在事件处理中主要包括3个逻辑体:客户端,告警服务器,订阅管理器,这三个逻辑体只有客户端是存在于NVR设备上,其它存在于前端IPC上。在上述规范基础上,ONVIF协议中定义了两种事件处理接口模式。
基本通知接口模式采用监听阻塞方式,该模式下客户端通过Subscription命令连接告警服务器,使之在IPC上创建一个订阅管理器并将其URL信息返回给客户端,客户端进而调用accept()进行监听阻塞,直到订阅管理器上传IPC上的告警信息给客户端,客户端才进行消息处理。订阅管理器的存活时间由客户端Subscription命令进行设置,在活跃期间可以通过Renew命令进行修改重设,还可通过Unsubscribe进行取消。其工作时序如图1所示:
Onvif事件处理模块之基本通知接口模式(NVC部分)_第1张图片
  2 实现:
 //设置订阅管理器相关信息
 struct SubscribeInfo SubscribeReq;
 struct SubscribeResponse SubscribeResp;
 int result=0;
 memset(&SubscribeResp,0,sizeof(struct SubscribeResponse));
sprintf(SubscribeReq.InitialTerminationTime,"PT%dH%dM%dS",EventInfomation->Hour, EventInfomation->Min,EventInfomation->Sec);//设置订阅管理器初始化时间 
 if(getlocalip(ip)==0)//将本地URL地址发送给订阅管理器
{
sprintf(SubscribeReq.ConsumerReference.Address,"http://%s:8086/onvif_notify_server/",ip);
	  }
     result=Subscribe(EventInfomation->url,&SubscribeReq, SubscribeReq.InitialTerminationTime, &SubscribeResp,user); //发送订阅请求,创建订管理器
  if(result)
	  exit(1);//订阅失败,退出
 struct Notify NotifyInfo;
 memset(&NotifyInfo,0,sizeof(struct Notify));
struct PortInput PortInfo;
PortInfo.PortNumber=8086;
static int counter=1;
ReceiverNotifyMessageInfo(counter,&PortInfo,&NotifyInfo);//设置接收通知参数,创建监听线程
ReceiverNotify(&NotifyInfo);//监听函数,监听告警消息
3 结语:上面的代码只是基本通知接口模式下的事件处理的核心代码,其中开发者需要注意的是,该模式下主要是实时监听,需要用accept函数尽心监听,其他只要按照ONVIF官网所提供的开发者文档的流程就可以了。


你可能感兴趣的:(Onvif)