PRACTICA MQTT
MQTT
Descripción
Desarrollo de Practica
La siguiente practica tiene como fin usar la tarjeta ESP8266 como publicador y nuestro
ordenador como subscriptor, así como también de bróker, para esta práctica usaremos
el sensor DHT11 de humedad y temperatura y HCSR04 de distancia para poder enviar
los datos, los cuales serán almacenados en una base datos de forma local como en un
servicio en la nube, para este caso utilizaremos nuestra máquina virtual de RedHat como
servidor local y una instancia de AWS como servidor en la nube.
Materiales:
• ESP8266
• Arduino IDE
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
Desarrollo de la práctica
Instalación de MQTT
1. Arrancamos nuestra máquina virtual y procedemos a ingresar los siguientes
comandos:
Para actualizar los repositorios
sudo yum -y install nano
Instalamos epl-release
sudo yum install epel-release-latest-7.noarch.rpm
Instalamos mosquito
sudo yum -y install mosquitto
Una vez instalado procedmos a modificar el archivo de configuración
vi /etc/mosquitto/mosquitto.conf
Aplastamos la tecla Shift + g para dirigirnos al final del archivo
Una vez estando al final del archivo vamos a agregar las siguientes líneas que
están en el recuadro rojo de la imagen superior
listener 1883
allow_anonymous true
listener 9001
protocol websockets
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
Observamos que la estructura es casi idéntica a la del susribtor, solo que usamos
el subfijo “_sub” así como añadimos el atributo de -m para añadir el mensaje a
enviar, pulsamos enter y tendremos el siguiente resultado:
Programación de ESP8266
Antes de comenzar a escribir nuestro script vamos a instalar las siguientes
librerías las cuales se pueden instalar mediante el gestor de librerías propio del
IDE de Arduino
• ESP8266WiFi
• Ticker
• AsyncMqttClient
• DHT
A continuación, se explicará las partes del código que se deben de modificar, el código
se encontrar al final de la explicación.
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
Solo se debe cambiar las líneas señaladas teniendo en cuenta los parámetros de
nuestra práctica, las demás líneas ya vienen por defecto.
NOTA: No se muestra el proceso para la adquisición de datos con los sensores
ya que es básico.
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>
// TOPICOS MQTT
#define MQTT_PUB_TEMP "casa/temperatura"
#define MQTT_PUB_HUM "casa/humedad"
#define MQTT_PUB_DIS "casa/distancia"
// sensor DHT
#define DHTPIN 5
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(115200);
Serial.println();
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
dht.begin();
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler =
WiFi.onStationModeDisconnected(onWifiDisconnect);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
connectToWifi();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
hum = dht.readHumidity();
temp = dht.readTemperature();
/////////
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
dis = duration*0.034/2.0;
//Publicación de mensaje MQTT con el topico temp
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP,
1, true, String(temp).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId:
%i ", MQTT_PUB_TEMP, packetIdPub1);
Serial.printf("Message: %.2f \n", temp);
}
}
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
Para la instalación de Mosquitto en AWS seguimos los mismos pasos que usamos
para instalarlo en nuestro servidor de RedHat es por eso por lo que se omitirá
esa parte y se mostrara las configuraciones adicionales que se deben de hacer
son la habilitación de puertos:
Luego vamos a añadir las reglas de entrada para que nuestra tarjeta ESP8266
pueda conectarse a nuestro servidor a AWS
Una ves en el apartado de reglas de entrada vamos a añadir dos reglas con
los parámetros de la siguiente imagen, una para MQTT y otra websockets.
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano
Una vez realizado este paso ya podremos usar nuestro servidor en AWS como
bróker, usaremos el mismo script para nuestra tarjeta ESP8266 que usamos
para el servidor local, solo debemos cambiar la IP de nuestro servidor, la cual
podemos encontrarla en el apartado de instancias, debemos de usar la IP
publica.
Vamos a ver como en nuestra consola de Putty donde nos suscribimos, vamos
a empezar a recibir los datos como se ve en la siguiente imagen:
UNIVERSIDAD TÉCNICA DE AMBATO
FACULTAD DE INGENIERÍA EN SISTEMAS, ELECTRÓNICA E INDUSTRIAL
Carrera: Telecomunicaciones - Modulo: Comunicaciones Avanzadas
Docente: Ing. Santiago Manzano