​GB28181心跳机制探讨和技术实现

​GB/T 28181-2016心跳机制​

​通过周期性的状态信息报送,实现注册服务器与源设备之间的状态检测即心跳机制。 ​

​心跳发送方、接收方需统一配置“心跳间隔”参数,按照“心跳间隔”定时发送心跳消息,默认心跳间隔60s。心跳发送方、接收方需统一配置“心跳超时次数”参数,心跳消息连续超时达到“心跳超时次数”则认为对方下线,默认心跳超时次数3次。​

​心跳接收方在心跳发送方上线状态态下检测到心跳消息连续超时达到商定次数则认为心跳发送方离线;心跳发送方在心跳接收方上线状态下检测到心跳消息响应消息连续超时达到商定次数则认为心跳接收方离线。​

状态信息流程如下:

 

具体技术实现

本文以我们实现的Android平台GB28181国标接入模块为例,探讨下大概实现。

相关参数定义:

private int gb28181_reg_expired_           = 3600; // 注册有效期时间最小3600秒
private int gb28181_heartbeat_interval_    = 20; // 心跳间隔GB28181默认是60, 目前调整到20秒
private int gb28181_heartbeat_count_       = 3; // 心跳间隔3次失败,表示和服务器断开了

设置到GB28181实现层:

// GB28181配置
gb28181_agent_.config(gb28181_reg_expired_, gb28181_heartbeat_interval_, gb28181_heartbeat_count_);

MESSAGE组成:

MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/TCP 192.168.0.120:60771;rport;branch=z9hG4bK741568174
From: <sip:34020000002000000005@3402000000>;tag=790237397
To: <sip:34020000002000000001@3402000000>
Call-ID: 282416456
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length:   176<?xml version="1.0" encoding="GB2312"?>
<Notify>
<CmdType>Keepalive</CmdType>
<SN>2</SN>
<DeviceID>34020000002000000005</DeviceID>
<Status>OK</Status>
<Info>
</Info>
</Notify>

底层针对异常的处理,如果超过设定的异常次数,状态回调上去,便于上层做进一步处理:

int count =  mExcepitonCount.incrementAndGet();
if ( count >= mConfig.getHeartBeatCount() ) {Log.e(GBDefine.LOGTAG, "KeepAlive.sendRequest() KeepAlive reached HeartBeatTimeoutCount:" + mConfig.getHeartBeatCount() + ", notify listener");GBSIPAgentListener listener = this.getListener();if ( listener != null) {listener.ntsOnHeartBeatException(count, e.getMessage());}
}

上层收到底层发过来的心跳异常回调,并做相应的处理:

