Open AndyDHill opened 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
i cannot recive the signal coming from my client to my esp after it wakes up from deepsleep
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:
If the first character of the topic "inTopic" is an 1, switch ON the ESP Led, else switch it off
It will reconnect to the server if the connection is lost using a blocking reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to achieve the same result without blocking the main loop.
To install the ESP8266 board, (using Arduino 1.6.4+):
*/
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
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