# MAVLink

MAVLink ou Micro Air Vehicle Link (Tradução literal: Comunicação de Micro Veículo Aéreo) é um protocolo de comunicação para pequenos veículos não tripulados. Ele é projetado como uma biblioteca de mensagens apenas de cabeçalho. MAVLink foi lançado pela primeira vez no início de 2009. por Lorenz Meier sob a licença LGPL.

## Aplicações

Ele é usado principalmente para comunicação entre uma Estação de Controle de Solo e veículo aéreo não tripulado, e na intercomunicação do subsistema do veículo. Ela pode ser usada para transmitir a orientação do veículo, sua localização GPS e velocidade.

## Estrutura dos Pacotes

Na versão 1.0, a estrutura do pacote é a seguinte:
| Field name | Index (Bytes) | Purpose |
| Start-of-frame | 0 | Denota o início da transmissão do quadro (v1.0: 0xFE) |
| Payload-length | 1 | tamanho do payload (n) |
| Packet sequence | 2 | Cada componente conta sua seqüência de envio. Permitindo a detecção de perda de pacotes. |
| System ID | 3 | Identificação do sistema de SENDING. Permite diferenciar diferentes sistemas na mesma rede. |
| Component ID | 4 | Identificação do componente SENDING. Permite diferenciar diferentes componentes de um mesmo sistema, por exemplo, a IMU e o piloto automático. |
| Message ID | 5 | Identificação da mensagem - o id define o que o payload "deve conter" e como ela deve ser corretamente decodificada. |
| Payload | 6 to (n+6) | Os dados na mensagem, dependem da identificação da mensagem. |
| CRC | (n+7) to (n+8) | Verificação da soma de todo o pacote, excluindo o sinal de partida do pacote (LSB para MSB) |
Após a Versão 2, a estrutura do pacote foi expandida para o seguinte:
| Field name | Index (Bytes) | Purpose |
| Start-of-frame | 0 | Denota o início da transmissão do quadro (v2: 0xFD) |
| Payload-length | 1 | tamanho do payload (n) |
| incompatibility flags | 2 | Bandeiras que devem ser interpretadas para a compatibilidade do MAVLink |
| compatibility flags | 3 | Bandeiras que podem ser ignoradas se não forem interpretadas |
| Packet sequence | 4 | Cada componente conta sua seqüência de envio. Permitindo a detecção de perda de pacotes. |
| System ID | 5 | Identificação do sistema de SENDING. Permite diferenciar diferentes sistemas na mesma rede. |
| Component ID | 6 | Identificação do componente SENDING. Permite diferenciar diferentes componentes de um mesmo sistema, por exemplo, a IMU e o piloto automático. |
| Message ID | 7 to 9 | Identificação da mensagem - o id define o que o payload "deve conter" e como ela deve ser corretamente decodificada. |
| Payload | 10 to (n+10) | Os dados na mensagem, dependem da identificação da mensagem. |
| CRC | (n+11) to (n+12) | Verificação da soma de todo o pacote, excluindo o sinal de partida do pacote (LSB para MSB) |
| Signature | (n+13) to (n+25) | Assinatura para verificar se as mensagens são originadas de uma fonte confiável. (opcional) |

### Campo CRC

Para garantir a integridade da mensagem, uma verificação de redundância cíclica (CRC) é calculada para cada mensagem nos dois últimos bytes. Outra função do campo CRC é garantir que o remetente e o receptor concordem na mensagem que está sendo transferida. Ele é calculado usando um hash ITU X.25SAE AS-4 dos bytes no pacote, excluindo o indicador de Início de Margem (assim 6+n+1 bytes são avaliados, o extra +1 é o valor da semente). A semente é gerada com cada novo conjunto de mensagens do protocolo, e é apresentada de forma semelhante aos pacotes de cada especificação de mensagem. Os sistemas que usam o protocolo MAVLink podem usar uma matriz pré-calculada para este propósito.
O algoritmo CRC do MAVLink foi implementado em muitas linguagens, como Python e Java.

### Mensagens

O payload dos pacotes descritos acima são mensagens do MAVLink. Cada mensagem é identificável pelo campo ID no pacote, que contém um payload com os dados da mensagem. Um documento XML no código-fonte do MAVLink possui a definição dos dados armazenados neste payload.
Abaixo está a mensagem com o ID 24 extraído do documento XML.
Observação: O documento XML descreve a ordenação lógica dos campos para o protocolo. O formato real do fio (e a representação típica em memória) tem os campos reordenados afim de reduzir Alinhamento da estrutura de dados os problemas. Isto pode ser uma fonte de confusão ao ler o código gerado a partir das definições da mensagem.

## Ecossistema do MAVLink

MAVLink é usado como protocolo de comunicação em muitos projetos, o que pode significar que há alguma compatibilidade entre eles. Um interessante tutorial explicando os conceitos básicos do MAVLink foi escrito.