/** CameraPublishActivity.java* CameraPublishActivity* 针对心跳异常处理** Github: https://github.com/daniulive/SmarterStreaming*/  
@Overridepublic void ntsOnHeartBeatException(int exceptionCount,  String lastExceptionInfo) {Log.e(TAG, "ntsOnHeartBeatException heart beat timeout count reached, count:" + exceptionCount+", exception info:" + (lastExceptionInfo!=null?lastExceptionInfo:""));// 10毫秒后,停止信令, 然后重启handler.postDelayed(new Runnable() {@Overridepublic void run() {Log.i(TAG, "gb28281_heart_beart_timeout");stopGB28181Stream();destoryRTPSender();if (gb28181_agent_ != null) {Log.i(TAG, "gb28281_heart_beart_timeout sip stop");gb28181_agent_.stop();Log.i(TAG, "gb28281_heart_beart_timeout sip start");gb28181_agent_.start();}}},10);}

感兴趣的开发者,可以自行参考实现。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win7系统电脑怎么设置桌面壁纸全屏显示

我们在使用电脑的时候经常会进行一些个性化的设置。电脑桌面壁纸肯定是许多小伙伴最先更改的个性化设置之一。但是有许多小伙伴发现自己的win7电脑在更换壁纸的时候&#xff0c;图像显示过小&#xff0c;没有办法全屏显示&#xff0c;Win7系统电脑怎么设置桌面壁纸全屏显示?下…

Unity3D下Linux平台播放RTSP或RTMP流

背景 尽管Windows平台有诸多优势&#xff0c;Linux平台的发展还是势不可挡&#xff0c;特别实在传统行业&#xff0c;然而Linux生态构建&#xff0c;总是差点意思&#xff0c;特别是有些常用的组件&#xff0c;本文基于已有的Linux平台RTSP、RTMP播放模块&#xff0c;构建Unit…

std::jthread与std::thread区别

​std::jthread是C20新引入的线程类&#xff0c;与 std::thread 类似&#xff0c;或者说&#xff0c;jthread是对thread进一步的封装&#xff0c;功能更强大​。 ​std::jthread的​j实际上是​joining的缩写​&#xff0c;​众所周知&#xff0c;std::thread在其生命周期结束…

Win11如何调整任务栏大小 Win11调整任务栏大小的方法

现在已经有很多小伙伴都已经安装Win11系统进行体验了&#xff0c;但有一些小伙伴在体验的时候想要更改任务栏大小却不知道如何操作&#xff0c;那么碰到这种问题应该怎么办呢?下面就和小编一起来看看有什么解决方法吧。 Win11调整任务栏大小的方法 1、win11的任务栏大小&…

Unity3D平台实现全景实时RTMP|RTSP流渲染

好多开发者的使用场景&#xff0c;需要在Windows特别是Android平台实现Unity3D的全景实时视频渲染&#xff0c;本文以Windows平台为例&#xff0c;简单介绍下具体实现&#xff1a; 如果是RTSP或RTMP流数据&#xff0c;实际上难点&#xff0c;主要在于拉取RTSP或RTMP流&#xf…

C++17新特性之std::string_view

std::string_view系C17标准发布后新增的内容&#xff0c;类成员变量包含两个部分&#xff1a;字符串指针和字符串长度&#xff0c;相比std::string, std::string_view涵盖了std::string的所有只读接口。如果生成的std::string无需进行修改操作&#xff0c;可以把std::string转换…

谷歌浏览器该扩展程序未列在Chrome网上应用店中解决方法

很多用户在谷歌浏览器中安装扩展程序的时候会发现有些扩展程序安装后会显示红字“该扩展程序未列在Chrome网上应用店中”&#xff0c;然后插件未能正常启用&#xff0c;这让其很是苦恼&#xff0c;那么下面就来说一下如何解决这类插件安装的问题。 谷歌浏览器该扩展程序未列在…

Android平台实现RTSP|RTMP转GB28181网关接入

背景 在事先Android平台RTSP、RTMP转GB28181网关之前&#xff0c;我们已经实现了Android平台GB28181的接入&#xff0c;可实现Android平台采集到的音视频数据&#xff0c;编码后&#xff0c;打包按需发到GB28181服务平台。此外&#xff0c;拉流端&#xff0c;我们已经有了成熟…

一句话解释C++指针和引用区别

记住一句话就够了&#xff1a;指针三心二意&#xff0c;引用从一而终&#xff01; 指针是一个实体&#xff0c;而引用可理解为一个别名&#xff1b; ”sizeof(指针)”得到的是指针本身的大小&#xff0c;”sizeof(引用)”返回所指向的变量(对象)的大小。 引用一定不为空&…

大地Win11 64位全新专业版系统V2021.08

大地Win11 64位全新专业版系统V2021.08以微软官方原版作为母盘对系统进行了全面优化更新&#xff0c;用户使用更加流畅顺手&#xff0c;轻松体验到系统的优秀性能&#xff0c;适用目前市场最新机型以及老旧机型&#xff0c;多种安装方式供用户选择&#xff0c;且更新时间短无需…

Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)

