90 lines
2.5 KiB
Go
90 lines
2.5 KiB
Go
package collection
|
|
|
|
import (
|
|
"time"
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/domain/device"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
|
)
|
|
|
|
// TimedCollector 实现了 Collector 接口,用于定时从数据库获取设备信息并下发采集指令
|
|
type TimedCollector struct {
|
|
deviceRepo repository.DeviceRepository
|
|
deviceService device.Service
|
|
logger *logs.Logger
|
|
interval time.Duration
|
|
ticker *time.Ticker
|
|
done chan bool
|
|
}
|
|
|
|
// NewTimedCollector 创建一个定时采集器实例
|
|
func NewTimedCollector(
|
|
deviceRepo repository.DeviceRepository,
|
|
deviceService device.Service,
|
|
logger *logs.Logger,
|
|
interval time.Duration,
|
|
) Collector {
|
|
return &TimedCollector{
|
|
deviceRepo: deviceRepo,
|
|
deviceService: deviceService,
|
|
logger: logger,
|
|
interval: interval,
|
|
done: make(chan bool),
|
|
}
|
|
}
|
|
|
|
// Start 开始定时采集
|
|
func (c *TimedCollector) Start() {
|
|
c.logger.Infof("定时采集器启动,采集间隔: %s", c.interval)
|
|
c.ticker = time.NewTicker(c.interval)
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-c.done:
|
|
return
|
|
case <-c.ticker.C:
|
|
c.collect()
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
// Stop 停止定时采集
|
|
func (c *TimedCollector) Stop() {
|
|
c.logger.Info("定时采集器停止")
|
|
c.ticker.Stop()
|
|
c.done <- true
|
|
}
|
|
|
|
// collect 是核心的采集逻辑
|
|
func (c *TimedCollector) collect() {
|
|
c.logger.Info("开始新一轮的设备数据采集")
|
|
|
|
sensors, err := c.deviceRepo.ListAllSensors()
|
|
if err != nil {
|
|
c.logger.Errorf("采集周期: 从数据库获取所有传感器失败: %v", err)
|
|
return
|
|
}
|
|
|
|
if len(sensors) == 0 {
|
|
c.logger.Info("采集周期: 未发现任何传感器设备,跳过本次采集")
|
|
return
|
|
}
|
|
|
|
sensorsByController := make(map[uint][]*models.Device)
|
|
for _, sensor := range sensors {
|
|
sensorsByController[sensor.AreaControllerID] = append(sensorsByController[sensor.AreaControllerID], sensor)
|
|
}
|
|
|
|
for controllerID, controllerSensors := range sensorsByController {
|
|
c.logger.Infof("采集周期: 准备为区域主控 %d 下的 %d 个传感器下发采集指令", controllerID, len(controllerSensors))
|
|
if err := c.deviceService.Collect(controllerID, controllerSensors); err != nil {
|
|
c.logger.Errorf("采集周期: 为区域主控 %d 下发采集指令失败: %v", controllerID, err)
|
|
}
|
|
}
|
|
|
|
c.logger.Info("本轮设备数据采集完成")
|
|
}
|