MAVLink 是一种二进制遥测协议,专为资源受限的系统和带宽受限的链路而设计。MAVLink部署有两个主要版本:v1.0和v2.0,v2.0向后兼容(v2.0实现可以解析和发送v1.0数据包)。遥测数据流以多播设计发送,而改变系统配置并需要保证传输(如任务协议或参数协议)的协议方面是点对点重传。
MAVLink 2 数据包格式
以下是MAVLink v2数据包的在线格式。内存中的表示可能有所不同。
uint8_t magic; ///< protocol magic marker
uint8_t len; ///< Length of payload
uint8_t incompat_flags; ///< flags that must be understood
uint8_t compat_flags; ///< flags that can be ignored if not understood
uint8_t seq; ///< Sequence of packet
uint8_t sysid; ///< ID of message sender system/aircraft
uint8_t compid; ///< ID of the message sender component
uint8_t msgid 0:7; ///< first 8 bits of the ID of the message
uint8_t msgid 8:15; ///< middle 8 bits of the ID of the message
uint8_t msgid 16:23; ///< last 8 bits of the ID of the message
uint8_t payload[max 255]; ///< A maximum of 255 payload bytes
uint16_t checksum; ///< CRC-16/MCRF4XX
uint8_t signature[13]; ///< Signature which allows ensuring that the link is tamper-proof (optional)
MAVLink 1 数据包格式类似,但省略了
incompat_flags
、compat_flags
和signature
,并且只有一个字节用于消息地址。有关详细信息,请参阅序列化 > 数据包格式。
序列化
MAVLink 的在线格式针对资源受限的系统进行了优化,因此字段顺序与 XML 规范中的字段顺序不同。在线生成器根据大小对消息的所有字段进行排序,uint64_t
首先是最大的字段 ( ),然后是较小的字段。排序是使用稳定的排序算法完成的,这确保任何不需要重新排序的字段保持相同的相对顺序。这可以防止编码/解码系统上的对齐问题,并允许非常有效的打包/解包。
有关详细信息和特定异常,请参阅序列化。
组播流与保证传送
MAVLink 专为混合网络而构建,其中来自数据源(通常是无人机)的高速数据流流向数据接收器(通常是地面站),但与需要保证交付的传输混合在一起。关键的见解是,对于大多数遥测流来说,没有已知的或单一的接收者:相反,通常机载计算机、地面控制站和云系统都需要相同的数据流。
另一方面,配置机载任务或使用机载参数更改系统配置需要保证交付的点对点通信。MAVLink 通过允许两种操作模式实现了非常高的效率。
主题模式(发布-订阅)
在主题模式下,协议不会发出消息的目标系统和组件 ID,以节省链路带宽。这种通信模式的典型示例是所有自动驾驶仪数据流,例如位置、姿态等。
这种多播模式的主要好处是不会产生额外的开销,并且多个订阅者都可以接收该数据。
点对点模式
在点对点模式下,MAVLink 使用目标 ID 和目标组件。在大多数使用这些字段的情况下,子协议还确保有保证的交付(任务、参数、命令)。
完整性检查/校验和
MAVLink 实现两个完整性检查:第一个检查是使用 CRC-16/MCRF4XX 校验和在传输过程中检查数据包的完整性。然而,这只能确保链接上的数据没有被更改 - 它不能确保与数据定义的一致性。第二个完整性检查是针对数据描述,以确保具有相同 ID 的两条消息确实包含相同的信息。为了实现这一点,数据定义本身通过 CRC-16-CCITT 运行,并且结果值用于作为数据包 CRC 的种子。大多数参考实现将此常量存储在名为CRC_EXTRA的数组中。