ecall GOST 33464 MSD数据结构分析 —— 根据ASN.1语法

GOST 33464中对MSD数据(minimum set of data)的结构规定是用ASN.1语法描述的。下面以version2版本为例分析MSD数据结构,并给出一种可能的实际数据结构示例。
首先是GOST 33464: 2015附录C.3, C.5中的描述:
在这里插入图片描述

MSDASN1Module_V2
DEFINITIONS
AUTOMATIC TAGS ::=
BEGIN
-- MSD specification version
CurrentId::= INTEGER (2)
-- ECallMessage is an upper level data element
-- It supports one message type only (msd)
-- Elements:
-- id: MSD data format, set to 1
-- msd: minimum set of data transmitted from IVDS side, except for ID
ECallMessage ::= SEQUENCE {
msdVersion INTEGER(0255),
msd OCTET STRING (CONTAINING MSDMessage)
}
-- Message sent from IVDS side (ID is excluded)
-- Elements:
-- msdStructure: main MSD structure
-- optionalAdditionalData: additional data
-- May be extended at this level in future versions
MSDMessage ::= SEQUENCE {
msdStructure MSDStructure,
optionalAdditionalData AdditionalData OPTIONAL,
...
}
-- Main MSD structure without any additional data
-- Elements:
-- messageldentifier: message identifier
-- control: see ControlType
-- vehicleldentificationNumber: see VIN
-- vehiclePropulsionStorageType: see VehiclePropulsionStorageType
-- timestamp: time stamp
-- vehicleLocation: see VehicleLocation
-- vehicleDirection: vehicle direction
 
-- recentVehicleLocationNl: displacement from current vehicle location
-- see VehicleLocationDelta
-- recentVehicleLocationN2: displacement from
-- recentVehicleLocationN1 see VehicleLocationDelta
-- numberOfPassengers: minimum known number
-- of fastened safety belts
MSDStructure ::= SEQUENCE {
messageIdentifier INTEGER(0 ... 255),
control ControlType,
vehicleIdentificationNumber VIN,
vehiclePropulsionStorageType VehiclePropulsionStorageType,
timestamp INTEGER(0 ... 4294967295),
vehicleLocation VehicleLocation,
vehicleDirection INTEGER(0 ... 255),
recentVehicleLocationN1 VehicleLocationDelta OPTIONAL,
recentVehicleLocationN2 VehicleLocationDelta OPTIONAL,
numberOfPassengers INTEGER(0 ... 255) OPTIONAL,
...
}
-- ControlType includes the following elements:
-- automaticActivation: true, false
-- testCall: true, false
-- positionCanBeTrusted: true, false
-- vehicleType: see VehicleType
ControlType ::= SEQUENCE {
automaticActivation BOOLEAN,
testCall BOOLEAN,
positionCanBeTrusted BOOLEAN,
vehicleType VehicleType
}
-- Vehicle type definition
VehicleType ::= ENUMERATED{
passengerVehicleClassM1 (1),
busesAndCoachesClassM2 (2),
busesAndCoachesClassM3 (3),
lightCommercialVehiclesClassN1 (4),
heavyDutyVehiclesClassN2 (5),
heavyDutyVehiclesClassN3 (6),
motorcyclesClassL1e (7),
motorcyclesClassL2e (8),
motorcyclesClassL3e (9),
motorcyclesClassL4e (10),
motorcyclesClassL5e (11),
motorcyclesClassL6e (12),
motorcyclesClassL7e (13),
...
}
-- Vehicle Identification Number (VIN)
VIN::= SEQUENCE{
isowmi PrintableString (SIZE(3))
(FROM("A".."H"|"J".."N"|"P"|"R".."Z"|"0".."9")),
isovds PrintableString (SIZE(6))
(FROM("A".."H"|"J".."N"|"P"|"R".."Z"|"0".."9")),
isovisModelyear PrintableString (SIZE(l))
(FROM("A".."H"|"J".."N"|"P"|"R".."Z"|"0".."9")),
isovisSeqPlant PrintableString (SIZE(7))
(FROM("A".."H"|"J".."N"|"P"|"R".."Z"|"0".."9")),
}
-- VehiclePropulsionStorageType:
-- Fuel (energy source) type used for vehicle
VehiclePropulsionStorageType ::= SEQUENCE {
gasolineTankPresent BOOLEAN DEFAULT FALSE,
dieselTankPresent BOOLEAN DEFAULT FALSE,
compressedNaturalGas BOOLEAN DEFAULT FALSE,
liquidPropaneGas BOOLEAN DEFAULT FALSE,
electricEnergyStorage BOOLEAN DEFAULT FALSE,
hydrogenStorage BOOLEAN DEFAULT FALSE,
otherStorage BOOLEAN DEFAULT FALSE,
...
}
-- VehicleLocation:
-- Current vehicle location
-- Elements:
-- Latitude32 bits (4 octets) allocated
-- Longitude32 bits (4 octets) allocated
VehicleLocation ::= SEQUENCE {
positionLatitude INTEGER (-2147483648..2147483647),
positionLongitude INTEGER (-2147483648..2147483647)
}
-- VehicleLocationDelta:
-- Vehicle location before an RTA event was detected
VehicleLocationDelta ::= SEQUENCE {
latitudeDelta INTEGER (-512..511),
longitudeDelta INTEGER (-512..511)
}
-- AdditionalData:
-- Any additional data encoded as a separate definition
-- Elements:
-- oid: object identifier defining data format and purpose
-- data: additional data in the format
-- defined by oid
AdditionalData ::= SEQUENCE {
oid RELATIVE-OID,
data OCTET STRING
}
END

