Este artigo apresenta uma implementação prática do protocolo MQTT sobre Wi-Fi utilizando a placa de desenvolvimento nRF7002DK e o Nordic Connect SDK (NCS). O foco está na confgiuração, execução e análise estrutural do exemplo fornecido pela Nordic Semiconductor, abrangendo desde os conceitos básicos até detalhes de arquitetura de softwaer.
Sobre a Plataforma nRF7002DK
A nRF7002DK é uma placa de avaliação que integra dois chips: o nRF7002, um transceptor Wi-Fi 6 dual-band (2.4 GHz e 5 GHz), e o nRF5340, um microcontrolador dual-core com suporte a Bluetooth LE. A comunicação entre os dois ocorre via interface QSPI. O núcleo de aplicação (Application Core) do nRF5340 roda o sistema operacional Zephyr e coordena as operações de rede e aplicação, enquanto o nRF7002 atua como adaptador de rede Wi-Fi.
Conceitos Básicos do MQTT
O MQTT (Message Queuing Telemetry Transport) é um protocolo leve baseado em TCP/IP, ideal para dispositivos IoT com recursos limitados. Utiliza um modelo de publicação/assinatura:
- Broker: servidor central que roteia mensagens.
- Topic: canal lógico identificado por uma string hierárquica.
- Publish: envio de mensagem a um tópico.
- Subscribe: recebimento de mensagens de um tópico.
Para segurança, o MQTT pode ser encapsulado com TLS (MQTTS), garantindo confidencialidade e autenticação mútua ou unidirecional via certificados X.509.
Preparação do Ambiente
Requisitos:
- Placa nRF7002DK ou Clever Connect Kit (CCK).
- Nordic Connect SDK v2.4.0+ instalado.
- Editor VS Code com extensão nRF Connect for VS Code.
- Cliente MQTT (ex: MQTTX) para testes.
- Rede Wi-Fi pessoal (modo PSK, não enterprise).
Execução do Exemplo
Criação do Projeto
- No VS Code, use a extensão nRF Connect → "Create a new application".
- Selecione "Copy a sample" e busque por
mqtt. - Escolha o exemplo
nrf/samples/net/mqtt.
Configuração da Rede Wi-Fi
Edite o arquivo boards/nrf7002dk_nrf5340_cpuapp.conf:
CONFIG_WIFI_CREDENTIALS_STATIC_SSID="SuaRede"
CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="SuaSenha"
CONFIG_WIFI_CREDENTIALS_STATIC_TYPE_PSK=y
O exemplo exige credenciais estáticas em tempo de compilação via BUILD_ASSERT.
Habilitação do TLS
Ao criar o alvo de build, selecione o arquivo de overlay overlay-tls-nrf7002.conf. Isso habilita:
- Porta 8883 (MQTTS).
- Biblioteca TLS (mbedTLS).
- Inclusão automática do certificado CA padrão (
ca-cert.pem).
Teste de Comunicação
O exemplo se conecta ao broker público test.mosquitto.org. O Client ID é gerado a partir do endereço MAC do dispositivo, formando tópicos como:
- Publicação:
<MAC>/my/publish/topic - Assinatura:
<MAC>/my/subscribe/topic
Use o MQTTX para assinar o tópico de publicação do dispositivo e enviar mensagens ao seu tópico de assinatura.
Análise da Arquitetura de Software
Estrutura Modular
O exemplo é dividido em módulos independentes:
- trigger: gera eventos periódicos ou por botão.
- sampler: simula coleta de dados.
- transport: gerencia conexão MQTT.
- network: trata conexão Wi-Fi.
- led: indica estado via LEDs.
- error: reinicia o sistema em falhas críticas.
Comunicação entre Módulos: ZBus
O ZBus é um barramento de mensagens interno do Zephyr, inspirado no MQTT. Define canais (channels) com tipos de payload específicos. Observadores (observers) podem receber mensagens de forma síncrona (callback) ou assíncrona (fila + thread).
Exemplo de definição de canal:
ZBUS_CHAN_DEFINE(NETWORK_CHAN,
enum network_status,
NULL, NULL,
ZBUS_OBSERVERS(transport, sampler),
ZBUS_MSG_INIT(0));
Um módulo publica com zbus_chan_pub(), e observadores recebem automaticamente.
Conexão Wi-Fi
O módulo network_wifi.c utiliza a API de gerenciamento de rede (net_mgmt):
struct net_if *iface = net_if_get_default();
net_mgmt(NET_REQUEST_WIFI_CONNECT_STORED, iface, NULL, 0);
As credenciais estáticas são armazenadas no flash via biblioteca wifi_credentials, que suporta modos PSK e (parcialmente) Enterprsie. A conexão real é mediada pelo WPA Supplicant integrado.
Conexão MQTT com SMF e TLS
O módulo transport usa:
- SMF (State Machine Framework): organiza o fluxo de conexão MQTT em estados (
MQTT_DISCONNECTED,MQTT_CONNECTED), com funções de entrada, execução e saída. - MQTT Helper: biblioteca da Nordic que encapsula a API base do Zephyr, gerenciando heartbeat e configuração via Kconfig.
- TLS Credentials: armazena certificados e chaves privadas associados a uma tag de segurança (
SEC_TAG). O certificado CA do Mosquitto é incluído em tempo de compilação quandoCONFIG_MQTT_HELPER_PROVISION_CERTIFICATES=y.
O socket seguro é configurado passando o SEC_TAG durante a inicialização da conexão.