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

张开发
2026/4/20 17:13:42 15 分钟阅读

分享文章

ESP32/ESP8622 -- 使用MQTT协议连接云平台(带图文说明)
目录一、前言关注微信公众号--星之援工作室 发送关键字ESP32可以获取一些基本资料2025-2.1号 关于阿里云服务器注如果不想自己搭建EMQX服务器关于如何自主搭建 EMQX1.建立Linux虚拟机2.虚拟机里面下载 EMXQ3.登录EMQX服务器4.设置中文界面5.查看端口6.设备连接MQTTX部分连接mqtt订阅主题设备一设备二发布主题二、云平台1. 添加产品2. 添加设备三、Arduino1.安装教程2.代码编写PubSubClient 库Ticker 库芯片选择ESP32 Dev ModuleESP32-完整代码芯片选择ESPinoESP-12ModuleESP12-完整代码上传程序查看平台实物效果四、参考与学习一、前言今天给大家带来的是ESP32系列联网教程因为是使用Arduino开发Arduino有很多库函数可以让我们直接使用可谓是站在巨人的肩膀上乘凉。当然网上教程一抹多我也只是其中之一只是给大家提供一写思路和我实践出来的方法给大家避避雷。关注微信公众号--星之援工作室 发送关键字ESP32可以获取一些基本资料➡️➡️2025-2.1号 关于阿里云服务器如何搭建使用EMQXMQTT服务阿里云现在也扛不住了现在不能提供免费的物联网服务器了不过之前建立了服务器的账号是可以正常使用的兄弟们大家可以看一下 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这样也是可以进行通信成功的关于如何自主搭建 EMQX1.建立Linux虚拟机通过网盘分享的文件ubuntu链接: https://pan.baidu.com/s/1qubn-aqb3wVUfatRhG2Nqw?pwdXZY0 提取码: 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启动 EMQXsudo 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?spm1001.2014.3001.5501https://blog.csdn.net/herui_2/article/details/135296814?spm1001.2014.3001.55012.代码编写所谓前人栽树后人乘凉现在就会体现的淋漓尽致首先我们需要加载两个库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 ModuleESP32-完整代码需要修改得到部分想要连接上阿里云还需要修改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_deviceh9sj0dFIZzO; // 服务端连接用户名(需要修改) const char* mqttPassword 9f86686e86c69f72d27515d6adb63c0223151e627bfa19284959647283210709; // 服务端连接密码(需要修改) const char* clientId h9sj0dFIZzO.ESP_Pet_device|securemode2,signmethodhmacsha256,timestamp1703866991146|; // 客户端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; // 清除会话如QoS0必须要设为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(); }芯片选择ESPinoESP-12ModuleESP12-完整代码只需要把代码的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%257Drequest_id170401469316800186571625biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-129079088-null-null.142%5Ev99%5Epc_search_result_base7utm_term%20ESP32%20spm1018.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%257Drequest_id170401469316800186571625biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-129079088-null-null.142%5Ev99%5Epc_search_result_base7utm_term%20ESP32%20spm1018.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/当然需要完整项目可以质询博主

更多文章