Tech Insights

Escolhendo um protocolo de transporte para IoT: UDP, TCP/IP, HTTPS, MQTT e o papel do TagoTiP

Um guia prático sobre protocolos de transporte para IoT, apresentando o TagoTiP e como ele reduz o tamanho do payload, a complexidade e o esforço de integração com a nuvem.

TagoIO Team ·
Escolhendo um protocolo de transporte para IoT: UDP, TCP/IP, HTTPS, MQTT e o papel do TagoTiP

Todo projeto de IoT começa com a mesma pergunta fundamental: como o meu dispositivo conversa com a nuvem? Sensores, atuadores e microcontroladores geram dados que só passam a ter valor quando chegam a uma plataforma onde podem ser armazenados, visualizados e usados para tomar decisões. Mas levar os dados do dispositivo até a nuvem não é só um detalhe técnico: o protocolo que você escolhe afeta diretamente a vida útil da bateria do dispositivo, os custos de dados, a confiabilidade, a complexidade e a escalabilidade.

Neste post, vamos passar pelos protocolos de conectividade mais comuns usados em IoT (UDP, TCP/IP, HTTPS e MQTT) e depois apresentar o TagoTiP (Transport IoT Protocol), um novo protocolo aberto desenvolvido pela TagoIO especificamente para dispositivos com recursos limitados, como o Arduino, o ESP8266, o ESP32 e qualquer outra plaquinha de IoT que precise chegar à nuvem da forma mais eficiente possível.

UDP: rápido, leve e sem confirmação de entrega

O UDP (User Datagram Protocol) é um dos protocolos de transporte mais fundamentais em redes. Ele envia pacotes de dados sem estabelecer uma conexão antes e sem nenhuma confirmação de que os dados foram recebidos.

Pense no UDP como deixar um cartão-postal numa caixa de correio. Você envia e segue em frente: não há como saber se ele realmente chegou.

As vantagens do UDP são consideráveis para aplicações de IoT em que velocidade e baixo overhead importam mais do que garantia de entrega. Como não há handshake nem processo de confirmação, o UDP é extremamente rápido e impõe quase nenhum overhead ao dispositivo. Os pacotes são pequenos e o dispositivo pode voltar a dormir quase imediatamente depois de transmitir. Isso torna o UDP especialmente adequado para dispositivos alimentados por bateria, implantações NB-IoT e cenários em que a perda eventual de pacotes é aceitável, como o envio de leituras periódicas de sensores, onde perder um valor entre cem não é um problema.

As desvantagens também são reais. O UDP não oferece nenhuma garantia de entrega. Os pacotes podem ser descartados pela rede, chegar fora de ordem ou ser duplicados, e o remetente nunca vai saber. Também não há segurança nativa, gerenciamento de sessão nem suporte nativo para comunicação bidirecional. Implementar confiabilidade sobre o UDP exige lógica personalizada na camada de aplicação, o que aumenta a complexidade do desenvolvimento.

Melhor para: telemetria de alta frequência, dispositivos limitados em redes de baixo consumo e aplicações em que a velocidade importa mais do que a garantia de entrega.

TCP/IP: comunicação confiável e orientada a conexão

O TCP (Transmission Control Protocol), sempre acompanhado do IP (Internet Protocol), é a espinha dorsal da internet. Ao contrário do UDP, o TCP estabelece uma conexão entre o dispositivo e o servidor antes de qualquer troca de dados, controla cada pacote, retransmite os perdidos e garante que os dados cheguem em ordem.

Se o UDP é um cartão-postal, o TCP é uma carta registrada com aviso de recebimento.

Os pontos fortes do TCP/IP são evidentes: você tem garantia de entrega, transmissão ordenada e verificação de erros nativa. Para casos de uso de IoT em que a integridade dos dados é crítica, como sistemas de controle industrial, dispositivos médicos e telemetria financeira, o TCP/IP é difícil de superar. Ele também tem suporte universal, ou seja, praticamente todo ambiente de programação, do C embarcado em um microcontrolador ao Python em um Raspberry Pi, tem bibliotecas TCP/IP disponíveis.

Os custos também são claros. A confiabilidade do TCP vem com overhead. Estabelecer uma conexão exige um handshake de três vias. Manter a conexão ativa exige pacotes de keep-alive periódicos. Cada segmento carrega cabeçalhos que aumentam os custos de dados. Em dispositivos muito limitados, com pouca RAM, ou em conexões celulares cobradas por kilobyte, esse overhead pesa. O TCP também mantém uma conexão persistente aberta, o que entra em conflito com os ciclos de dormir e acordar que prolongam a bateria em dispositivos de baixo consumo.

