加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

ESP32-使用MQTT协议连接云平台(带图文说明)

03/20 14:34
3053
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
    • 一、前言
    • 二、云平台
    • 三、Arduino
    • 四、参考与学习
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

一、前言

今天给大家带来的是ESP32系列联网教程,因为是使用Arduino开发,Arduino有很多库函数可以让我们直接使用,可谓是站在巨人的肩膀上乘凉。当然网上教程一抹多,我也只是其中之一,只是给大家提供一写思路和我实践出来的方法,给大家避避雷。

二、云平台

平台选择的话有很多哟,腾讯,阿里云,移动云甚至EMQX自己去搭建一个,这里我就选择一个我常用的平台,阿里云作为这场教程的使用。

阿里云官网icon-default.png?t=N7T8https://www.aliyun.com/

1. 添加产品

首先登陆账号然后点击控制台

 点击左上角目录然后下滑找到 物联网平台

关注微信公众号--星之援工作室 发送关键字(ESP32)可以获取一些基本资料

➡️➡️

点击 公共实例 进去(显示没有开通就自行开通一下就行了)

 点击 产品 选项再点击 创建产品

添加自己的 产品名称 再点击 自定义品类 最后点击 确认 产品就建立好了

 2. 添加设备

添加好产品后,我们需要给产品添加对应的设备,用来识别我们的硬件和使用我们的mqtt协议,点击 前往管理

再管理界面,我们点击 添加设备 会弹出一个框,我们需要按要求添加名字和备注就行(这个是自定义的)

 我们点击 查看设备信息

我框中的就是我们需要使用的连接平台的数据,可以先保存下来

三、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.代码编写

所谓前人栽树后人乘凉,现在就会体现的淋漓尽致,首先我们需要加载两个库

PubSubClient 库

PubSubClient.h库是Arduino中用于实现物联网(IoT)功能的一个库,它支持 publish 和 subscribe 操作,使得Arduino开发板能够与各种物联网平台(如MQTT、CoAP等)进行通信。这个库的主要功能是将Arduino与云平台连接,实现远程控制、数据传输和自动化处理等。 PubSubClient.h库的主要特点如下:

1. 易于使用:库提供了简洁的API,便于开发者进行 Publish/Subscribe 操作。

2. 支持多种协议:支持MQTT、CoAP等物联网协议,可根据项目需求选择合适的协议。

3. 可靠性:库中包含错误处理和重传机制,确保数据在传输过程中的可靠性。

4. 自动重连:库具有自动重连功能,当网络连接断开时,会自动尝试重新连接,确保设备始终在线。

5. 跨平台兼容性:PubSubClient.h库适用于各种Arduino开发板,如Arduino Uno、Mega、Nano等。

6. 丰富的示例:库提供了丰富的示例代码,包括接入MQTT服务器、CoAP服务器等,帮助开发者快速上手并实现实际应用。

Ticker 库

Arduino的Ticker库是一个用于在预定时间间隔内调用回调函数的库。它使得Arduino开发板能够以固定周期执行某些操作,适用于需要定期执行的任务。Ticker库不使用硬件计时器中断,而是使用Arduino的micros()和millis()函数来实现定时功能。 Ticker库的主要功能和用法如下:

1. 创建Ticker对象:通过构造函数创建一个Ticker对象,传入回调函数、时间间隔、重复次数和分辨率等参数。

2. 启动和暂停Ticker:使用start()和pause()方法控制Ticker的运行状态。 3. 停止Ticker:使用stop()方法随时停止Ticker。

4. 更新Ticker:在main loop()中调用update()方法,以检查Ticker的状态并执行回调函数。

5. 设置和获取Ticker的时间间隔:使用interval()方法设置或获取时间间隔。

6. 获取Ticker的执行次数:使用counter()方法获取已执行的回调次数。

7. 获取Ticker的状态:使用state()方法获取Ticker的状态(STOPPED、RUNNING或PAUSED)。

8. 获取上次 tick 的时间:使用elapsed()方法获取上次tick的时间。

