1. 程式人生 > 其它 >ESP8266連線MQTT伺服器並實現點燈操作

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燈受到控制,證明實驗板成功連上伺服器,實驗成功!