go_rabbitmq/app/lib/device_registry.go

163 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package lib
import (
"fmt"
entity2 "node_rabbit_go/app/entity"
"strings"
"time"
)
type DeviceRegistry struct {
DeviceRegistry map[string]entity2.Device
DeviceUptimeRegistry map[string]entity2.DeviceUptime
RequestController *RequestController
OnlineDevices []string
TempBeforeUpdateTSSYNC []string
}
func NewDeviceRegistry(rc *RequestController) *DeviceRegistry {
dr := &DeviceRegistry{
DeviceRegistry: make(map[string]entity2.Device),
DeviceUptimeRegistry: make(map[string]entity2.DeviceUptime),
RequestController: rc,
OnlineDevices: []string{},
TempBeforeUpdateTSSYNC: []string{},
}
go dr.initializeRegistry()
return dr
}
func (dr *DeviceRegistry) initializeRegistry() {
getDeviceList, _ := dr.RequestController.MySQL.Query(`select * from device where 1`)
//defer getDeviceList.Close()
for getDeviceList.Next() {
var device entity2.Device
err := getDeviceList.Scan(&device.Id, &device.Name)
if err != nil {
fmt.Println("Error scanning device:", err)
continue
}
dr.DeviceRegistry[device.Id] = device
}
getUptimeList, _ := dr.RequestController.MySQL.Query(`select * from device_uptime where 1`)
for getUptimeList.Next() {
var uptime entity2.DeviceUptime
err := getUptimeList.Scan(&uptime.Id, &uptime.Device_id)
if err != nil {
fmt.Println("Error scanning uptime:", err)
continue
}
dr.DeviceUptimeRegistry[uptime.Device_id] = uptime
}
}
func (dr *DeviceRegistry) FindDevice(mid string) entity2.Device {
device, found := dr.DeviceRegistry[mid]
if !found {
rows, err := dr.RequestController.MySQL.Query(fmt.Sprintf("select * from device where mid = '%s'", mid))
if err != nil {
fmt.Println("Error querying device:", err)
return entity2.Device{} // Предположим, что у вас есть структура для устройства
}
//defer rows.Close()
if rows.Next() {
var d entity2.Device // Предположим, что у вас есть структура для устройства
err := rows.Scan(&d.Id, &d.Name) // Пример сканирования значений
if err != nil {
fmt.Println("Error scanning device:", err)
return entity2.Device{} // Предположим, что у вас есть структура для устройства
}
dr.DeviceRegistry[d.Mid] = d
return d
}
}
return device
}
func (dr *DeviceRegistry) CheckOnline(device entity2.Device) {
tsNow := time.Now().Unix()
dr.UpdateDeviceTsSync(device.Id)
device.Ts_sync = tsNow
}
func (dr *DeviceRegistry) WriteMM_AgentData(deviceID string, uptime string, queueSize string) {
if deviceID != "" && uptime != "" && queueSize != "" {
_, err := dr.RequestController.MySQL.Query(fmt.Sprintf("UPDATE `device_uptime` SET `uptime`='%s', `queue_size`='%s' WHERE `device_id`='%s'", uptime, queueSize, deviceID))
if err != nil {
return
}
}
}
func (dr *DeviceRegistry) UpdateDeviceTsSync(deviceID string) {
dr.MarkDeviceOnline([]string{deviceID})
if !contains(dr.OnlineDevices, deviceID) {
dr.OnlineDevices = append(dr.OnlineDevices, deviceID)
}
}
func (dr *DeviceRegistry) MarkDeviceOnline(deviceList []string) {
for _, deviceID := range deviceList {
uptime, _ := dr.FindUptime(deviceID)
//if uptime != nil
uptime.Status = 1
}
}
func (dr *DeviceRegistry) MarkDeviceOffline(mid string) {
device := dr.FindDevice(mid)
uptime, _ := dr.FindUptime(device.Id)
uptime.Status = 0
}
func (dr *DeviceRegistry) FindUptime(id string) (entity2.DeviceUptime, error) {
record, found := dr.DeviceUptimeRegistry[id]
if !found {
rows, _ := dr.RequestController.MySQL.Query(fmt.Sprintf("select * from device_uptime where device_id = '%s'", id))
//defer rows.Close()
if rows.Next() {
var uptime entity2.DeviceUptime
err := rows.Scan(&uptime.Id, &uptime.Device_id)
if err != nil {
fmt.Println("Error scanning uptime record:", err)
}
dr.DeviceUptimeRegistry[uptime.Device_id] = uptime
return uptime, nil
}
}
return record, nil
}
func (dr *DeviceRegistry) GlobalUpdateTsSync() {
dr.TempBeforeUpdateTSSYNC = append([]string{}, dr.OnlineDevices...)
dr.OnlineDevices = []string{}
if len(dr.TempBeforeUpdateTSSYNC) > 0 {
deviceIDsStr := strings.Join(dr.TempBeforeUpdateTSSYNC, ",")
_, err := dr.RequestController.MySQL.Query(fmt.Sprintf("UPDATE `device` SET `ts_sync` = %d WHERE `id` IN (%s)", time.Now().Unix(), deviceIDsStr))
if err != nil {
fmt.Println("Error in GlobalUpdateTsSync")
}
}
dr.TempBeforeUpdateTSSYNC = []string{}
}
func (dr *DeviceRegistry) CheckDeviceOnline(deviceID string) bool {
return contains(dr.OnlineDevices, deviceID) || contains(dr.TempBeforeUpdateTSSYNC, deviceID)
}
func contains(arr []string, val string) bool {
for _, item := range arr {
if item == val {
return true
}
}
return false
}