Documentation and message reference: https://mavlink-m.dronecode.org/
MAVLink-M is one open interface for military payloads and platforms: a dialect of MAVLink 2 that adds a public message set for safety and arming, targeting and engagement, remote weapon systems, and shared tracks. Platforms and payloads that implement it work together without a custom integration for every pair.
Where the common MAVLink message set covers flying the aircraft, MAVLink-M covers what the platform carries and how it coordinates with others. The messages are shaped so that a platform speaking this dialect can be understood by the wider force, translating cleanly, through a gateway, into the command-and-control message standards those systems already run on.
MAVLink-M is a message-schema dialect. It defines field layouts on top of open MAVLink; it is not an implementation, and it does not describe how any device works internally.
What the dialect deliberately does and does not carry is the core of its design:
- It carries descriptive intent and observation — what was seen, what is requested, and the current status of a participant. This is the information a cooperating system needs to coordinate.
- It excludes device-internal configuration — no fuze timing values, no laser codes, no performance or effectiveness data. The messages describe coordination between participants, never the internal programming of a device.
- Kinetic and non-kinetic intent are separable — observation cueing is a distinct message from action requests, so a consumer can tell "observe this" from "act on this" by message ID alone.
- Accountability is a record, not a trigger — messages that record a decision or authorization are exactly that: a record for audit and shared awareness, not a command that causes an action.
These boundaries are intentional. They keep the dialect a coordination and telemetry vocabulary that interoperates across systems, and keep the internal programming of any device off the wire.
| File | Purpose |
|---|---|
military.xml |
The shared MAVLink-M dialect. Includes common.xml. |
military_extensions.xml |
A template only, showing how a downstream implementor defines private, local messages in the reserved 53900-53999 block without adding them to the shared dialect. Not part of the generated dialect here. |
component_metadata/ |
Shared schema and examples for payload catalogue metadata retrieved through the MAVLink Component Metadata service. |
IDMAPPING.md |
Message-ID allocation for the 53000-53999 range. |
Message IDs are allocated as 53000-53099 for the initial shared messages,
53100-53108 for the generic payload messages, 53109-53899 for future shared
growth, and 53900-53999 for private/downstream messages. See
IDMAPPING.md for the full map.
The dialect drops into any MAVLink 2 stack. Generate bindings for your language with mavgen, for example:
python3 -m pymavlink.tools.mavgen \
--lang=C --wire-protocol=2.0 \
--output=out military.xmlPre-generated C headers are published to
mavlink-military-c_library_v2,
regenerated by CI on every change to military.xml on main. This repository
and that library make up the project. Only CI publishes to the library, and
each commit it makes there names the commit of this repository it comes from
and the generator pins; a daily check regenerates the headers and compares them
with the library.
For a worked example on real hardware — a flight controller relaying MAVLink-M messages to a peripheral — see nucleo-mavlink-m-demo.
MAVLink-M is a public draft: message layouts can still change until the
standard freezes in November 2026. See the
status and roadmap for
what that means for implementers. The 53000-53099 allocation is active for
this dialect, and message IDs are stable once assigned. The working group
discusses proposals on the
MAVLink-M mailing list. To propose a
new shared message or a change, open a pull request against military.xml;
keep additions within the scope and boundaries above.
See CONTRIBUTING.md for the commit format, the DCO sign-off,
and review expectations.
MIT. See LICENSE.