GOOSE报文解析
GOOSE报文的结构,基于ISO/IEC 8802-3的帧格式 普通报文:
目的MAC + 源MAC + (TPID + TCI) + 以太网类型 + APPID + APDU数据的长度
(m+8)
TPID为0x8100 以太网类型为0x88B8(对于GOOSE报文)
TCI为用户优先级+CFI+VID
+ 00 00 + APDU(长度为m)
00 00 为保留位
注:( ) 中的部分可以不写,但强烈建议以以太网传输的时候,加入…. APDU Head : 格式为 61 81 + GOOSEPDU的长度,从80开始算起
广播报文:
目的MAC + 源MAC + 以太网类型 + APPID + APDU数据的长度(m+8)
(目的MAC为FF FF FF FF)
+ 00 00 + APDU(长度为m)
ASN.1 的BE R编码形式为:
TLV形式,即 Tag + Length + Value 的形式
Tag 与数据类型标记的编码一致
Length 表示后面Value的长度
Value 应用ASCII码进行编码解析
对于 Tag 的解析:
Bit 7,6 Type of Tag
Bit 5 Primitive or Constructed Flag
Bit 4-0 Tag Value
ASN.1 数据类型
83 BOOL型
84 BIT-String 型
91 UTC 型(时间)
85 Int 型
86 Unsigned 型
8a Visble-String 型
翟大厨的报文分析:
0000: 01 00 00 00 00 07 08 00 06 86 48 42 81 00 40 03
目的MAC 源Mac TPID TCI
0010: 88 B8 00 07 00 90 00 00 00 00 61 81 85 80 25 50
以太网类型 APPID 长度 保留位 APDU Head gocbRef (80 表示数据类型Tag,25表示数
据长度,从50开始都是后续数据)
0020: 32 41 31 4A 31 51 36 50 72 6F 74 65 63 74 69 6F 0030: 6E 2F 4C 4C 4E 30 24 47 53 45 70 72 6F 74 65 63
0040: 74 69 6F 6E 81 02 05 00 82 25 50 32 41 31 4A 31
timeAllowtoLive(81表示类型) dataSet(82表示类型)
0x0500---1280 0050: 51 36 50 72 6F 74 65 63 74 69 6F 6E 2F 4C 4C 4E
0060: 30 24 47 53 45 70 72 6F 74 65 63 74 69 6F 6E 83
goID(83表示类型)
0x37 对应ASCII码中的 ‘7’ 0070: 01 37 84 08 00 00 00 00 00 00 00 00 85 01 01 86
t(84表示类型) stNum(85表示类型) Num 为1
表示时间:01/01/1970_00:00:00.000000q00
0080: 03 02 70 A1 87 01 00 88 01 01 89 01 00 8A 01 04 numDatSetEntries(8A表示类型)值4
sqNum(86表示类型) test(87表示类型) ConfRev(88表示类型) ndsCom(89表示类型)
0x0270A1---159905 00 表示FALSE 为1 00表示FALSE 0090: AB 10 83 01 00 84 03 02 00 00 83 01 00 84 03 02
allData(AB表示类型)
allData为一个数据的集合 10表示后面的数据长度 内部分解为不同的小的数据集
如:83 01 00 83 (数据类型为boolean型) 01(数据长度为1) 00 (表示数据内容,对于boolean型表示为FALSE)
84 03 02 00 00 84(数据类型为bit-string型)03(数据长度为03) 02 00 00(表示数据内容) 00A0: 00 00
注:其中 numDatSetEntries表示了allData中的数据链的个数
报文解析出来为:
GoosePdu {
gocbRef "P2A1J1Q6Protection/LLN0$GSEprotection",
timeAllowedtoLive 1280,
datSet "P2A1J1Q6Protection/LLN0$GSEprotection",
goID "7",
t 01/01/1970_00:00:00.000000q00,
stNum 1,
sqNum 159905,
test FALSE,
confRev 1,
ndsCom FALSE,
numDatSetEntries 4,
allData {
boolean FALSE,
bit-string '00000000000000'B,
boolean FALSE,
bit-string '00000000000000'B }
}
Comgoose 中报文分析:
0000 01 0c cd 01 00 04 01 0c cd 01 10 10 88 b8 00 04
目的MAC 源MAC 以太网类型 APPID 0010 00 94 00 00 00 00 61 81 89 80 1c 58 37 32 31 32
长度 保留位 APDU Head gocbRef 0020 5f 32 48 42 50 52 4f 54 2f 4c 4c 4e 30 24 47 4f
0030 24 67 6f 63 62 54 78 81 02 27 10 82 1c 58 37 32
timeAllowtoLive datSet
10000
0040 31 32 5f 32 48 42 50 52 4f 54 2f 4c 4c 4e 30 24
0050 64 73 47 6f 6f 73 65 54 78 83 11 58 37 32 31 32
goID(查ASCII码表可得)
X7212_GOOSE_TX_ID
0060 5f 47 4f 4f 53 45 5f 54 58 5f 49 44 84 08 47 42
t
0070 d2 8a c8 31 26 ea 85 01 01 86 01 0d 87 01 00 88
stNum(值为1) sqNum(值为13) test(FALSE) 0080 01 01 89 01 00 8a 01 08 ab 18 83 01 00 84 01 00 ConfRev(值为1) ndsCom(FALSE) numDatSetEntries(值为8) allData(共有8个数据链,长度为24)
0090 83 01 00 84 01 00 83 01 00 84 01 00 83 01 00 84 00a0 01 00
报文解析出来为:
GoosePdu {
gocbRef "X7212_2HBPROT/LLN0$GO$gocbTx",
timeAllowedtoLive 1280,
datSet "X7212_2HBPROT/LLN0$dsGooseTx",
goID " X7212_GOOSE_TX_ID ",
t 01/01/1970_00:00:00.000000q00,
stNum 1,
sqNum 13,
test FALSE,
confRev 1,
ndsCom FALSE,
numDatSetEntries 8,
allData {
boolean FALSE,
bit-string '00000000000000'B,
boolean FALSE,
bit-string '00000000000000'B
boolean FALSE,
bit-string '00000000000000'B,
boolean FALSE,
bit-string '00000000000000'B
}
}
Goose3 中报文分析:
0000 01 0c cd 01 01 ff 00 0d 60 9f 07 a6 81 00 80 00
目的MAC 源MAC TPID TCI 0010 88 b8 00 00 01 79 00 00 00 00 61 82 01 6d 80 10
以太网类型 APPID 长度 保留位 APDU Head gocbRef
0x0179---385
0020 45 44 50 30 31 4c 44 30 2f 67 6f 6f 73 65 53 54 0030 81 01 0a 82 18 45 44 50 30 31 4c 44 30 2f 4c 4c
timeAllowedtoLive datSet
10
0040 4e 30 24 41 6c 6c 5f 53 54 5f 50 6f 73 83 0c 4c
goID 0050 44 30 5f 47 6f 6f 73 65 5f 53 54 84 08 00 00 00
t
0060 00 00 00 00 00 85 01 01 86 01 00 87 01 00 88 01
stNum sqNum test ConfRev
值为1 值为0 FALSE 32 0070 20 89 01 00 8a 01 08 ab 82 01 10 a2 20 a2 05 85
ndsCom numDatSetEntries allData 数据结构为嵌套型
FALSE 值为8,表示有8个嵌套结构数据
0080 01 00 89 00 86 01 00 84 02 06 40 84 03 03 00 00 0090 91 08 45 65 09 c2 7f ff ff 18 83 01 00 a2 20 a2 00a0 05 85 01 00 89 00 86 01 00 84 02 06 80 84 03 03 00b0 00 00 91 08 00 00 00 00 00 00 00 00 83 01 00 a2 00c0 20 a2 05 85 01 00 89 00 86 01 00 84 02 06 40 84 00d0 03 03 00 00 91 08 00 00 00 00 00 00 00 00 83 01 00e0 00 a2 20 a2 05 85 01 00 89 00 86 01 00 84 02 06 00f0 80 84 03 03 00 00 91 08 00 00 00 00 00 00 00 00 0100 83 01 00 a2 20 a2 05 85 01 00 89 00 86 01 00 84 0110 02 06 80 84 03 03 00 00 91 08 00 00 00 00 00 00 0120 00 00 83 01 00 a2 20 a2 05 85 01 00 89 00 86 01 0130 00 84 02 06 40 84 03 03 00 00 91 08 00 00 00 00 0140 00 00 00 00 83 01 00 a2 20 a2 05 85 01 00 89 00 0150 86 01 00 84 02 06 40 84 03 03 00 00 91 08 00 00 0160 00 00 00 00 00 00 83 01 00 a2 20 a2 05 85 01 00 0170 89 00 86 01 00 84 02 06 80 84 03 03 00 00 91 08 0180 00 00 00 00 00 00 00 00 83 01 00
报文解析出来为:
GoosePdu {
gocbRef " EDP01LD0 /gooseST ",
timeAllowedtoLive 10,
datSet " EDP 01LD0/LL N0$All_S T_Pos ",
goID " LD0_Goose _ST ",
t 01/01/1970_00:00:00.000000q00,
stNum 1,
sqNum 0,
test FALSE,
confRev 32,
ndsCom FALSE,
numDatSetEntries 8,
allData {
}
}