技术背景 随着物联网等行业的崛起&#xff0c;越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等&#xff0c;对Linux下的生态构建&#xff0c;有了更大的期望&#xff0c;Linux平台下&#xff0c;可选的直播推拉流解决方案相对Windows和移动端&#xff0c;非常少…

电脑公司Win11 64位全新旗舰版镜像V2021.08

电脑公司Win11 64位全新旗舰版镜像V2021.08以微软官方原版作为母盘对系统进行了全面优化更新&#xff0c;用户使用更加流畅顺手&#xff0c;轻松体验到系统的优秀性能&#xff0c;适用目前市场最新机型以及老旧机型&#xff0c;多种安装方式供用户选择&#xff0c;且更新时间短…

Android平台实现VR头显Unity下音视频数据RTMP推送

背景 随着技术发展的日新月异&#xff0c;虚拟现实产业已经从过去的探索期&#xff0c;自2020年起&#xff0c;慢慢过渡到高速发展期&#xff0c;随着5G时代的到来&#xff0c;大带宽高可靠低延迟网络环境&#xff0c;为虚拟现实产业提供了很好的网络保障&#xff0c;虚拟现实…

如何快速区分C++左值和右值

C左值和右值&#xff0c;初学者经常傻傻分不清&#xff0c;可参看“C Primer”书中的描述&#xff0c;简单来说&#xff1a; 当一个对象被用作右值的时候&#xff0c;用的是对象的值&#xff08;内容&#xff09;&#xff1b;当对象被用作左值的时候&#xff0c;用的是对象的身…

Win11将沿用Win10升级模式 并会有LTSC版本

微软官方已经确认 Windows 11 将沿用 Windows 10 的升级模式&#xff0c;包括每月的安全更新、可选累积更新、紧急的带外更新、服务栈更新等等。此外&#xff0c;微软还确认将会有个长期服务渠道&#xff08;LTSC&#xff09;版本的 Windows 11。 在近日更新的官方支持文档中&…

C++11特性之std:call_once介绍

std:call_once是C11引入的新特性&#xff0c;如需使用&#xff0c;只需要#include <mutex>即可&#xff0c;简单来说std:call_once的作用&#xff0c;确保函数或代码片段在多线程环境下&#xff0c;只需要执行一次&#xff0c;常用的场景如Init()操作或一些系统参数的获取…

2022年了,该学C++还是Java?

最近好多朋友私信我&#xff0c;C好不好学&#xff1f;学C好还是Java好&#xff1f; 我的回答是&#xff1a;C不好学&#xff0c;但你觉得C不好学的话&#xff0c;Java也不好学。因为C难是难在语言本身&#xff0c;java难是难在各种框架和库。 C学习进阶比较陡, 对新手不友好&…

Outlook怎么打印日历 Outlook日历打印教程

Outlook中的日历想要打印出来&#xff0c;该怎么打印日历呢?下面我们就来看看详细的教程。 Outlook怎么打印日历? Outlook日历打印教程 1、下载安装outlook软件。 Outlook怎么打印日历? Outlook日历打印教程 2、双击打开outlook软件&#xff0c;登入邮箱账户。 Outlook…

Android平台音视频RTMP推送|GB28181对接之动态水印设计

技术背景 随着移动单兵、智能车载、智慧安防、智能家居、工业仿真、GB28281技术对接等行业的发展&#xff0c;现场已经不再限于采集到视频数据编码打包发送或对接到流媒体服务端&#xff0c;大多场景对视频水印的要求越来越高&#xff0c;从之前的固定位置静态文字水印、png水…

TIM怎么更新版本 TIM检查更新版本教程

TIM是非常好用的软件&#xff0c;与传统的QQ比起来比较轻便&#xff0c;简洁大方&#xff0c;今天小编教大家怎样TIM检查更新。 TIM检查更新版本教程 首先&#xff0c;打开TIM&#xff0c;如下图所示&#xff0c;TIM是这个图标&#xff0c;如果在metro界面&#xff0c;就是第…