LCM消息由channel name和payload组成。channel name是一个标识消息的语义分组的string,payload是对应消息内容的二进制数据块,该编码是LCM类型的。
每个LCM消息使用一个或多个UDP数据报传输到UDP的多播组和端口。地址和端口事先规定,LCM没有自动发现的机制。
要在通道上发布消息,LCM客户端将按照下两节中的说明对其进行打包,然后将其直接发送到多播组。如果LCM消息的大小很小,则可以使用单个UDP数据报发送它。否则,消息必须分段并以多个部分传输。
small messages
小消息指LCM small message header,channel name,payload能封在一个UDP数据包内。LCM将其限制在1400 bytes以下,从而保持在以太网的MTU最大传输单元之内。
header为8 byte
short_header_magic是unsigned 32-bit int 0x4c433032
sequence_number是单调递增的unsigned 32-bit 数,用于标识/区别消息
两个值都是网络字节序(Big-Endian)
header之后是空值终止的UTF-8编码,是channel name
再后面是payload
message片段
如果消息较大需要拆分成多个片段进行传输,每个片段再单个UDP数据报中传输,第一个片段包含header,channel name和第一段payload。后续片段由header和payload组成。
每个片段的header为20个字节,格式如下:
fragment_header_magic 是带有值的无符号32位整数 0x4c433033
sequence_number是单调递增的unsigned 32-bit 数,用于标识/区别消息。对于片段和短消息,都使用相同的计数器,一个LCM消息的所有片段有相同的序列号。
payload_size是一个无符号的32位整数,表示有效负载的长度,以字节为单位。这不包括channl name的长度。
fragment_offset 是无符号的32位整数,指示消息有效负载内的片段数据的有效负载字节偏移量。即拼接时候的位置
fragment_number 是无符号的16位整数,第一个片段的值为0,第二个片段的值为1,依此类推。
n_fragments 是无符号的16位整数,其值对应于消息中的片段总数。
所有header都按网络字节序打包。通道的以空值终止的UTF-8编码紧跟在消息的第一个片段的标头之后。接下来是消息有效负载的第一个字节。在后续片段中,有效载荷数据紧跟在片段头部之后。
payload
payload是LCM类型的,其规范用法如下:
除了平台协议,还包含为用户定义的数据类型的编组和解组(marshalling and unmarshalling)功能,有点类似与XDR但是具有更高的类型安全性。
优点:
类型规范在“.lcm”类型的文件中。
struct
LCM中的struct是由其他类型组成的。例如
这种结构体声明必须出现在对应的.lcm文件中。LCM类型中不包含指针但支持数组,这消除了循环引用的可能性。
支持的原始类型如下:
整数类型都有符号,并以网络字节序进行编码。byte类型的编码方式和int8_t一样。有些情况下,buffers of data(缓冲区数据)必须通过网络发送。这些数据缓冲区必须由一些其他软件解码。The type byte can be used by a type designer to help convey the notion that the data is opaque, and should not be interpreted (literally) as an array of 8 bit integers.(???)
float型数据通过IEEE 32 bit和64 bit格式来编码,LCM实现可能不使用其他任何编码。32位和64位量以网络字节序传输。
boolean类型被编码为单个字节,其值为0或1.N布尔值的数组将需要N个字节。
string类型编码以NULL结尾的UTF-8字符串。该字符串作为32位整数发送,包括字符串的总长度(包括终止NULL字符),后跟字符串的字节(再次,包括NULL字符)。
数组
LCM支持由原始类型、结构体或常量声明组成的多维数组。数组维数以LCM类型声明。LCM类型不能包括可变维数的数组,但可变size的数组可以。
在这个例子中,包括可变长度和固定长度的二维数组。在可变长度声明中,包含长度的变量必须在用作数组长度之前声明。另请注意,长度变量(上例中的npoints)必须是整数类型,并且必须始终具有大于或等于零的值。当对数组进行编码和解码时,每个维度的大小都是已知的:它是一个常量(由LCM类型声明给出),或者它是先前编码/解码的变量。
常量
LCM提供了一种声明常量的简单方法,随后可用于填充其他数据字段。用户可以以他们选择的任何方式自由使用这些常量:作为幻数,枚举或位域(magic numbers, enumerations, or bitfields)。
可以使用const关键字声明常量。
必须为常量声明类型。支持所有整数和浮点类型。不支持字符串常量。
Namespaces
LCM允许在namespace中定义类型。在像C这样的语言中,通过将package名称添加到类型名称来近似命名空间。