Programação de um cliente MQTT em C (Paho MQTT) no Linux Embarcado

Apesar de ser uma linguagem de programação com uma significativa idade, a linguagem C está constantemente evoluindo e seu uso continua muito relevante no desenvolvimento de software embarcado, como mostrado no Ranking das Linguagens de Programação mais usadas em 2018 (IEEE Spectrum). O próprio Kernel Linux (e, também, outros softwares importantes para uma distribuição Linux) é desenvolvido majoritariamente em linguagem C, reforçando portanto a importância desta linguagem de programação. Além disso, os compiladores C estão cada vez melhores (sobretudo os destinados às plataformas e arquiteturas embarcadas), garantindo que os softwares compilados tenham desempenho excelente. Logo, faz pleno sentido desenvolver software embarcado em linguagem C.

 

Nesta linha de raciocínio, este artigo mostra como desenvolver em C um cliente MQTT utilizando a biblioteca open-source Paho MQTT, abrindo portanto para o leitor a possibilidade de integração com as plataformas de Internet das Coisas a partir de programas escritos em C no Linux Embarcado.

 

Hardware utilizado

 

Como o título deste artigo sugere, este artigo pode ser aplicado em diversas distribuições Linux para sistemas embarcados. Porém, para poder exemplificar, mostrar e validar todo o processo de compilação e instalação da biblioteca e a programação de um cliente MQTT, foi escolhido como hardware-alvo a placa de desenvolvimento Beaglebone Black. O motivo da escolha foi devido a esta ser uma das placas de desenvolvimento mais empregadas em projetos em nível mundial, tanto como hobby quanto no âmbito de projetos comerciais. A figura 1 mostra a Beaglebone Black (Rev. C).

 

Beaglebone Black (Rev. C).
Figura 1 - Beaglebone Black (Rev. C).

 

O protocolo MQTT - Linhas gerais

 

O protocolo MQTT (Message Queue Telemetry Transport) é um protocolo criado no final dos anos 90 pela IBM, destinado à comunicação M2M (Machine-to-Machine). Apesar de não ser algo novo, possui larga utilização atualmente devido a ser um protocolo classificado como lightweight (utiliza poucos recursos computacionais dos seus clientes e utiliza pouco tráfego de dados para funcionar). Desta forma, configura-se como um dos mais adequados protocolos para projetos IoT em clientes embarcados, onde poder computacional, consumo energético, memória, armazenamento e quantidade de dados a serem trafegados são sempre diminutos.

 

Em linhas gerais, o MQTT utiliza um servidor (chamado broker), o qual faz a mediação / direcionamento de comunicação entre N clientes, os quais podem enviar (publish) e/ou receber (subscribe) dados. Ou seja, todos os dados trafegam obrigatoriamente pelo broker, e este é o responsável por receber as mensagens dos remetentes e enviá-las aos destinatários. Tal controle de remetentes e destinatários é feito através de tópicos MQTT, os quais servem para os clientes informarem aos brokers o que desejam receber e para quem desejam enviar dados. Observe a figura 2.

 

