123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- 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
- }
|