六、使用ESP8266程式設計利用Wifi連結網絡訂閱接收MQTT伺服器的資訊
以下是使用ESP8266單片機通過WiFi連結到網絡上,通過MQTT協定接收訂閱mqtt.laobai.net的MQTT伺服器"laobai_topic001"主題發來的消息的代碼示例,包括詳盡的代碼注釋和程式設計說明:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi網絡設定
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// MQTT伺服器設定
const char* mqttServer = "mqtt.laobai.net";
const int mqttPort = 1883;
const char* mqttTopic = "laobai_topic001";
// MQTT用戶端設定
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// 連接配接WiFi網絡
void connectWiFi() {
// 連接配接WiFi網絡
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
Serial.println("IP address: " + WiFi.localIP().toString());
}
// 處理接收到的MQTT消息
void handleMQTTMessage(char* topic, byte* payload, unsigned int length) {
Serial.print("Received MQTT message. Topic: ");
Serial.print(topic);
Serial.print(", Payload: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup() {
Serial.begin(115200);
// 連接配接WiFi網絡
connectWiFi();
// 設定MQTT伺服器位址和端口
mqttClient.setServer(mqttServer, mqttPort);
// 設定MQTT回調函數,用于處理接收到的消息
mqttClient.setCallback(handleMQTTMessage);
// 連接配接到MQTT伺服器
while (!mqttClient.connected()) {
Serial.println("Connecting to MQTT server...");
if (mqttClient.connect("ESP8266Client")) {
Serial.println("Connected to MQTT server");
} else {
Serial.print("Failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
}
// 訂閱主題
mqttClient.subscribe(mqttTopic);
}
void loop() {
// 處理MQTT消息的接收
mqttClient.loop();
}
上述代碼使用了ESP8266的WiFi庫和PubSubClient庫來實作WiFi連接配接和MQTT協定通信。
首先,在connectWiFi函數中,通過調用WiFi.begin函數連接配接到WiFi網絡,并使用WiFi.localIP函數擷取ESP8266的IP位址。
然後,在setup函數中,調用Serial.begin函數初始化序列槽,并依次調用connectWiFi函數、mqttClient.setServer函數和mqttClient.setCallback函數來連接配接WiFi網絡、設定MQTT伺服器的位址和端口,并設定MQTT回調函數來處理接收到的消息。
接下來,在一個循環中,調用mqttClient.connect函數嘗試連接配接到MQTT伺服器,如果連接配接成功,則訂閱指定的MQTT主題。
最後,在loop函數中,通過調用mqttClient.loop函數來處理MQTT消息的接收。
請注意,在使用此代碼之前,需要確定已經安裝了ESP8266的開發環境,并在代碼中替換your_SSID和your_PASSWORD為正确的WiFi網絡名稱和密碼。同時,還需要在項目中添加對WiFi庫和PubSubClient庫的引用,以便使用相應的函數和資料結構。