ESP8266連線MQTT伺服器並實現點燈操作
阿新 • • 發佈:2022-02-22
因為工創Ⅲ的緣故不得不重新學習原來大一所學的ESP8266和MQTT伺服器相關的知識,但是本人記性實在是非常的差,為了重新學習又在網上搜集了很久的知識,這裡為了防止以後出現類似的情況,這裡就寫一篇部落格記錄一下。
前置準備
我們首先需要在windows自帶的商店中裝上ubuntu虛擬機器(用於配置伺服器)和MQTTBox軟體(用於測試伺服器)。Ubuntu有很多種型別,具體選擇的型號選擇下圖所示的這一種:
Ubuntu下載好了之後,進去進行基礎配置。(密碼因為奇怪的原因輸入的時候不會顯示,大家記住自己的密碼輸的是什麼就好!)
然後下面進行的就是在Ubuntu上安裝其配置EMQX伺服器的操作,具體操作可以去看:
配置好了以後,一般只需要記住以下三條常用指令:
啟動emqx伺服器
sudo emqx start
關閉emqx伺服器
sudo emqx stop
在瀏覽器輸入localhost:18083即可訪問伺服器的Dashboard,密碼為預設密碼。
測試
開啟emqx伺服器後測試需要使用mqttbox,開啟mqttbox,點選上方Create MQTT Client
protocol選擇mqtt/tcp,Host填入伺服器所在Ipv4地址,可以使用cmd輸入ipconfig獲得。第一個ClientName隨便填一個即可。
然後點選save。
如圖,如果上述按鈕變為綠色顯示connected,說明連線伺服器成功,測試成功!
ESP8266連線並控制其上的LED燈
控制程式碼如下(有詳細註釋):
#include <ESP8266WiFi.h> #include <PubSubClient.h> // 設定wifi接入資訊(請根據您的WiFi資訊進行修改) const char* ssid = "************";//WiFi名稱 const char* password = "*********";//WiFi密碼 const char* mqttServer = "***********";//伺服器地址 // 如以上MQTT伺服器無法正常連線,請前往以下頁面尋找解決方案 // http://www.taichi-maker.com/public-mqtt-broker/ WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); const byte ledPin = LED_BUILTIN; // 需要控制的led燈 void setup() { Serial.begin(9600); //設定ESP8266工作模式為無線終端模式 WiFi.mode(WIFI_STA); // 連線WiFi connectWifi(); // 設定MQTT伺服器和埠號 mqttClient.setServer(mqttServer, 1883); // 連線MQTT伺服器 connectMQTTServer(); mqttClient.setCallback(callback); // 設定回撥,控制led燈 pinMode(ledPin,OUTPUT); } void loop() { if (mqttClient.connected()) { // 如果開發板成功連線伺服器 mqttClient.loop(); // 保持客戶端心跳 } else { // 如果開發板未能成功連線伺服器 connectMQTTServer(); // 則嘗試連線伺服器 } } void connectMQTTServer(){ // 根據ESP8266的MAC地址生成客戶端ID(避免與其它ESP8266的客戶端ID重名) String clientId = "esp8266-" + WiFi.macAddress(); // 連線MQTT伺服器 if (mqttClient.connect(clientId.c_str())) { //設定mqtt主題的id //連線成功後就訂閱主題 mqttClient.subscribe("hopeful");//訂閱主題 Serial.print("訂閱主題成功!!"); } else { Serial.println(mqttClient.state()); delay(3000); } } // ESP8266連線wifi void connectWifi(){ WiFi.begin(ssid, password); //等待WiFi連線,成功連線後輸出成功資訊 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); } //回撥函式 void callback(char* topic, byte* payload, unsigned int length) { // Serial.print("Message arrived ["); // Serial.print(topic); // Serial.print("] "); for (int i=0;i<length;i++) { char receivedChar = (char)payload[i]; if (payload[length-1] == '1') { // 收到訊息是 '1' 點亮LED燈 digitalWrite(ledPin,HIGH); Serial.print(receivedChar); // 列印mqtt接收到訊息 } if (payload[length-1] == '0') // 收到訊息是 '0' 關閉LED燈 digitalWrite(ledPin, LOW); } Serial.println(); }
在上述基礎上,我們通過MQTTBOX訂閱hopeful主題,並且在主題中輸入1或者0,可以發現ESP8266開發板上的LED燈受到控制,證明實驗板成功連上伺服器,實驗成功!