118 lines
2.9 KiB
Go
118 lines
2.9 KiB
Go
package message
|
||
|
||
import "encoding/binary"
|
||
|
||
//RSSP-1 V1.0 铁路信号安全通信协议
|
||
|
||
// RsspHead rssp报文头
|
||
type RsspHead struct {
|
||
//报文头-协议交互类别(1Byte)
|
||
Pic byte
|
||
//报文头-报文类别(1Byte)
|
||
Mc byte
|
||
//报文头-源地址(2Byte)
|
||
Sa uint16
|
||
//报文头-目地址(2Byte)
|
||
Da uint16
|
||
}
|
||
|
||
// RsspRsd 实时安全数据包
|
||
type RsspRsd struct {
|
||
RsspHead
|
||
//安全校验域-序列号(4Byte)
|
||
Sn uint32
|
||
//安全校验域-安全数据长度(2Byte)
|
||
Sdl uint16
|
||
//安全校验域-安全校验通道1(4Byte)
|
||
Svc1 uint32
|
||
//安全校验域-安全校验通道2(4Byte)
|
||
Svc2 uint32
|
||
//用户数据包-安全应用数据(总字节数480)
|
||
Sad []byte
|
||
//报文尾-CRC16(2Byte)
|
||
Crc16 uint16
|
||
}
|
||
|
||
func (r *RsspRsd) Encode() []byte {
|
||
data := make([]byte, 0, 6+14+len(r.Sad)+2)
|
||
//报文头
|
||
data = append(data, r.Pic)
|
||
data = append(data, r.Mc)
|
||
data = binary.LittleEndian.AppendUint16(data, r.Sa)
|
||
data = binary.LittleEndian.AppendUint16(data, r.Da)
|
||
//安全校验域
|
||
data = binary.LittleEndian.AppendUint32(data, r.Sn)
|
||
data = binary.LittleEndian.AppendUint16(data, r.Sdl)
|
||
data = binary.LittleEndian.AppendUint32(data, r.Svc1)
|
||
data = binary.LittleEndian.AppendUint32(data, r.Svc2)
|
||
//用户数据包
|
||
data = append(data, r.Sad...)
|
||
//报文尾-CRC16
|
||
r.Crc16 = uint16(NewCrc(uint64(RsspCrc16GX), 17, data).Generate())
|
||
data = binary.LittleEndian.AppendUint16(data, r.Crc16)
|
||
//
|
||
return data
|
||
}
|
||
func (t *RsspRsd) Decode(buf []byte) error {
|
||
return nil
|
||
}
|
||
|
||
// RsspSse 时序校正请求包
|
||
type RsspSse struct {
|
||
RsspHead
|
||
//安全校验域-序列号(4Byte)
|
||
Sn uint32
|
||
//安全校验域-时序校正请求通道1(4Byte)
|
||
SeqEnq1 uint32
|
||
//安全校验域-时序校正请求通道2(4Byte)
|
||
SeqEnq2 uint32
|
||
//报文尾-CRC16(2Byte)
|
||
Crc16 uint16
|
||
}
|
||
|
||
// RsspSsr 时序校正应答包,用于回应SSE
|
||
type RsspSsr struct {
|
||
RsspHead
|
||
//安全校验域-应答方的序列号(4Byte)
|
||
SrSn uint32
|
||
//安全校验域-请求方的序列号(4Byte)
|
||
SeSn uint32
|
||
//安全校验域-时序初始化通道1(4Byte)
|
||
Tic1 uint32
|
||
//安全校验域-时序初始化通道2(4Byte)
|
||
Tic2 uint32
|
||
//安全校验域-数据版本号(1Byte)
|
||
Dvn byte
|
||
//报文尾-CRC16(2Byte)
|
||
Crc16 uint16
|
||
}
|
||
|
||
// //////////////////CRC循环冗余校验--移位寄存器///////////////////////////
|
||
|
||
const (
|
||
RsspCrc16GX uint32 = 0b1_0000_1000_0001_0001 //生成多项式 G(X)=X16+X11+X4+1
|
||
)
|
||
|
||
type crc struct {
|
||
//生成多项式,即二进制位数,如生成多项式X4+X3+1对应二进制11001共5位,生成的校验码长度为4
|
||
g uint64
|
||
//移位寄存器
|
||
reg uint64
|
||
//生成多项式长度、移位寄存器长度
|
||
gl int8
|
||
//消息数据
|
||
m []byte
|
||
}
|
||
|
||
// NewCrc CRC循环冗余校验
|
||
//
|
||
// g : 生成多项式
|
||
// gl : 生成多项式的长度即二进制位数
|
||
// m : 被校验的消息数据
|
||
func NewCrc(g uint64, gl int8, m []byte) *crc {
|
||
return &crc{g: g, gl: gl, m: m, reg: 0}
|
||
}
|
||
func (c *crc) Generate() uint64 {
|
||
return 0
|
||
}
|