1

У меня есть 2 ESP8266 PubSubClients, которые подключаются к брокеру MQTT, установленному на малине PI3. Я могу подключить их и сделать операцию ON/OFF, и все в порядке! но когда я собираюсь использовать их обоих для работы, это будет зависать и застревать в петле повторного соединения, когда я выключу один из них, его работа прекрасна.подключить два ESP8266 к одному брокеру MQTT вызвать зависание

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

к:

WiFiClient espClient1; 
PubSubClient client(espClient1); 

Большое спасибо.

ответ

3

Ваша проблема эта линия:

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

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