將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

預算有限並不一定意味著您不能承擔高級 DIY 項目。如果您正在尋找一款小型、經濟實惠且方便的 WiFi 模塊來擴展您的 IoT 項目,那麼 ESP-01 模塊是一個不錯的選擇。然而,將此類模塊與 MQTT 等輕量級協議集成可能會很棘手,特別是如果您是 IoT 開發新手。

與 ESP8266 系列的其他模塊相比,單獨對 ESP-01 板進行編程可能具有挑戰性。但是,讓我們回顧一下開始使用該模塊所需的所有硬件和軟件設置的基礎知識,以及如何以簡單且程序化的方式設置 MQTT。

了解董事會

ESP8266 ESP-01 是一款小巧緊湊的 WiFi 模塊,配備 ESP8266EX 芯片,該芯片是專為物聯網應用設計的高度集成的 SoC。

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

該模塊包括一個帶有 TCP/IP 協議棧的單芯片無線微控制器,能夠連接到無線網絡或充當接入點。ESP-01 模塊還具有 2x4 引腳接頭,可提供對其 GPIO 引腳、電源和接地以及 UART 接口的訪問。

設置硬件

該模塊根本不適合麵包板。為了方便起見,您可以購買預製的擴展板,或者直接採用老式方式 - 使用跳線和麵包板。

有一個專用的編程器,ESP8266 串行模塊板,可以簡化您的編程體驗。如果您喜歡走這條路,DIYHOBI有一個關於如何使用編程器(包括 USB 到 TTL CH340G 轉換器模塊適配器)將程序燒錄到 ESP-01 模塊的便捷教程。

但是,您仍然可以使用 Arduino 闆對模塊進行編程。請看下面的電路圖以供參考。

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

雖然它看起來很誘人,但我們通常不建議將模塊直接連接到 Arduino 的 3.3v 引腳,因為它需要的電流比引腳提供的電流更多。相反,將 Arduino 5V連接到 3.3V 穩壓器(如 LM1117/LD117),然後通過穩壓器為 WiFi 模塊供電。

不要將ESP的VCCCH_PD引腳連接到Arduino的5V引腳。將模塊連接到5V電源可能會損壞模塊。

所有電容均為10uF,電阻為1K電阻。

軟件要求

ESP-01 模塊通常與 Arduino 平台配合使用。因此,設置軟件非常簡單,特別是如果您熟悉 Arduino C。但是,如果您更熟悉 Raspberry,則有很多Raspberry Pi IoT 項目可以嘗試。

這些是基本要求:

  • MQTT 代理或服務器(例如 Mosquitto 或 CloudMQTT)。
  • 帶有 ESP8266 核心庫的 Arduino IDE。
  • Arduino 的 PubSubClient 庫。

您必須記住,在本地擁有自己的 MQTT 服務器可以為您的項目提供靈活性。

安裝必要的庫

首先,在您的計算機上下載並安裝 Arduino IDE。安裝後,打開 Arduino IDE,然後轉到File > Preferences

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

其他 Boards Manager URL字段中,輸入以下 URL:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

單擊“確定”關閉“首選項”窗口。

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

接下來,轉到“工具” > “板” > “板管理器”

然後搜索esp8266並安裝 esp8266 板包——其中包括 ESP-01 模塊所需的所有庫。

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

要安裝 PubSubClient 庫,請轉到Sketch > Include Library > Manage Libraries

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

搜索PubSubClient並單擊庫進行安裝。

將 ESP-01 與 MQTT 結合使用:如何連接和控制 IoT 設備

安裝完所有必需的庫後,您就可以開始對 ESP-01 模塊進行編程。但需要注意的一件事是,您可以使用庫中包含的Wifi.h ,或者下載ESPWifi.h並將其包含在您的草圖中。

在 ESP-01 和 MQTT Broker 之間建立連接

MQTT 代理是充當 MQTT 客戶端之間中介的服務器。它允許客戶端通過發布-訂閱模型相互發送和接收消息。

要將 ESP-01 模塊連接到 MQTT 代理,您需要在代碼中指定代理的 IP 地址和端口號。您還需要向代理提供唯一的客戶端 ID,用於識別您的 ESP-01 模塊。

首先,在草圖頂部包含必要的庫

#include ESP8266WiFi.h> #include PubSubClient.h>

接下來,定義 WiFi 和 MQTT 連接詳細信息。

const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; const char* mqtt_server = "YOUR_MQTT_SERVER";

