我正在使用ESP8266,并想使用MQTT来控制它,而MQTT服务器是我的Synology DS415 +。我希望ESP安装在无法通过串行访问它的地方,因此我需要能够使用WiFi配置它的Wifi凭据以及MQTT服务器IP,端口和凭据。
因此,我决定WiFiManager-Library和PubSubClient-Library可以为我做到这一点。问题是:我无法让PubSubClient使用WiFiManager来工作,因为我还没有找到如何告诉PubSubClient使用正确的“客户端”的方法。
以下示例可在我的ESP上使用,但是它不允许对ESP Wifi进行动态配置:https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino
我提出以下内容:
http://pastebin.com/t5evEy1i
但是,这不起作用,其通过串行的输出如下:
mounting FS...
mounted file system
reading config file
opened config file
{"mqtt_server":"192.168.1.250","mqtt_port":"9001","switch_token":"BackupSwitch"}
parsed json
*WM: Adding parameter
*WM: server
*WM: Adding parameter
*WM: port
*WM: Adding parameter
*WM: blynk
*WM:
*WM: AutoConnect
*WM: Reading SSID
*WM: SSID:
*WM: XXX
*WM: Reading Password
*WM: Password: XXX
*WM: Connecting as wifi client...
*WM: Connection result:
*WM: 3
*WM: IP Address:
*WM: 192.168.1.74
connected...yeey :)
local ip
192.168.1.74
Attempting MQTT connection...192.168.1.250:9001
failed, rc=-2 try again in 5 seconds
Attempting MQTT connection...192.168.1.250:9001
failed, rc=-2 try again in 5 seconds
我很确定问题出在第17和18行中PubSubClient的定义中:
WiFiClient espClient;
PubSubClient client(espClient);
但是我不知道如何从WiFiManager中提取客户端以将其提供给PubSubClient-Library。
我需要的是如何获取与WiFiClient或EthernetClient创建的对象相等,WiFiManager可能创建的对象以及我可以作为PubSubClient client(espClient)参数提供的对象。
有谁知道如何实现这一目标?提前致谢。
最佳答案
您无需从WiFiManager中提取任何东西,因为它正在使用WiFiClient。您需要做的只是:
#include <ESP8266WiFi.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient client(espClient);
void mqttCallback(char* topic, byte* payload, unsigned int length) {
// message received
}
void mqttReconnect() {
// reconnect code from PubSubClient example
}
void setup() {
WiFiManager wifiManager;
wifiManager.setTimeout(180);
if(!wifiManager.autoConnect("AutoConnectAP")) {
Serial.println("failed to connect and hit timeout");
delay(3000);
ESP.reset();
delay(5000);
}
Serial.println("connected...yeey :)");
client.setServer(mqtt_server, 1883);
client.setCallback(mqttCallback);
}
void loop() {
if (!client.connected()) {
mqttReconnect();
}
client.loop();
yield();
}