2. Qué son los tópicos en MQTT
En MQTT, un tópico es una cadena de texto utilizada por el broker para filtrar los mensajes para cada cliente conectado. Los clientes pueden suscribirse a uno o más tópicos y publicar mensajes en ellos. Los tópicos se organizan de manera jerárquica utilizando barras inclinadas (/) como delimitadores.
Ejemplos de tópicos:
home/livingroom/temperature
office/secondfloor/humidity
weather/+/temperature
(el signo más +
es un comodín que representa un nivel de la jerarquía de tópicos)
4. Publicar y suscribirse a tópicos desde un cliente MQTT
Para publicar y suscribirse a tópicos, puedes utilizar un cliente MQTT como el ESP8266. Aquí tienes un ejemplo de cómo hacerlo en Arduino (como se mostró anteriormente):
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Configuración de la red Wi-Fi
const char* ssid = "TU_SSID"; // Reemplaza con el SSID de tu red Wi-Fi
const char* password = "TU_PASSWORD"; // Reemplaza con la contraseña de tu red Wi-Fi
// Configuración del broker MQTT
const char* mqtt_server = "broker.mymqtthub.com"; // Dirección del broker MQTT
const int mqtt_port = 1883; // Puerto del broker MQTT
const char* mqtt_user = "TU_USUARIO"; // Reemplaza con tu usuario de MyMQTTHub
const char* mqtt_password = "TU_CONTRASEÑA"; // Reemplaza con tu contraseña de MyMQTTHub
const char* mqtt_topic = "test/topic"; // Reemplaza con el tópico donde deseas publicar el mensaje
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando al broker MQTT...");
if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
Serial.println("Conectado");
} else {
Serial.print("Fallo, rc=");
Serial.print(client.state());
Serial.println(" intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Publicar un mensaje cada 10 segundos
static unsigned long lastMsg = 0;
unsigned long now = millis();
if (now - lastMsg > 10000) {
lastMsg = now;
Serial.println("Publicando mensaje...");
client.publish(mqtt_topic, "Hola desde ESP8266");
}
}