在分析MSD数据结构之前,首先需要了解一些基本的ASN.1语法规则,可参考文档《ASN.1编码规则详解(最全最经典)》中2.2节,2.3节,2.4节,2.6节,2.8节,2.9节,2.10节中的2.10.2(重要!),以及其他读者认为有必要提前阅读的章节。

    其次,还需要了解编码规则。GOST 33464中规定的MSD数据是按UPER编码的,可参考文档《ASN.1编码规则详解(最全最经典)》中的3.3节。特别需要阅读的是,涉及到MSD的相关数据类型的编码说明(在3.3.6节中),如BOOLEAN型、INTEGER型、ENUMERATED型、RELATIVE-OID型、字符串与日期型、SEQUENCE型等。

举例:
SEQUENCE类型:
首先,如果有 COMPONENTS OF 语句,则由相应的类型进行替换。
如果 SEQUENCE 类型是可扩展的,则在编码的头部加上一个比特的 bit-field,如果SEQUENCE 的取值中有属于扩展附加部分的成员,则该比特等于 1,否则等于 0。如果 SEQUENCE 的定义中在扩展根部( extension root)有"n"个成员被置为OPTIONAL 或 DEFAULT,则在编码头部再添加"n"个比特的 bit-field,该 bit-field从第一个 bit 开始,依次指示被标记为 OPTIONAL 或 DEFAULT 的成员是否出现。如果为 1,则该成员出现,否则没有出现。如果“ n”小于 64K,则这个 bit-field 应该直接添到码流中。如果"n"大于等于 64K, 按照前面提到的处理方法把“ n”个bit 的 bit-field 分段并添加到域序列中,前面的长度字段 L 就作为一个有约束的整数编码,而约束的上限和下限都等于 n。

接下来就可以具体分析GOST 33465 附录C.5中对MSD数据的具体规定了。
注意:关于OID的分析需要参考文档ISO/IEC 8825-2的第33章节。(这块还没仔细看,待补充…)
分析完后,一种可能的MSD数据结构为(不说是一定,是因为按照ASN.1描述,部分指示位、数据位有可能不存在。此处只列举一种可能性供读者参考):

在这里插入图片描述