我在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);
}
}