加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

ESP32-使用MQTT協(xié)議連接云平臺(帶圖文說明)

03/20 14:34
1.2萬
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關(guān)方案
  • 方案介紹
    • 一、前言
    • 二、云平臺
    • 三、Arduino
    • 四、參考與學習
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

一、前言

今天給大家?guī)淼氖荅SP32系列聯(lián)網(wǎng)教程,因為是使用Arduino開發(fā),Arduino有很多庫函數(shù)可以讓我們直接使用,可謂是站在巨人的肩膀上乘涼。當然網(wǎng)上教程一抹多,我也只是其中之一,只是給大家提供一寫思路和我實踐出來的方法,給大家避避雷。

二、云平臺

平臺選擇的話有很多喲,騰訊,阿里云,移動云甚至EMQX自己去搭建一個,這里我就選擇一個我常用的平臺,阿里云作為這場教程的使用。

阿里云官網(wǎng)icon-default.png?t=N7T8https://www.aliyun.com/

1. 添加產(chǎn)品

首先登陸賬號然后點擊控制臺

?點擊左上角目錄然后下滑找到 物聯(lián)網(wǎng)平臺

關(guān)注微信公眾號--星之援工作室 發(fā)送關(guān)鍵字(ESP32)可以獲取一些基本資料

????

點擊 公共實例 進去(顯示沒有開通就自行開通一下就行了)

?點擊 產(chǎn)品 選項再點擊 創(chuàng)建產(chǎn)品

添加自己的 產(chǎn)品名稱 再點擊 自定義品類 最后點擊 確認 產(chǎn)品就建立好了

?2. 添加設(shè)備

添加好產(chǎn)品后,我們需要給產(chǎn)品添加對應(yīng)的設(shè)備,用來識別我們的硬件和使用我們的mqtt協(xié)議,點擊 前往管理

再管理界面,我們點擊 添加設(shè)備 會彈出一個框,我們需要按要求添加名字和備注就行(這個是自定義的)

?我們點擊 查看設(shè)備信息

我框中的就是我們需要使用的連接平臺的數(shù)據(jù),可以先保存下來

三、Arduino

咱們就是默認都安裝好了Arduino,當然我這里也給出一個安裝教程,畢竟做就要做全套嘛~~

1.安裝教程

Arduino IDE 使用安裝以及ESP32庫的導入(離線)icon-default.png?t=N7T8https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501

?2.代碼編寫

所謂前人栽樹后人乘涼,現(xiàn)在就會體現(xiàn)的淋漓盡致,首先我們需要加載兩個庫

PubSubClient 庫

PubSubClient.h庫是Arduino中用于實現(xiàn)物聯(lián)網(wǎng)(IoT)功能的一個庫,它支持 publish 和 subscribe 操作,使得Arduino開發(fā)板能夠與各種物聯(lián)網(wǎng)平臺(如MQTT、CoAP等)進行通信。這個庫的主要功能是將Arduino與云平臺連接,實現(xiàn)遠程控制、數(shù)據(jù)傳輸和自動化處理等。 PubSubClient.h庫的主要特點如下:

1. 易于使用:庫提供了簡潔的API,便于開發(fā)者進行 Publish/Subscribe 操作。

2. 支持多種協(xié)議:支持MQTT、CoAP等物聯(lián)網(wǎng)協(xié)議,可根據(jù)項目需求選擇合適的協(xié)議。

3. 可靠性:庫中包含錯誤處理和重傳機制,確保數(shù)據(jù)在傳輸過程中的可靠性。

4. 自動重連:庫具有自動重連功能,當網(wǎng)絡(luò)連接斷開時,會自動嘗試重新連接,確保設(shè)備始終在線。

5. 跨平臺兼容性:PubSubClient.h庫適用于各種Arduino開發(fā)板,如Arduino Uno、Mega、Nano等。

6. 豐富的示例:庫提供了豐富的示例代碼,包括接入MQTT服務(wù)器、CoAP服務(wù)器等,幫助開發(fā)者快速上手并實現(xiàn)實際應(yīng)用。

Ticker 庫

Arduino的Ticker庫是一個用于在預定時間間隔內(nèi)調(diào)用回調(diào)函數(shù)的庫。它使得Arduino開發(fā)板能夠以固定周期執(zhí)行某些操作,適用于需要定期執(zhí)行的任務(wù)。Ticker庫不使用硬件計時器中斷,而是使用Arduino的micros()和millis()函數(shù)來實現(xiàn)定時功能。 Ticker庫的主要功能和用法如下:

