​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);
  }

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

相关文章
|
网络协议 网络架构
计算机网络期末复习——计算大题(一)
计算机网络期末复习——计算大题(一)
1090 0
计算机网络期末复习——计算大题(一)
|
传感器 Rust 安全
为什么物联网领域使用Rust的项目越来越多?
2021年2月8日,Rust基金会成立,Rust商标及所有权移交给基金会。
为什么物联网领域使用Rust的项目越来越多?
|
Linux Docker 容器
Docker 容器抓包说明
正常情况下,操作系统层面可以通过 tcpdump 来抓包。但对于容器环境,根据所使用的 base 镜像的不同,容器内不一定含有抓包工具,所以无法直接抓包。本文简要介绍如何通过 ```nsenter``` 工具来对容器快速抓包。 # nsenter 工具介绍 nsenter 包含在绝大部分 Linux 发行版预置的 util-linux 工具包中。它可以进入指定进程的关联命名空间。包
9216 0
|
4月前
|
人工智能 JSON API
淘宝/天猫:使用物流查询API实时显示包裹位置,减少客服咨询量
在电商竞争激烈的环境下,淘宝、天猫通过集成物流查询API,实现实时追踪包裹位置,显著减少用户咨询量。本文解析其原理、实现步骤与效益,展示如何以技术手段提升用户体验、降低客服压力,助力平台高效运营。(238字)
351 0
|
1月前
|
人工智能 NoSQL 前端开发
springai
SpringAI整合多款主流大模型,支持对话、函数调用与RAG等架构,提供统一API简化开发。涵盖Ollama、OpenAI等平台,实现聊天机器人、智能客服、知识库问答(如ChatPDF)及多模态交互,助力快速构建AI应用。
354 0
|
编解码 Python
Python如何给视频添加音频和字幕
Python如何给视频添加音频和字幕
|
前端开发 JavaScript
Vite 多种前端框架的构建
Vite 多种前端框架的构建
|
安全 网络安全 Windows
电脑插上U盘不显示怎么回事?怎么解决?
平时使用电脑的时候经常会使用U盘来传输数据或是备份文件,有时候会遇到一个令头疼的问题,比如,将U盘插入电脑的USB口后,设备却显示不出来。电脑上插入U盘后却不显示会影响我们的正常工作。接下来,我们一起分析一下故障的原因和常见的解决方法。
|
数据采集 人工智能 监控
【最佳实践】实时计算Flink在广告行业的实时数仓建设实践
通过每个广告位上不同广告的投放地区、广告ID、设备唯一编码等信息,可以统计点击次数、投放次数等指标,可用于制定更高效的广告投放策略,降低投放成本,提高广告收益。