package service
|
|
import (
|
"bytes"
|
"encoding/json"
|
"io"
|
"net/http"
|
"time"
|
"errors"
|
|
"gat1400Exchange/config"
|
"gat1400Exchange/pkg/logger"
|
"gat1400Exchange/models"
|
|
"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
|
Type string `json:"type"` // 设备类型
|
Model string `json:"model"` // 设备型号
|
SerialNum string `json:"serialNum"` // 硬件序列号
|
Name string `json:"name"` // 设备名称
|
Org string `json:"org"` // 所属机构
|
Position string `json:"position"` // 具体位置
|
Addr string `json:"addr"` // 地址
|
Longitude string `json:"lon"` // 经度
|
Latitude string `json:"lat"` // 纬度
|
Desc string `json:"desc"` // 设备描述
|
InstallTime string `json:"installTime"` // 安装时间
|
UpTime string `json:"upTime"` // 启动时间
|
Hardware map[string]interface{} `json:"hardware"` // 硬件信息
|
IpAddr string `json:"ip"`
|
}
|
|
func reportDeviceInfo() error {
|
if config.ForwardConf.ReportServer == "" {
|
return errors.New("server addr is empty !")
|
}
|
|
var d models.Device
|
devices, err := d.FindAll()
|
if err != nil {
|
return err
|
}
|
|
|
for _, dev := range devices{
|
if _, exists := deviceAliveCache.Get(dev.Id); !exists {
|
continue
|
}
|
|
device := DevReportData{
|
Code: dev.Id,
|
Type: "camera",
|
Name: dev.Name,
|
Addr: dev.Addr+dev.Pos,
|
IpAddr: dev.Ip,
|
}
|
|
data, err := json.Marshal(device)
|
if err != nil {
|
return err
|
}
|
|
_, err = HttpPost(config.ForwardConf.ReportServer, nil, data)
|
}
|
|
return nil
|
}
|
|
func DeviceInfoReportTask() {
|
interval := config.ForwardConf.ReportInterval
|
if interval == 0 {
|
interval = 10
|
}
|
|
logger.Info("start device info report task, server:%s interval:%d.", config.ForwardConf.ReportServer, interval)
|
|
ticker := time.NewTicker(1 * time.Second)
|
for {
|
select {
|
case <-ticker.C:
|
logger.Debug("report device info.")
|
|
err := reportDeviceInfo()
|
if err != nil {
|
logger.Warn(err.Error())
|
}
|
|
ticker.Reset(time.Duration(interval) * time.Second)
|
}
|
}
|
}
|
|
|
func HttpPost(url string, header map[string]string, data []byte) ([]byte, error) {
|
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))
|
if err != nil {
|
return nil, err
|
}
|
req.Header.Set("Content-Type", "applicaiton/json; charset=UTF-8")
|
if header != nil {
|
for k, v := range header {
|
req.Header.Set(k, v)
|
}
|
}
|
cli := &http.Client{}
|
resp, err := cli.Do(req)
|
if err != nil {
|
return nil, err
|
}
|
defer resp.Body.Close()
|
body, err := io.ReadAll(resp.Body)
|
if err != nil {
|
return nil, err
|
}
|
return body, nil
|
}
|