{getToc} $title={Índice}
Informações
Nível de dificuldade: Fácil
Requisitos: ESP32, ESP IDF, ambiente Linux/Mac/Windows.
Requisitos: ESP32, ESP IDF, ambiente Linux/Mac/Windows.
Ressalvas
Tutorial feito em um ambiente Linux, porém o Mosquitto Broker também pode ser implementado em ambientes Windows, Mac, Debian e até Raspberry.
Introdução
Esse tutorial contempla a implementação de um exemplo básico de MQTT capaz de se conectar em um Broker, publicar e se inscrever em um tópico.Setup MQTT
Instalar o MQTT no seu sistema com o comando abaixo:
```bash
$ sudo apt install -y mosquitto
```
Para verificar se o servidor Mosquitto está rodando é possível utilizar o comando:
```bash
$ sudo systemctl status mosquitto
```
O serviço deverá estar carregado e ativo (loaded and active).
Configuração Mosquitto
Por default, o Mosquitto carrega as configurações do arquivo:
```bash
/etc/mosquitto/mosquitto.conf
```
Essas configurações iniciais não possuem nenhuma forma de segurança, nem usuário/senha de acesso.
Para habilitar um sistema de usuário/senha, é necessário criar uma configuração personalizada.
Essa configuração deverá possuir o nome default.conf e ficar no diretório:
```bash
/etc/mosquitto/conf.d/
```
Para este exemplo vamos utilizar a seguinte configuração:
```quote
allow_anonymous false
listener 1883 0.0.0.0
password_file /etc/mosquitto/passwd
```
allow_anonymous false: essa configuração impede acessos anonimos ao broker, o default é true. Com essa configuração o broker fará o requisito de usuário e senha que serão configurados em outro arquivo.
listener 1883 0.0.0.0: para uma conexão TCP deve ser utilizada a porta 1883, para uma conexão TLS (com verificação de certificados) é utilizada a porta 8883. O endereço 0.0.0.0 permite os acessos pela sua rede local.
password_file /etc/mosquitto/passwd: indica o caminho para o arquivo com os usuários e senhas permitidos.
```bash
/etc/mosquitto/mosquitto.conf
```
Essas configurações iniciais não possuem nenhuma forma de segurança, nem usuário/senha de acesso.
Para habilitar um sistema de usuário/senha, é necessário criar uma configuração personalizada.
Essa configuração deverá possuir o nome default.conf e ficar no diretório:
```bash
/etc/mosquitto/conf.d/
```
Para este exemplo vamos utilizar a seguinte configuração:
```quote
allow_anonymous false
listener 1883 0.0.0.0
password_file /etc/mosquitto/passwd
```
allow_anonymous false: essa configuração impede acessos anonimos ao broker, o default é true. Com essa configuração o broker fará o requisito de usuário e senha que serão configurados em outro arquivo.
listener 1883 0.0.0.0: para uma conexão TCP deve ser utilizada a porta 1883, para uma conexão TLS (com verificação de certificados) é utilizada a porta 8883. O endereço 0.0.0.0 permite os acessos pela sua rede local.
password_file /etc/mosquitto/passwd: indica o caminho para o arquivo com os usuários e senhas permitidos.
Usuário e Senha
Criar um arquivo de texto simples, cada linha é uma combinação de usuário e senha, que deve ser criada com o padrão a seguir:
```quote
nome_usuario:senha
```
Para criptografar esse arquivo e evitar o acesso indesejado a essas credenciais, usar o seguinte comando:
```bash
mosquitto_passwd -U nome_arquivo
```
Agora é só colocar esse arquivo no caminho definido na configuração do passo anterior e reiniciar o Mosquitto com o comando:
```bash
sudo systemctl restart mosquitto
```
Projeto de exemplo MQTT no ESP
A ESP IDF já possui um exemplo de implementação do MQTT no ESP, utilizando a biblioteca integrada esp-mqtt.
No seu diretório de instalação da IDF já temos esse exemplo.
Iremos utilizar o MQTT TCP, localizado em:
esp-idf/examples/protocols/mqtt/tcp
Esse projeto pode também ser obtido no github da esp-idf, no mesmo diretório:
https://github.com/espressif/esp-idf
Configurando o projeto
Esse projeto usa o exemplo base de wifi para conexão, as credenciais de acesso ao wifi devem ser configuradas no Menuconfig (documentação de referência: example connect esp)
A função mqtt_app_start inicializa a estrutura de configuração e realiza o acesso ao broker.
Para utilizar um acesso com senha e usuário, é necessário mudar a estrutura mqtt_cfg para o seguinte:
```C
esp_mqtt_client_config_t mqtt_cfg = {
.uri = "mqtt://ip:1883",
.username = "nome_usuario",
.password = "senha",
};
```
Substituir "ip" pelo ip da sua rede, "nome_usuario" e "senha" pelos atributos configurados no default.conf.
Remover todo o código de
```C
#if CONFIG_BROKER_URL_FROM_STDIN
```
até
```C
#endif /* CONFIG_BROKER_URL_FROM_STDIN */
```
para simplificar o desenvolvimento deste exemplo.
Entendendo o projeto
A parte principal do código está na função:
```C
mqtt_event_handler
```
Resumidamente:
- Após a conexão com o WiFi, o ESP tentará se conectar com o broker MQTT.
- Assim que a conexão com o broker for realizada, o evento MQTT_EVENT_CONNECTED será chamado e irá realizar publish/subscribe.
- Qualquer dado que chegar no tópico de subscribe ativará o evento MQTT_EVENT_DATA e irá printar a mensagem recebida.
O fluxo de mensagens pode ser visualizado utilizando comandos do Mosquitto Broker ou então com ferramentas de suporte ao MQTT, a minha preferida é o MQTT Explorer.
Para mais informações é possível consultar a documentação da biblioteca esp-mqtt fornecida pela Espressif, contida também abaixo nas Referências.