ESP32-S3 + OneNet物联网平台实战:手把手教你用MQTT协议上报温湿度数据(附完整代码)

张开发
2026/4/15 16:20:27 15 分钟阅读

分享文章

ESP32-S3 + OneNet物联网平台实战:手把手教你用MQTT协议上报温湿度数据(附完整代码)
ESP32-S3与OneNet物联网平台实战从零构建温湿度监测系统物联网技术的快速发展让硬件开发者能够轻松将传感器数据上传至云端。本文将手把手教你使用ESP32-S3开发板通过MQTT协议将DHT11温湿度传感器的数据上传至OneNet物联网平台构建一个完整的端到端解决方案。1. 硬件准备与环境搭建在开始编码之前我们需要准备好硬件设备并搭建开发环境。ESP32-S3是乐鑫科技推出的一款高性能Wi-Fi/蓝牙双模微控制器特别适合物联网应用场景。所需硬件清单ESP32-S3开发板推荐使用带有USB接口的型号DHT11温湿度传感器模块杜邦线若干母对母微型USB数据线可选面包板用于临时连接硬件连接非常简单将DHT11的VCC引脚连接到ESP32-S3的3.3V电源将DHT11的GND引脚连接到ESP32-S3的GND将DHT11的DATA引脚连接到ESP32-S3的任意GPIO本文使用GPIO4开发环境配置步骤安装ESP-IDF开发框架最新稳定版git clone -b v5.1.1 --recursive https://github.com/espressif/esp-idf.git cd esp-idf ./install.sh source export.sh创建项目模板cp -r examples/protocols/mqtt/tcp ~/esp32_onenet_demo cd ~/esp32_onenet_demo添加DHT11驱动库 在项目目录下创建components文件夹然后添加DHT11驱动mkdir -p components/dht112. OneNet平台配置OneNet是中国移动推出的物联网开放平台提供设备接入、数据存储、可视化展示等功能。我们需要在平台上完成以下配置注册与产品创建访问OneNet官网并注册开发者账号进入开发者中心点击产品开发创建新产品关键参数设置接入协议MQTT数据协议OneJson联网方式Wi-Fi设备添加与认证信息获取在产品下添加新设备记录设备名称获取产品ID和设备密钥使用OneNet提供的Token生成工具生成连接密码数据流与API配置创建温湿度数据流设置数据点标识符temperature和humidity配置数据存储策略关键参数说明表参数名称获取位置示例值用途说明产品ID产品详情页sq8cUJ2H38MQTT连接用户名设备名称设备管理页ESP32_DHT11客户端IDToken安全认证工具生成version2018...连接密码上报Topic文档查询$sys/{pid}/{dev}/thing/property/post数据上报地址3. ESP-IDF项目代码实现现在我们来编写ESP32-S3端的代码实现温湿度数据采集和MQTT上报功能。3.1 项目结构esp32_onenet_demo/ ├── main/ │ ├── CMakeLists.txt │ ├── component.mk │ ├── dht11.c │ ├── dht11.h │ └── main.c ├── components/ │ └── dht11/ ├── CMakeLists.txt └── sdkconfig3.2 主程序逻辑在main.c中我们需要实现以下功能初始化Wi-Fi连接初始化DHT11传感器配置MQTT客户端定时读取传感器数据并上报Wi-Fi连接配置#define WIFI_SSID your_wifi_ssid #define WIFI_PASS your_wifi_password void wifi_init_sta(void) { wifi_config_t wifi_config { .sta { .ssid WIFI_SSID, .password WIFI_PASS, }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); }DHT11数据读取实现#include dht11.h #define DHT11_GPIO 4 void read_sensor_data() { int temperature, humidity; if(dht11_read(DHT11_GPIO, temperature, humidity) ESP_OK) { ESP_LOGI(TAG, Temperature: %d°C, Humidity: %d%%, temperature, humidity); } else { ESP_LOGE(TAG, Failed to read DHT11 data); } }3.3 MQTT客户端实现MQTT配置参数// 替换为你的实际OneNet参数 #define ONENET_MQTT_BROKER mqtts.heclouds.com #define ONENET_MQTT_PORT 1883 #define ONENET_PRODUCT_ID your_product_id #define ONENET_DEVICE_NAME your_device_name #define ONENET_TOKEN your_generated_token // Topic定义 #define TOPIC_PUBLISH $sys/ ONENET_PRODUCT_ID / ONENET_DEVICE_NAME /thing/property/post #define TOPIC_SUBSCRIBE $sys/ ONENET_PRODUCT_ID / ONENET_DEVICE_NAME /thing/property/setMQTT事件处理函数static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { esp_mqtt_event_handle_t event event_data; switch (event-event_id) { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG, MQTT connected); // 订阅主题 esp_mqtt_client_subscribe(event-client, TOPIC_SUBSCRIBE, 1); break; case MQTT_EVENT_DATA: ESP_LOGI(TAG, MQTT data received); // 处理平台下发的数据 break; case MQTT_EVENT_ERROR: ESP_LOGE(TAG, MQTT error); break; } }数据上报JSON格式OneNet平台要求使用特定的JSON格式上报数据{ id: 123, version: 1.0, params: { temperature: { value: 25 }, humidity: { value: 50 } } }数据上报函数实现void publish_sensor_data(esp_mqtt_client_handle_t client, int temp, int humi) { char payload[200]; snprintf(payload, sizeof(payload), {\id\:\%d\,\version\:\1.0\,\params\:{ \temperature\:{\value\:%d}, \humidity\:{\value\:%d}}}, (int)time(NULL), temp, humi); esp_mqtt_client_publish(client, TOPIC_PUBLISH, payload, 0, 1, 0); }4. 常见问题与调试技巧在实际开发过程中可能会遇到各种问题。以下是几个常见问题及其解决方案MQTT连接失败检查产品ID、设备名称和Token是否正确确保网络连接正常可以ping通OneNet服务器验证Token是否过期默认有效期为1年数据上报但平台未显示检查Topic格式是否正确验证JSON数据格式是否符合OneJson规范确认数据流名称与代码中定义的一致DHT11读取失败检查接线是否正确特别是DATA引脚确保供电稳定DHT11需要3.3V供电添加适当的延时DHT11需要至少1秒的采样间隔调试工具推荐MQTT.fx用于测试MQTT连接和数据收发OneNet设备调试工具平台内置的实时数据查看工具ESP-IDF Monitor查看ESP32的日志输出性能优化建议合理设置数据上报间隔建议不低于10秒启用QoS 1确保数据可靠传输实现离线数据缓存网络恢复后补发数据在实际项目中我们还需要考虑设备OTA升级、低功耗设计等高级功能。通过这个基础框架开发者可以快速扩展出满足各种场景需求的物联网应用。

更多文章