feat:data debug config.

This commit is contained in:
2026-05-13 10:04:48 +08:00
parent 25ed68be27
commit 1b447c782d
9 changed files with 251 additions and 8 deletions
+16 -7
View File
@@ -128,13 +128,13 @@ func (l *Listener) connect() error {
func (l *Listener) subscribe(client mqtt.Client) error {
var topics []string
if l.cfg.EnableMeasurementSubscriptions {
topics = append(topics,
fmt.Sprintf("/whgw/v2/region/%s/measurement/band/+/hr", l.cfg.Region),
fmt.Sprintf("/whgw/v2/region/%s/measurement/band/+/step", l.cfg.Region),
fmt.Sprintf("/whgw/v2/region/%s/gateway/+/status", l.cfg.Region),
)
}
// Measurement topics stay subscribed so runtime config changes take effect
// immediately without requiring an MQTT reconnect.
topics = append(topics,
fmt.Sprintf("/whgw/v2/region/%s/measurement/band/+/hr", l.cfg.Region),
fmt.Sprintf("/whgw/v2/region/%s/measurement/band/+/step", l.cfg.Region),
fmt.Sprintf("/whgw/v2/region/%s/gateway/+/status", l.cfg.Region),
)
if l.cfg.EnableTrainingEventSubscription {
topics = append(topics, "/whgw/v2/region/test/+/+")
}
@@ -180,12 +180,21 @@ func (l *Listener) handleMessage(_ mqtt.Client, msg mqtt.Message) {
switch payload := packet.Choice.(type) {
case *whgw_hrpb.GatewaySlaveOutCloudMasterInMsg_NtfHrMeasurement:
if !GetListenerStorageConfig().Enabled {
return
}
record := buildHeartRateRecord(payload.NtfHrMeasurement, msg.Topic(), now)
l.enqueue(&record)
case *whgw_hrpb.GatewaySlaveOutCloudMasterInMsg_NtfStepCountMeasurement:
if !GetListenerStorageConfig().Enabled {
return
}
record := buildStepCountRecord(payload.NtfStepCountMeasurement, msg.Topic(), now)
l.enqueue(&record)
case *whgw_hrpb.GatewaySlaveOutCloudMasterInMsg_NtfGatewayStatus:
if !GetListenerStorageConfig().Enabled {
return
}
record := buildGatewayStatusRecord(payload.NtfGatewayStatus, msg.Topic(), now)
l.enqueue(&record)
default:
+79
View File
@@ -0,0 +1,79 @@
package mqtt
import (
"fmt"
"hr_receiver/models"
"sync/atomic"
"gorm.io/gorm"
)
type ListenerStorageConfig struct {
Enabled bool `json:"enabled"`
ExpireDays int `json:"expireDays"`
DeleteExpired bool `json:"deleteExpired"`
}
var listenerStorageConfig atomic.Value
func InitListenerStorageConfig(db *gorm.DB) error {
cfg, err := loadListenerStorageConfig(db)
if err != nil {
return err
}
storeListenerStorageConfig(cfg)
return nil
}
func GetListenerStorageConfig() ListenerStorageConfig {
if cfg, ok := listenerStorageConfig.Load().(ListenerStorageConfig); ok {
return normalizeListenerStorageConfig(cfg)
}
return normalizeListenerStorageConfig(ListenerStorageConfig{
Enabled: true,
ExpireDays: models.DefaultMqttMeasurementExpireDays,
DeleteExpired: true,
})
}
func UpdateListenerStorageConfig(db *gorm.DB, cfg ListenerStorageConfig) (ListenerStorageConfig, error) {
cfg = normalizeListenerStorageConfig(cfg)
if cfg.ExpireDays <= 0 {
return ListenerStorageConfig{}, fmt.Errorf("expireDays must be greater than 0")
}
record := models.MqttListenerSetting{
Model: gorm.Model{ID: models.MqttListenerSettingSingletonID},
Enabled: cfg.Enabled,
ExpireDays: cfg.ExpireDays,
DeleteExpired: cfg.DeleteExpired,
}
if err := db.Save(&record).Error; err != nil {
return ListenerStorageConfig{}, err
}
storeListenerStorageConfig(cfg)
return cfg, nil
}
func loadListenerStorageConfig(db *gorm.DB) (ListenerStorageConfig, error) {
var record models.MqttListenerSetting
if err := db.First(&record, models.MqttListenerSettingSingletonID).Error; err != nil {
return ListenerStorageConfig{}, err
}
return normalizeListenerStorageConfig(ListenerStorageConfig{
Enabled: record.Enabled,
ExpireDays: record.ExpireDays,
DeleteExpired: record.DeleteExpired,
}), nil
}
func storeListenerStorageConfig(cfg ListenerStorageConfig) {
listenerStorageConfig.Store(normalizeListenerStorageConfig(cfg))
}
func normalizeListenerStorageConfig(cfg ListenerStorageConfig) ListenerStorageConfig {
if cfg.ExpireDays <= 0 {
cfg.ExpireDays = models.DefaultMqttMeasurementExpireDays
}
return cfg
}