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

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

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

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

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

虛擬商品不可退

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

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

一、前言

今天給大家?guī)淼氖荅SP32系列聯(lián)網(wǎng)教程,因?yàn)槭鞘褂?a class="article-link" target="_blank" href="/tag/arduino/">Arduino開發(fā),Arduino有很多庫函數(shù)可以讓我們直接使用,可謂是站在巨人的肩膀上乘涼。當(dāng)然網(wǎng)上教程一抹多,我也只是其中之一,只是給大家提供一寫思路和我實(shí)踐出來的方法,給大家避避雷。

二、云平臺

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

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

1. 添加產(chǎn)品

首先登陸賬號然后點(diǎn)擊控制臺

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

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

????

點(diǎn)擊 公共實(shí)例 進(jìn)去(顯示沒有開通就自行開通一下就行了)

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

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

?2. 添加設(shè)備

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

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

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

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

三、Arduino

咱們就是默認(rèn)都安裝好了Arduino,當(dāng)然我這里也給出一個(gè)安裝教程,畢竟做就要做全套嘛~~

1.安裝教程

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

?2.代碼編寫

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

PubSubClient 庫

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

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

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

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

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

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

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

Ticker 庫

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

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

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

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

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

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

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

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

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

完整代碼

?需要修改得到部分

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


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

// 設(shè)置wifi接入信息(請根據(jù)您的WiFi信息進(jìn)行修改)
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計(jì)數(shù)用變量

// ****************************************************
// 注意!以下需要用戶根據(jù)然也物聯(lián)平臺信息進(jì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;             // 客戶端訂閱主題時(shí)使用的QoS級別(截止2020-10-07,僅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false;  // 清除會話(如QoS>0必須要設(shè)為false)

bool ledStatus = HIGH;

void setup() {

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

  //設(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();
}
// 計(jì)時(shí)器
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è)備在離線時(shí)仍然能夠讓qos1工作,則connect時(shí)的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ù)第二個(gè)參數(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"}";

  // 實(shí)現(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è)備在線了

實(shí)物效果

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

四、參考與學(xué)習(xí)

【ESP32最全學(xué)習(xí)筆記(基礎(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/


當(dāng)然,需要完整項(xiàng)目可以質(zhì)詢博主


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

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

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
ATXMEGA384C3-AU 1 Microchip Technology Inc IC MCU 8BIT 384KB FLASH 64TQFP

ECAD模型

下載ECAD模型
$9.28 查看
STM32F030C8T6 1 STMicroelectronics Mainstream Arm Cortex-M0 Value line MCU with 64 Kbytes of Flash memory, 48 MHz CPU

ECAD模型

下載ECAD模型
$3.22 查看
DS3234SN#T&R 1 Maxim Integrated Products Real Time Clock, Non-Volatile, 1 Timer(s), CMOS, PDSO20, 0.300 INCH, ROHS COMPLIANT, SOP-20
$8.47 查看

相關(guān)推薦

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

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