Diagrama de comunicação do MQTT.
Figura 2 - Diagrama de comunicação do MQTT (fonte: https://www.embarcados.com.br/mqtt-protocolos-para-iot/).

 

Ainda, o broker pode estar em uma rede local ou em uma rede de alcance maior (como em um servidor com acesso à Internet), permitindo, portanto, a comunicação entre clientes a nível mundial.

 

Para mais detalhes sobre o MQTT, leia o artigo MQTT - Protocolos para IoT, do autor Marcelo Barros.

 

A biblioteca Paho MQTT

 

A biblioteca Paho MQTT trata-se de uma biblioteca open-source para desenvolvimento de clientes MQTT (e, mais recentemente, desenvolvimento de clientes MQTT-SN também). Esta biblioteca é um projeto do iot.eclipse.org e possui como principais características ser leve, suportar comunicação MQTT segura (TLS/SSL) e por possuir versões para várias linguagens de programação dominantes, tais como Java, C e Python. Além disso, computacionalmente falando, trata-se de uma biblioteca muito leve (tanto em consumo de memória, armazenamento, quanto processamento requerido).

 

Logo oficial da biblioteca Paho MQTT.
Figura 3 - Logo oficial da biblioteca Paho MQTT.

 

Com o boom do IoT mundo afora, esta biblioteca é uma ótima escolha àqueles que desejam acrescentar em seus projetos conectividade com as plataformas IoT (Amazon AWS, Microsoft Azure, etc.), uma vez que a grande maioria delas permite o envio e recepção de dados por MQTT.

 

A documentação da biblioteca para a linguagem C pode ser lida neste link.

 

Procedimento de compilação e instalação - Paho MQTT C client

 

Antes de partir para a programação do cliente MQTT e C, é necessária a compilação e instalação da biblioteca Paho MQTT (para linguagem C). Para isso, siga o procedimento abaixo:

 

Atualização dos pacotes já existentes

 

Como primeiro passo, é altamente recomendável atualizar os pacotes instalados. Isso evita possíveis incompatibilidades ou erros nas instalações de pacotes deste procedimento. Para isso, execute os comandos a seguir:

 

 

Instalação dos pacotes de desenvolvimento do OpenSSL

 

A bibloteca Paho MQTT da suporte à comunicação segura com MQTT (utilizando TLS/SSL), logo os pacotes de desenvolvimento do OpenSSL são necessários para sua compilação e funcionamento. Para instalar os pacotes de desenvolvimento do OpenSSL, execute os comandos a seguir:

 

 

Instalação do Doxygen

 

O Doxygen também precisa ser instalado. Ele fará com que toda a documentação da biblioteca possa ser gerada, algo muito importante para quem quiser desenvolver aplicações com esta biblioteca (sobretudo para trabalhos mais sérios, já que a documentação é bem completa). Para fazer esta instalação, execute o comando a seguir:

 

 

Obtenção do repositório da biblioteca

 

A biblioteca Paho MQTT, conforme dito anteriormente neste mesmo artigo, é open-source. Desta forma, para utilizá-la, precisaremos baixar seu código-fonte e, posteriormente, fazer a compilação do mesmo. Para isso, execute o comando abaixo:

 

 

Compilação e instalação

 

Agora é a etapa de compilação e instalação da biblioteca. Para isso, vá ao diretório do repositório (o qual foi baixado no item anterior):

 

 

Em seguida, faça a compilação da biblioteca e de sua documentação com os comandos abaixo:

 

 

Uma vez compilada, a biblioteca pode ser instalada. Para isso, utilize o comando abaixo:

 

 

A partir deste ponto, a biblioteca Paho MQTT (C client) está pronta para uso.

 

Programando um cliente MQTT simples em C

 

É chegada a hora de desenvolver um cliente MQTT em C, utilizando a biblioteca Paho MQTT. Tal cliente terá como finalidade fazer echo da mensagem MQTT recebida de um tópico em outro tópico. Para isso, considere o código-fonte a seguir. É fortemente recomendada a leitura de seus comentários para maior compreensão do mesmo.

 

 

Para compilar, deve ser considerada a biblioteca Paho MQTT. Assumindo que o código-fonte seja salvo como main.c e que o binário final irá se chamar mqtt_exemplo, o comando de compilação é o seguinte:

 

 

E, para executar, utilize o seguinte comando:

 

 

Pronto! Agora basta testar com um cliente MQTT de sua preferência. A figura 4 mostra o teste do programa em ação, utilizando o cliente MQTT MQTT Lens e o terminal com o programa rodando na Beaglebone Black.

 

Teste do programa.
Figura 4 - Teste do programa.

 

Saiba mais

 

MQTT-SN: MQTT para rede de sensores

Exibindo valores de temperatura e umidade no app MQTT Dash com o sensor DHT11

Raspberry Pi 3 na IoT - MQTT e Python

 

Referências

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Pedro Bertoleti
Sou engenheiro eletricista formado pela Faculdade de Engenharia de Guaratinguetá (FEG - UNESP) e trabalho com desenvolvimento de sistemas embarcados em São Paulo capital. Curioso e viciado em tecnologia, sempre busco me aprimorar na área de eletrônica e programação, em especial em desenvolvimento de firmware (área que mais gosto de trabalhar e estudar).Para mais informações, acesse minha página no Facebook:https://www.facebook.com/pbertoleti

4
Deixe um comentário

avatar
 
2 Comment threads
2 Thread replies
3 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Jordana Caires CarvalhoPedro BertoletiFabio Augusto Bitencourt Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Jordana Caires Carvalho
Membro
Jordana_Carvalho

Pedro, cumprimentos pelo artigo. Você usou qual imagem no seu Beaglebone Black? Pode indicar o link por favor? Você salvou na memória da própria placa ou foi via cartão SD? Qual a vantagem dessa rede sobre a rede CAN? Obrigada!

Fabio Augusto Bitencourt
Membro
fabitencourt63

Legal Pedro, segui todas as etapas e funcionou. Agora estou curioso em saber o que eu posso fazer com isso. Sera que eu posso criar um broker MQTT local ? Usando um esp8266 como propõe o Fabio Souza em seus artigos ?