天天看點

MQTT協定在物聯網環境中的應用及代碼實作解析(五)

作者:北京老白
MQTT協定在物聯網環境中的應用及代碼實作解析(五)

五、通過使用ESP8266單片機程式設計利用Wifi聯網向MQTT伺服器特定主題發送消息

以下是使用ESP8266單片機通過WiFi連結到網絡上,通過MQTT協定與mqtt.laobai.net的MQTT伺服器的"laobai_topic001"主題發送一串文本為"TEST001"的消息的代碼示例,包括詳盡的代碼注釋和程式設計說明:

#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 connectMQTT() {
  // 設定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");
      mqttClient.subscribe(mqttTopic);  // 訂閱主題
    } else {
      Serial.print("Failed with state ");
      Serial.print(mqttClient.state());
      delay(2000);
    }
  }
}

// 處理接收到的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伺服器
  connectMQTT();
  
  // 釋出消息
  mqttClient.publish(mqttTopic, "TEST001");
}

void loop() {
  // 處理MQTT消息的接收
  mqttClient.loop();
}
           
MQTT協定在物聯網環境中的應用及代碼實作解析(五)

上述代碼使用了ESP8266的WiFi庫和PubSubClient庫來實作WiFi連接配接和MQTT協定通信。

首先,在connectWiFi函數中,通過調用WiFi.begin函數連接配接到WiFi網絡,并使用WiFi.localIP函數擷取ESP8266的IP位址。

然後,在connectMQTT函數中,設定MQTT伺服器的位址和端口,并通過調用mqttClient.setCallback函數設定MQTT回調函數來處理接收到的消息。

接下來,在setup函數中,首先調用Serial.begin函數初始化序列槽,并依次調用connectWiFi函數和connectMQTT函數來連接配接WiFi網絡和MQTT伺服器。

然後,使用mqttClient.publish函數釋出消息到指定的MQTT主題。

最後,在loop函數中,通過調用mqttClient.loop函數來處理MQTT消息的接收。

請注意,在使用此代碼之前,需要確定已經安裝了ESP8266的開發環境,并在代碼中替換your_SSID和your_PASSWORD為正确的WiFi網絡名稱和密碼。同時,還需要在項目中添加對WiFi庫和PubSubClient庫的引用,以便使用相應的函數和資料結構。

繼續閱讀