【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 1-6 MQTT服務(wù)端連接操作

為了幫助您學(xué)習,我們專門為本教程制作了視頻。
↓

到目前為止,我們已經(jīng)學(xué)習了發(fā)布和訂閱MQTT消息的基本知識,這節(jié)課我們來將目前所學(xué)的知識應(yīng)用到實際操作中。我們將要利用ESP8266來實現(xiàn)最基本的MQTT消息發(fā)布。
本節(jié)課的學(xué)習將需要您掌握ESP8266的基本操作,假如您對ESP8266的基本操作不太了解,您可以先完成《零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng)》系列教程的第一部分“基礎(chǔ)知識篇”。

假如您已經(jīng)完成以上教程,那么接下來您就可以繼續(xù)這節(jié)課的學(xué)習了。
ESP8266的Arduino開發(fā)環(huán)境里有多個MQTT庫,我們將使用最為流行的PubSubClient庫來作為本教程的主要介紹對象,我們將通過一系列課程教您如何使用ESP8266通過PubSubClient庫來實現(xiàn)MQTT物聯(lián)網(wǎng)應(yīng)用。關(guān)于PubSubClient庫,以下是其基本信息:
作者名:Nick O’Leary
官網(wǎng)地址:https://pubsubclient.knolleary.net/
GitHub:https://github.com/knolleary/pubsubclient/
百度網(wǎng)盤下載: https://pan.baidu.com/s/12MHGbdfiOdwOGip5RMSSEQ 提取碼: sizy
當您將PubSubClient庫安裝后,我們就可以使用該庫進行開發(fā)了。
發(fā)布MQTT消息示例程序
通過以下示例程序,我們將可以讓ESP8266向公用MQTT服務(wù)器發(fā)布消息。如果您需要了解此程序的詳細說明,請點擊本文首部的視頻。
/**********************************************************************
項目名稱/Project??????????: 零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng)
程序名稱/Program name???? : publish_ranye_url
團隊/Team????????????????: 太極創(chuàng)客團隊 / Taichi-Maker (www.taichi-maker.com)
作者/Author??????????????: CYNO朔
日期/Date(YYYYMMDD)???? : 20200813
程序目的/Purpose??????????:
本程序旨在演示如何使用PubSubClient庫使用ESP8266向MQTT服務(wù)器發(fā)布信息。
-----------------------------------------------------------------------
本示例程序為太極創(chuàng)客團隊制作的《零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng)》中示例程序。
該教程為對物聯(lián)網(wǎng)開發(fā)感興趣的朋友所設(shè)計和制作。如需了解更多該教程的信息,請參考以下網(wǎng)頁:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
?
// 設(shè)置wifi接入信息(請根據(jù)您的WiFi信息進行修改)
const char* ssid = "taichi-maker";
const char* password = "12345678";
const char* mqttServer = "test.ranye-iot.net";
?
// 如以上MQTT服務(wù)器無法正常連接,請前往以下頁面尋找解決方案
// http://www.taichi-maker.com/public-mqtt-broker/
?
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
?
int count;????// Ticker計數(shù)用變量
?
void setup() {
??Serial.begin(9600);
??
??//設(shè)置ESP8266工作模式為無線終端模式
??WiFi.mode(WIFI_STA);
??
??// 連接WiFi
??connectWifi();
??
??// 設(shè)置MQTT服務(wù)器和端口號
??mqttClient.setServer(mqttServer, 1883);
?
??// 連接MQTT服務(wù)器
??connectMQTTServer();
?
??// Ticker定時對象
??ticker.attach(1, tickerCount);??
}
?
void loop() {
??if (mqttClient.connected()) { // 如果開發(fā)板成功連接服務(wù)器
????// 每隔3秒鐘發(fā)布一次信息
????if (count >= 3){
??????pubMQTTmsg();
??????count = 0;
????}????
????// 保持心跳
????mqttClient.loop();
??} else {??????????????????// 如果開發(fā)板未能成功連接服務(wù)器
????connectMQTTServer();????// 則嘗試連接服務(wù)器
??}
}
?
void tickerCount(){
??count++;
}
?
void connectMQTTServer(){
??// 根據(jù)ESP8266的MAC地址生成客戶端ID(避免與其它ESP8266的客戶端ID重名)
??String clientId = "esp8266-" + WiFi.macAddress();
?
??// 連接MQTT服務(wù)器
??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);
??}??
}
?
// 發(fā)布信息
void pubMQTTmsg(){
??static int value; // 客戶端發(fā)布信息用數(shù)字
?
??// 建立發(fā)布主題。主題名稱以Taichi-Maker-為前綴,后面添加設(shè)備的MAC地址。
??// 這么做是為確保不同用戶進行MQTT信息發(fā)布時,ESP8266客戶端名稱各不相同,
??String topicString = "Taichi-Maker-Pub-" + WiFi.macAddress();
??char publishTopic[topicString.length() + 1];??
??strcpy(publishTopic, topicString.c_str());
?
??// 建立發(fā)布信息。信息內(nèi)容以Hello World為起始,后面添加發(fā)布次數(shù)。
??String messageString = "Hello World " + String(value++);
??char publishMsg[messageString.length() + 1];??
??strcpy(publishMsg, messageString.c_str());
??
??// 實現(xiàn)ESP8266向主題發(fā)布信息
??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.");
??}
}
?
// 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("");
}

假如您也喜歡太極創(chuàng)客,希望您將本文“分享”給更多的人,讓更多朋友認識我們。您的每一份點贊與投幣,都是對我們最溫暖的鼓勵與支持。
本文編輯制作:CYNO朔 (https://space.bilibili.com/415252426/