| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> GB28181 安卓移动设备位置上报实现(订阅和通知实现) -> 正文阅读 |
|
[网络协议]GB28181 安卓移动设备位置上报实现(订阅和通知实现) |
GB28181中事件订阅和通知机制是基于RFC3265 中的SIP扩展方法SUBSCRIBE和NOTIFY实现的。代码实现之前,先了解下相关协议. 这里先简单说明下RFC3265: 1.SUBSCRIBE请求中应该包含"Expires“头, 快到期的时候,需要在重新发送SUBSCRIBE刷新订阅有效期(有效期单位是秒)。 2.SUBSCRIBE 2xx响应中也必须包含"Expires”,这个值可以比请求中的小,但不能比它大。 3.SUBSCRIBE请求中"Expires“为0表示取消订阅. 4.SUBSCRIBE请求必须包含"Event"头,对于GB28181来说,移动设备位置订阅这个值是"presence", 也可能包含一个"id"参数,这个"id"参数仅在一个Dialog范围内有效(Dialog概念请参考RFC3261), GB28181中域间目录订阅通就有"id“参数,例如:
移动设备位置订阅:
5.SUBSCRIBE 请求可能会创建Dialog(INVITE也可能创建Dialog), 订阅被Notifier接受的话要响应一个2xx最终响应(SIP中临时响应是1xx), 如果收到非2xx的最终响应,表示没有订阅成功或相应的Dialog已经被创建,并且没有后续的NOTIFY消息被发送。收到489 Bad Event 表示订阅事件不能被Notifier理解。如果SUBSCRIBE 请求是一个刷新请求,收到481响应表示订阅会话已经被终止。还有一点要注意,使用UDP传输SIP消息时,NOTIFY messages可能会比SUBSCRIBE 200 response先到达,实现中要处理好这一点。 6.取消订阅只要"Expires“头设置为0即可,要注意的是取消订阅成功的话,也会发一个最终的NOTIFY message. 7,Notifier会检查SUBSCRIBE请求中"Expires"值是不是太小,当且仅当这个值大于0且小于1小时,并且小于Notifier配置的最小值时,Notifier可能会返回一个"423 Interval too ?small"错误,并包含一个""Min-Expires" 头域。 8.发送SUBSCRIBE 2xx响应后,要立即发送一个NOTIFY message. 9.前面已经提过订阅到期之前,需要在同一个Dialog中发送刷新SUBSCRIBE请求,需要包含"Expires"头,值可以和上一次的不一样,如果这个值太小,Notifier应该响应423("423 Subscription Too Brief"), 如果订阅到期之前没有收到刷新请求,这个订阅需要被移除,移除时需要发送一个NOTIFY message,消息要包含"Subscription-State",具体格式如下:
相应的Dialog也要终止. 10.NOTIFY请求也要有"Event"头,这个头必须和对应的SUBSCRIBE请求中的"Event"头匹配,如果有"id"参数的话,"id"参数也要匹配. 11.NOTIFY?request 超时的话,notifier应该移除这个订阅. 12.NOTIFY?request响应非2xx的话,响应没有"Retry-After"头,并且也没有其他暗示让重新发送request, notifier必须移除这个订阅. 13.NOTIFY request收到一个481响应,?notifier必须移除这个订阅. 14.NOTIFY request必须包含"Subscription-State"头,有三个可选的值:"active", "pending", "terminated". 当值是"active"或"pending"时,应该也包含一个”expires“参数,显示订阅剩余时间,例如:
15.对于NOTIFY request中?"Subscription-State" 头参数,RFC3265 3.2.4节中有这么一句:
不过我在GB28181事件通知消息示范中(可以看下GB28181-2016 J.21)看到类似如下示例:
多了个"retry-after"参数,不过应该不影响实际应用. 16.多个订阅能关联同一个Dialog上, 多个订阅也可以存在于INVITE创建的Dialog,如果订阅销毁后,没有其他应用状态和Dialog关联,那Dialog也终止.反过来也是,这里要注意一点是使用INVITE创建的Dialog不一定会在收到BYE时终止;多个订阅关联一个Dialog,要等到所有关联订阅销毁后,Dialog才终止. GB28181事件订阅和通知规定简单说明: 1.事件源接受事件订阅,并发通知。事件观察者订阅事件,接受通知。事件源可以是安卓移动设备等。事件观察者可以是SIP服务器等。事件包括移动设备位置通知等事件。 2.观察者发SUBSCRIBE请求,返回200OK 表示订阅成功,按文档说明返回400应该是订阅没成功吧,或者在刷新订阅的时候,返回400表示订阅会话结束. 关于返回失败状态码问题, RFC3265也有讨论,具体实现还是看实际系统吧。 3.SUBSCRIBE 请求消息Content-type:Application/MANSCDP+xml. 4.移动设备位置上报事件的SUBSCRIBE请求消息体采用 MANSCDP协议格式, 注意这个事件的响应消息没有消息体,而报警事件响应消息有消息体的。 5.事件源接受事件订阅后,在事件触发后立即通知观察者(RFC3265是说事件源发送SUBSCRIBE 2xx响应后,要立即发送一个NOTIFY消息,这里我建议立即发送NOTIFY消息,不要等到事件触发后再发送,有一个原因就是订阅者收到NOTIFY请求(如果还没有收到SUBSCRIBE 2xx)就可以创建一个新的Dialog和Subscription). 6.NOTIFY 请求消息Content-type:Application/MANSCDP+xml. 7,移动设备位置通知的NOTIFY 请求消息体采用 MANSCDP协议格式定义,注意响应没有消息体. 8.移动设备位置上报 SUBSCRIBE 请求示例(这个是我补充的,GB28181中没有给出位置上报相关消息示例):
? ? 请求体XML:
9.移动设备位置上报 NOTIFY 请求示例(这个是我补充的,GB28181中没有给出位置上报相关消息示例):
? ?请求体XML:
10. GB28181 A.2.5-e?中定义:
? GB28181位置上报订阅通知相关说明到此为止,接下来是具体代码实现了,毕竟文字说明并不适合描述代码细节,代码才是干货. 移动位置订阅,我安卓上的实现接口如下:
? ? ?demo 代码如下:
?从协议到代码实现,还是要花些精力的,?更多问题可以联系qq:?1130758427,? ?github |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:01:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |