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

目录

一、前言

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

 2025-2.1号 关于阿里云服务器

注:如果不想自己搭建EMQX服务器

关于如何自主搭建 EMQX

1.建立Linux虚拟机

2.虚拟机里面下载 EMXQ

3.登录EMQX服务器 

4.设置中文界面

5.查看端口

6.设备连接

MQTTX部分

连接mqtt

订阅主题

设备一

设备二

发布主题

二、云平台

1. 添加产品

2. 添加设备

三、Arduino

1.安装教程

2.代码编写

PubSubClient 库

Ticker 库

芯片选择:ESP32 Dev Module

ESP32-完整代码

芯片选择:ESPino(ESP-12)Module

ESP12-完整代码

上传程序

查看平台

实物效果

四、参考与学习


一、前言

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

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

➡️🫡🫡🫡🫡🫡🫡🫡🫡➡️

 2025-2.1号 关于阿里云服务器


如何搭建使用EMQX(MQTT服务)


 

阿里云现在也扛不住了,现在不能提供免费的物联网服务器了,不过之前建立了服务器的账号是可以正常使用的

兄弟们,大家可以看一下 EMQX 或者 华为云
关于 EMQX 我后面会出一个新的使用方法和一个例程


EMQX:用于物联网、车联网和工业物联网的企业级 MQTT 平台采用排名第一的企业级 MQTT 平台 —— EMQX 获取快速、可靠和安全的 MQTT 消息传递服务,释放物联网、工业物联网和车联网的全部潜力。https://www.emqx.com/zh

共建智能世界云底座-华为云华为云提供稳定可靠、安全可信、可持续发展的云服务,致力于让云无处不在,让智能无所不及,共建智能世界云底座。助力企业降本增效,全球300万客户的共同选择。7x24小时专业服务支持,5天内无理由退订,免费快速备案。https://www.huaweicloud.com/

注:如果不想自己搭建EMQX服务器

我们可以直接将ip地址改成EMQX官网提供的测试IP地址 其他的地方都可以不用改变,也可以实现相互通信,不过毕竟免费的,不知道多久就不行了

broker.emqx.io

这样也是可以进行通信成功的

关于如何自主搭建 EMQX

1.建立Linux虚拟机

通过网盘分享的文件:ubuntu
链接: https://pan.baidu.com/s/1qubn-aqb3wVUfatRhG2Nqw?pwd=XZY0 提取码: XZY0
--来自百度网盘超级会员v6的分享

2.虚拟机里面下载 EMXQ

因为我们虚拟机才开始有些插件需要安装,所有要先安装一点插件

sudo snap install curl  # version 8.12.1

安装好之后在安装EMQX,现在下面的东西我们的配置 EMQX Apt 源就算安装完成了

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash

 开始安装 EMQX ,安装好以后会如下图

sudo apt-get install emqx

 启动 EMQX

sudo systemctl start emqx

3.登录EMQX服务器 

使用浏览器打开

http://localhost:18083

Ubuntu上使用浏览器访问emqx服务器(用户名admin;密码:public)

第一次登录会让我们修改一下登录密码

自行修改即可

4.设置中文界面

找到右上角设置界面

5.查看端口

在ubuntu终端输入ip a 查看我们服务器的端口号

ip a

 找到 我们的服务器 ip 地址

6.设备连接

我们需要先下载 MQTTX这个软件

MQTTX部分

需要安装MQTTX软件,是由EMQX公司提供的,下载安装即可

MQTTX:全功能 MQTT 客户端工具MQTTX 是一款强大的全功能 MQTT 5.0 客户端工具,适用于桌面、命令行和 WebSocket。它使得开发和测试 MQTT 应用更加简单高效。https://mqttx.app/zhhttps://mqttx.app/zhhttps://mqttx.app/zh

连接mqtt

打开软件添加对应的MQTT信息,点击连接即可

订阅主题

填写对应的python发布的Mqtt主题消息的名称,进行连接即可

设备一

设备二

 我们的服务器上也会显示出来设备的在线情况了

发布主题

设备就可以相互通信了

先写到这吧,通信基本欧克了 只是没有挂到服务器上面,这个相当于本地发服务器们,需要在一个网络下面

后面继续补充 EMQX的官网还是这方面还是挺完善的c

用之前的例程代码修改ip和端口号,是可以使用的

MQTT 客户端工具演示 | EMQX文档https://docs.emqx.com/zh/emqx/latest/messaging/publish-and-subscribe.html


二、云平台

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

阿里云官网https://www.aliyun.com/https://www.aliyun.com/

1. 添加产品

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

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

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

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

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

 2. 添加设备

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

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

 我们点击 查看设备信息

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

三、Arduino

咱们就是默认都安装好了Arduino,当然我这里也给出一个安装教程,毕竟做就要做全套嘛~~

1.安装教程

Arduino IDE 使用安装以及ESP32库的导入(离线)https://blog.csdn.net/herui_2/article/details/135296814?spm=1001.2014.3001.5501https://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的时间。

芯片选择:ESP32 Dev Module

ESP32-完整代码

 需要修改得到部分

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

下载到我们的ESP32上即可


#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("");
}

芯片选择:ESPino(ESP-12)Module

ESP12-完整代码

只需要把代码的WIFI部分修改成ESP8622WiFi就行

上传程序

查看平台

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

实物效果

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

四、参考与学习

【ESP32最全学习笔记(基础篇)——1.ESP32简介】https://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.4187https://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


太极创客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/esp8266-iot-basics/http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-application/esp8266-iot-basics/


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


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿柒学起来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值