簡體   English   中英

與MQTT代理建立新連接后,Arduino回調停止工作

[英]Arduino callback stops working when there is a new connection to MQTT broker

第一次在此發布信息,我希望有人能夠為我遇到的煩人問題提供幫助。

我試圖通過帶有websockets的MQTT通過MQTT控制Arduino,這一切工作正常,直到與代理建立新連接為止,然后Arduino不響應回調。

    #include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 123);
const char* server = "192.168.0.30";
char message_buff[100];

// defines and variable for sensor/control mode
#define MODE_OFF    0  // not sensing light, LED off
#define MODE_ON     1  // not sensing light, LED on
#define MODE_SENSE  2  // sensing light, LED controlled by software
int senseMode = 0;
unsigned long time;

EthernetClient ethClient;
PubSubClient mqttClient(ethClient);
void callback(char* topic, byte* payload, unsigned int length) {
  int i = 0;
  for (int i=0;i<length;i++) {
   message_buff[i] = payload[i];
  }


   String msgString = String(message_buff);
   Serial.println("Payload: " + msgString);
  if (msgString.equals("onn")){
      senseMode = MODE_ON;

    }else if(msgString.equals("off")){
     senseMode = MODE_OFF;

    }


}
void reconnect() {
  // Loop until we're reconnected
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqttClient.connect("arduinoClient")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      mqttClient.publish("test","AR1 Connected");
      // ... and resubscribe
      mqttClient.subscribe("test");
    } else {
      Serial.print("failed, rc=");

      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup()
{
  Serial.begin(9600);
  pinMode(7, OUTPUT);
  mqttClient.setServer(server, 1883);
  mqttClient.setCallback(callback);

  Ethernet.begin(mac, ip);
  // Allow the hardware to sort itself out
  delay(1500);

}

void loop()
{
  if (!mqttClient.connected()) {
    reconnect();
  }
    switch (senseMode) {
    case MODE_OFF:
      // light should be off
      digitalWrite(7, LOW);
      break;
    case MODE_ON:
      // light should be on
      digitalWrite(7, HIGH);
      break;
    }
  mqttClient.loop();
}

輸出:

Attempting MQTT connection...failed, rc= try again in 5 seconds
Attempting MQTT connection...connected
Payload: onn
Payload: off
Payload: JTPA.CONNECTED
Payload: onnA.CONNECTED
Payload: offA.CONNECTED

任何幫助將非常感激。

謝謝。

如注釋中所述,這里的問題是,所有實例都使用相同的MQTT客戶端ID。 這將不起作用,因為每個客戶端都需要一個唯一的ID,並且代理將斷開重復項的連接。

您需要一種生成唯一ID的方法,在Arduino站點上的此問題提供了有關如何執行此操作的一些提示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM