EasyNVR现场设备离线后无法自动重连如何优化?

本文探讨了EasyNVR在视频监控中的稳定性,着重分析了设备掉线后的自动重连机制,并揭示了遇到的特定问题——设备离线后无法重连。通过代码剖析和日志定位,解决了因defer阻塞导致的问题,优化了处理RTC空闲时的通知。
摘要由CSDN通过智能技术生成

EasyNVR是我司比较热门的产品之一,很多用于室内固定IP摄像头监控的场景都能够适用。有的开发者在使用之前可能会担心系统是否稳定?掉线是否频繁?是否支持设备重连?这一点相信很多使用过EasyNVR的朋友都有了比较深切的体验,断线自动重连可以算是我们的基本功能了。EasyNVR已经是一个非常成熟的视频平台了,系统稳定,且支持二次开发,是很多视频行业监控直播的不二选择。

EasyNVRonvif协议.png

在网络不稳定或者其他因素的影响下,也会出现设备掉线的情况,正常来说,设备掉线后大多能够进行自动重连。但部分现场出现设备离线后,会出现永远不在线的情况,对于这种情况我们需要进一步排查。

image.png

在代码中添加日志查看,再 Open() 打开流的操作,一直没有返回数据在该函数中。

r1, _, _ = procClientSetCallback.Call(client.handle, uintptr(unsafe.Pointer(C.__EasyStreamClientCallBack)))
if r1 != 0 {
   err = fmt.Errorf("%v EasyStreamClient_SetCallback failed, ret[%d]", client, r1)
   return
}
curl, err := syscall.BytePtrFromString(client.URL)
if err != nil {
   return
}
timeout := utils.Conf().Section("base_config").Key("open_stream_timeout").MustInt(5)
r1, _, _ = procClientOpenStream.Call(client.handle, uintptr(unsafe.Pointer(curl)), uintptr(client.TransType), client.handle, 1000, uintptr(timeout), 0)
if r1 != 0 {
   err = fmt.Errorf("%v EasyStreamClient_OpenStream failed, ret[%d]", client, r1)
   return
}

发现在最后的 return 并没有代码返回,因此定位到是在 defer 中阻塞了,定位到问题点。

原defer 代码如下,经过分析后发现,代码阻塞在 rtcQuit 这段代码中。

defer func() {
   if client.handle != 0 && err != nil {
      procClientDeinit.Call(client.handle)
      client.unregist()
      client.handle = 0
      client.Status = STREAM_STOPED
      client.rtcQuit <- 1
    }
}()

因此修改代码如下,只有在 RTC 为空的情况下才发送信息到通道中。

defer func() {
   if client.handle != 0 && err != nil {
      procClientDeinit.Call(client.handle)
      client.unregist()
      client.handle = 0
      client.Status = STREAM_STOPED
      if client.Rtc != nil {
         client.rtcQuit <- 1
      }
   }
}()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值