【发布时间】: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