217 lines
11 KiB
Go
217 lines
11 KiB
Go
package config
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"log/slog"
|
||
|
||
"github.com/spf13/viper"
|
||
"joylink.club/iot/dto"
|
||
)
|
||
|
||
const (
|
||
SystemName = "rtsts"
|
||
)
|
||
|
||
type AppConfig struct {
|
||
// Env string
|
||
Server server
|
||
Datasource datasource
|
||
Logging log
|
||
Messaging messaging
|
||
// Dynamics DynamicsConfig
|
||
// Vobc VobcConfig
|
||
// Interlock InterlockConfig
|
||
}
|
||
type server struct {
|
||
Port int
|
||
}
|
||
type datasource struct {
|
||
Dsn string
|
||
}
|
||
type log struct {
|
||
Level string // 日志打印级别 debug info warn error
|
||
Format string // 输出日志格式 logfmt, json
|
||
Path string // 输出日志文件路径
|
||
FileName string // 输出日志文件名称
|
||
FileMaxSize int // 【日志分割】单个日志文件最多存储量 单位(mb)
|
||
FileMaxBackups int // 【日志分割】日志备份文件最多数量
|
||
MaxAge int // 日志保留时间,单位: 天 (day)
|
||
Compress bool // 是否压缩日志
|
||
Stdout bool // 是否输出到控制台
|
||
}
|
||
|
||
type messaging struct {
|
||
Mqtt mqtt
|
||
}
|
||
|
||
// MQTT客户端配置
|
||
type mqtt struct {
|
||
Address string
|
||
Username string
|
||
Password string
|
||
}
|
||
|
||
// type centrifugo struct {
|
||
// TokenSecret string
|
||
// ApiKey string
|
||
// ApiEndpoint string
|
||
// Address string
|
||
// }
|
||
|
||
// 第三方配置结构
|
||
type ThridPartyConfig struct {
|
||
Id int32 `json:"id"`
|
||
Dynamics DynamicsConfig `json:"dynamics" description:"动力学配置"`
|
||
Vobc VobcConfig `json:"vobc" description:"半实物配置"`
|
||
Interlocks []InterlockConfig `json:"interlock" description:"联锁配置"`
|
||
RsspAxleCfgs []RsspAxleConfig `json:"rsspAxleCfgs" description:"所有联锁集中站计轴RSSP-I配置"`
|
||
ElectricMachinery ElectricMachineryConfig `json:"electricMachinery" description:"电机配置"`
|
||
BtmCanet BtmCanetConfig `json:"btmCanet" description:"BTM关联的网关设备CANET配置"`
|
||
CidcModbus []CidcModbusConfig `json:"cidcModbus" description:"联锁驱采Modbus接口配置"`
|
||
Radar RadarConfig `json:"radar" description:"车载雷达相关配置"`
|
||
Acc AccConfig `json:"acc" description:"车载加速计"`
|
||
PcSimConfig VehiclePCSimConfig `json:"pcSimConfig" description:"车载pc仿真平台通信"`
|
||
}
|
||
type RadarConfig struct {
|
||
Open bool `json:"open" description:"是否开启"`
|
||
RemoteIp string `json:"remoteIp" description:"远端接收列车信息ip"`
|
||
RemotePort uint32 `json:"remotePort" description:"远端接收列车信息端口"`
|
||
//LocalPort uint32 `json:"localPort" description:"本地端口"`
|
||
}
|
||
|
||
type AccConfig struct {
|
||
Open bool `json:"open" description:"是否开启"`
|
||
RemoteIp string `json:"remoteIp" description:"远端接收列车信息ip"`
|
||
RemotePort uint32 `json:"remotePort" description:"远端接收列车信息端口"`
|
||
}
|
||
type CidcModbusConfig struct {
|
||
Open bool `json:"open" description:"是否开启"`
|
||
Url string `json:"url" description:"接口URL【格式tcp://{ip}:{port}】" default:"tcp://127.0.0.1:502"` // 连接地址
|
||
UnitId uint32 `json:"unitId" description:"从机unitId"` // 从机unitId
|
||
Endianness dto.Modbus_Endianness `json:"endianness" description:"字节序【大端/小端】"` // 16位寄存器字节序
|
||
Interval uint32 `json:"interval" description:"定时请求间隔" default:"1000"` // 循环请求间隔(毫秒),0表示不主动请求,只当有变化时请求
|
||
Timeout uint32 `json:"timeout" description:"请求超时时间" default:"1000"` // 超时时间(毫秒)
|
||
Ecs string `json:"ecs" description:"联锁集中站"` // 所属集中站
|
||
Mapping []ModbusDcMapping `json:"mapping" description:"modbus数据与驱动/采集码表映射配置"`
|
||
}
|
||
type ModbusDcMapping struct {
|
||
Function dto.Modbus_Function `json:"function" description:"Modbus功能"` // 功能
|
||
Addr uint32 `json:"addr" description:"Modbus功能起始地址【位类型的功能为起始位地址,寄存器类型的功能为起始字(2个字节)地址】"` // 起始地址,当功能为位功能时,表示起始位地址,当功能为寄存器功能时,表示起始字(2个字节)地址
|
||
Quantity uint32 `json:"quantity" description:"Modbus读取数量【位类型的为位数,寄存器类型的为字(2个字节)数】"` // 数量,当功能为位功能时,表示位数,当功能为寄存器功能时,表示字(2个字节)数
|
||
// WriteStrategy proto.Modbus_WriteStrategy `json:"writeStrategy" description:"写入策略"` // 当功能为写入类功能时(不包含读写类功能),写策略
|
||
Type dto.DataType `json:"type" description:"映射的数据类型"` // 对应数据类型
|
||
Start uint32 `json:"start" description:"映射数据的起始地址【位类型的为起始位地址,寄存器类型的为起始字节地址】"` // 映射起始地址
|
||
}
|
||
type DynamicsConfig struct {
|
||
Ip string `json:"ip" description:"IP配置"`
|
||
UdpLocalPort int `json:"udpLocalPort" description:"本机监听接收端口"`
|
||
UdpRemotePort int `json:"udpRemotePort" description:"远端接收道岔信息端口"`
|
||
UdpRemoteTrainPort int `json:"udpRemoteTrainPort" description:"远端接收列车信息端口"`
|
||
HttpPort int `json:"httpPort" description:"http服务端口"`
|
||
Open bool `json:"open" description:"是否开启"`
|
||
}
|
||
type VobcConfig struct {
|
||
Ip string `json:"ip" description:"IP配置"`
|
||
LocalPort int `json:"localPort" description:"本机监听接收端口"`
|
||
RemotePort int `json:"remotePort" description:"远端接收列车信息端口"`
|
||
Open bool `json:"open" description:"是否开启"`
|
||
}
|
||
type InterlockConfig struct {
|
||
Ip string `json:"ip" description:"IP配置"`
|
||
LocalPort int `json:"localPort" description:"本机监听接收端口"`
|
||
RemotePort int `json:"remotePort" description:"远端接收采集信息端口"`
|
||
Open bool `json:"open" description:"是否开启"`
|
||
Code string `json:"code" description:"所属集中站"`
|
||
}
|
||
type ElectricMachineryConfig struct {
|
||
Ip string `json:"ip" description:"IP配置"`
|
||
RemotePort int `json:"remotePort" description:"远端接收信息端口"`
|
||
Open bool `json:"open" description:"是否开启"`
|
||
}
|
||
|
||
// BtmCanetConfig BTM CANET网关设备配置
|
||
type BtmCanetConfig struct {
|
||
LocalUdpPort int `json:"localUdpPort" description:"本机监听接收UDP端口"`
|
||
RemoteIp string `json:"remoteIp" description:"CANET设备IP配置"`
|
||
RemoteUdpPort int `json:"remoteUdpPort" description:"CANET设备UDP端口"`
|
||
Open bool `json:"open" description:"是否开启"`
|
||
}
|
||
|
||
// RsspAxleConfig 计轴区段与联锁安全通信配置
|
||
type RsspAxleConfig struct {
|
||
Open bool `json:"open" description:"是否开启"`
|
||
City string `json:"city" description:"所属城市"`
|
||
LineId string `json:"lineId" description:"所属线路"`
|
||
CentralizedStation string `json:"centralizedStation" description:"所属集中站"`
|
||
RsspCfg RsspConfig `json:"rsspCfg" description:"安全通道配置"`
|
||
}
|
||
|
||
// RsspConfig CI系统与计轴设备的安全通信协议配置参数
|
||
// 计轴设备(管理一个集中站的所有计轴器)配置
|
||
type RsspConfig struct {
|
||
SrcAddr uint16 `json:"srcAddr" description:"16位源地址,本地地址"` //16位源地址,本地地址
|
||
DstAddr uint16 `json:"dstAddr" description:"16位目的地址,远程地址"` //16位目的地址,远程地址
|
||
DataVer1 uint32 `json:"dataVer1" description:"通道1数据版本"` //通道1数据版本
|
||
DataVer2 uint32 `json:"dataVer2" description:"通道2数据版本"` //通道2数据版本
|
||
SID1 uint32 `json:"sID1" description:"通道1源标识"` //通道1源标识
|
||
SID2 uint32 `json:"sID2" description:"通道2源标识"` //通道2源标识
|
||
SINIT1 uint32 `json:"sINIT1" description:"通道1序列初始"` //通道1序列初始
|
||
SINIT2 uint32 `json:"sINIT2" description:"通道2序列初始"` //通道2序列初始
|
||
SendingPeriod uint32 `json:"sendingPeriod" description:"发送周期值"` //接收方每个安全通信会话对应的发送周期值,单位ms
|
||
SsrRsspTimeout uint32 `json:"ssrRsspTimeout" description:"等待SSR回应的定时器超时值"` //等待SSR回应的定时器超时值,为RsspTimer时间,1=SendingPeriod
|
||
Mtv uint32 `json:"mtv" description:"最大时序偏差"` //每个安全通信会话可容忍的最大时序偏差,即当前接收的RSD的序列号与上一次RSD的序列号最大允许差值
|
||
Udl uint32 `json:"udl" description:"RSD应用数据长度配置值"` //每个安全通信会话RSD应用数据长度发送和接收的配置值(支持固定长度和可变长度);0-可变长度,大于0即固定长度
|
||
DeviceA bool `json:"deviceA" description:"true-A机;false-B机"` //true-A机;false-B机
|
||
PicType byte `json:"picType" description:"协议交互类别"` //协议交互类别,message.PicType
|
||
RemoteIp string `json:"remoteIp" description:"远程服务器ip"` //远程服务器ip
|
||
RemoteUdpPort int `json:"remoteUdpPort" description:"远程服务器端口"` //远程服务器端口
|
||
LocalUdpPort int `json:"localUdpPort" description:"本地服务器端口"` //本地服务器端口
|
||
}
|
||
|
||
type VehiclePCSimConfig struct {
|
||
Open bool `json:"open" description:"是否开启"`
|
||
PcSimIp string `json:"pcSimIp" description:"pc仿真平台通信ip"`
|
||
PcSimPort uint32 `json:"pcSimPort" description:"pc仿真平台通信端口"`
|
||
LocalTestingPort uint32 `json:"localTestingPort" description:"本地测试端口"`
|
||
}
|
||
|
||
// CheckAddress 检测目标源地址目的地址是否在配置中
|
||
func (c *RsspConfig) CheckAddress(srcAddr uint16, dstAddr uint16) bool {
|
||
return true
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
var Config AppConfig
|
||
|
||
// 获取配置文件名称,从运行flag参数config中获取,若未提供,使用默认'dev'
|
||
func getConfigName() string {
|
||
configName := ""
|
||
flag.StringVar(&configName, "config", "dev", "config name, eg: -config test")
|
||
flag.Parse()
|
||
if configName == "" {
|
||
configName = "dev"
|
||
}
|
||
slog.Info("读取配置文件", "配置文件名称", configName)
|
||
return configName
|
||
}
|
||
|
||
// 加载配置
|
||
func LoadConfig() {
|
||
cnf := viper.New()
|
||
cnf.SetConfigName(getConfigName())
|
||
cnf.SetConfigType("yml")
|
||
cnf.AddConfigPath("./config/")
|
||
cnf.AddConfigPath(".")
|
||
err := cnf.ReadInConfig()
|
||
if err != nil {
|
||
panic(fmt.Errorf("读取配置文件错误: %w", err))
|
||
}
|
||
err = cnf.Unmarshal(&Config)
|
||
if err != nil {
|
||
panic(fmt.Errorf("解析配置文件错误: %w", err))
|
||
}
|
||
slog.Info("成功加载配置", "config", Config)
|
||
}
|