подключить два ESP8266 к одному брокеру MQTT, что приведет к зависанию

У меня есть 2 ESP8266 PubSubClient, которые подключаются к брокеру MQTT, установленному на Raspberry PI3. Я могу подключить их и выполнить операцию ВКЛ / ВЫКЛ, и все в порядке! но когда я собираюсь использовать их оба для работы, они будут зависать и застревать в цикле повторного подключения, когда я выключаю один из них, он работает нормально.

это мой код на 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);
  }
}

Я изменил эти строки ниже для одной из них, но результат тот же.

WiFiClient espClient;
PubSubClient client(espClient);

to:

WiFiClient espClient1;
PubSubClient client(espClient1);

Огромное спасибо.


person Mort    schedule 19.11.2016    source источник


Ответы (1)


Ваша проблема в этой строке:

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

Каждому клиенту нужен уникальный идентификатор клиента, жесткое кодирование его на ESP8266Client означает, что когда второй клиент подключается, брокер отключит первого, который затем попытается повторно подключиться, что отключит второго. Это просто застревает в петле.

person hardillb    schedule 19.11.2016