以下是一个使用WiFiManager库和ESP8266的程序示例。程序将自动连接到现有WiFi网络或创建新的网络并提供管理页面。然后,您可以通过串口输入命令行配置MQTT服务器的连接信息。```C++
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiManager.h>
WiFiManager wifiManager; // 创建Wi-FiManager实例
/* WiFi 信息*/
char wifi_ssid[40];
char wifi_pass[40];
/* MQTT 信息*/
char mqtt_server[40];
char mqtt_port[6];
char mqtt_topic[40];
char mqtt_user[40];
char mqtt_pass[40];
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
/* 连接WiFi信息管理和连接,必要要在第一时间完成 */
wifiManager.autoConnect("ESP8266 WiFi");
Serial.println("Wi-Fi Connected");
/* 配置MQTT服务器并连接 */
while (!client.connected()) {
Serial.println("Connecting to MQTT");
if (client.connect("ESP8266", mqtt_user, mqtt_pass)) {
Serial.println("Connected to MQTT");
client.subscribe(mqtt_topic);
} else {
Serial.print("failed with state ");
Serial.println(client.state());
delay(2000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
handleSerialCommands(); // 处理串口命令
}
/* 处理串口命令 */
void handleSerialCommands() {
static String inputString = "";
static boolean stringComplete = false;
if (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
if (stringComplete) {
String command = "";
String argument = "";
int delimiterIndex = inputString.indexOf(' ');
if (delimiterIndex > -1) {
command = inputString.substring(0, delimiterIndex);
argument = inputString.substring(delimiterIndex + 1, inputString.length()-1);
} else {
command = inputString.substring(0, inputString.length()-1);
}
if (command == "mqtt_server") {
strncpy(mqtt_server, argument.c_str(), 40);
} else if (command == "mqtt_port") {
strncpy(mqtt_port, argument.c_str(), 6);
} else if (command == "mqtt_topic") {
strncpy(mqtt_topic, argument.c_str(), 40);
} else if (command == "mqtt_user") {
strncpy(mqtt_user, argument.c_str(), 40);
} else if (command == "mqtt_pass") {
strncpy(mqtt_pass, argument.c_str(), 40);
}
inputString = "";
stringComplete = false;
}
}
void setup() {
Serial.begin(115200);
wifiManager.autoConnect("ESP8266 WiFi"); // 连接到WiFi或创建新WiFi网络
Serial.println("Wi-Fi Connected");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
```
在这个程序中,通过输入命令行 `"mqtt_server your_mqtt_server_address\n"`, `"mqtt_port your_mqtt_server_port\n"`, `"mqtt_topic your_mqtt_topic\n"`, `"mqtt_user your_mqtt_user\n"`, or `"mqtt_pass your_mqtt_password\n"` 可以配置MQTT信息。这些命令及格式可以根据实际需求进行自定义。
值得注意的是,在程序运行前,您需要在终端中输入需要的信息以配置MQTT服务器。完成后,可以开始正常运行程序。
此外,您还可以自定义用于配置的命令格式、分隔符等细节以适应特定的项目需求。