订阅的作用

简单点来讲就是保持上下级域之间的目录结构、设备状态保持一致。举个小例子:这边有两台sip服务器A和B,A和B通过国标对接,B把资源推送给A,A订阅B域的系统ID,B上的一个摄像头原来在线的,现在离线了,那么B就会通知A,我这儿有个摄像头离线了,然后A也让B将推送过来的这个摄像头离线,此外每当B上的设备离线,上线,增加,删除,目录更新时,都会向A发送通知。

订阅方式(详细见IETF RFC 3265)


国标标准定义了以下几种订阅方式:
1)A订阅B的系统ID------最常用的
释:B 域检测到直属目录和下级域的目录变更事件时应向 A 域发送通知消息;
2)A订阅B的下级域系统ID
释:B 域检测到对应此ID 的下级系统范围内的目录变更事件时应向 A 域发送通知消息;
3)A订阅B的行政区划编码
释:B 域检测到属于此行政区划的目录变更事件时应向 A 域发送通知消息
4)A订阅B的设备ID
释:B 域检测到该设备及其下属子设备发生目录变更事件时应向A 域发送通知消息;
5)A订阅B的上报业务分组ID,虚拟组织ID
释:B 域检测到该业务分组、 虚拟组织下属虚拟组织、 设备发生目录变更事件时应向 A 域发送通知消息
4. 刷新订阅
A 域在初始订阅成功之后, 应在过期之前向 B 域发送刷新订阅消息, 进行订阅状态维护。
刷新订阅消息与初始订阅消息属于同一会话, 并且 Expire 头域值大于0.
初始化订阅时,Expire头域值国标定义可以配置,默认为600s。
5. 取消订阅(两种方式:主动和被动)
主动: A订阅B,A主动取消订阅。取消订阅请求应与初始订阅请求属于同一会话, 并且 Expire 头域值为0
被动: A订阅B,B 域可通过发送subscription-state 头域为terminated 的 NOTIFY 消息主动结束订阅, NOTIFY消息体可为空, 订阅方接收到该消息后回复200 OK 响应。

信令流程


命令流程描述如下:
1: 订阅域向被订阅域发送初始订阅SUBSCRIBE 消息, 订阅目的域的目录变更事件, 消息头域中使用 Event 头域描述订阅事件, 消息体中携带订阅的详细参数, 使用 Expire 头域指定订阅过期时间;
2: 被订阅域设备收到订阅消息后, 向订阅域发送200 OK 响应;
3: 对于初始订阅操作, 被订阅域立即发送 NOTIFY 消息携带离线及其他异常状态设备目录,消息头域中使用 Event 头域描述订 阅事件;
4: 订阅域收到 NOTIFY 消息后回复200 OK 响应;
5: 被订阅域目录变更后, 通过 NOTIFY 消息将变更事件通知订阅域, 消息头域中使用 Event头域描述订阅事件;
6: 订阅域收到 NOTIFY 消息后回复200 OK 响应;
7: 订阅域在过期之前向被订阅域发送刷新订阅 SUBSCRIBE 消息, 订阅目的域的目录变更事件, 消息头域中使用 Event 头域描述订 阅事件, 消息体中携带订阅的详细参数, 使用 Expire 头域指定订阅过期时间;
8: 被订阅域设备收到订阅消息后, 向订阅域发送200 OK 响应;
9: 被订阅域目录变更后, 通过 NOTIFY 消息将变更事件通知订阅域, 消息头域中使用 Event头域描述订阅事件;
10: 订阅域收到 NOTIFY 消息后回复200 OK 响应;
11: 订阅域向被订阅域发送取消订阅SUBSCRIBE 消息, 消息头域中使用 Event 头域描述订阅事件, 消息体中携带订阅的详细参数,Expire 头域值为0;
12: 被订阅域设备收到订阅消息后, 向订阅域发送200 OK 响应, 取消向订阅域发送目录变更通知消息。

