zhangzengfei
2024-10-17 7a19301f6972e0b81490e57200a634e4e3731a4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package config
 
import (
    "fmt"
    "gat1400Exchange/pkg/logger"
 
    "github.com/fsnotify/fsnotify"
    "github.com/spf13/viper"
)
 
type serve struct {
    ID        string `mapstructure:"id"`
    Mode      string `mapstructure:"mode"`
    Host      string `mapstructure:"host"`
    Port      string `mapstructure:"port"`
    Realm     string `mapstructure:"realm"`
    Username  string `mapstructure:"username"`
    Password  string `mapstructure:"password"`
    Role      string `mapstructure:"role"` // agent 设备端, proxy 1400中转 不处理deivce, server 全功能
    Keepalive bool   `mapstructure:"keepalive"`
}
 
type client struct {
    ServerId           string `mapstructure:"server-id"`
    DeviceID           string `mapstructure:"device-id"`
    Username           string `mapstructure:"username"`
    Password           string `mapstructure:"password"`
    ServerAddr         string `mapstructure:"server-addr"`
    ServerPort         string `mapstructure:"server-port"`
    Proto              string `mapstructure:"proto" `             // http, https
    UploadType         string `mapstructure:"upload-type"`        // binary, url
    ChannelNo          string `mapstructure:"channel-number"`     // 通道号, 同id
    HeartbeatInterval  int    `mapstructure:"heartbeat-interval"` // 心跳周期
    HeartbeatFailCount int    `mapstructure:"heartbeat-count"`    // 心跳超时次数
    AddFloorToFaceId   bool   `mapstructure:"add-floor-faceId"`
    Enable             bool   `mapstructure:"enable"`
}
 
type log struct {
    LogWay string `mapstructure:"log-way"` // 日志输出
    Path   string `mapstructure:"path"`    // 日志存储路径
    Level  string `mapstructure:"level"`   // 日志等级
    MaxAge int64  `mapstructure:"max-age"` // 保留压缩包天数
}
 
type forward struct {
    SyncServer     string `mapstructure:"sync-server"`
    ReportServer   string `mapstructure:"report-server"`
    ReportInterval int    `mapstructure:"report-interval"`
    RetryInterval  int    `mapstructure:"retry-interval"`
    FTPServer      string `mapstructure:"ftp-server"`
    RecordServer   string `mapstructure:"record-server"`
}
 
type image struct {
    CutFaceImage   bool   `mapstructure:"cut-face-image"`
    Enlarge        int    `mapstructure:"enlarge"`
    ImageUriPrefix string `mapstructure:"url-prefix"`
}
 
// 梯控设备
type nvcs struct {
    Mac         string `mapstructure:"mac"`
    Model       string `mapstructure:"model"` // 型号
    Port        string `mapstructure:"port"`  // 端口
    OSD         string `mapstructure:"osd"`
    RunState    bool   `mapstructure:"run-state"`
    WaitRunTime int    `mapstructure:"wait-run-time"`
}
 
type rfid struct {
    DevName   string `mapstructure:"dev"`
    Baud      int    `mapstructure:"baud"`
    ReadFloor bool   `mapstructure:"read-floor"`
    EPC       string `mapstructure:"epc"`
    Position  uint8  `mapstructure:"position"`
}
 
type rateLimit struct {
    FillInterval int64 `mapstructure:"fill-interval" json:"fillInterval"`
    Capacity     int64 `mapstructure:"capacity" json:"capacity"`
}
 
type sysTime struct {
    NTPServer    string `mapstructure:"ntp-server" json:"ntp-server"`
    SyncInterval int    `mapstructure:"sync-interval" json:"sync-interval"`
}
 
var ServeConf = &serve{}
var LogConf = &log{}
var ForwardConf = &forward{}
var RateLimitConf = &rateLimit{}
var ClientConf = &client{}
var NVCSConf = &nvcs{}
var ImageConf = &image{}
var SysTimeConf = &sysTime{}
var RFIDConf = &rfid{}
 
// Init is an exported method that takes the environment starts the viper
// (external lib) and returns the configuration struct.
func init() {
    var err error
    v := viper.New()
    v.SetConfigType("yaml")
    v.SetConfigName("gat1400")
    v.AddConfigPath("./")
    v.AddConfigPath("./config/")
    v.AddConfigPath("../config/")
    err = v.ReadInConfig()
    if err != nil {
        fmt.Println("error on parsing configuration file", err)
    }
 
    read2Conf(v)
    v.WatchConfig()
    v.OnConfigChange(func(e fsnotify.Event) {
        read2Conf(v)
    })
}
 
func read2Conf(v *viper.Viper) {
    v.UnmarshalKey("serve", ServeConf)
    v.UnmarshalKey("log", LogConf)
    v.UnmarshalKey("forward", ForwardConf)
    v.UnmarshalKey("rate-limit", RateLimitConf)
    v.UnmarshalKey("client", ClientConf)
    v.UnmarshalKey("nvcs", NVCSConf)
    v.UnmarshalKey("rfid", RFIDConf)
    v.UnmarshalKey("image", ImageConf)
    v.UnmarshalKey("systime", SysTimeConf)
 
    if LogConf.Level == "" {
        LogConf.Level = "info"
    }
 
    if ForwardConf.ReportInterval == 0 {
        ForwardConf.ReportInterval = 10
    }
 
    if ForwardConf.RetryInterval == 0 {
        ForwardConf.RetryInterval = 5
    }
 
    if ClientConf.HeartbeatInterval == 0 {
        ClientConf.HeartbeatInterval = 30
    }
 
    if ClientConf.Proto == "" {
        ClientConf.Proto = "http"
    }
 
    if ImageConf.Enlarge == 0 {
        ImageConf.Enlarge = 100
    }
 
    if NVCSConf.WaitRunTime == 0 {
        NVCSConf.WaitRunTime = 60
    }
 
    if SysTimeConf.SyncInterval == 0 {
        SysTimeConf.SyncInterval = 10
    }
 
    if SysTimeConf.NTPServer == "" {
        SysTimeConf.NTPServer = "ntp.aliyun.com"
    }
 
    logger.SetLogLevel(LogConf.Level)
}