Arduino未通过ESP8266接收MQTT订阅的消息

时间:2017-01-19 06:20:52

标签: arduino mqtt esp8266 mosquitto

我在RPi3上运行了一个MQTT服务器(Mosquitto)。我的工作台上还有一个传感器阵列,每隔5秒就会向MQTT发布读数。所有这一切都很有效。

今晚,我使用Mega的一个额外硬件串口(rx1,tx1)将ESP8266-01连接到Arduino Mega。我在草图中使用了两个库:(1)WiFiEsp和(2)PubSubClient。我已经尝试了O' Leary的PubSubClient和Imroy的分支机构O' Leary的PubSubClient。我得到了相同的结果。

当我用它的ESP8266屏蔽为我的Mega供电时,它连接到WiFi和MQTT经纪人很好。但是,它没有收到任何消息。它还会每分钟左右断开与MQTT代理的连接。它立即重新连接。 ESP8266上的蓝色发射LED循环非常快。对我的MQTT服务器上的消息流量来说太快了。

我在设备之间使用适当的电平转换。当我在Mega的rx1上放置一个示波器时,我看到一个连续的数据跟踪,只有在断开连接时才会停止。

在类似的帖子here中,ankur昨天发布了回调中的错误。我认为他可能指的是PubSubClient库。 PubSubClient是一个非常受欢迎的库,很多人都在使用它。任何人都可以进一步评论ankur提到的bug的性质吗?我将在下面发布我的代码。

如果有其他人遇到此问题,我还测试了此配置的另一种变体。我将我的WiFi客户端代码和我的MQTT客户端代码直接放在ESP8266的micro上,并通过SoftwareSerial以19200波特将ESP8266连接到Arduino Uno。与我的MQTT服务器的连接非常稳固,所有消息都完美无缺。

我在Mega上的代码如下:

#include <WiFiEsp.h> #include <PubSubClient.h> const char *ssid = "********"; const char *pass = "********"; int status = WL_IDLE_STATUS; #define BUFFER_SIZE 100 IPAddress server(10, 0, 1, 6); // initialize WiFi client WiFiEspClient espClient; // connect to mqtt server PubSubClient client(espClient); void callback(const MQTT::Publish& pub) { if (pub.has_stream()) { uint8_t buf[BUFFER_SIZE]; int read; while (read = pub.payload_stream()->read(buf, BUFFER_SIZE)) { Serial.write(buf, read); } pub.payload_stream()->stop(); Serial.println(""); } else Serial.println(pub.payload_string()); } void setup() { pinMode(19, INPUT_PULLUP); // pull rx1 high Serial.begin(9600); Serial1.begin(9600); WiFi.init(&Serial1); // check for the presence of the shield if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue while (true); } // attempt to connect to WiFi network while (status != WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network status = WiFi.begin(ssid, pass); } Serial.println("You're connected to the network"); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); } void reconnect() { if (!client.connected()) { client.set_server(server, 1883); client.connect("AVR101"); client.subscribe("ishnalaIOT"); client.set_callback(callback); } }

0 个答案:

没有答案