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 emqx3.登录EMQX服务器
使用浏览器打开
http://localhost:18083Ubuntu上使用浏览器访问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目录里面可以找到
保活时间改成60
下载到我们的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/
当然,需要完整项目可以质询博主