9. 获取下次tick的时间:使用remaining()方法获取下次tick的时间。

完整代码

 需要修改得到部分

想要连接上阿里云,还需要修改 PubSubClient.h 里面的配置参数,这个文件再我们安装的lib目录里面可以找到


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

// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "NET";
const char* password = "12345678";
const char* mqttServer = "iot-06z00axdhgfk24n.mqtt.iothub.aliyuncs.com";
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
Ticker ticker;
int count;  // Ticker计数用变量

// ****************************************************
// 注意!以下需要用户根据然也物联平台信息进行修改!否则无法工作!
// ****************************************************
const char* mqttUserName = "ESP_Pet_device&h9sj0dFIZzO";                                                          // 服务端连接用户名(需要修改)
const char* mqttPassword = "9f86686e86c69f72d27515d6adb63c0223151e627bfa19284959647283210709";                    // 服务端连接密码(需要修改)
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";                                                           // 遗嘱主题名称(需要修改)
// ****************************************************

//遗嘱相关信息
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必须要设为false)

bool ledStatus = HIGH;

void setup() {

  Serial.begin(9600);             // 启动串口通讯
  ticker.attach(1, tickerCount);  // Ticker定时对象

  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);

  // 连接WiFi
  connectWifi();

  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
  mqttClient.setCallback(receiveCallback);

  // 连接MQTT服务器
  connectMQTTserver();
}

void loop() {
  // 如果开发板未能成功连接服务器,则尝试连接服务器
  if (!mqttClient.connected()) {
    connectMQTTserver();
  }
  if (count == 3) {
    pubMQTTmsg();  // 每隔3秒钟发布一次信息
    count = 0;
  }
  // 处理信息以及心跳
  mqttClient.loop();
}
// 计时器
void tickerCount() {
  count++;
}
// 连接MQTT服务器并订阅信息
void connectMQTTserver() {
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)


  /* 连接MQTT服务器
  boolean connect(const char* id, const char* user, 
                  const char* pass, const char* willTopic, 
                  uint8_t willQos, boolean willRetain, 
                  const char* willMessage, boolean cleanSession); 
  若让设备在离线时仍然能够让qos1工作,则connect时的cleanSession需要设置为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);
  }
}

// 收到信息后的回调函数
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() {


  // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  // 请注意subscribe函数第二个参数数字为QoS级别。这里为QoS = 1
  if (mqttClient.subscribe(subTopic, subQoS)) {
    Serial.print("Subscribed Topic: ");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }

}

// 发布信息
void pubMQTTmsg() {
  char* pubMessage;

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

  // 实现ESP8266向主题发布信息
  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("");
}

上传程序

查看平台

 只要修改成自己的设备信息,就可以看到设备在线了

实物效果

时间冲忙,简单的用面包板做了一个项目(PS:上面的代码只是实现了联网部分,没有oled,舵机,dht11的控制代码,等我空了会一一讲解一下)

四、参考与学习

【ESP32最全学习笔记(基础篇)——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

太极创客icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/esp8266-iot-basics/


当然,需要完整项目可以质询博主


联系方式 微信号:13648103287

  • 联系方式.docx

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ATXMEGA128A4U-AUR 1 Microchip Technology Inc IC MCU 8BIT 128KB FLASH 44TQFP
$5.49 查看
STM8S003F3P6 1 STMicroelectronics Mainstream Value line 8-bit MCU with 8 Kbytes Flash, 16 MHz CPU, integrated EEPROM

ECAD模型

下载ECAD模型
$1.53 查看
DS3231SN# 1 Maxim Integrated Products Real Time Clock, Non-Volatile, 1 Timer(s), CMOS, PDSO16, 0.300 INCH, SOIC-16
$11.21 查看

相关推荐

电子产业图谱

方案定制,程序设计方案、单片机程序设计与讲解、APP定制开发。本公众号致力于向读者传递关于程序设计和开发的相关知识,并分享一些关于软件开发的最佳实践。如果您有什么问题或建议,请随时联系我们。我们将竭诚为您服务