1. 創(chuàng)建Ticker對象:通過構(gòu)造函數(shù)創(chuàng)建一個Ticker對象,傳入回調(diào)函數(shù)、時間間隔、重復次數(shù)和分辨率等參數(shù)。

2. 啟動和暫停Ticker:使用start()和pause()方法控制Ticker的運行狀態(tài)。 3. 停止Ticker:使用stop()方法隨時停止Ticker。

4. 更新Ticker:在main loop()中調(diào)用update()方法,以檢查Ticker的狀態(tài)并執(zhí)行回調(diào)函數(shù)。

5. 設(shè)置和獲取Ticker的時間間隔:使用interval()方法設(shè)置或獲取時間間隔。

6. 獲取Ticker的執(zhí)行次數(shù):使用counter()方法獲取已執(zhí)行的回調(diào)次數(shù)。

7. 獲取Ticker的狀態(tài):使用state()方法獲取Ticker的狀態(tài)(STOPPED、RUNNING或PAUSED)。

8. 獲取上次 tick 的時間:使用elapsed()方法獲取上次tick的時間。

9. 獲取下次tick的時間:使用remaining()方法獲取下次tick的時間。

完整代碼

?需要修改得到部分

想要連接上阿里云,還需要修改 PubSubClient.h 里面的配置參數(shù),這個文件再我們安裝的lib目錄里面可以找到


#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>

// 設(shè)置wifi接入信息(請根據(jù)您的WiFi信息進行修改)
const char* ssid = "NET";
const char* password = "12345678";
const char* mqttServer = "iot-06z00axdhgfk24n.mqtt.iothub.aliyuncs.com";
// 如以上MQTT服務(wù)器無法正常連接,請前往以下頁面尋找解決方案
// http://www.taichi-maker.com/public-mqtt-broker/

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Ticker ticker;
int count;  // Ticker計數(shù)用變量

// ****************************************************
// 注意!以下需要用戶根據(jù)然也物聯(lián)平臺信息進行修改!否則無法工作!
// ****************************************************
const char* mqttUserName = "ESP_Pet_device&h9sj0dFIZzO";                                                          // 服務(wù)端連接用戶名(需要修改)
const char* mqttPassword = "9f86686e86c69f72d27515d6adb63c0223151e627bfa19284959647283210709";                    // 服務(wù)端連接密碼(需要修改)
const char* clientId = "h9sj0dFIZzO.ESP_Pet_device|securemode=2,signmethod=hmacsha256,timestamp=1703866991146|";  // 客戶端id (需要修改)
const char* subTopic = "/broadcast/h9sj0dFIZzO/test1";                                                            // 訂閱主題(需要修改)
const char* pubTopic = "/broadcast/h9sj0dFIZzO/test2";                                                            // 訂閱主題(需要修改)
const char* willTopic = "/broadcast/h9sj0dFIZzO/test1";                                                           // 遺囑主題名稱(需要修改)
// ****************************************************

//遺囑相關(guān)信息
const char* willMsg = "esp8266 offline";  // 遺囑主題信息
const int willQos = 0;                    // 遺囑QoS
const int willRetain = false;             // 遺囑保留

const int subQoS = 1;             // 客戶端訂閱主題時使用的QoS級別(截止2020-10-07,僅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false;  // 清除會話(如QoS>0必須要設(shè)為false)

bool ledStatus = HIGH;

void setup() {

  Serial.begin(9600);             // 啟動串口通訊
  ticker.attach(1, tickerCount);  // Ticker定時對象

  //設(shè)置ESP8266工作模式為無線終端模式
  WiFi.mode(WIFI_STA);

  // 連接WiFi
  connectWifi();

  // 設(shè)置MQTT服務(wù)器和端口號
  mqttClient.setServer(mqttServer, 1883);
  mqttClient.setCallback(receiveCallback);

  // 連接MQTT服務(wù)器
  connectMQTTserver();
}

