目录
一、事件订阅和事件通知
国标GB28181协议定义了事件订阅流程和事件通知流程,这两个流程是相互关联、且相辅相成的流程,它们共同构成了事件处理和通信的完整机制。
有兴趣的可以看我前面写的文章:
1、事件订阅
(1)定义
事件订阅是指联网系统、SIP服务器、客户端等事件观察者,通过SIP协议(具体为RFC3265中定义的SUBSCRIBE方法),向能够触发事件的系统或设备(如联网系统、SIP服务器、报警设备、移动设备以及被集成的卡口系统等事件源)发起订阅请求,以接收特定事件的通知。
(2)作用
事件订阅机制有助于保持上下级域之间的目录结构和设备状态的一致性。当设备状态发生变化时,通过事件订阅,上级系统能够实时接收到这些变化通知,从而保持整个系统的状态同步。
2、事件通知
事件通知是指当事件源接受到事件订阅后,在事件触发后应立即通知事件观察者,事件观察者应向事件源发送事件收到的确认消息。
3、关系
(1)相互依赖
事件订阅是事件通知的前提和基础。只有事件观察者成功订阅了特定事件,才能在事件触发时接收到事件通知。
(2)协同工作
事件订阅和事件通知协同工作,共同实现事件处理和通信的完整机制。通过事件订阅,事件观察者可以获取所需的事件信息;通过事件通知,事件源可以将事件信息及时、准确地发送给事件观察者。
(3)实时性和同步性
事件订阅流程和事件通知流程保证了系统的实时性和同步性。通过这两个流程,系统可以实时地检测到设备状态的变化和事件的发生,并及时地通知相关系统或设备进行处理和响应。
二、问题
1、问题描述
视频监控平台能够实现报警事件的通知和推送,同时也提供了对应的API接口,可以为上层应用程序调用。
在项目现场,第三方上层应用的技术人员说我们提供的API接口有问题,他们在调用时间订阅时候成功,但是事件通知好像有问题,没有收到我们的任何事件通知消息。经过我们技术人员反复说明,对方一直不理解。
2、问题分析
经过我们开会诊断,觉得肯定是对方接受通知的接口有问题,但是解释目前已经没有用,我们需要给对方实际的测试,来验证我们的API接口的正确性。也就是要在事件通知目的服务器没有的情况下,快速验证事件通知的推送是有效的。
三、解决方案
1、API接口
(1)报警订阅
请求方式:POST
请求地址:http://192.168.0.156:8687/ivms/sipsvr/alarmsubscribe
请求参数:
{
"AuthorizationId":"xxxx",
"PushInterval":1000,
"NumEachPage":100,
"SendAddress":"http://192.168.12.53:8888/alarmnotify"
}
返回参数:
{
"errcode":0,
"errdesc":"OK",
"PushInterval":1000,
"NumEachPage":100,
"SendAddress":"http://192.168.12.53:8888/alarmnotify"
}
(2)事件通知
按订阅给的地址推送。
URL:http://ip:port/{path}
HTTP Method: POST
上下线事件推送:
Body { "sn":"123453213", //序列号,唯一 "msgtype":"msg_vedio_event" "TotalAlarmCount":1 "AlarmListCount":1, "AlarmList": [ { "AlarmId":"186ef967-7a9d-44be-8ca4-90bef8fd9024", "DeviceId":"64000000001320012179", "AlarmPriority":1, "AlarmMethod":2, "AlarmTime":"2019-01-24T15:17:30", "AlarmDescription":"设备上线", "Longitude":116.666666, "Latitude":66.666666, "ExtendInfo":5, "EventId":-1 } ] }
2、思路
(1)模拟上级应用程序调用接口,订阅事件
这种情况下,可以采用postman工具,postman工具可以非常方便的调用http格式的API接口。
(2)模拟事件处理服务器接收事件通知
要测试平台相关报警API接口能否正常使用,可以使用postman进行测试,
3、准备工作
(1)系统和工具
需要准备如下系统和工具:
服务器1台:AS-V1000视频监控平台。
电脑1台:安装windows系统,安装postman工具
主机1台:可以是windows或者linux,安装netcat工具
(2)postman脚本
需要准备如下代码:
按照AS-V1000视频监控平台的http API接口,编写登录语句、事件订阅语句
准备好Netcat工具的命令语句,可以侦听端口,接收事件通知消息
四、实际操作说明
1、报警订阅
根据API接口文档,进行报警订阅,实际操作如下图:
执行后,返回成功,如下图示:
注意,这里设置了事件通知的目的地址,即接收报警的服务器地址,地址为:
http://192.168.1.109:8007/alarmnotify
2、事件通知推送过程和说明
(1)没有事件服务器启动的情况推送
向订阅地址发送“上下线事件”推送,实际操作如下图:
但由于这个端口暂时没有设备监听,所以返回错误,即connect refused,如下图:
(2)模拟侦听端口,接收事件通知
在命令行采用netcat命令(简写为nc),模拟设备监听、接收事件通知。
在主机192.168.1.109上使用使用如下命令:
nc -l 8007 -v
实际操作后,显示如下图界面:
说明创建8007侦听端口成功。
PS:若对nc命令有兴趣,详情可以参考我之前的文章:
(3) 发送报警通知
用postman发送post信息,在主机109上可以看到如下图所示:
可以看到成功收到信息。
(4)事件接收服务器返回消息
在netcat命令行下,输入“receive ok”消息,然后回车发送,如下图所示:
在postman上,出现如下图示:
由于简单的netcat不是正常可以接收的设备,我们这里只是模拟监听,可以接收http的消息,但是不能发送符合http API接口的格式。因此,当我们随手输入字符 作为返回信息时,接口会提示接收到了错误的信息,但这也说明事件通知服务到设备的通信是没有问题的。
问题得到解决。说明我们视频监控平台的API接口的正确性,报警事件通知的推送是有效的。
文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。