ESP8266連接MQTT服務器並實現點燈操作


因為工創Ⅲ的緣故不得不重新學習原來大一所學的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燈受到控制,證明實驗板成功連上服務器,實驗成功!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM