MQTT és un protocol de comunicacions que utilitza un servidor per intercanviar dades entre màquines.
Nosaltres podem, per exemple, comunicar el nostre D1 mini amb un programa de Snap! per visualitzar la temperatura d'un sensor o encendre i apagar un llum des de Snap!
Ens caldrà instal·lar la llibreria PubSubClient a l'entorn Arduino i a Snap! importar la biblioteca de Xavier Pi i Bernat Romagosa MQTT4Snap!. Aquí teniu un exemple:
Codi Arduino
#include <ESP8266WiFi.h>#include <PubSubClient.h>#include <WEMOS_DHT12.h>const char* ssid = "NOM DE LA XARXA";const char* password = "CONTRASENYA";const char* mqtt_server = "test.mosquitto.org"; WiFiClient espClient;PubSubClient client(espClient);DHT12 dht12;const int lamp = D4;long now = millis();long lastMeasure = 0;void setup_wifi() { delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); }}void callback(String topic, byte* message, unsigned int length) { String messageTemp; for (int i = 0; i < length; i++) { messageTemp += (char)message[i]; } if(topic=="bany/lamp"){ if(messageTemp == "on"){ digitalWrite(lamp, HIGH); Serial.print("On"); } else if(messageTemp == "off"){ digitalWrite(lamp, LOW); Serial.print("Off"); } }}void reconnect() { while (!client.connected()) { String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { client.subscribe("bany/lamp"); } else { delay(5000); } }}void setup() { pinMode(lamp, OUTPUT); Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback);}void loop() { if (!client.connected()) { reconnect(); } client.loop(); now = millis(); if (now - lastMeasure > 30000) { dht12.get(); lastMeasure = now; float h = dht12.humidity; float t = dht12.cTemp; static char temperatureTemp[7]; dtostrf(t, 6, 2, temperatureTemp); static char humidityTemp[7]; dtostrf(h, 6, 2, humidityTemp); client.publish("bany/temperature", temperatureTemp); client.publish("bany/humidity", humidityTemp); }}Codi Snap!
Visualització a Snap!
En aquest cas és important que el servidor MQTT respongui tant al protocol estàndard com al WebSockets. Fixeu-vos que en el codi Arduino s'utilitza el port 1883 (estàndard al servidor test.mosquitto.org) mentre que al codi Snap! s'utilitza el port 8081 (WebSockets+SSL al mateix servidor). Podeu trobar altres servidors i les seves característiques a https://github.com/mqtt/mqtt.github.io/wiki/public_brokers