zhangzengfei
2024-10-22 4ca3791590a7bf50222aa5f80e53edf04739108a
service/device.go
@@ -2,22 +2,13 @@
import (
   "encoding/json"
   "fmt"
   "time"
   "errors"
   "gat1400Exchange/config"
   "gat1400Exchange/pkg/logger"
   "gat1400Exchange/models"
   "gat1400Exchange/util"
   "github.com/hashicorp/golang-lru/v2/expirable"
)
var deviceAliveCache *expirable.LRU[string, bool]
func init() {
   deviceAliveCache = expirable.NewLRU[string, bool](100, nil, time.Second*60) //过滤指定时间内的重复人物
}
type DevReportData struct {
   Code        string                 `json:"code"`        // 设备ID
@@ -42,30 +33,50 @@
      return nil
   }
   logger.Info("Start device info report task, server:%s.", config.ForwardConf.ReportServer)
   if config.ForwardConf.ReportServer == "" {
      return errors.New("Server addr is empty!")
   }
   var d models.Device
   var d models.Ape
   devices, err := d.FindAll()
   if err != nil {
      return err
   }
   for _, dev := range devices {
      // 级联的设备不检查心跳
      if dev.FromId == "" {
         hTime, err := time.ParseInLocation("2006-01-02 15:04:05", dev.HeartbeatTime, time.Local)
         if err != nil {
            dev.HeartbeatTime = time.Now().Format("2006-01-02 15:04:05")
            dev.Ext.IsOnline = "1"
         } else {
            if hTime.Unix()+120 >= time.Now().Unix() {
               dev.Ext.IsOnline = "1"
            } else {
               dev.Ext.IsOnline = "2"
            }
         }
   for _, dev := range devices{
      if _, exists := deviceAliveCache.Get(dev.Id); !exists {
         // 更新在线状态
         dev.Save()
         // 离线设备不执行上报
         if dev.Ext.IsOnline == "2" {
            continue
         }
      }
      // 配置了上报地址, 推送数据
      if config.ForwardConf.ReportServer == "" {
         continue
      }
      device := DevReportData{
         Code:      dev.Id,
         Model:     dev.Ext.Model,
         Type:      "camera",
         Name:      dev.Name,
         Addr:      dev.Addr+dev.Floor,
         IpAddr:    dev.Ip,
         Addr:      dev.Ext.Place,
         IpAddr:    dev.Ext.IPAddr,
         Latitude:  fmt.Sprintf("%f", dev.Ext.Latitude),
         Longitude: fmt.Sprintf("%f", dev.Ext.Longitude),
      }
      data, err := json.Marshal(device)
@@ -73,9 +84,7 @@
         return err
      }
      logger.Info("Report device info. %+v", dev)
      headers := map[string]string{"Content-Type": "applicaiton/json; charset=UTF-8"}
      headers := map[string]string{"Content-Type": "application/json; charset=UTF-8"}
      _, err = util.HttpPost(config.ForwardConf.ReportServer, headers, data)
      if err != nil {
         return err
@@ -83,18 +92,4 @@
   }
   return nil
}
func KeepDeviceAlive(id string) {
   // 上报设备信息
   var d = models.Device{
      Id: id,
   }
   err := d.Upsert()
   if err != nil {
      logger.Warn("Device db update camera error:%s", err.Error())
   }
   deviceAliveCache.Add(id, true)
}