【BUG修复】视频综合管理平台EasyNVS首页设备接入情况显示与实际不符如何调整?
大家知道,在RTSP协议摄像头没有公网固定IP的情况下,TSINGSEE青犀视频云边端架构中的EasyNVR是部署在内网的,而要实现公网直播,则需要在公网部署一套EasyNVS视频综合管理平台,用于同一接入管理EasyNVR。
这几天TSINGSEE青犀视频团队在运行EasyNVS进行测试,进入首页后查看设备接入情况及运行情况,测试中EasyNVS并未接入设备,但在首页的设备接入情况中,显示接入了4套设备。
然而当查找设备时,有无法查询到设备,显示的信息与实际不符:
通过接口查看是调用EasyNVS的/api/v1/stats这个接口,然后查看后端代码,所有的数据都是这个里面。
func (h *APIHandler) Stats(c *gin.Context) { devices := make([]*models.Device, 0) deviceData := make([]map[string]interface{}, 0) db.SQLite.Model(models.Device{}).Order("created_at desc").Find(&devices) deviceCount := len(devices) onlineDeviceCount := 0 channelCount := 0 enabledChannelCount := 0 onlineChannelCount := 0 for _, dev := range devices { if dev.Online { deviceData = append(deviceData, map[string]interface{}{ "ID": dev.ID, "Name": dev.Name, "DiskTotalSize": dev.DiskTotalSize, "DiskUsedSize": dev.DiskUsedSize, "DiskUsedPercent": dev.DiskUsedPercent, "CPUUsedPercent": dev.CpuUsedPercent, "MEMUsedPercent": dev.MemUsedPercent, }) onlineDeviceCount++ onlineChannelCount += dev.OnlineChannelCount } channelCount += dev.ChannelCount enabledChannelCount += dev.EnabledChannelCount } totoalInBytes := server.StatsGetServer().TotalTrafficIn totalOutBytes := server.StatsGetServer().TotalTrafficOut todayInBytes := server.StatsGetServer().TodayTrafficIn todayOutBytes := server.StatsGetServer().TodayTrafficOut c.IndentedJSON(200, gin.H{ "CPUData": cpuData, "MEMData": memData, "InBitrateData": inBitrateData, "OutBitrateData": outBitrateData, "DeviceData": deviceData, "MessageData": models.GetLatestSysMsg(10), "TotalInBytes": totoalInBytes, "TotalOutBytes": totalOutBytes, "TodayInBytes": todayInBytes, "TodayOutBytes": todayOutBytes, "DeviceCount": deviceCount, "OnlineDeviceCount": onlineDeviceCount, "ChannelCount": channelCount, "EnabledChannelCount": enabledChannelCount, "OnlineChannelCount": onlineChannelCount, }) }
可以看到代码都是没有问题的。于是查看数据库,发现device表中有很多之前连接上来,但后来下线却没有删除的数据,于是就确定了是这些数据导致的问题。
要解决该问题,我们可以找到EasyNVR下线的地方,在此处添加一个删除设备表的操作。参考代码如下:
case *server.HttpOutConf: log.Printf("<<<<<< EasyNVR [ID=%s, Name=%s] closed <<<<<<", conf.DeviceID, conf.DeviceName) models.OfflineDevice(conf.DeviceID) db.SQLite.Create(&models.SysMsg{ Type: "device", Level: 1, Content: fmt.Sprintf("设备%s下线", conf.DeviceName), }) // 删除设备表 var device models.Device db.SQLite.Where("id = ?", conf.DeviceID).First(&device) if device.ID != "" { db.SQLite.Delete(&device) }
于是EasyNVS在线,EasyNVR主动下线后数据仍存在的问题消除了。
但是还存在另一种情况,即EasyNVR已经连接到EasyNVS了,EasyNVS关掉,EasyNVR下线,此时重新启动EasyNVS,EasyNVS中仍有接入过得EasyNVR的信息。
该情况比较简单,我们只需在启动EasyNVS的时候,先将device表清空,这样就规避了这个情况了。
p.StartHTTP() // 启动时清空已经连接上来的设备(device) db.SQLite.Delete(&models.Device{})
EasyNVS云管理平台的web界面清晰呈现设备接入状况、运行时长、宽带使用、存储空间和流量统计等状态,运维者直观获悉平台及设备健康状态,通过管理平台远程定位故障,帮助运维人员提高网络排查效率。获得EasyNVR的永久授权即可同步使用EasyNVS管理平台,欢迎大家联系我们了解咨询。