到目前為止,我們已經學習了發布和訂閱MQTT消息的基本知識,這節課我們來將目前所學的知識應用到實際操作中。我們將要利用ESP8266來實現最基本的MQTT消息發布。
本節課的學習將需要您掌握ESP8266的基本操作,假如您對ESP8266的基本操作不太了解,您可以先通過以下小程序觀看我們製作的《零基礎入門學用物聯網 - 基礎知識篇》。
假如您已經完成以上教程,那麼接下來您就可以繼續這節課的學習了。
ESP8266的Arduino開發環境裡有多個MQTT庫,我們將使用最為流行的PubSubClient庫來作為本教程的主要介紹對象,我們將通過一系列課程教您如何使用ESP8266通過PubSubClient庫來實現MQTT物聯網應用。
關於PubSubClient庫,您可以通過以下連結獲取。
官網地址:https://pubsubclient.knolleary.net/
GitHub:https://github.com/knolleary/pubsubclient/
另外,在之前的課程裡我們學習了如何使用ESP8266連接MQTT服務端。您可以通過以下連接前往該教程文章。
【零基礎學物聯網】MQTT篇 1-4 服務端連接操作
發布MQTT消息示例程序通過以下示例程序,我們將可以讓ESP8266向公用MQTT伺服器發布消息。
您可以點擊本文開始的B站視頻小程序,即可觀看本程序的詳細講解視頻教程。
#include <ESP8266WiFi.h>#include <PubSubClient.h>#include <Ticker.h> const char* ssid = "taichi-maker";const char* password = "12345678";const char* mqttServer = "test.ranye-iot.net"; Ticker ticker;WiFiClient wifiClient;PubSubClient mqttClient(wifiClient); int count; void setup() { Serial.begin(9600); WiFi.mode(WIFI_STA); connectWifi(); mqttClient.setServer(mqttServer, 1883); connectMQTTServer(); ticker.attach(1, tickerCount); } void loop() { if (mqttClient.connected()) { if (count >= 3){ pubMQTTmsg(); count = 0; } mqttClient.loop(); } else { connectMQTTServer(); }} void tickerCount(){ count++;} void connectMQTTServer(){ String clientId = "esp8266-" + WiFi.macAddress(); if (mqttClient.connect(clientId.c_str())) { Serial.println("MQTT Server Connected."); Serial.println("Server Address: "); Serial.println(mqttServer); Serial.println("ClientId:"); Serial.println(clientId); } else { Serial.print("MQTT Server Connect Failed. Client State:"); Serial.println(mqttClient.state()); delay(3000); } } void pubMQTTmsg(){ static int value; String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress(); char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str()); String messageString = "Hello World " + String(value++); char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str()); if(mqttClient.publish(publishTopic, publishMsg)){ Serial.println("Publish Topic:");Serial.println(publishTopic); Serial.println("Publish message:");Serial.println(publishMsg); } else { Serial.println("Message Publish Failed."); }} void connectWifi(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected!"); Serial.println(""); }假如您也喜歡太極創客,希望您將本文「分享」或「在看」。 讓更多朋友認識我們。您的每一份支持與鼓勵,都是對我們最溫暖的鼓勵與支持。
謝謝~~~