Melhor para: transmissão confiável de dados em aplicações críticas, dispositivos de middleware e gateway, e sistemas que exigem comunicação bidirecional com garantia de entrega.

HTTPS: o padrão da web para dados seguros de IoT

O HTTPS é o HTTP (HyperText Transfer Protocol) em cima do TLS (Transport Layer Security), que por sua vez roda sobre o TCP/IP. É o mesmo protocolo que o seu navegador usa toda vez que você acessa um site seguro, e se tornou uma escolha popular para dispositivos IoT enviarem dados a APIs na nuvem.

O atrativo do HTTPS em IoT é a sua universalidade e simplicidade. Toda plataforma de nuvem, incluindo a TagoIO, expõe uma API REST sobre HTTPS. Enviar dados é tão simples quanto fazer uma requisição HTTP POST com um payload JSON. Existem bibliotecas para praticamente toda linguagem e framework de microcontrolador, incluindo o HTTPClient do Arduino e a pilha Wi-Fi nativa do ESP32. A autenticação é feita por meio de headers de token, e o TLS oferece criptografia de ponta a ponta de imediato, atendendo à maioria dos requisitos de segurança corporativa sem implementação personalizada.

O desafio é que o HTTPS é o mais pesado dos protocolos comuns de IoT. Os handshakes TLS são caros em processamento e consomem muita memória, muitas vezes além do que microcontroladores muito pequenos suportam. Cada ciclo de requisição e resposta abre uma conexão, negocia o TLS, envia os dados, recebe a resposta e fecha a conexão. Para um dispositivo que envia uma leitura por minuto, esse ciclo é aceitável. Para um dispositivo que envia dezenas de leituras por segundo, ou que roda em um microcontrolador minúsculo de 8 bits com 2 KB de RAM, o HTTPS rapidamente se torna inviável. O consumo de energia também é bem mais alto do que o de UDP ou MQTT, por causa do tempo em que o rádio precisa ficar ativo durante todo o ciclo de requisição e resposta.

Para ilustrar o peso do HTTPS na prática: um payload típico de HTTP/JSON carregando uma leitura de sensor tem cerca de 487 bytes, contando cabeçalhos, estrutura JSON e campos de autenticação. Para um dispositivo que transmite por um link celular limitado, esse overhead se acumula depressa.

Melhor para: dispositivos Wi-Fi ou celulares conectados à nuvem com memória suficiente, integrações com API REST e upload seguro de dados a partir de gateways e dispositivos de edge.

MQTT: o padrão da indústria de IoT

O MQTT (Message Queuing Telemetry Transport) foi projetado desde o início para IoT. Originalmente desenvolvido no final dos anos 1990 para monitorar oleodutos por conexões via satélite, evoluiu até se tornar um dos protocolos de mensageria mais adotados da indústria.

O MQTT usa um modelo de publicação/assinatura mediado por um broker central. Os dispositivos publicam mensagens em tópicos (como factory/machine1/temperature), e os assinantes (dashboards, motores de análise ou outros dispositivos) recebem essas mensagens ao assinarem os tópicos relevantes. O dispositivo e o dashboard nunca se comunicam diretamente; o broker gerencia todo o roteamento.

Os pontos fortes do MQTT são vários. Ele é leve e eficiente, com um overhead mínimo de apenas 2 bytes por pacote. Oferece três níveis de Quality of Service (QoS): QoS 0 para envio sem confirmação, QoS 1 para entrega pelo menos uma vez e QoS 2 para entrega exatamente uma vez. Essa flexibilidade permite ajustar o protocolo aos requisitos de confiabilidade da sua aplicação. O MQTT também tem suporte a sessões persistentes, então um broker pode enfileirar mensagens para um dispositivo que ficou offline temporariamente, algo que nem o UDP nem o HTTPS puro conseguem fazer de forma nativa.

A TagoIO oferece algumas opções de broker MQTT dedicado. Os dispositivos publicam os dados, o Live Inspector da plataforma mostra a chegada em tempo real, e as Actions podem processar e armazenar tudo automaticamente, sem precisar de middleware personalizado adicional.

As limitações do MQTT se concentram principalmente no overhead de conexão. O MQTT roda sobre TCP, o que significa manter uma conexão persistente. Para dispositivos que entram em sono profundo entre as leituras para economizar bateria, estabelecer uma conexão TCP a cada despertar adiciona latência e consumo de energia. O broker também representa um ponto único de falha, a menos que você implemente clustering ou redundância.