A发送初始订阅消息订阅B的目录时Expires头域携带订阅过期时间,默认是600s,该时间应可配置。A在订阅过期时间到来之前订阅域应该刷新订阅。B在过期时间到来时若未收到刷新订阅的消息,则移除A的订阅状态。
刷新订阅消息的初始订阅消息属于同一个会话,会话ID应该一致。

实例分析

例一

第一步:SUBSCRIBE消息

第三步:NOTIFY消息,初始订阅上报离线及异常设备状态

第五步: NOTIFY消息暂时没抓,后期补上

第七步:刷新订阅是比较难抓的,有机会抓来展示

第九步:后期补上

第11步:来看下主动取消吧,被动取消有机会可以的话,补上,因为DZ在做的时候是先取消的订阅,在订阅的,所以这边的CALL-id和订阅的CALL-ID不一致

例二

服务器A(192.168.0.33)订阅海康NVR(192.168.0.64)目录
一、A初始订阅

二、NVR回复200 ok然后回复NOTIFY消息
(这个消息截图与初始化截图的是两个不同时间内获得的,所以有会话不一致,实际上同一个流程notify的会话ID和初始订阅的是一样的)


服务器回复200 OK(这个流程也是不同时间跑的,所以会话ID与初始化订阅抓包截图的不一样,实际上应该是一致的)

三、订阅刷新的抓包

回复200 OK

由初始化订阅和订阅刷新可知,会话ID是要保持一致的,若刷新注册使用不同的ID在exoisp中创建刷新信息会出现错误码-6(NOFOUND)。
四、demo
1、初始化订阅

char rsp_xml_body[4096];
osip_message_t *rsp_msg = NULL;
char sour_call[128] = {0};
char dest_call[128] = {0};sprintf(sour_call, "sip:%s@%s:%d", deviceInfo.server_id, deviceInfo.server_ip,deviceInfo.server_port);
sprintf(dest_call, "sip:%s@%s:%d", deviceInfo.ipc_id, deviceInfo.ipc_ip, deviceInfo.ipc_port);eXosip_subscription_build_initial_subscribe(g_context_eXosip, &rsp_msg, dest_call, sour_call, NULL, "Catalog", 600);
snprintf(rsp_xml_body, 4096, "<?xml version=\"1.0\"?>\r\n"
"<Query>\r\n"
"<CmdType>Catalog</CmdType>\r\n"
"<SN>%s</SN>\r\n"
"<DeviceID>%s</DeviceID>\r\n"
"</Query>\r\n",
"25",
deviceInfo.ipc_id
);osip_message_set_body(rsp_msg, rsp_xml_body, strlen(rsp_xml_body));
osip_message_set_content_type(rsp_msg, "Application/MANSCDP+xml");eXosip_lock(g_context_eXosip);
eXosip_subscription_send_initial_request(g_context_eXosip, rsp_msg);
eXosip_unlock(g_context_eXosip);

2、会话id保存

//发送成功之后NVR回复200 OK,在这个200 OK 的event处理流程中需要保存会话ID用于刷新注册
case EXOSIP_SUBSCRIPTION_ANSWERED:
{m_SubCatalogId = g_event->did;  //保存会话ID
}break;

3、刷新订阅

{//refreshosip_message_t * sub = NULL;char rsp_xml_body[1024];memset(rsp_xml_body,0,1024);eXosip_lock(this->g_context_eXosip);int ret = eXosip_subscription_build_refresh_request(this->g_context_eXosip, this->m_SubCatalogId, &sub); /* 使用保存下来的会话ID */if(ret != OSIP_SUCCESS){LOG_DEBUG << "eXosip_subscription_build_refresh_request FAILE! Error code: " << ret;return;}snprintf(rsp_xml_body, 1024, "<?xml version=\"1.0\"?>\r\n""<Query>\r\n""<CmdType>Catalog</CmdType>\r\n""<SN>%s</SN>\r\n""<DeviceID>%s</DeviceID>\r\n""</Query>\r\n","25",deviceInfo.ipc_id);osip_message_set_body(sub, rsp_xml_body, strlen(rsp_xml_body));osip_message_set_content_type(sub, "Application/MANSCDP+xml");ret = eXosip_subscription_send_refresh_request(this->g_context_eXosip, this->m_SubCatalogId, sub);eXosip_unlock(this->g_context_eXosip);if(ret != OSIP_SUCCESS){LOG_DEBUG << "eXosip_subscription_send_refresh_request FAILE! Error code: " << ret;return;}LOG_DEBUG << "eXosip_subscription_send_refresh_request Success !!! ";
}

