diff --git a/IHM_Remote/src/App.tsx b/IHM_Remote/src/App.tsx index 7175263..a934fd8 100644 --- a/IHM_Remote/src/App.tsx +++ b/IHM_Remote/src/App.tsx @@ -24,7 +24,7 @@ interface history { values: number[]; } -const client = new Paho.Client('192.168.1.2', 9001, '', Date.now().toString()); +const client = new Paho.Client('10.0.0.101', 9001, '', Date.now().toString()); const App = () => { const [latestData, setLatestData] = useState([{ value: 0 }]); @@ -139,6 +139,26 @@ const App = () => { const unusableArea = 35 + 40 + 36; + const turnOnLed = () => { + const buffer = new ArrayBuffer(3); + const charArray = new Uint8Array(buffer); + //charArray.set(0, 0x2); + charArray[0] = 0x06; + charArray[1] = 0x06; + charArray[2] = 0x06; + client.publish('comand', charArray, 2, false); + }; + + const turnOfLed = () => { + const buffer = new ArrayBuffer(3); + const charArray = new Uint8Array(buffer); + //charArray.set(0, 0x2); + charArray[0] = 0x09; + charArray[1] = 0x09; + charArray[2] = 0x09; + client.publish('comand', charArray, 2, false); + }; + return ( @@ -475,46 +495,54 @@ const App = () => { adjustToWidth={true} /> - { - if (client.isConnected()) { - Alert.alert('Ja tá conectado'); - return; - } - client.connect({ - userName: 'aluno', - password: '@luno*123', - onFailure: f => console.log('Failure', f), - onSuccess: () => { - console.log('Sucesso'); - client.subscribe('analogic/history', { - onSuccess: d => { - console.log('incrito em analogic/history'); - }, - }); - client.subscribe('5/history', { - onSuccess: d => { - console.log('incrito em 5/history'); - }, - }); - client.subscribe('16/history', { - onSuccess: d => { - console.log('incrito em 16/history'); - }, - }); - client.subscribe('update_interval', { - onSuccess: d => { - console.log('incrito em update_interval'); - }, - }); - }, - reconnect: true, - }); - }}> - {client.isConnected() ? 'Conectado ✅' : 'Conectar 📡'} - + + { + if (client.isConnected()) { + Alert.alert('Ja tá conectado'); + return; + } + client.connect({ + userName: 'aluno', + password: '@luno*123', + onFailure: f => console.log('Failure', f), + onSuccess: () => { + console.log('Sucesso'); + client.subscribe('analogic/history', { + onSuccess: () => { + console.log('incrito em analogic/history'); + }, + }); + client.subscribe('5/history', { + onSuccess: () => { + console.log('incrito em 5/history'); + }, + }); + client.subscribe('16/history', { + onSuccess: () => { + console.log('incrito em 16/history'); + }, + }); + client.subscribe('update_interval', { + onSuccess: () => { + console.log('incrito em update_interval'); + }, + }); + }, + reconnect: true, + }); + }}> + {client.isConnected() ? 'Conectado ✅' : 'Conectar 📡'} + + + Ligar o led + + + Desligar o led + + {/*} -#include "ota_setup.h" -#include "comunication.h" -#include "io.h" -#include - -const char* mqtt_server = "10.0.0.101"; -WiFiClient espClient; - -void callback(char* topic, byte* payload, unsigned int length); - -PubSubClient client(mqtt_server,1883,callback,espClient); - -void callback(char* topic, byte* payload, unsigned int length) { - // In order to republish this payload, a copy must be made - // as the orignal payload buffer will be overwritten whilst - // constructing the PUBLISH packet. - // - // Allocate the correct amount of memory for the payload copy - String topico = String(topic); - - if(topico.equals("comand")){ - char* p = (char*)malloc(length); - // Copy the payload to the new buffer - memcpy(p,payload,length); - String leitura = p; - int comando = leitura.charAt(0); - int endereco = leitura.charAt(1); - comand(comando,endereco); - // Free the memory - free(p); - } - - - -} - -void comand(int comando,int endereco){ - char* output; - switch (comando) { - case GET_DIGITAL_INPUT_VALUE: // Le o valor de um sensor digital - { - int res = read_digital_input(endereco); - if(res != -1){ - output[0] = char(DIGITAL_LEVEL); - output[1] = char(res); - }else{ - output[0] = char(DIGITAL_LEVEL); - output[1] = char(NODE_MCU_STATUS_ERROR); - } - client.publish("output",output); - /*res != -1 - ? send_response(DIGITAL_LEVEL, res + '0') // retorna valor com sucesso - : send_error(DIGITAL_LEVEL); // retorna erro de port inexistente - */ - } - break; - - case GET_NUMBER_OF_SENSORS: // obtem Numero de sensores - { - //send_response(NUMBER_OF_DIGITAL_PORTS, NELEMS(digital) + '0'); - output[0] = char(NUMBER_OF_DIGITAL_PORTS); - output[1] = char(NELEMS(digital)); - client.publish("output",output); - } - break; - - case NODE_MCU_ON_LED_BUILTIN: // Ligar o led - { - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, LOW); - //send_response(LED_CHANGED_VALUE, '1'); // led ligado com sucesso - output[0] = char(LED_CHANGED_VALUE); - output[1] = char(0x01); - client.publish("output",output); - } - break; - - case NODE_MCU_OFF_LED_BUILTIN: // desligar o led - { - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, HIGH); - output[0] = char(LED_CHANGED_VALUE); - output[1] = char(0x00); - client.publish("output",output); - //send_response(LED_CHANGED_VALUE, '0'); - } - break; - - case GET_ANALOG_INPUT_VALUE: // Fazer a leitura do sensor analogico - { - String res = read_analog_input(); - //send_response(ANALOG_LEVEL, res.charAt(0), res.charAt(1)); - output[0] = char(ANALOG_LEVEL); - output[1] = res.charAt(0); - output[2] = res.charAt(1); - client.publish("output",output); - } - break; - - // Obtem o endereço do sensor - // onde o valor do endereço deve estar entre 1 e o valor retornado - // pela função GET_NUMBER_OF_SENSORS - case GET_SENSOR_ADDRESS: - { - int res = get_digital_io_address(endereco); - if(res != -1){ - output[0] = char(SENSOR_ADDRESS_VALUE); - output[1] = char(res); - }else{ - output[0] = char(SENSOR_ADDRESS_VALUE); - output[1] = char(NODE_MCU_STATUS_ERROR); - } - client.publish("output",output); - /*res != -1 - ? send_response(SENSOR_ADDRESS_VALUE, res) // resposta - : send_error(SENSOR_ADDRESS_VALUE); // erro*/ - } - break; - - case GET_SENSOR_NAME: // Obter o nome do sensor - { - char *name = get_digital_io_name(endereco); - if(name != NULL){ - output[0] = char(DIGITAL_PORT_NAME); - output[1] = name[0]; - output[2] = name[1]; - }else{ - output[0] = char(DIGITAL_PORT_NAME); - output[1] = char(NODE_MCU_STATUS_ERROR); - } - client.publish("output",output); - /*name != NULL - ? send_response(DIGITAL_PORT_NAME, name[0], name[1]) - : send_error(DIGITAL_PORT_NAME);*/ - } - break; - - case GET_NODE_MCU_STATUS: // Obter o status da placa - { - output[0] = char(NODE_MCU_STATUS_OK); - output[1] = char(NODE_MCU_STATUS_ERROR); - client.publish("output",output); - } - //send_response(NODE_MCU_STATUS_OK, NODE_MCU_STATUS_ERROR); - break; - - // Comando não reconhecido - default: - { - output[0] = char(NODE_MCU_STATUS_ERROR); - client.publish("output",output); - } - //send_error(NODE_MCU_STATUS_ERROR); - break; - } - -} - -void setup() { - ota_setup(); // Configuração de atualização via OTA - setup_io_pins(); // Define pinos da GPIO como entrada e acende o led - client.connect("esp","admin","123"); - client.subscribe("comand"); -} - -void loop() { - - client.loop(); - - handle_ota(); -} diff --git a/README.md b/README.md index 98affb9..008cc15 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,355 @@ -# Problema #3 – IoT: A Internet das Coisas - -## Descrição do Projeto -

Este documento descreve a utilização de um sistema baseado na internet das coisas (IOT).

- -Table of contents -================= - - - * [Instalação](#instalação) - * [Usage](#usage) - * [STDIN](#stdin) - * [Local files](#local-files) - * [Remote files](#remote-files) - * [Multiple files](#multiple-files) - * [Combo](#combo) - * [Auto insert and update TOC](#auto-insert-and-update-toc) - * [GitHub token](#github-token) - * [TOC generation with Github Actions](#toc-generation-with-github-actions) - * [Tests](#tests) - * [Dependency](#dependency) - * [Docker](#docker) - * [Local](#local) - * [Public](#public) - - - -Instalação -============ + + +## Tabela de Conteúdo + +- [Tabela de Conteúdo](#tabela-de-conte%C3%BAdo) +- [Sobre o Projeto](#sobre-o-projeto) + - [O problema](#) + - [Requisitos](#) + - [Arquitetura da soluçao](#arquitetura) + - [Diagrama geral da solução](#diagrama-geral-da-solucao) + - [Diagrama da SBC](#diagrama-de-estados-da-sbc) + - [Diagrama de sequencia](#diagrama-de-sequencia) + - [Formato das mensagens do historico](#interface-dos-dados-enviados-nos-topicos-de-historico) +- [Feito Com](#feito-com) +- [Começando](#come%C3%A7ando) + - [Pré-requisitos](#pr%C3%A9-requisitos) + - [Estrutura de Arquivos](#estrutura-de-arquivos) + - [Instalação](#instalacao-na-nodemcu) + - [Edição](#edi%C3%A7%C3%A3o) + - [Executar projeto](#executar-projeto-na-sbc) +- [Autores](#autores) +- [Materiais de referência](#materiais-de-referência) +- [Contribuição](#contribui%C3%A7%C3%A3o) + + +## Sobre o projeto +Projeto de sensor analógico/digital em microcontrolador utilizando comunicação mqtt. + +Implementando de um protótipo de sistema de sensoriamento genérico de uma plataforma baseada na NodeMCU para confecção das unidades de sensoriamento modular comandado por um Single Board Computer (SBC), capaz de controlar o acionamento de um conjunto variável de sensores, assim como monitorar o seu funcionamento, de forma automatizada por meio de uma comunicação MQTT +
+ +## Arquitetura + +A solução desenvolvida foi arquitetada da seguinte maneira: + +
+ +### Diagrama geral da solucao + +![](https://cdn.discordapp.com/attachments/1054100882976940186/1054144203162140672/Untitled_5_3.vpd_3.jpg) + +### Diagrama de estados da SBC + +```mermaid +stateDiagram-v2 + [*] --> RealTimeUpdate + [*] --> Publishing + State RealTimeUpdate { + TempoReal: Leituras em tempo real + note left of TempoReal + Exibição em tempo real das + leituras dos sensores + end note + + [*] --> TempoReal +TempoReal --> Histórico: Botão 1 + + Histórico: Histórico + note right of Histórico + Histórico das ultimas leituras do sensor + exibido no display no momento do + pressionar do botão 1 + end note + Histórico --> TempoReal: Botão 2 +} + + State Publishing { +[*] --> Publicações + Publicações: Publicações + note right of Publicações + - Requisições dos valores dos sensores + - Publicação dos históricos de leituras + e velocidade de atualização + end note +} +``` + +### Diagrama de sequencia + +![Fluxo drawio](https://user-images.githubusercontent.com/39845798/208326509-c8b0ccbe-eb32-437c-a002-f32800f1a620.png) + +
+ + + +
+ +## Interface dos dados enviados nos topicos de historico + +As mensagens enviadas pela SBC aos topicos de historico: + - analogic/history + - 5/history + - 16/history + +são formatadas como strings em formato [JSON((JavaScript Object Notation))](https://www.json.org/json-en.html). Como por exemplo: + +```JSON +{"number_of_items": 10,"max_lenght": 10,"values": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]} +``` +Segue, em typescript, a descrição de cada atributo da resposta + +```typescript +/** + * Interface (em typescript) dos dados enviados nos + * topicos dos historicos de leituras dos sensores digitais + * e analogico + */ +export interface history { + /** + * Quntidade de leituras atualmente no historico. + */ + number_of_items: number + /** + * Quantidade maxima de leituras no historico + */ + max_lenght: number // 10 leituras atualmente + /** + * Lista dos ultimos valores lidos do sensor. + * O primeiro valor da lista representa a leitura mais recente + */ + values: number[] +} +``` + +Por padrão, number_of_items sempre tem no minimo tamanho 1, pois na SBC cada lista é inicializada com 1 leitura de valor zero. ou seja: + +```typescript +values: number[] = [ 0 ]; +``` + +## Feito Com + +Abaixo segue o que foi utilizado na criação deste projeto: + +- [GCC (GNU Compiler Collection)](https://gcc.gnu.org/) - O GNU Compiler Collection é um conjunto de compiladores de linguagens de programação produzido pelo projecto GNU. +- [ESP8266 SDK para Arduino](https://github.com/esp8266/Arduino) - Este projeto traz suporte ao chip ESP8266 para o ambiente Arduino. +- [Arduino IDE v1.8](https://www.arduino.cc/en/software) - O Arduino Software (IDE) de código aberto facilita a escrita de código e o upload para a placa. Este software pode ser usado com qualquer placa Arduino. + +
+ + + +## Começando + +Para conseguir rodar o projeto, siga os passos abaixo. ### Pré-requisitos -Antes de começar, você vai precisar ter instalado em sua máquina as seguintes ferramentas: -[Git](https://git-scm.com), [Paho MQTT](https://github.com/eclipse/paho.mqtt.c). +Antes de seguirmos, é preciso que você tenha o ambiente configurado para criar e testar aplicações em C, bem como o ambiente para desenvolvimento React Native configurado (para compilar o IHM_Remoto). + + - Configure o ambiente react native seguindo a [documentação oficial](https://reactnative.dev/docs/environment-setup) + - Configure o ambiente react native for windows (para fazer build da aplicação desktop para windows) seguindo a [documentação oficial](https://microsoft.github.io/react-native-windows/docs/rnw-dependencies) + - Certifique-se de ter o gerenciador de dependencias Yarn instalado na versão 1. [instruções de instalação](https://classic.yarnpkg.com/en/docs/install#mac-stable) + +No ambiente da SBC (considerando a Raspberry Pi rodando um sistema baseado no Debian) caso não tenha o tooling to GCC, execute: + +``` +$ sudo apt install build-essential +``` +Instale também na SBC o [Paho MQTT](https://github.com/eclipse/paho.mqtt.c) e WiringPI + +
+ +1. Instale a IDE do Arduino na versão 1.8 de acordo com a [documentação oficial](https://www.arduino.cc/en/software) +2. Abra as preferências da IDE e adicione o código abaixo, assim como na imagem e pressione o botão de OK + +``` +https://arduino.esp8266.com/stable/package_esp8266com_index.json +``` + + ![Captura de tela_20221118_144353](https://user-images.githubusercontent.com/39845798/202769027-3c90d7e9-46e7-466c-a4ce-e1c3c5729711.png) + +3. Em seguida, abra o gerenciador de placas da IDE e instale o Generic ESP8266 Module na versão 3.0.2, como na imagem: +![Captura de tela_20221118_144840](https://user-images.githubusercontent.com/39845798/202769949-31b1df48-23b3-4089-b06a-dae98be37bbe.png) -### 🎲 Rodando o projeto +4. Em seguida, abra o gerenciador de bibliotecas e instale a biblioteca PubSubClient by Nick O'Leary, como na imagem: + +![instalarpubsub](https://user-images.githubusercontent.com/39845798/208325870-813796ce-8b16-49b9-b02b-99dd00e62385.png) + +### Estrutura de Arquivos + +A estrutura de arquivos está da seguinte maneira: ```bash -# Clone este repositório -$ git clone +ESP8266_ES +├── NodeMCU/ +│ ├── NodeMCU.cpp +├── Raspberry/ +│ ├── display.h +│ ├── makefile +│ ├── display.o +│ └── main.c +├── .gitignore +└── README.md +``` + +Serão explicados os arquivos e diretórios na seção de [Edição](#edição). + +### Instalacao na NodeMCU + +1. Abra a ide do Arduino +2. Abra o menu: Ferramentas > Placa e selecione a placa NodeMCU 1.0 +3. Conecte a NodeMCU ao computador via usb +4. Copie o diretorio NodeMCU para dentro do diretorio de projetos do arduino, abra a IDE e abra o arquivo NodeMCU.ino. Copile e carrege o codigo na ESP8266 +5. Selecione a porta no menu: Ferramentas > Porta +6. Carregue o codigo na placa (Ctrl + u) -# Acesse a pasta do projeto no terminal/cmd +### Instalação na SBC + +1. Na SBC, faça clone do projeto utilizando o comando e navegue para o diretório raiz do projeto: + +```sh +$ git clone https://github.com/DanielSRS/mcute $ cd mcute +``` + +2. Navegue até o diretório que contém o código a ser executado na SBC e faça build: + +```sh +cd IHM_Local +make mock +make all +``` + +3. Execute a aplicação + +```sh +make run +``` + +### Instalação do IHM_Remoto + +1. Na maquina onde há a configuração do ambiente de desenvolvimento React Native: + +```sh +git clone https://github.com/DanielSRS/mcute +cd mcute +``` + +2. Navegue até o diretório que contém o código a das aplicações Android, IOS, Web e Windows e faça build: -# Vá para a pasta IHM -$ cd IHM_Local +```sh +cd IHM_Remote +yarn +``` + +3. Execute a aplicação web + +```sh +yarn web +``` + +5. Ou a aplicação android + +```sh +yarn android +``` -# Execute a aplicação em modo de testes com makefile -$ +6. Ou a aplicação IOS +```sh +yarn ios +``` + +6. Ou a aplicação windows +```sh +yarn windows ``` -### 🛠 Tecnologias -As seguintes ferramentas foram usadas na construção do projeto: +### Edição + +Nesta seção haverão instruções caso você queira editar o projeto, explicando para que os diretórios são utilizados e também os arquivos de configuração. + +- **NodeMCU** - Após execução do projeto, o analizador léxico irá gerar arquivos de saída neste diretório contendo as informações processadas em cada arquivo de entrada. + + - **NodeMCU.cpp** - Codigo da aplicação executada na NodeMCU responsável por interpretar os comandos enviados pela SBC, realizar a leitura dos sensores e enviar atraves da UART as informações solicitadas + +- **IHM_Local** - Diretório contendo todos os arquivos da aplicação executada na SBC (Raspberry Pi), + + - **main.c** - Codigo da aplicação executada na SBC e responsável pelo controle da NodeMCU enviando comandos, lendo e exibindo as informações coletadas. + + - **makefile** - Arquivo de configuração makefile com as instruções de build do projeto. + + - **display.h** - Arquivo de cabeçalho da biblioteca de comunicação com o display 16x2. + + - **display.o** - Biblioteca para comunicação com o display 16x2. + +- **.gitignore** - Arquivo de configurção do git contendo informções de arquivos que não devem ser versionados junto com o codigo fonte; + +- **README.md** - Este arquivo. Aqui é feito a documentação basica do projeto com instruções de instalação, configuração e execução. + +## Executar projeto na SBC + +- Ainda no diretório raiz, navegue para o diretorio Raspberry: + + ```sh + cd IHM_Local + ``` +- Faça o build da aplicação + + ```sh + make mock + make all + ``` + +- Faça o build e rode a aplicação + + ```sh + make run + ``` + +- Execute manualmente a aplicação informando o sensor analógico e dois digitais conectados + + ```sh + $ sudo ./Rasp -analogic -d."D0".16 -d."D1".5 + ``` + +
+ +## Materiais de referência +[Raspberry Pi Documentation](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-zero-w) + +[Display LCD HD44780U](https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.sparkfun.com/datasheets/LCD/HD44780.pdf&ved=2ahUKEwjso46tlqn6AhVGL7kGHSe6BMEQFnoECGIQAQ&usg=AOvVaw076YT-P88DM3oFFvTDUv43) + +[BCM2835 ARM Peripherals](https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) + +[ESP8266 Arduino Core Documentation](https://readthedocs.org/projects/arduino-esp8266/downloads/pdf/latest/) + +[Documentação de Referência da Linguagem Arduino](https://www.arduino.cc/reference/pt/) + +[ESP8266WiFi library](https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html) + +[ESP8266mDNS library](https://www.arduino.cc/reference/en/libraries/esp8266_mdns/) + +[WifiUdp library](https://www.arduino.cc/reference/en/libraries/wifi/wifiudp/) + +[ArduinoOTA](https://www.arduino.cc/reference/en/libraries/arduinoota/) + +[SoftwareSerial Library](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjSluW4ypz7AhU_kZUCHbP9C5kQFnoECAoQAQ&url=https%3A%2F%2Fwww.arduino.cc%2Fen%2FReference%2FsoftwareSerial&usg=AOvVaw2kUbQNvvMDReS_1LIPB82g) + +[HardwareSerial Library](https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/HardwareSerial.h) + +[Termios Library](https://pubs.opengroup.org/onlinepubs/7908799/xsh/termios.h.html) + +Autores +======= +| [
Alexandre Silva Caribé](https://github.com/AlexandreCaribe) | [
Alisson Bonfim Silva](https://github.com/absilva21) | [
Daniel Santa Rosa Santos](https://github.com/DanielSRS) | [
Joanderson Santos](https://github.com/Joanderson90) | +| :---: | :---: | :---: | :---: | -- [MQTT](https://mqtt.org/) +## Contribuição +- Quaisquer dúvidas, sugestões ou problemas que encontrar, fique livre para abrir uma issue. +- Se quiser contribuir ajustando o codigo, implementando novas funcionalidas ou corrigindo bugs, faça um fork do projeto, faça as alterações nescessárias como descrito na seção de [Edição](#edição) e abra um pull request diff --git a/main.c b/main.c deleted file mode 100644 index 74303f3..0000000 --- a/main.c +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include -#include -#include - -#define TRUE 1 -#define MQTT_ADDRESS "tcp://10.0.0.101" -#define CLIENTID "98631145" - -#define USERNAME "aluno" -#define PASSWORD "@luno*123" - -#define MQTT_PUBLISH_TOPIC "B9863" -#define MQTT_SUBSCRIBE_TOPIC "B986311" - -MQTTClient client; - -void publish(MQTTClient client, char *topic, char *payload); -int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message); - -void publish(MQTTClient client, char *topic, char *payload) -{ - MQTTClient_message pubmsg = MQTTClient_message_initializer; - - pubmsg.payload = payload; - pubmsg.payloadlen = strlen(pubmsg.payload); - pubmsg.qos = 2; - pubmsg.retained = 0; - MQTTClient_deliveryToken token; - MQTTClient_publishMessage(client, topic, &pubmsg, &token); - MQTTClient_waitForCompletion(client, token, 1000L); -} - -int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message) -{ - char *payload = message->payload; - - /* Mostra a mensagem recebida */ - printf("Mensagem recebida! \n\rTopico: %s Mensagem: %s\n", topicName, payload); - - /* Faz echo da mensagem recebida */ - publish(client, MQTT_PUBLISH_TOPIC, payload); - - MQTTClient_freeMessage(&message); - MQTTClient_free(topicName); - return 1; -} - -int main(int argc, char *argv[]) -{ - int rc; - - /*Configuração do Cliente*/ - MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - conn_opts.username = USERNAME; - conn_opts.password = PASSWORD; - - /* Inicializacao do MQTT (conexao & subscribe) */ - MQTTClient_create(&client, MQTT_ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); - MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL); - - rc = MQTTClient_connect(client, &conn_opts); - - if (rc != MQTTCLIENT_SUCCESS) - { - printf("\n\rFalha na conexao ao broker MQTT. Erro: %d\n", rc); - exit(-1); - } - - MQTTClient_subscribe(client, MQTT_SUBSCRIBE_TOPIC, 0); - - while (TRUE) - { - } -}