不要忘記用您自己的 WiFi 和 MQTT 連接詳細信息替換佔位符。

之後,創建一個 WiFi 客戶端並連接到您的本地 WiFi 網絡:

WiFiClient espClient; void setup_wifi() {   delay(10);   WiFi.begin(ssid, password);   while (WiFi.status() != WL_CONNECTED) {     delay(500);   } }

應在草圖的setup()函數中調用此函數。

接下來,您需要創建一個 MQTT 客戶端並連接到您的 MQTT 代理:

PubSubClient client(espClient); void reconnect() {   while (!client.connected()) {     if (client.connect("ESP01", mqtt_user, mqtt_password)) {       // Subscribe to a topic       client.subscribe("test/topic");     } else {       delay(5000);     }   } }

連接到 MQTT 代理後,您就可以開始發布和訂閱主題。

將數據從 ESP-01 發佈到 MQTT Broker

現在您已成功將 ESP01 模塊連接到 MQTT 代理,讓我們看看如何將數據從 ESP-01 發佈到代理。

要發布數據,請使用client.publish()函數將消息發佈到inTopic主題。

client.publish("inTopic", "Hello from ESP-01");

這會將消息“Hello from ESP-01”發佈到inTopic主題。

您還可以將傳感器數據從 ESP-01 發佈到代理。例如,如果您的 ESP-01 連接了溫度傳感器,您可以將溫度數據發佈到代理,如下所示。

float temperature = 25.5; String temperatureString = String(temperature); char temperatureChar[5]; temperatureString.toCharArray(temperatureChar, 5); client.publish("Temp", temperatureChar);

這會將溫度數據發佈到Temp主題。

數據可以循環發布或定期發布,具體取決於項目的要求。確保您沒有向代理髮送過多數據,並且以合理的時間間隔進行發布。

在 ESP-01 上訂閱 MQTT 主題並接收數據

要訂閱主題,請使用client.subscribe()函數。對於下面的例子,客戶端訂閱了outTopic主題。

client.subscribe("outTopic");

訂閱主題後,您可以使用下面草圖中的loop()函數中的client.loop ()函數接收發佈到該主題的消息:

void loop() {   if (!client.connected()) {     reconnect();   }   client.loop(); }

這將不斷檢查新消息並在收到新消息時執行回調函數。

要處理收到的消息,請定義一個回調函數,如下所示:

void callback(char* topic, byte* payload, unsigned int length) {   // Print the received message   Serial.print("Message received on topic: ");   Serial.print(topic);   Serial.print(". Message: ");   for (int i=0;i     Serial.print((char)payload[i]);   }   Serial.println(); }

當訂閱主題收到新消息時,將調用此函數。它將把收到的消息打印到串行監視器。

使用 QoS(服務質量)級別和安全功能

處理請求時使用的最重要的技術之一是對 MQTT 消息使用 QoS(服務質量)級別。QoS 級別定義代理和訂閱者應如何處理您的消息。QoS 分為三個級別:0、1 和 2。

QoS 級別 0 是最不可靠的,因為消息僅發送一次,並且不能保證傳遞給訂閱者。QoS 級別 1 更可靠,因為消息至少發送一次並保證至少傳遞給訂閱者一次。QoS 級別 2 是最可靠的,因為消息只發送一次,並且保證只發送給訂閱者一次。您的設備通信方式與其他常見的物聯網 (IoT) 安全問題和您希望掌握的解決方案一致。

要使用 QoS 級別,您可以在使用client.publish()函數發布消息時指定所需的級別:

client.publish("topic", "Hello, world!", 1);

這將發布消息Hello, world! 轉到QoS 級別1的主題topic 。

另一種高級技術是使用遺囑和遺囑 (LWT)消息。LWT 消息是當客戶端意外斷開連接時由代理髮送的消息。我們認為這對於檢測離線設備或在設備斷開連接時觸發操作非常重要。

要使用 LWT 消息,您可以在使用client.setWill()函數連接到代理時指定 LWT 消息:

client.setWill("status", "offline", 1, true);

這會將狀態主題上的LWT 消息設置為脫機,QoS 級別為 1,保留標誌設置為true

為您的下一個物聯網項目做好準備

ESP-01 模塊是物聯網項目的經濟實惠且緊湊的解決方案,將其與 MQTT 結合使用可以將您的項目提升到一個新的水平。儘管初始設置可能令人畏懼,但 MQTT 的優勢(例如輕量級通信和高可擴展性)使其成為一項值得的投資。