void loop() {
  // 如果開發(fā)板未能成功連接服務(wù)器,則嘗試連接服務(wù)器
  if (!mqttClient.connected()) {
    connectMQTTserver();
  }
  if (count == 3) {
    pubMQTTmsg();  // 每隔3秒鐘發(fā)布一次信息
    count = 0;
  }
  // 處理信息以及心跳
  mqttClient.loop();
}
// 計時器
void tickerCount() {
  count++;
}
// 連接MQTT服務(wù)器并訂閱信息
void connectMQTTserver() {
  // 根據(jù)ESP8266的MAC地址生成客戶端ID(避免與其它ESP8266的客戶端ID重名)


  /* 連接MQTT服務(wù)器
  boolean connect(const char* id, const char* user, 
                  const char* pass, const char* willTopic, 
                  uint8_t willQos, boolean willRetain, 
                  const char* willMessage, boolean cleanSession); 
  若讓設(shè)備在離線時仍然能夠讓qos1工作,則connect時的cleanSession需要設(shè)置為false                
                  */
  if (mqttClient.connect(clientId, mqttUserName,
                         mqttPassword, willTopic,
                         willQos, willRetain, willMsg, cleanSession)) {
    Serial.print("MQTT Server Connected. ClientId: ");
    Serial.println(clientId);
    Serial.print("MQTT Server: ");
    Serial.println(mqttServer);

    subscribeTopic();  // 訂閱指定主題
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(5000);
  }
}

// 收到信息后的回調(diào)函數(shù)
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message Received [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println("");
  Serial.print("Message Length(Bytes) ");
  Serial.println(length);

  if ((char)payload[0] == '1') {  // 如果收到的信息以“1”為開始
    ledStatus = LOW;

  } else {
    ledStatus = HIGH;
  }

  pubMQTTmsg();
}

// 訂閱指定主題
void subscribeTopic() {


  // 通過串口監(jiān)視器輸出是否成功訂閱主題以及訂閱的主題名稱
  // 請注意subscribe函數(shù)第二個參數(shù)數(shù)字為QoS級別。這里為QoS = 1
  if (mqttClient.subscribe(subTopic, subQoS)) {
    Serial.print("Subscribed Topic: ");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }

}

// 發(fā)布信息
void pubMQTTmsg() {
  char* pubMessage;

  pubMessage = "{"heart":"1"}";

  // 實現(xiàn)ESP8266向主題發(fā)布信息
  if (mqttClient.publish(pubTopic, pubMessage)) {
    Serial.println("Publish Topic:");
    Serial.println(pubTopic);
    Serial.println(pubMessage);
  } 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("");
}

上傳程序

查看平臺

?只要修改成自己的設(shè)備信息,就可以看到設(shè)備在線了

實物效果

時間沖忙,簡單的用面包板做了一個項目(PS:上面的代碼只是實現(xiàn)了聯(lián)網(wǎng)部分,沒有oled,舵機,dht11的控制代碼,等我空了會一一講解一下)

四、參考與學習

【ESP32最全學習筆記(基礎(chǔ)篇)——1.ESP32簡介】icon-default.png?t=N7T8https://blog.csdn.net/m0_46509684/article/details/129079088?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170401469316800186571625%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170401469316800186571625&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-129079088-null-null.142%5Ev99%5Epc_search_result_base7&utm_term=%20ESP32%20&spm=1018.2226.3001.4187

太極創(chuàng)客icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/esp8266-iot-basics/


當然,需要完整項目可以質(zhì)詢博主


聯(lián)系方式 微信號:13648103287

  • 聯(lián)系方式.docx

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
FT232RL-TUBE 1 FTDI Chip USB Bus Controller, CMOS, PDSO28, 10.20 X 5.30 MM, GREEN, SSOP-28

ECAD模型

下載ECAD模型
$4.7 查看
MC9S08PA16AVTJR 1 NXP Semiconductors Microcontroller

ECAD模型

下載ECAD模型
$2.42 查看
DSPIC33EP512MU810-I/PT 1 Microchip Technology Inc 16-BIT, FLASH, 60 MHz, MICROCONTROLLER, PQFP100, 12 X 12 MM, 1 MM HEIGHT, LEAD FREE, PLASTIC, TQFP-100
$10.04 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

方案定制,程序設(shè)計方案、單片機程序設(shè)計與講解、APP定制開發(fā)。本公眾號致力于向讀者傳遞關(guān)于程序設(shè)計和開發(fā)的相關(guān)知識,并分享一些關(guān)于軟件開發(fā)的最佳實踐。如果您有什么問題或建議,請隨時聯(lián)系我們。我們將竭誠為您服務(wù)