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

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

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)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/210069.html
標籤:其他
上一篇:數字影像處理實驗五
