【问题标题】:Arduino callback stops working when there is a new connection to MQTT broker与 MQTT 代理建立新连接时,Arduino 回调停止工作
【发布时间】:2018-01-18 21:58:55
【问题描述】:

第一次在这里发帖,希望有人能帮我解决我遇到的烦人问题。

我正在尝试通过带有 websockets 的 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

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 编辑问题以包含串行输出,以便我们了解实际发生的情况。此外,除非有所改变,否则 PubSubClient 不支持基于 websockets 的 MQTT。并且到端口 1883 的连接很可能是本机 MQTT,而不是 websockets 上的 MQTT。
  • 抱歉没有正确解释所有内容,Arduino 通过标准 MQTT Socket 1883 连接,然后我还运行了一个通过 websockets 连接的 web 服务器。当他首先连接网络服务器时,Arduino 一切正常,但是当新客户端连接到 MQTT 服务器时,Arduino 没有响应。
  • 您还没有将任何串行输出添加到问题中,因此我们可以看到发生了什么。还要说明您有多少个 Arduino 运行此代码。该代码有一个硬编码的客户端 ID,不能用于多个实例
  • 感谢您的建议。这突出了这个问题,但我仍然不确定如何解决这个问题。

标签: websocket callback arduino mqtt


【解决方案1】:

正如在 cmets 中讨论的那样,这里的问题是您对所有实例使用相同的 MQTT 客户端 ID。这不会起作用,因为每个客户端都需要一个唯一的 id,并且代理会断开重复。

您需要一种方法来生成唯一 ID,Arduino 网站上的 question 提供了一些有关如何执行此操作的提示。

【讨论】:

  • 谢谢你的建议。我只有 1 个 Arduino,我已经把串行监视器放出来了,这突出了问题,它在前两个“onn”和“off”中切换正常" 但是当新客户端连接时,它发布的网站是 "JTPA.CONNECTED" 然后当再次发送 "onn" "off" 命令时,字符串的一半留在 m" 消息中,但我仍然不确定如何解决这个问题。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多