Search code examples
raspberry-pipublish-subscribemqttesp8266arduino-esp8266

connect two ESP8266 to one MQTT broker cause hang


I have 2 ESP8266 PubSubClients who are connecting to MQTT broker installed on Raspberry PI3. I'm able to connect them and make a ON/OFF operation and its okay! but when I'm going to use both of them to operating its will be hang and stuck in reconnecting loop, when i turn one of them off, its work fine.

this is my code on ESP8266:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "192.168.1.10";

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(115200);
  Serial.begin(9600);
  pinMode(0, OUTPUT);
  digitalWrite(0, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  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();

  //1 ( pin 0 )
  if (strcmp(topic,"/home/1/ard1/p1/com")==0) {
    if (payload[0] == '0'){
      digitalWrite(0, HIGH); 
      Serial.print("Turning Light ON");
      delay(100);
      client.publish("/home/1/ard1/p1/state","0");
    }
    else if (payload[0] == '1')
    {
      digitalWrite(0, LOW);
      Serial.print("Turning Light OFF");
      delay(100);
      client.publish("/home/1/ard1/p1/state","1");
    }
  }


  //2 ( pin 2 )
  if (strcmp(topic,"/home/1/ard1/p2/com")==0) {
    if (payload[0] == '0'){
      digitalWrite(2, HIGH); 
      Serial.print("Turning Light ON");
      delay(100);
      client.publish("/home/1/ard1/p2/state","0");
    }
  else if (payload[0] == '1')
    {
      digitalWrite(2, LOW);
      Serial.print("Turning Light OFF");
      delay(100);
      client.publish("/home/1/ard1/p2/state","1");
    }
  }

  //3 ( pin 4 )
  if (strcmp(topic,"/home/1/ard1/p3/com")==0) {
    if (payload[0] == '0'){
      digitalWrite(4, HIGH); 
      Serial.print("Turning Light ON");
      delay(100);
      client.publish("/home/1/ard1/p3/state","0");
    }
  else if (payload[0] == '1')
    {
      digitalWrite(4, LOW);
      Serial.print("Turning Light OFF");
      delay(100);
      client.publish("/home/1/ard1/p3/state","1");
    }
  }

  //4 ( pin 5 )
  if (strcmp(topic,"/home/1/ard1/p4/com")==0) {
    if (payload[0] == '0'){
      digitalWrite(5, HIGH); 
      Serial.print("Turning Light ON");
      delay(100);
      client.publish("/home/1/ard1/p4/state","0");
    }
  else if (payload[0] == '1')
    {
      digitalWrite(5, LOW);
      Serial.print("Turning Light OFF");
      delay(100);
      client.publish("/home/1/ard1/p4/state","1");
    }
  }



}
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("outTopic", "hello world");
      client.subscribe("/home/1/ard1/#");
      // ... 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("outTopic", msg);
  }
}

I changed these below lines for one of them but the result is the same.

WiFiClient espClient;
PubSubClient client(espClient);

to:

WiFiClient espClient1;
PubSubClient client(espClient1);

Many Thanks.


Solution

  • Your problem is this line:

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

    Every client needs a unique client id, hard coding it to ESP8266Client means that when the second client connects the broker will kick the first one off, which will then try and reconnect which will kick the second off. This just ends up stuck in a loop.