RTSP/GB28181/Ehome協議/HIKSDK視訊融合共享平臺EasyCVR級聯到上級國標平臺線上狀態不更新修復

TSINGSEE發表於2020-11-09

支援RTSP、GB28181、SDK、Ehome協議的視訊平臺EasyCVR支援將所有視訊通道通過GB28181協議級聯到上級國標平臺上,且支援同一通道級聯到多個上級平臺,這一操作給很多使用者的級聯帶來了便捷。

微信截圖_20201026174750.png

但是EasyCVR在1.0.34的版本當中,EasyCVR級聯到國標平臺,下級平臺顯示上級平臺線上狀態時狀態更新異常。

37.png

EasyCVR中上級平臺的線上狀態更新是由定時器完成,通過國標協議中心跳包去判斷上級平臺的狀態,但是隻在上級平臺線上時才進行檢測,如果出現網路問題,上級平臺狀態為離線後,不會去定時檢測。當網路恢復正常,Easycvr中的上級平臺狀態無法恢復。

因此我麼可以通過修復判斷規則修復該問題,參考程式碼如下:

func (c *Client) StartKeepAlive() {
	defer func() {
		if err := recover(); err != nil {
			err_logger.Error(fmt.Sprintf("%s\n", err))
			err_logger.Error(fmt.Sprintln(string(debug.Stack())))
		}
	}()
	timer := time.NewTicker(time.Duration(c.Cascade.KeepaliveInterval) * time.Second)
	defer timer.Stop()
	for !c.Stoped {
		select {
		case <-timer.C:
			c.doKeepAlive()
		case <-c.KeepAliveQuit:
			c.ClientOnline(false)
			log.Println("級聯保活停止:", c.Cascade.ID)
			return
		}
	}
}
func (c *Client) doKeepAlive() {
	req, _, err := c.MakeKeepAliveRequest(c.LocalSerial, c.Cascade.Realm)
	if err != nil {
		log.Println("級聯心跳包組包失敗")
		return
	}
	err = req.SendByTransport(c.Transport)
	if err != nil {
		log.Println("級聯心跳包傳送失敗", err.Error())
		return
	}
	log.Println("級聯保活:", c.Cascade.ID)
	res, err := c.WaitAck(req.HeaderMap["Call-ID"], req.HeaderMap["CSeq"])
	if err != nil {
		c.ClientOnline(false)
		return
	}
	if res.StatusCode != 200 {
		c.ClientOnline(false)
		return
	}else{
		c.ClientOnline(true)
	}
}

相關文章