ReactJS + MQTT
Tags: mqtt, react, esp8266, iot
Published: 2021-02-02 00:56:11

Olá pessoal, essa é a primeira vez que escrevo um artigo nesse site. Nessa primeira publicação irei escrever sobre duas tecnologias que amo muito que são o REACTJS e o protocolo de comunicação MQTT para internet das coisas. Vou relatar aqui uma pequena aplicação que fiz para automatizar o acionamento de uma fita de leds que coloquei no meu quarto, e deixo claro aqui também que não irei me aprofundar muito neste artigo, apenas explicarei coisas básicas sobre o assunto.


#O que é o MQTT?

O MQTT é um protocolo utilizado para comunicação de dispositivos em IOT criado pela IBM no final dos anos 90. Ele utiliza o modelo de comunicação Publicador/Assinante através de tópicos. É um protocolo leve que serve pra transportar pequenas quantidades de dados. Para saber mais sobre [clique aqui] (https://developer.ibm.com/br/technologies/iot/articles/iot-mqtt-why-good-for-iot/)


#O que é o REACTJS? 

O REACTJS é uma biblioteca Javascript para criação de interfaces web. Fonte: https://pt-br.reactjs.org/

#Equipamentos Utilizados

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/nigpxwurh01iit93ks3b.jpeg)
<figcaption>WEMOS D1<figcaption>


![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/4k0fbxv45ckrkxxaj0he.jpeg)
<figcaption>Fita de led RGB<figcaption>


#Como foi feito?

Para a criação desse mini projeto também foi utilizada a linguagem de programação C++ para programar o microcontrolador. Também foram utilizadas as bibliotecas ArduinoJson, Adafruit NeoPixel e ESP8266WiFi. Segue abaixo o código utilizado:


```c++
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

#define LEDS 100

WiFiClient wificlient;

PubSubClient client(wificlient);
String data;
Adafruit_NeoPixel strip(LEDS, 13, NEO_GRB + NEO_KHZ800);

StaticJsonDocument<128> doc;

//Coloca os leds com a cor branca
void brilhoalto()
{
  strip.clear();
  //Os argumentos do strip color são as cores no modo RGB 
  //Os argumentos do strip.fill() são as cores, o led inicial e o led final (no caso do 0 preenche a fita do inicio ao fim) 
  strip.fill(strip.Color(255, 255, 255), 0, 0);
  strip.show();
  delay(300);
 
}
//Coloca os leds com a cor amarela (mais suave para os olhos)
void modoLeitura(){
  strip.clear();
 
  strip.fill(strip.Color(255,105,0), 0, 0);
  strip.show();
  delay(300);
}
//Apaga os leds
void apagar(){
  strip.clear();

  strip.fill(strip.Color(0,0,0), 0, 0);
  strip.show();
}

//Callback para receber os dados do tópico assinado
void callback(char *topic, byte *payload, unsigned int length)
{

  for (int i = 0; i < length; i++)
  {
    char c = payload[i];
    data += c;
  }

  //Deserialização dos dados recebidos em JSON
  deserializeJson(doc, data);


  int mode = doc["mode"];    

  switch (mode)
  {
  case 1:
    brilhoalto();
    break;
  
  case 2:
    modoLeitura();
    break;

  case 3:
    apagar();
    break;
  }

   
   data ="";
}

void setup()
{
  Serial.begin(9600);
  delay(100);
  strip.begin();

  //Conexão na rede wifi
  WiFi.begin("REDE", "senha");

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(100);
  }
  
  //Informo qual o servidor broker será utilizado

  client.setServer("{Broker de sua Preferência}", 1883);

  client.setCallback(callback);
  /*Conecto ao broker (Mudar id do cliente pelo de sua preferência)*/
  if (client.connect("client_id_led123938"))
  {
    Serial.println("Conectado ao broker");
  }
  //Inscrevo dispositivo no tópico da minha preferência
  client.subscribe("{TÓPICO DE SUA PREFERÊNCIA}");

  Serial.print("Conectado!");
}

void loop()
{
  /*Função para "escutar" as mensagens recebidas no tópico inscrito*/
  client.loop();
}

```

### Parte do código da aplicação REACT:


```

import React, { Component } from 'react';
import Button from '../components/Button';
import '../styles/Main.css'
const mqtt = require('mqtt')
var client;

export default class Main extends Component {

    componentDidMount() {
       //Conecto ao mesmo broker do dispositivo
        client = mqtt.connect("wss://test.mosquitto.org:8081",  'clientic_' + Math.random())
        client.on('connect', function () {

            console.log('conectado')

        })
    }
    render() {
        return (
            <div className={'container'}>


                <Button title={'Ligar'} onClick={() => {
                    const data = {
                        mode: 1
                    }
                    {/*Publico no mesmo tópico que o meu dispositivo foi inscrito enviando o dado de acordo com a opção selecionada*/}
                    client.publish('{topico}', JSON.stringify(data))
                }} />

                <Button title={'Desligar'} onClick={() => {
                    const data = {
                        mode: 3
                    }
                    client.publish('{topico}', JSON.stringify(data))
                }} />

                <Button title={'Modo Leitura'} onClick={() => {
                    const data = {
                        mode: 2
                    }
                    client.publish('{topico}', JSON.stringify(data))
                }} />





            </div>
        )
    }
}


```



#Depois de pronto...

Depois de devidamente feitas as conexões dos fios e o deploy da aplicação realizado no Heroku, foi possível controlar as luzes pela internet

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3y2lg57zxgrvamq4x4kh.jpeg)

<figcaption>Aplicação Funcionando<figcaption>



{%youtube yI0rn8pOujI %}


Obs: Ainda não foram implementadas as ações para uma maior segurança da aplicação.


Fontes: 

https://developer.ibm.com/br/technologies/iot/articles/iot-mqtt-why-good-for-iot/

https://pt-br.reactjs.org/

https://pubsubclient.knolleary.net/

https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use