通過MQTT協議對Esp8266進行互聯網控制

通過MQTT協議對Esp8266進行互聯網控制
大家好! 本文將詳細描述並展示如何在短短 20 分鐘的空閒時間內使用 Android 應用程序使用 MQTT 協議設置 esp8266 模塊的遠程控制。

遠程控制和監控的想法一直讓熱衷於電子和編程的人們興奮不已。 畢竟,無論您身在何處,都能隨時接收或發送必要的數據,這提供了充足的機會。 在我之前的文章中 第1條 и 第2條)我嘗試考慮幾種經濟實惠且相對簡單的選項來通過互聯網實現微控制器的遠程控制。 然而,時間和整個世界並沒有停滯不前——進步繼續不可阻擋地向前發展。 在這短短的時間內,esp8266模塊獲得了廣泛的普及,由於其低廉的價格和內置的wi-fi,已經成為智能家居的主要組件之一。

目前,MQTT 是智能家居系統中各個設備之間先進且最流行的數據傳輸協議。 與其他協議相比,它有幾個優點:
——交通消耗低;
- 客戶端和服務器之間的連接始終保持打開狀態;
- 不加載互聯網頻道;
——數據傳輸不存在延遲;
— 便捷的主題訂閱系統;
這一切使得實時監測和控製成為可能。 但是,MQTT 需要自己的服務器,該服務器充當網絡客戶端之間的中介。 有兩種方法可以創建自己的服務器或使用第三方服務。

所描述的控制系統由兩個主要部分組成:MQTT服務器(通常是一個)和客戶端,客戶端可能很多。 在我們的例子中,Android 應用程序和 esp8266 模塊本身將充當客戶端。

系統運行算法如下。 客戶端連接到服務器,連接後立即訂閱自己感興趣的主題。 客戶端之間的所有通信都通過服務器進行傳輸,服務器根據其他客戶端的訂閱將數據重定向到其他客戶端。

MQTT 服務器。

就我們而言,我們將使用極其方便的服務 www.cloudmqtt.com 它有一個免費關稅計劃(可愛貓),將完全滿足實施小型內部智能家居系統的需求。
通過MQTT協議對Esp8266進行互聯網控制
讓我們在網站上註冊並獲取訪問服務器所需的數據。 配置客戶端時,必須使用常規端口(不含 SSL 和 TLS)。
通過MQTT協議對Esp8266進行互聯網控制

安卓應用程序。

我們的應用程序將充當微控制器的控制面板,還將接收並顯示從 esp8266 收到的所有信息。

該應用程序稱為 物聯網 MQTT 儀表板 並且是一個現成的 mqtt 客戶端,帶有少量非常方便的小部件。 您可以觀看視頻以了解有關如何使用該應用程序的更多詳細信息。

Esp8266。

該模塊是在Arduino編程環境中燒錄的,但是,我想注意的是,該模塊在最新版本的Arduino中固件存在問題,因此我建議使用1.6.4版本。
例如,一個LED(8266個引腳)和一個溫度傳感器ds5b18(20個引腳)連接到esp2。
由於需要接收數據來控制LED,所以連接後,esp必須訂閱相應的“test/led”主題,否則所有發送的數據都會經過我們的單片機。
您不需要訂閱即可發送溫度數據,但在發送溫度值時,您必須指定該數據將發送到的主題。

下面是帶有詳細註釋的草圖。

草圖 Esp8266_mqtt.ino// Светодиод подлкючен к 5 пину
// Датчик температуры ds18b20 к 2 пину

#包括
#包括
#包括
#包括

#定義單線匯流排 2
OneWire oneWire(ONE_WIRE_BUS);
達拉斯溫度感測器(&oneWire);

const char *ssid = "AIRPORT"; // WiFi接入點的名稱
const char *pass = "PASSWORD"; // 接入點的密碼

const char *mqtt_server = "server"; // MQTT 伺服器名稱
const int mqtt_port = 11140; // 連接 MQTT 伺服器的端口
const char *mqtt_user = "Login"; // 從伺服器登入
const char *mqtt_pass = "Pass"; //伺服器密碼

#定義BUFFER_SIZE 100

bool LedState = false;
int tm=300;
浮動溫度=0;

//從伺服器接收資料的函數

無效回調(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // 將主題名稱輸出到串列埠
串行列印(“ => ”);
Serial.print(pub.payload_string()); //將收到的資料值輸出到串列埠

字串有效載荷=pub.payload_string();

if(String(pub.topic()) == "test/led") // 檢查資料是否來自我們需要的主題
{
int stled = payload.toInt(); //將接收到的資料轉換為整數型
digitalWrite(5,stled); // 根據接收的資料值開啟或關閉 LED
}
}

WiFi用戶端 wclient;
PubSubClient 客戶端(wclient,mqtt_server,mqtt_port);

void setup(){

感應器.開始();
Serial.begin(115200);
延遲(10);
串行列印();
串行列印();
pinMode(5,輸出);
}

無效循環(){
// 連線到 Wi-Fi
如果(WiFi.status()!= WL_CONNECTED){
串行列印(“連接到”);
串行列印(ssid);
串行列印(“...”);
WiFi.開始(ssid,pass);

如果(WiFi.waitForConnectResult()!= WL_CONNECTED)
返回;
Serial.println("WiFi已連線");
}

// 連接到 MQTT 伺服器
如果(WiFi.status()==WL_CONNECTED){
如果(!客戶端.connected()){
Serial.println("正在連線到 MQTT 伺服器");
如果(客戶端.連線(MQTT :: Connect(“ arduinoClient2”)
.set_auth(mqtt_user,mqtt_pass))){
Serial.println("已連接到 MQTT 伺服器");
客戶端.set_callback(回調);
client.subscribe("test/led"); // 訂閱 LED 資料主題
} {
Serial.println("無法連線到 MQTT 伺服器");
}
}

如果(客戶端.connected()){
客戶端.循環();
臨時發送();
}

}
} // 主循環結束

// 用於發送溫度感測器讀數的函數
無效TempSend(){
如果(tm == 0)
{
sensor.requestTemperatures(); // 我們從感測器取得溫度值
浮動溫度=感測器.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // 將溫度值傳送到溫度感測器的主題
串行列印(溫度);
tm = 300; //發送溫度值之間暫停約3秒
}
tm--;
延遲(10);
}

這樣,我們就得到了一個方便的遠程控制和數據監控工具,而且非常容易學習,即使是初學者也能做到。

演示控制系統操作的視頻

播放視頻

設置系統的詳細視頻說明

播放視頻

通過 MQTT 協議使用 esp8266 控制的選項之一

播放視頻

LED燈帶互聯網控制

播放視頻

如果您對此材料有任何疑問,那麼我建議觀看視頻的第二部分,其中材料的呈現更加清晰。

該存檔包含草圖以及使用示例中的草圖刷新微控制器所需的所有庫。
請注意,ESP8266WiFi.h 庫不包含在此存檔中,它是通過 Arduino 環境中的板管理器安裝的。

檔案

MQTT 服務器 - www.cloudmqtt.com

鏈接到 IoT MQTT 儀表板應用程序 - play.google.com/store/apps/details?id=com.thn.iotmqttdashboard&hl=ru

感謝大家的關注。

來源: www.habr.com

添加評論