订阅消息与通知消息体(国标规范)

订阅消息消息体示例如下:

< ? xml version="1.0" ?>
<Query>
< ! -- 命令类型: 目录订阅(必选) -->
<CmdType>Catalog</CmdType>
< ! -- 命令序列号(必选) -->
<SN> 命令序列号</SN>
< ! -- 订阅的系统/行政区划/设备/业务分组/虚拟组织编码(必选) -->
<DeviceID> 订阅编码</ DeviceID>
</Query>

通知消息消息体示例如下, 增加/更新目录通知消息中Item 的字段参数应遵循 A.2.1g) 的规定:

< ? xml version="1.0" ?>
<Notify>
< ! -- 命令类型: 目录订阅(必选) -->
<CmdType>Catalog</CmdType>
< ! -- 命令序列号(必选) -->
<SN> 命令序列号</SN>
< ! -- 订阅的系统/行政区划/设备/业务分组/虚拟组织编码(必选) -->
<DeviceID> 订阅编码</DeviceID>
< ! -- 通知消息中SumNum 取值与 DeviceList 中 Num 取值相同(必选) -->
<SumNum>2</SumNum><DeviceList Num="2"><Item>
< ! -- 状态改变的系统/设备/行政区划编码(必选) -->
<DeviceID> 编码1</DeviceID>
< ! -- 状态改变事件 ON: 上线, OFF: 离线, VLOST: 视频丢失,DEFECT: 故障,
ADD: 增加,DEL: 删除,UPDATE: 更新(必选) -->
<Event>OFF</Event>
</Item><Item>< ! -- 状态改变的系统/设备/行政区划编码(必选) -->
<DeviceID> 编码n</DeviceID>
< ! -- 状态改变事件 ON: 上线, OFF: 离线, VLOST: 视频丢失,DEFECT: 故障,
ADD: 增加,DEL: 删除,UPDATE: 更新(必选) -->
<Event>ADD</Event>
<Name>IPC_天山视频</Name>
< Manufacturer>XXX</Manufacturer>
< Model>1.0</Model>
<Owner>0</Owner>
<CivilCode>650102</CivilCode>
<Address>axy</Address>
<Parental>0</Parental>
<RegisterWay>1</RegisterWay>
<Secrecy>0</Secrecy>
<Status>ON</Status>
</Item>
</DeviceList>
</Notify

参考来源:
DZ先生怪谈国标28181之目录订阅与通知
GB28181目录订阅记录