Melhor para: telemetria em tempo real, gestão de frotas, comunicação bidirecional entre dispositivos e aplicações que exigem persistência de mensagens e garantias de QoS.

TagoTiP: um formato de frame comum para UDP, TCP/IP, HTTPS e MQTT

Cada um dos protocolos discutidos acima resolve o problema do transporte, ou seja, como os bytes saem do dispositivo e chegam ao servidor, mas nenhum deles responde a uma pergunta diferente e igualmente prática: como esses bytes devem realmente ser? Desenvolvedores que conectam uma plaquinha à TagoIO ainda precisam decidir como estruturar os dados, como autenticar, como codificar nomes de variáveis, valores, unidades e timestamps, e como fazer tudo isso de um jeito que a plataforma consiga interpretar. Esse trabalho de implementação costuma ser refeito do zero a cada novo projeto.

É esse o problema que o TagoTiP foi criado para resolver.

O TagoTiP (Transport IoT Protocol) é um novo formato de frame aberto e uma especificação de protocolo desenvolvidos pela TagoIO, publicados em github.com/tago-io/tagotip sob a licença Apache 2.0. Ele não é uma alternativa ao UDP, ao TCP/IP, ao HTTPS ou ao MQTT: ele funciona em cima de todos eles. O mesmo frame TagoTiP pode ser enviado sobre UDP para os dispositivos mais limitados, sobre TCP para confiabilidade, sobre HTTPS em ambientes onde apenas a porta 443 está aberta, ou como um payload MQTT em implantações de publicação/assinatura. O desenvolvedor escolhe o transporte que combina com o hardware e a rede; o TagoTiP cuida da estrutura dos dados.

O benefício prático para plaquinhas como o Arduino, o ESP8266 e o ESP32 é grande: em vez de montar payloads JSON na mão, gerenciar headers HTTP ou construir codificadores binários personalizados, o desenvolvedor escreve uma única linha compacta e a envia. A TagoIO interpreta tudo nativamente do outro lado.

Um frame compacto e legível por humanos

Um frame TagoTiP é texto puro, estruturado e legível sem nenhuma ferramenta:

PUSH|4deedd7bab8817ec|sensor-01|[temperature:=32.5#C;humidity:=65#%]

Detalhando: PUSH é o método, 4deedd7bab8817ec é o Authorization Hash (os primeiros 8 bytes do SHA-256 do token do dispositivo), sensor-01 é o identificador serial do dispositivo, e o payload entre colchetes contém duas variáveis separadas por ponto e vírgula. O frame inteiro tem aproximadamente 112 bytes, contra cerca de 487 bytes de uma requisição HTTP/JSON equivalente, o que torna o TagoTiP cerca de 4,3x menor para os mesmos dados.

Metadados ricos de variáveis em uma única expressão

Cada variável aceita sufixos opcionais para unidade (#), timestamp (@), grupo (^) e metadados ({}), tudo em uma única expressão compacta:

temperature:=32.5#C@1694567890000^reading_001{source=dht22,quality=high}

Isso significa que uma única linha carrega tudo o que a TagoIO precisa para armazenar um ponto de dado bem anotado (nome da variável, valor, unidade, timestamp, grupo e metadados) sem aninhamento de JSON nem um schema personalizado.

Métodos do protocolo

O TagoTiP define quatro métodos que cobrem todo o ciclo de comunicação entre dispositivo e plataforma, independentemente de qual transporte é usado por baixo:

MétodoDireçãoFinalidade
PUSHCliente → ServidorEnviar dados estruturados ou payloads de passthrough bruto
PULLCliente → ServidorRecuperar o último valor de uma ou mais variáveis
PINGCliente → ServidorKeepalive / teste de conectividade
ACKServidor → ClienteResposta a qualquer método de uplink (OK, PONG, CMD, ERR)

Payloads de passthrough

Para dispositivos que já produzem payloads binários, o TagoTiP tem suporte a passthrough em hex e base64, encaminhando os bytes brutos diretamente ao payload parser de um dispositivo na TagoIO:

PUSH|AUTH|SERIAL|>xDEADBEEF01020304

PUSH|AUTH|SERIAL|>b3q2+7wECAwQ=

Isso torna o TagoTiP útil não só para firmwares novos, mas também como um wrapper leve para dispositivos existentes que já geram dados binários estruturados sobre qualquer um dos transportes suportados.

Para ambientes em que o TLS não está disponível ou é caro demais em processamento (LoRa, Sigfox, NB-IoT, UDP puro), o TagoTiP inclui uma variante segura chamada TagoTiP/S. Ela envolve os frames TagoTiP em um envelope binário criptografado com AEAD, oferecendo forte confidencialidade e integridade sem um handshake TLS.

O TagoTiP/S tem suporte a vários conjuntos de cifras, do obrigatório AES-128-CCM ao AES-256-GCM e ao ChaCha20-Poly1305. Mesmo com a criptografia ativada, o payload resultante tem apenas cerca de 119 bytes, 4,1x menor que o HTTP/JSON, com só 29 bytes de overhead de envelope para as cifras baseadas em CCM.

Comparação de tamanho em um relance

FormatoTamanhoProporção vs HTTP/JSON
HTTP/JSON~487 bytes-
TagoTiP~112 bytes4,3x menor
TagoTiP/S~119 bytes4,1x menor

Por que isso importa para Arduino, ESP e plaquinhas pequenas

O formato de frame foi pensado explicitamente para ser amigável com C: parsing linear, tamanhos de buffer previsíveis e manipulação mínima de strings, o que torna prático implementá-lo em microcontroladores AVR de 8 bits e acima. Placas com flash e RAM limitados conseguem implementar a conectividade com a TagoIO em poucas linhas de código, enviando o mesmo frame compacto sobre qualquer transporte que o hardware suportar. A escolha do transporte fica nas mãos do desenvolvedor; o TagoTiP cuida da estrutura dos dados que passa por ele.

Escolhendo o protocolo certo: um guia prático

Nenhum transporte é a melhor escolha para toda aplicação de IoT. A escolha certa depende das restrições do seu dispositivo, da sua rede, dos seus requisitos de confiabilidade e do seu cronograma de desenvolvimento.

Independentemente do transporte que você escolher, o TagoTiP oferece um formato de dados consistente, compacto e suportado nativamente para carregar por qualquer um deles. Um desenvolvedor que trabalha com um Arduino ou ESP8266 pode escrever um frame TagoTiP e enviá-lo sobre UDP para o menor overhead, sobre TCP para confiabilidade, sobre HTTPS se apenas a porta 443 estiver disponível, ou como um payload MQTT em implantações de publicação/assinatura: os mesmos dados estruturados, a mesma interpretação pela TagoIO, independentemente do caminho. A especificação aberta completa está em github.com/tago-io/tagotip.

Quanto ao transporte em si: se o seu dispositivo precisa de velocidade máxima e overhead mínimo e tolera a perda eventual de pacotes, o UDP é a escolha natural, e o TagoTiP sobre UDP é o caminho mais eficiente até a TagoIO para hardware limitado. Se você precisa de entrega garantida e ordenada para dados críticos, o TCP/IP oferece essa confiabilidade. Se segurança e compatibilidade universal são o que mais importa e o seu dispositivo tem recursos para lidar com o TLS, o HTTPS dá a integração mais simples com API REST. E se você precisa de comunicação bidirecional, persistência de mensagens e garantias de QoS em uma grande frota, o MQTT continua sendo o padrão consagrado da indústria.

Considerações finais

A diversidade de protocolos de conectividade de IoT reflete a diversidade das próprias aplicações de IoT. Um sensor instalado em um oleoduto no meio de um campo remoto tem necessidades completamente diferentes das de um servidor gateway que agrega dados de centenas de dispositivos em uma fábrica. Entender os trade-offs de cada protocolo (overhead, confiabilidade, energia, segurança e complexidade de desenvolvimento) é essencial para construir soluções de IoT que funcionem no mundo real.

O TagoTiP se encaixa nesse cenário não por substituir nenhum desses transportes, mas por resolver a camada acima deles: a estrutura dos dados. Em vez de cada desenvolvedor reinventar como codificar variáveis, unidades, timestamps e autenticação no transporte que estiver usando, o TagoTiP define um único formato compacto, legível por humanos e com tipos seguros que funciona em todos eles. Para plaquinhas como o Arduino, o ESP8266 e o ESP32, isso significa menos código, menos bugs e um caminho consistente até a TagoIO, não importa como os bytes viajam.

Para explorar a especificação aberta completa, a gramática do protocolo e os detalhes de implementação, visite o repositório do TagoTiP no GitHub em github.com/tago-io/tagotip.