大家知道,在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管理平台,欢迎大家联系我们了解咨询。