什么是视频监控平台的订阅和通知相关推荐

  1. RTSP/RTMP/GB28181协议视频监控平台搭建之国网B接口协议介绍

    我们知道TSINGSEE青犀视频全线产品对应了不同的视频协议,比如EasyNVR就是支持RTSP协议的视频平台,EasyDSS是支持RTMP协议的视频平台,EasyGBS是支持GB28181协议的视频 ...

  2. iSpy免费的开源视频监控平台

    iSpy包括英文,Deutsch,Español,Française,Italiano和中文的翻译 iSpy是我们免费的开源视频监控平台.iSpy作为安装的Windows应用程序运行,具有完整的本地用 ...

  3. 中小学、幼儿园校园明厨亮灶视频监控平台要求

    中小学.幼儿园校园明厨亮灶视频监控平台要求 为进一步落实学校食品安全主体责任,加强学校食堂食品安全管理工作,完善食品安全管理制度,规范加工制作行为,严厉打击食品安全违法违规行为,预防食物中毒事件的发生 ...

  4. 视频监控平台-GB28181-语音对讲功能

    视频监控平台-GB28181-2016语音对讲功能 很多人在问我,语音对讲是怎么流程, 实现了怎么去测试,语音对讲是在2014版本提出来的,我这里详细写一遍国标28181-2016语音对讲的功能介绍. ...

  5. 利用华为云ECS服务器搭建安防视频监控平台

    1. 前言 华为云的弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效率 ...

  6. TSINGSEE青犀视频监控平台的多种联网方式详解

    TSINGSEE青犀视频根据流媒体传输协议的不同,拥有满足不同需求的视频监控平台.比如有支持国标GB28181协议的EasyGBS国标云服务,支持RTSP/Onvif协议的EasyNVR平台,以及可兼 ...

  7. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  8. 浅析搭建高速公路视频监控平台的建设方案及必要性

    一.方案背景 搭建高速公路视频监控平台的必要性有如下几点: 1)用于高速收费站的收费流程监控.安全监察.智能收费等相关管理工作: 2)用于交通卡口的测速.应急车道占用抓拍.违规行驶抓拍等: 3)用于监 ...

  9. 智慧城市视频监控平台组成

    视频监控平台对本级接入的各种资源进行汇集管理,为上下级平台提供调用服务. (1)平台组成 平台由建立在 VPN 视频专用网络上的"中心管理"."媒体管理"&qu ...

最新文章

  1. R语言as.double函数(转化为浮点型)和is.double函数(检验是否为浮点型)实战
  2. 在git项目误上传了本地idea配置文件,如何解决?
  3. 使用说明 vector_Paddlepaddle学习|Ubuntu环境使用 Mahout 进行朴素贝叶斯模型的训练和测试...
  4. Kubernetes - - k8s - v1.12.3 OpenLDAP统一认证
  5. 通过set方式注入的bean为null_Spring 注入集合
  6. android在特定时间,如何在Android Oreo的特定时间在Android上发出通知?
  7. 已知信码序列为1011_信息论与编码理论习题答案解析.doc
  8. 新松机器人产业小镇_啃下“硬骨头”!“青岛造”机器人挺进新加坡港
  9. 普通web项目转maven项目
  10. SQL Developer显示多个工作表
  11. 华为手机连不上adb解决方法
  12. numpy.mgrid的用法图解
  13. vibe算法 c++实现
  14. 怎么删除远程桌面连接IP记录 删除连接信息
  15. 长截图、识别图片里的文字,不用装其它软件!
  16. DICOM世界观·第二章 数字(D)、成像(I)与通讯(Co)
  17. word里如何在□里打√!框框里打勾!!!!!
  18. 网易AI平台开放多项技术,助力网易七鱼智能客服升级
  19. 计算机科学技术学院迎新晚会主题,计算机科学与技术学院2019迎新晚会圆满落幕...
  20. 双向可控硅详细用法说明

热门文章

  1. 连麦互动的网络直播方案
  2. tplinkac2600评测_使用TP-LINK AC2600M双频路由器怎样,穿透性好不好
  3. php表单网页实例,40多个漂亮的网页表单设计实例_HTML/Xhtml_网页制作
  4. Matplotlib数据可视化实操--基础知识、使用PyLab模块和Pyplot模块基础绘图方式
  5. 微信视频号知识付费领域哪些比较好做:国仁楠哥
  6. C++ Primer Plus-基础部分-note1
  7. js怎么打开一个html文件怎么打开方式,JavaScript实现打开链接页面的方式汇总
  8. 手机为什么会发热,发热之后为什么会卡
  9. thinker 库开发的GUI程序-利用Pandas进行excel文档数据的读取和数据比对
  10. 【在linux云服务器上传jar包并运行jar】以及Linux运行包的相关命令