knolleary / pubsubclient

A client library for the Arduino Ethernet Shield that provides support for MQTT.
http://pubsubclient.knolleary.net/
MIT License
3.84k stars 1.47k forks source link

Continually reconnections #483

Open AndyDHill opened 6 years ago

AndyDHill commented 6 years ago

Continual re connection and ever so often will lose connect return -4

`/* Basic ESP8266 MQTT example

This sketch demonstrates the capabilities of the pubsub library in combination with the ESP8266 board/library.

It connects to an MQTT server then:

*/

include

include

// Update these with values suitable for your network.

ifdef work

const char ssid = "SSID"; const char password = "PASS"; const char* mqtt_server = "broker.hivemq.com";

else

const char ssid = "SSID"; const char password = "PASS"; const char* mqtt_server = "broker.hivemq.com";

endif

WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0;

void setup() { pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(9600); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); }

void setup_wifi() {

delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }

Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); }

void callback(char topic, byte payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println();

// Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is acive low on the ESP-01) } else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH }

}

void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect("ESP8266Client")) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic123", "hello world"); // ... and resubscribe client.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void loop() {

if (!client.connected()) { reconnect(); } client.loop();

long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, 75, "hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic123", msg); } ` Output from above program

Connecting to Denserver ... WiFi connected IP address: 192.168.1.82 Attempting MQTT connection...connected Publish message: hello world #1 Message arrived [inTopic] vimal Attempting MQTT connection...connected Message arrived [inTopic] vimal Publish message: hello world #2 Publish message: hello world #3 Publish message: hello world #4 Publish message: hello world #5 Publish message: hello world #6 Publish message: hello world #7 Publish message: hello world #8 Publish message: hello world #9 Publish message: hello world #10 Publish message: hello world #11 Publish message: hello world #12 Publish message: hello world #13 Publish message: hello world #14 Attempting MQTT connection...connected Message arrived [inTopic] vimal Publish message: hello world #15 Attempting MQTT connection...connected Message arrived [inTopic] vimal Publish message: hello world #16 Publish message: hello world #17 Publish message: hello world #18 Publish message: hello world #19 Publish message: hello world #20 Publish message: hello world #21 Publish message: hello world #22 Publish message: hello world #23 Publish message: hello world #24 Publish message: hello world #25 Publish message: hello world #26 Publish message: hello world #27 Publish message: hello world #28 Attempting MQTT connection...connected Message arrived [inTopic] vimal Publish message: hello world #29

Tired on a Wemos D1 ESP and on a NODEMCU 12E. both have similar problem. Always using HiveMQ public broker

Code seems to be failing to detect !client.connected() and forcing reconnect();

Andy

AndyDHill commented 6 years ago

SOLVED - This is due to a hard coded ClientID

if (client.connect("ESP8266Client")) {

Change this to

if (client.connect(ClientId.c_str())) {

where

String ClientId = "ESP8266_"; unsigned char mac[6]; WiFi.macAddress(mac); ClientId += macToStr(mac);

String macToStr(const uint8_t* mac) { String result; for (int i = 0; i < 6; ++i) { result += String(mac[i], 16); } return result; }

https://github.com/esp8266/Arduino/issues/313#issuecomment-104945593

ahmedalkhabeer commented 5 years ago

i cannot recive the signal coming from my client to my esp after it wakes up from deepsleep