Chat freely about anything...

User avatar
By Mortezaaghili
#58390 Hi guys,

I have two PubSubClients in my project and One MQTT broker who is raspberry pi 3. I wrote the code for pub/sub messages on each ESP8266, but when i connect both of them, they stuck in reconnect loop!

My question is, how i can manage connecting two ESP8266.

this is my code:
Code: Select all#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'm also changed these lines for one of them but the result the same.
Thanks.
User avatar
By gdsports
#58433
Code: Select allif (client.connect("ESP8266Client")) {


Mosquitto disconnects clients with duplicate names. Use a unique name for each ESP. For example, ESP8266Client1 and ESP8266Client2. Alternatively, create the client name to include the WiFi MAC hardware address since the address is supposed to be globally unique.
User avatar
By PuceBaboon
#58460 If you look in the examples directory in the PubSubClient library directory you'll find that there's an ESP8266-specific example program in there. It solves this exact problem by adding a random number into the client-ID to ensure that each one is unique.

Another common method is to use the ESP chip's own ID using a call to getChipid(), something like this:-

Code: Select allsprintf(clidbuff, "ESPNo_%08X", ESP.getChipId());