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

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

GB/T 28181-2016心跳机制

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


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


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


状态信息流程如下:

425ed2984c6f41c8b0a59b0301cf05d5.png

具体技术实现

本文以我们实现的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
 */  
@Override
  public 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() {
          @Override
          public 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);
  }

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

相关文章
|
监控 前端开发 网络协议
GB/T 28181-2016多响应消息传输探究
我们在实现Android平台GB28181设备接入模块的时候,有遇到发送多条记录的情况,本文主要探讨下GB28181多响应传输。
132 0
|
NoSQL API 调度
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
.NET开源的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化) - FreeScheduler
225 0
|
3月前
|
消息中间件 网络协议 RocketMQ
RocketMQ Controller 模式 始终更新成本机ip
ontrollerAddr=192.168.24.241:8878 但是日志输出Update controller leader address to 127.0.0.1:8878。导致访问失败
78 3
|
9月前
|
NoSQL Redis 数据安全/隐私保护
大事件后端项目35——登录优化_redis_主动失效机制实现
大事件后端项目35——登录优化_redis_主动失效机制实现
|
前端开发 芯片
【芯片前端】延迟一拍出数的握手型ram结构的一次探索
【芯片前端】延迟一拍出数的握手型ram结构的一次探索
153 0
|
消息中间件 NoSQL Java
Redis实现延迟队列,我研究了两种方案,发现并不简单
前段时间有个小项目需要使用延迟任务,谈到延迟任务,我脑子第一时间一闪而过的就是使用消息队列来做,比如RabbitMQ的死信队列又或者RocketMQ的延迟队列,但是奈何这是一个小项目,并没有引入MQ,我也不太想因为一个延迟任务就引入MQ,增加系统复杂度,所以这个方案直接就被pass了。
|
机器学习/深度学习 5G
beamManagement(一)idle初始接入过程
NR中所有的上下行信道的发送和接收都是基于波束。基站通过对信道质量的测量来动态选择UE和基站之间波束的方向和频率,进而完成通信。NR使用的频率信号是高频信号,高频意味着波长越短,天线也就越短。当无线信号辐射变为波束形状后,就很难使用单个的天线传输同时覆盖多个UE,因而NR的天线数量大大增加,形成更多波束,提升覆盖;NR使用Massive MIMO技术时,就需要使用大规模天线阵列,进而实现多用户空分,提升频谱利用率; 提升能量利用率,满足覆盖需求(特别是高频)。beam forming 不是本篇的重点(其实我也不太会),可以百度看下具体内容。这里只关注3GPP spec中相关的波束管理的内容。
|
消息中间件 NoSQL JavaScript
用 Redis 实现延迟队列,我研究了两种方案,发现并不简单 下
用 Redis 实现延迟队列,我研究了两种方案,发现并不简单 下
|
消息中间件 NoSQL JavaScript
用 Redis 实现延迟队列,我研究了两种方案,发现并不简单 上
用 Redis 实现延迟队列,我研究了两种方案,发现并不简单 上
|
消息中间件 RocketMQ
扩展RocketMQ 使其支持任意时间精度的消息延迟(2)
扩展RocketMQ 使其支持任意时间精度的消息延迟(2)
355 0
扩展RocketMQ 使其支持任意时间精度的消息延迟(2)