package config import ( "encoding/json" "fmt" "gopkg.in/yaml.v3" "io/ioutil" "os" "sync" ) var ( instance *config once sync.Once SerialConfig Serial DevConfig Devs ) // 初始化配置,确保只初始化一次 func init() { once.Do(func() { loadConfig() // 加载配置文件 }) } // 重新加载配置文件 func ReloadConfig() { loadConfig() // 加载配置文件 } // 加载配置文件 func loadConfig() { var conf config filePath := "./config/config.yaml" if f, err := os.Open(filePath); err != nil { panic(err) } else { err := yaml.NewDecoder(f).Decode(&conf) if err != nil { panic(err) } } instance = &conf } // 获取配置文档实例 func Instance() *config { return instance } type config struct { TunnelId string `yaml:"tunnelId"` Logger logger `yaml:"logger"` Mqtt mqtt `yaml:"mqtt"` Nums nums `yaml:"nums"` Policy policy `yaml:"policy"` } type logger struct { Path string `yaml:"path"` Name string `yaml:"name"` Level string `yaml:"level"` } type mqtt struct { Server string `yaml:"server"` Id string `yaml:"id"` User string `yaml:"user"` Password string `yaml:"password"` } type nums struct { EnvNum int `yaml:"envNum"` OptNum int `yaml:"optNum"` } type policy struct { Id int `yaml:"id"` Control string `yaml:"control"` StartTime string `yaml:"startTime"` EndTime string `yaml:"endTime"` } func LoadSerialConfig() error { // 读取配置文件 data, err := ioutil.ReadFile("./config/serial.json") if err != nil { return fmt.Errorf("读取配置文件失败: %v", err) } // 解析 JSON 数据到结构体 if err := json.Unmarshal(data, &SerialConfig); err != nil { return fmt.Errorf("解析 JSON 配置失败: %v", err) } return nil } type Serial struct { SerialMap map[int8]*SerialPort `json:"serial"` } type SerialPort struct { Code int8 `json:"code"` Interface string `json:"interface"` Address string `json:"address"` BaudRate int `json:"baudRate"` DataBits uint8 `json:"dataBits"` StopBits uint `json:"stopBits"` Parity string `json:"parity"` Timeout uint `json:"timeout"` } func LoadDevConfig() error { fmt.Println("加载配置...") // 读取配置文件 data, err := ioutil.ReadFile("./dev/devs.json") if err != nil { return fmt.Errorf("读取配置文件失败: %v", err) } // 解析 JSON 数据到结构体 if err := json.Unmarshal(data, &DevConfig); err != nil { return fmt.Errorf("解析 JSON 配置失败: %v", err) } return nil } type Devs struct { EnvDevs []*EnvDev `json:"envDev"` LampDevs []*LampDev `json:"lampDev"` SwitchDevs []*SwitchDev `json:"switchDev"` } type EnvDev struct { Sn string `json:"sn"` //设备SN Address string `json:"address"` //设备地址 Name string `json:"name"` //设备名称 TaskTime uint `json:"taskTime"` //设备采集周期,单位分钟 WaitTime uint `json:"waitTime"` //等待时间,单位秒 SerialId int8 `json:"serialId"` //串口id } type LampDev struct { Sn string `json:"sn"` //设备SN Address string `json:"address"` //设备地址 Name string `json:"name"` //设备名称 RadarId int8 `json:"radarId"` //雷达id(用于在雷达监测到来车后,控制雷达在的那一路的单灯控制器) SerialId int8 `json:"serialId"` // 串口id } type SwitchDev struct { Sn string `json:"sn"` //设备SN Address string `json:"address"` //设备地址 Name string `json:"name"` //设备名称 RadarId int8 `json:"radarId"` //雷达id SerialId int8 `json:"serialId"` // 串口id } // 读取、更新并保存配置的统一方法 func UpdateYAMLConfig(updates map[string]interface{}) error { data, err := ioutil.ReadFile("./config/config.yaml") if err != nil { return fmt.Errorf("读取文件时出错: %w", err) } var yamlData map[string]interface{} err = yaml.Unmarshal(data, &yamlData) if err != nil { return fmt.Errorf("解析 YAML 数据时出错: %w", err) } pl, ok := yamlData["policy"].(map[string]interface{}) if !ok { return fmt.Errorf("找不到 'policy' 字段") } for key, value := range updates { pl[key] = value } updatedData, err := yaml.Marshal(yamlData) if err != nil { return fmt.Errorf("编码 YAML 数据时出错: %w", err) } err = ioutil.WriteFile("./config/config.yaml", updatedData, 0644) if err != nil { return fmt.Errorf("写入文件时出错: %w", err) } return nil }