refactor: embed mochi mqtt broker
This commit is contained in:
@@ -11,18 +11,23 @@ import (
|
||||
)
|
||||
|
||||
type MQTT struct {
|
||||
Broker string `yaml:"Broker"`
|
||||
ClientID string `yaml:"ClientID"`
|
||||
Username string `yaml:"Username"`
|
||||
Password string `yaml:"Password"`
|
||||
UpTopic string `yaml:"UpTopic"`
|
||||
DownTopic string `yaml:"DownTopic"`
|
||||
AckTopic string `yaml:"AckTopic"`
|
||||
QoS byte `yaml:"QoS"`
|
||||
TLS bool `yaml:"TLS"`
|
||||
CAFile string `yaml:"CAFile"`
|
||||
CertificateFile string `yaml:"CertificateFile"`
|
||||
PrivateKeyFile string `yaml:"PrivateKeyFile"`
|
||||
Address string `yaml:"Address"`
|
||||
ListenerID string `yaml:"ListenerID"`
|
||||
Devices []MQTTDevice `yaml:"Devices"`
|
||||
UpTopic string `yaml:"UpTopic"`
|
||||
DownTopic string `yaml:"DownTopic"`
|
||||
AckTopic string `yaml:"AckTopic"`
|
||||
QoS byte `yaml:"QoS"`
|
||||
TLS bool `yaml:"TLS"`
|
||||
CAFile string `yaml:"CAFile"`
|
||||
CertificateFile string `yaml:"CertificateFile"`
|
||||
PrivateKeyFile string `yaml:"PrivateKeyFile"`
|
||||
}
|
||||
type MQTTDevice struct {
|
||||
ClientID string `yaml:"ClientID"`
|
||||
DeviceID string `yaml:"DeviceID"`
|
||||
Username string `yaml:"Username"`
|
||||
Password string `yaml:"Password"`
|
||||
}
|
||||
type HTTP struct {
|
||||
Address string `yaml:"Address"`
|
||||
@@ -50,13 +55,26 @@ func Load(path string) (Config, error) {
|
||||
if err = yaml.Unmarshal(data, &cfg); err != nil {
|
||||
return cfg, err
|
||||
}
|
||||
override(&cfg.MQTT.Password, "HEQI_IOT_MQTT_PASSWORD")
|
||||
if len(cfg.MQTT.Devices) == 1 {
|
||||
override(&cfg.MQTT.Devices[0].Password, "HEQI_IOT_MQTT_PASSWORD")
|
||||
}
|
||||
override(&cfg.HTTP.InternalToken, "HEQI_IOT_INTERNAL_TOKEN")
|
||||
override(&cfg.Protocol.Key1, "HEQI_IOT_KEY_1")
|
||||
override(&cfg.Protocol.Key2, "HEQI_IOT_KEY_2")
|
||||
override(&cfg.Protocol.Key3, "HEQI_IOT_KEY_3")
|
||||
if cfg.MQTT.Broker == "" || cfg.HTTP.Address == "" || cfg.HTTP.InternalToken == "" {
|
||||
return cfg, fmt.Errorf("MQTT.Broker、HTTP.Address 和 HTTP.InternalToken 必填")
|
||||
if cfg.MQTT.Address == "" || cfg.HTTP.Address == "" || cfg.HTTP.InternalToken == "" {
|
||||
return cfg, fmt.Errorf("MQTT.Address、HTTP.Address 和 HTTP.InternalToken 必填")
|
||||
}
|
||||
if cfg.MQTT.ListenerID == "" {
|
||||
cfg.MQTT.ListenerID = "mqtt-tcp"
|
||||
}
|
||||
if len(cfg.MQTT.Devices) == 0 {
|
||||
return cfg, fmt.Errorf("MQTT.Devices 必填,Broker 禁止匿名连接")
|
||||
}
|
||||
for index, device := range cfg.MQTT.Devices {
|
||||
if device.ClientID == "" || device.DeviceID == "" || device.Username == "" || device.Password == "" {
|
||||
return cfg, fmt.Errorf("MQTT.Devices[%d] 的 ClientID、DeviceID、Username 和 Password 必填", index)
|
||||
}
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
34
backend/iot-server/internal/config/config_test.go
Normal file
34
backend/iot-server/internal/config/config_test.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestLoadRequiresDeviceCredentials(t *testing.T) {
|
||||
path := filepath.Join(t.TempDir(), "iot.yaml")
|
||||
data := []byte("MQTT:\n Address: 127.0.0.1:1883\nHTTP:\n Address: 127.0.0.1:12428\n InternalToken: test\n")
|
||||
if err := os.WriteFile(path, data, 0o600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := Load(path); err == nil {
|
||||
t.Fatal("未配置设备凭证时应拒绝启动")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadDefaultsListenerAndOverridesSingleDevicePassword(t *testing.T) {
|
||||
t.Setenv("HEQI_IOT_MQTT_PASSWORD", "from-secret-store")
|
||||
path := filepath.Join(t.TempDir(), "iot.yaml")
|
||||
data := []byte("MQTT:\n Address: 127.0.0.1:1883\n Devices:\n - ClientID: detector-1\n DeviceID: '0000000000000001'\n Username: detector-1\n Password: placeholder\nHTTP:\n Address: 127.0.0.1:12428\n InternalToken: test\n")
|
||||
if err := os.WriteFile(path, data, 0o600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
cfg, err := Load(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cfg.MQTT.ListenerID != "mqtt-tcp" || cfg.MQTT.Devices[0].Password != "from-secret-store" {
|
||||
t.Fatalf("unexpected MQTT config: %+v", cfg.MQTT)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user