tutorial servidor raspberry cloudmqtt arduino mqtt esp8266 mosquitto

arduino - servidor - mqtt mosquitto raspberry pi esp8266



Arduino no recibe mensajes suscritos de MQTT por ESP8266 (0)

Tengo un servidor MQTT (Mosquitto) ejecutándose en un RPi3. También tengo una matriz de sensores en mi banco que publica lecturas a MQTT cada 5 segundos. Todo esto está funcionando bien.

Esta noche, conecté un ESP8266-01 a un Arduino Mega usando uno de los puertos seriales extra de hardware del Mega (rx1, tx1). Estoy usando dos bibliotecas en mi boceto: (1) WiFiEsp y (2) PubSubClient. Probé tanto el PubSubClient de O''Leary como la rama de Imroy del PubSubClient de O''Leary. Obtengo el mismo resultado con cada uno.

Cuando enciendo mi Mega con su escudo ESP8266, se conecta a WiFi y al agente de MQTT. Sin embargo, no recibe ningún mensaje. También deja caer la conexión con el intermediario MQTT cada minuto más o menos. Se vuelve a conectar de inmediato. El LED azul de transmisión en el ESP8266 está ciclando extremadamente rápido. Demasiado rápido para el tráfico de mensajes en mi servidor MQTT.

Estoy usando el cambio de nivel adecuado entre los dispositivos. Cuando coloco un alcance en el rx1 de Mega, veo un rastro continuo de datos que solo se detiene al desconectarse.

En una publicación similar aquí , Ankur publicó ayer que hay un error en la devolución de llamada. Creo que probablemente se está refiriendo a la biblioteca PubSubClient. PubSubClient es una biblioteca muy popular que mucha gente está usando. ¿Alguien puede comentar más sobre la naturaleza del error al que aludía ankur? Voy a publicar mi código a continuación.

Si alguien más se encuentra con este problema, también probé otra variante de esta configuración. Puse mi código de cliente WiFi y mi código de cliente MQTT directamente en el micro del ESP8266 y conecté el ESP8266 a un Arduino Uno a través de SoftwareSerial a 19200 baudios. La conexión a mi servidor MQTT es sólida como una roca y todos los mensajes vienen de manera impecable.

Mi código en el Mega sigue:

#include <WiFiEsp.h> #include <PubSubClient.h> const char *ssid = "********"; const char *pass = "********"; int status = WL_IDLE_STATUS; #define BUFFER_SIZE 100 IPAddress server(10, 0, 1, 6); // initialize WiFi client WiFiEspClient espClient; // connect to mqtt server PubSubClient client(espClient); void callback(const MQTT::Publish& pub) { if (pub.has_stream()) { uint8_t buf[BUFFER_SIZE]; int read; while (read = pub.payload_stream()->read(buf, BUFFER_SIZE)) { Serial.write(buf, read); } pub.payload_stream()->stop(); Serial.println(""); } else Serial.println(pub.payload_string()); } void setup() { pinMode(19, INPUT_PULLUP); // pull rx1 high Serial.begin(9600); Serial1.begin(9600); WiFi.init(&Serial1); // check for the presence of the shield if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don''t continue while (true); } // attempt to connect to WiFi network while (status != WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network status = WiFi.begin(ssid, pass); } Serial.println("You''re connected to the network"); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); } void reconnect() { if (!client.connected()) { client.set_server(server, 1883); client.connect("AVR101"); client.subscribe("ishnalaIOT"); client.set_callback(callback); } }