config.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package config
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "gopkg.in/yaml.v3"
  6. "io/ioutil"
  7. "os"
  8. "sync"
  9. )
  10. var (
  11. instance *config
  12. once sync.Once
  13. SerialConfig Serial
  14. DevConfig Devs
  15. )
  16. // 初始化配置,确保只初始化一次
  17. func init() {
  18. once.Do(func() {
  19. loadConfig() // 加载配置文件
  20. })
  21. }
  22. // 重新加载配置文件
  23. func ReloadConfig() {
  24. loadConfig() // 加载配置文件
  25. }
  26. // 加载配置文件
  27. func loadConfig() {
  28. var conf config
  29. filePath := "./config/config.yaml"
  30. if f, err := os.Open(filePath); err != nil {
  31. panic(err)
  32. } else {
  33. err := yaml.NewDecoder(f).Decode(&conf)
  34. if err != nil {
  35. panic(err)
  36. }
  37. }
  38. instance = &conf
  39. }
  40. // 获取配置文档实例
  41. func Instance() *config {
  42. return instance
  43. }
  44. type config struct {
  45. TunnelId string `yaml:"tunnelId"`
  46. Logger logger `yaml:"logger"`
  47. Mqtt mqtt `yaml:"mqtt"`
  48. Nums nums `yaml:"nums"`
  49. Policy policy `yaml:"policy"`
  50. }
  51. type logger struct {
  52. Path string `yaml:"path"`
  53. Name string `yaml:"name"`
  54. Level string `yaml:"level"`
  55. }
  56. type mqtt struct {
  57. Server string `yaml:"server"`
  58. Id string `yaml:"id"`
  59. User string `yaml:"user"`
  60. Password string `yaml:"password"`
  61. }
  62. type nums struct {
  63. EnvNum int `yaml:"envNum"`
  64. OptNum int `yaml:"optNum"`
  65. }
  66. type policy struct {
  67. Id int `yaml:"id"`
  68. Control string `yaml:"control"`
  69. StartTime string `yaml:"startTime"`
  70. EndTime string `yaml:"endTime"`
  71. }
  72. func LoadSerialConfig() error {
  73. // 读取配置文件
  74. data, err := ioutil.ReadFile("./config/serial.json")
  75. if err != nil {
  76. return fmt.Errorf("读取配置文件失败: %v", err)
  77. }
  78. // 解析 JSON 数据到结构体
  79. if err := json.Unmarshal(data, &SerialConfig); err != nil {
  80. return fmt.Errorf("解析 JSON 配置失败: %v", err)
  81. }
  82. return nil
  83. }
  84. type Serial struct {
  85. SerialMap map[int8]*SerialPort `json:"serial"`
  86. }
  87. type SerialPort struct {
  88. Code int8 `json:"code"`
  89. Interface string `json:"interface"`
  90. Address string `json:"address"`
  91. BaudRate int `json:"baudRate"`
  92. DataBits uint8 `json:"dataBits"`
  93. StopBits uint `json:"stopBits"`
  94. Parity string `json:"parity"`
  95. Timeout uint `json:"timeout"`
  96. }
  97. func LoadDevConfig() error {
  98. fmt.Println("加载配置...")
  99. // 读取配置文件
  100. data, err := ioutil.ReadFile("./dev/devs.json")
  101. if err != nil {
  102. return fmt.Errorf("读取配置文件失败: %v", err)
  103. }
  104. // 解析 JSON 数据到结构体
  105. if err := json.Unmarshal(data, &DevConfig); err != nil {
  106. return fmt.Errorf("解析 JSON 配置失败: %v", err)
  107. }
  108. return nil
  109. }
  110. type Devs struct {
  111. EnvDevs []*EnvDev `json:"envDev"`
  112. LampDevs []*LampDev `json:"lampDev"`
  113. SwitchDevs []*SwitchDev `json:"switchDev"`
  114. }
  115. type EnvDev struct {
  116. Sn string `json:"sn"` //设备SN
  117. Address string `json:"address"` //设备地址
  118. Name string `json:"name"` //设备名称
  119. TaskTime uint `json:"taskTime"` //设备采集周期,单位分钟
  120. WaitTime uint `json:"waitTime"` //等待时间,单位秒
  121. SerialId int8 `json:"serialId"` //串口id
  122. }
  123. type LampDev struct {
  124. Sn string `json:"sn"` //设备SN
  125. Address string `json:"address"` //设备地址
  126. Name string `json:"name"` //设备名称
  127. RadarId int8 `json:"radarId"` //雷达id(用于在雷达监测到来车后,控制雷达在的那一路的单灯控制器)
  128. SerialId int8 `json:"serialId"` // 串口id
  129. }
  130. type SwitchDev struct {
  131. Sn string `json:"sn"` //设备SN
  132. Address string `json:"address"` //设备地址
  133. Name string `json:"name"` //设备名称
  134. RadarId int8 `json:"radarId"` //雷达id
  135. SerialId int8 `json:"serialId"` // 串口id
  136. }
  137. // 读取、更新并保存配置的统一方法
  138. func UpdateYAMLConfig(updates map[string]interface{}) error {
  139. data, err := ioutil.ReadFile("./config/config.yaml")
  140. if err != nil {
  141. return fmt.Errorf("读取文件时出错: %w", err)
  142. }
  143. var yamlData map[string]interface{}
  144. err = yaml.Unmarshal(data, &yamlData)
  145. if err != nil {
  146. return fmt.Errorf("解析 YAML 数据时出错: %w", err)
  147. }
  148. pl, ok := yamlData["policy"].(map[string]interface{})
  149. if !ok {
  150. return fmt.Errorf("找不到 'policy' 字段")
  151. }
  152. for key, value := range updates {
  153. pl[key] = value
  154. }
  155. updatedData, err := yaml.Marshal(yamlData)
  156. if err != nil {
  157. return fmt.Errorf("编码 YAML 数据时出错: %w", err)
  158. }
  159. err = ioutil.WriteFile("./config/config.yaml", updatedData, 0644)
  160. if err != nil {
  161. return fmt.Errorf("写入文件时出错: %w", err)
  162. }
  163. return nil
  164. }