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