GB28181心跳机制探讨和技术实现
生活随笔
收集整理的這篇文章主要介紹了
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);}感興趣的開發者,可以自行參考實現。
?
總結
以上是生活随笔為你收集整理的GB28181心跳机制探讨和技术实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NodeJs express自定义中间件
- 下一篇: 【机器学习】降维代码练习