/*
程序来源: EMQX
https://www.emqx.com/zh/blog/esp32-connects-to-the-free-public-mqtt-broker
*/
//首先我们将导入 WiFi 和 PubSubClient 库,
//WiFi 库能够将 ESP32 连接到 Wi-Fi 网络,
//PubSubClient 库能使 ESP32 连接到 MQTT 服务器发布消息及订阅主题。
#include <WiFi.h>
#include <PubSubClient.h>
//设置 Wi-Fi 名称和密码,以及 MQTT 服务器连接地址和端口,并这是 topic 为 "esp32/test"
// WiFi
const char *ssid = "fly"; // Enter your WiFi name ChinaNet-axHs
const char *password = "00001111"; // Enter WiFi password y8lbj5lg
// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "esp32/test";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
//打开一个串行连接,以便于输出程序的结果并且连接到 Wi-Fi 网络
// Set software serial baud to 115200;
Serial.begin(115200);
pinMode(2, OUTPUT);
pinMode(15, OUTPUT);
digitalWrite(2,0);
digitalWrite(15,0);
int timeDelay = 1000; // 毫秒
vTaskDelay(timeDelay / portTICK_PERIOD_MS); // 除以每个tack的毫秒
digitalWrite(2,!digitalRead(2));
digitalWrite(15,1);
// connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
//使用 PubSubClient 连接到公共 MQTT Broker。
//connecting to a mqtt broker
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public emqx mqtt broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
//MQTT 服务器连接成功后,ESP32 将向 MQTT 服务器 esp/test 发布消息和订阅 esp/test 主题消息。
// publish and subscribe
client.publish(topic, "Hi EMQ X I'm ESP32 ^^");
client.subscribe(topic);
}
//设置回调函数将主题名称打印到串行端口并打印从 esp32/test 主题接收的消息。
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
void loop() {
client.loop();
}