Реализация MAVLink предоставляется в следующих версиях:
MAVLink 2.0: текущая/рекомендуемая версия. Была адаптирована основными пользователям в начале 2017 года. MAVLink v1.0: широко использовалась до 2013 года. Все еще используется некоторой старой периферией.
Примечание: расшифровку незнакомых терминов и сокращений см. в Словарике MAVLink [3].
Библиотеки MAVLink 2.0 C/C++ и Python обладают обратной совместимостью с MAVLink 1.0 (т. е. поддерживают обе версии протокола). См. далее "Version Handshaking" и "Negotiating Versions" для объяснения, как выбрать используемую версию.
Замечание: версия MAVLink v0.9 была предварительным релизом, который больше не поддерживается. Связанный с этой версией набор сообщений был удален в августе 2018 года. Устаревший код может присутствовать в генераторе и коде теста.
[Определение протокола / версии сообщения]
Поддержка библиотеки MAVLink может быть определена несколькими способами:
• AUTOPILOT_VERSION.capabilities можно проверить на наличие флага MAV_PROTOCOL_CAPABILITY_MAVLINK2, что указывает на поддержку MAVLink 2.
• PROTOCOL_VERSION.version содержит номер версии MAVLink, умноженный на 100: 100 соответствует версии v1.0, 203 соответствует v2.3, и т. д.
• Поле HEARTBEAT.mavlink_version содержит minor-номер версии. Это поле < version> определено в Message Definitions (version в common.xml для диалектов, которые зависят от общего набора сообщений).
• Major-версия может быть определена по начальному байту маркера пакета. У MAVLink 1 это байт 0xFE, а у MAVLink 2 байт 0xFD.
Замечание: библиотека MAVLink, не поддерживающая версию протокола, не распознает маркер запуска протокола; поэтому сообщения даже не будут обнаружены (см. описание сериализации пакета [2]).
Совет: хотя сообщения не поддерживают информацию версии, используется дополнительная CRC для гарантии, что библиотека будет обрабатывать только совместимые сообщения (см. CRC_EXTRA [2]).
[Version Handshaking]
Поддержка MAVLink 2 показывается в сообщении AUTOPILOT_VERSION флагом MAV_PROTOCOL_CAPABILITY_MAVLINK2.
Этого достаточно, если линк коммуникации между автопилотом и GCS полностью прозрачен. Однако многие линки не полностью прозрачны, поскольку могут включать либо маршрутизацию, либо реализации пакетов беспроводной связи фиксированной длины. Чтобы также проверить линк, протокол рукопожатия MAVLink 2 (handshake protocol) посылает кадр MAVLink 2 для теста всей цепочки обмена.
Чтобы это сделать, GCS посылает команду COMMAND_LONG или COMMAND_INT с идентификатором команды MAV_CMD_REQUEST_PROTOCOL_VERSION (это так называемое рукопожатие версии, version handshaking).
Если система поддерживает MAVLink 2, то на этот handshake будет получен ответ с PROTOCOL_VERSION, закодированный как пакет MAVLink 2. Если это не поддерживается, то MAVLink 2 должен отклонить (NACK) команду. GCS должна попасть в таймаут отсутствия ответа в случае, когда интерфейс команды не реализован соответствующим образом.
Следующая диаграмма иллюстрирует последовательность рукопожатия.

Semi-Transparent Legacy Radios. Некоторые популярные радиоустройства (например серия SiK radio) работают в частично прозрачном режиме (semi-transparent mode) путем инжекции сообщений RADIO_STATUS в поток сообщений MAVLink. В соответствии со спецификацией MAVLink они должны фактически излучать сердцебиение (heartbeat) с тем же идентификатором системы (system ID) и другим идентификатором компонента, отличающимся от автопилота, чтобы быть обнаруживаемым. Тем не менее, дополнительный heartbeat может быть проблемой для развернутых систем. Следовательно, эти радиостанции могут альтернативно подтвердить свое соответствие MAVLink 2 путем излучения RADIO_STATUS в формате сообщения v2 после приема первого кадра MAVLink v2.
[Версии и их подпись]
Поддерживаемые реализации библиотеки MAVLink позволяют использовать различные версии MAVLink на базе каналов, где под каналом подразумевается определенный in/out линк системы или компонента MAVLink (линком может быть например последовательный порт UART ил порт UDP).
В результате все соединения с другими компонентами на определенном канале должны глобально использовать одинаковую версию MAVLink. Если система использует подпись, то все соединения на дном и том же канале должны также подписывать сообщения одинаковым ключом.
Замечание: системы не могут использовать один канал для соединения с подписанными системами MAVLink 2, неподписанными системами MAVLink 2, и/или компонентами MAVLink 1.
В настоящее время большинство сетей MAVLink сконфигурированы для использования неподписанных сообщений MAVLink 2. MAVLink 1 используется в основном чтобы позволить автопилотам подключаться к устаревшим периферийным устройствам MAVLink, и это осуществляется через отдельный канал. Подписанные сети нуждаются в еще одном отдельном канале для подключения к другим подписанным системам.
В следующей секции объясняется, как система/канал должны реализовать согласование используемой версии (negotiate version).
[Negotiating Versions]
Реализации MAV и GCS будут поддерживать обе версии MAVLink 1 и MAVLink 2 в течение достаточно продолжительного времени. Мы хотели бы, чтобы большинство пользователей получили выгоды от использования MAVLink 2, в то же время с сохранением поддержки реализаций, в которых еще нет MAVLink 2.
Существует соответствующая рекомендательная практика для разработчиков прошивок MAV и GCS:
• Реализации MAV должны иметь опцию разрешения/запрета отправки сообщений MAVLink 2. Это предпочтительно должно использоваться на базе линка (канала), чтобы некоторые периферийные устройства могли быть MAVLink 1, в то время как другие MAVLink 2. Для этой опции допустима перезагрузка FC, чтобы изменение настройки вступило в силу.
• Если подпись разрешена, то MAV сразу после своего запуска должен посылать подписанные сообщения MAVLink 2.
• Если подпись не разрешена, и разрешено использование MAVLink 2, то MAV может выбрать посылать MAVLink 1 и переключаться на MAVLink 2 на линке, когда он первый раз получит через этот линк сообщение MAVLink 2.
• MAV-ы должны установить флаг MAV_PROTOCOL_CAPABILITY_MAVLINK2 в сообщении AUTOPILOT_VERSION, если на линке доступен MAVLink 2. Это должно быть установлено на линке, на котором в настоящее время посылаются пакеты MAVLink 1, но приняты пакеты MAVLink 2, и тогда произойдет переключение на MAVLink 2.
• Реализации GCS могут выбрать либо автоматическое переключение на MAVLink 2, где это доступно, либо поддерживать опцию конфигурации для использования MAVLink 2.
• Если GCS выбрала использовать опцию конфигурации, то при включении опции MAVLink 2 она должна посылать сообщения MAVLink 2 при старте линка.
• Если GCS выбрала автоматическое переключение, то она должна переключиться на отправку MAVLink 2, если либо приняла сообщение MAVLink 2 на линке, ли бо путем запроса отправки сообщения AUTOPILOT_VERSION и в ответ на него увидела, что флаг MAV_PROTOCOL_CAPABILITY_MAVLINK2 установлен.
[Ссылки]
1. MAVLink Versions site:mavlink.io. 2. MAVLink Packet Serialization site:mavlink.io. 3. MAVLink: руководство разработчика. 4. MAVLink: стандартные определения. |