From be1d65eab28472deaeec4a2e5c2fc920c714d969 Mon Sep 17 00:00:00 2001 From: xzb <223@qq.com> Date: Thu, 9 Nov 2023 17:38:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A1=E8=BD=B4rssp=20=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.go | 48 ++++++++-------- third_party/axle_device/rssp_axle.go | 61 ++++----------------- third_party/axle_device/rssp_axle_manage.go | 6 +- 3 files changed, 34 insertions(+), 81 deletions(-) diff --git a/config/config.go b/config/config.go index 1a1d081..289c99e 100644 --- a/config/config.go +++ b/config/config.go @@ -82,37 +82,33 @@ type InterlockConfig struct { // RsspAxleConfig 计轴区段与联锁安全通信配置 type RsspAxleConfig struct { - City string `json:"city" description:"所属城市"` - LineId string `json:"lineId" description:"所属线路"` - CentralizedStation string `json:"centralizedStation" description:"所属集中站"` - RsspCfgs []RsspConfig `json:"rsspCfgs" description:"主备安全通道配置"` - 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机 + 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 //接收方每个安全通信会话对应的发送周期值,单位ms - SsrRsspTimeout uint32 //等待SSR回应的定时器超时值,为RsspTimer时间,1=SendingPeriod - Mtv uint32 //每个安全通信会话可容忍的最大时序偏差,即当前接收的RSD的序列号与上一次RSD的序列号最大允许差值 - Udl uint32 //每个安全通信会话RSD应用数据长度发送和接收的配置值(支持固定长度和可变长度);0-可变长度,大于0即固定长度 - DeviceA bool //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:"本地服务器端口"` //本地服务器端口 + 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:"本地服务器端口"` //本地服务器端口 } // CheckAddress 检测目标源地址目的地址是否在配置中 diff --git a/third_party/axle_device/rssp_axle.go b/third_party/axle_device/rssp_axle.go index 0617041..217b517 100644 --- a/third_party/axle_device/rssp_axle.go +++ b/third_party/axle_device/rssp_axle.go @@ -29,9 +29,7 @@ type rsspAxle struct { //接收方每个安全通信会话对应的发送周期值,单位ms sendingPeriod uint32 //主安全通道 - masterRssp *RsspChannel - //备安全通道 - slaveRssp *RsspChannel + rsspChannel *RsspChannel //收到应用层消息回调 messageManager AxleMessageManager //发送区段状态任务 @@ -44,34 +42,10 @@ func InitRsspAxle(cfg *config.RsspAxleConfig) RsspAxle { ra.city = cfg.City ra.lineId = cfg.LineId ra.centralizedStation = cfg.CentralizedStation - ra.sendingPeriod = cfg.SendingPeriod + ra.sendingPeriod = cfg.RsspCfg.SendingPeriod // - cfgLen := len(cfg.RsspCfgs) - var masterConfig, slaveConfig *config.RsspConfig - if cfgLen >= 1 { - masterConfig = &cfg.RsspCfgs[0] - masterConfig.SendingPeriod = cfg.SendingPeriod - masterConfig.SsrRsspTimeout = cfg.SsrRsspTimeout - masterConfig.Mtv = cfg.Mtv - masterConfig.Udl = cfg.Udl - masterConfig.DeviceA = cfg.DeviceA - } - if cfgLen >= 2 { - slaveConfig = &cfg.RsspCfgs[1] - slaveConfig.SendingPeriod = cfg.SendingPeriod - slaveConfig.SsrRsspTimeout = cfg.SsrRsspTimeout - slaveConfig.Mtv = cfg.Mtv - slaveConfig.Udl = cfg.Udl - slaveConfig.DeviceA = cfg.DeviceA - } - if masterConfig != nil { - mrc := &RsspChannel{} - ra.masterRssp = mrc.Init(masterConfig) - } - if slaveConfig != nil { - src := &RsspChannel{} - ra.slaveRssp = src.Init(slaveConfig) - } + mrc := &RsspChannel{} + ra.rsspChannel = mrc.Init(&cfg.RsspCfg) // return ra } @@ -85,13 +59,9 @@ func (s *rsspAxle) rcvCmdMsg(data []byte) { func (s *rsspAxle) Start(amm AxleMessageManager) error { s.messageManager = amm //设置安全通道层 - if s.masterRssp != nil { - s.masterRssp.handleUserData = s.rcvCmdMsg - s.masterRssp.Start() - } - if s.slaveRssp != nil { - s.slaveRssp.handleUserData = s.rcvCmdMsg - s.slaveRssp.Start() + if s.rsspChannel != nil { + s.rsspChannel.handleUserData = s.rcvCmdMsg + s.rsspChannel.Start() } // sendContext, sendCancel := context.WithCancel(context.Background()) @@ -101,11 +71,8 @@ func (s *rsspAxle) Start(amm AxleMessageManager) error { return nil } func (s *rsspAxle) Stop() { - if s.masterRssp != nil { - s.masterRssp.Stop() - } - if s.slaveRssp != nil { - s.slaveRssp.Stop() + if s.rsspChannel != nil { + s.rsspChannel.Stop() } // if s.cancelSendStatus != nil { @@ -153,14 +120,8 @@ func (s *rsspAxle) doTaskSendStatus(sendContext context.Context) { // 发送计轴区段状态给联锁 func (s *rsspAxle) sendStatusMsg(msg *message.SectionStatusMsgPack) { data := msg.Encode() - //向备通道发送 - if s.slaveRssp != nil { - data_s := make([]byte, len(data)) - copy(data_s, data) - s.slaveRssp.sendUserData(data_s) - } //向主通道发送 - if s.masterRssp != nil { - s.masterRssp.sendUserData(data) + if s.rsspChannel != nil { + s.rsspChannel.sendUserData(data) } } diff --git a/third_party/axle_device/rssp_axle_manage.go b/third_party/axle_device/rssp_axle_manage.go index f72de43..55c7cd0 100644 --- a/third_party/axle_device/rssp_axle_manage.go +++ b/third_party/axle_device/rssp_axle_manage.go @@ -1,10 +1,8 @@ package axle_device import ( - "fmt" "joylink.club/bj-rtsts-server/config" "joylink.club/bj-rtsts-server/third_party/message" - "log/slog" ) //联锁集中站计轴与联锁通信管理 @@ -20,10 +18,8 @@ type AxleMessageManager interface { func StartLineAllRsspAxleServices(ram AxleMessageManager) { cfgs := ram.GetLineAllRsspAxleCfgs() for _, cfg := range cfgs { - if len(cfg.RsspCfgs) > 0 { + if cfg.Open { InitRsspAxle(&cfg).Start(ram) - } else { - slog.Debug(fmt.Sprintf("")) } } }