模块3 WIFI物联网通信-项目2 数据上报下发-任务2 数据上传OneNET平台
基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网
任务2 数据上传OneNET平台
一、任务描述
本任务基于 STM32F103C8T6 最小系统板,通过传感器采集温度、湿度、光照强度数据,由 ESP-01S WiFi 模块以MQTT 协议将数据上传至OneNET物联网平台。实现硬件采集→ WiFi传输→MQTT上报→云端存储显示的完整物联网流程,掌握设备数据上报、平台数据解析、物联网通信格式等核心技能。
二、任务目标
1. 知识目标
1)理解MQTT 数据上报格式与 OneNET 平台数据解析规则。
2)掌握温湿度、光照传感器数据采集与格式转换方法。
3)熟悉 ESP-01S 通过AT 指令发布 MQTT 消息(PUBLISH)的流程。
4)理解 JSON 格式在物联网数据传输中的作用。
2. 能力目标
1)能够采集温度、湿度、光照模拟 / 数字数据。
2)能够将采集数据拼接为标准 JSON 上报格式。
3)能够通过 ESP-01S 将数据上传至 OneNET 平台。
4)能够在 OneNET 平台查看实时数据、历史曲线。
3. 素质目标
1)培养数据格式规范、通信时序严谨的工程习惯。
2)提升传感器采集、数据封装、云端调试综合能力。
3)建立 “采集→处理→上传→显示” 的完整物联网思维。
三、任务重难点
1. 任务重点
1)MQTT 数据上报主题:$sys/产品ID/设备ID/thing/property/post
2)标准 JSON 数据格式:包含温度、湿度、光照。
3)ESP-01S 发布指令:AT+MQTTPUB。
4)数据成功上传并在 OneNET 平台显示。
2. 任务难点
1)JSON 格式错误导致平台无法解析。
2)字符串拼接、转义字符处理不当。
3)MQTT 主题错误、数据无法上报。
4)浮点型数据(温度 / 湿度)格式转换。
四、知识准备
1.MQTT 数据上传原理
设备作为MQTT 客户端,通过PUBLISH报文,向指定主题(Topic)发送 JSON 格式数据,平台订阅主题并解析、存储、展示数据。
2.OneNET 数据上报主题(固定格式)
$sys/产品ID/设备ID/thing/property/post
·必须替换为自己平台的产品 ID和设备 ID
·主题错误 → 数据发不出去 / 平台收不到
3.标准 JSON 上报格式(必须严格遵守)
{
"id": "1",
"params": {
"temp": { "value": 25.5 },
"humi": { "value": 48 },
"light": { "value": 320 }
}
}
temp:温度
humi:湿度
light:光照
格式错误 → 平台显示无数据
4.ESP-01S MQTT 发布 AT 指令
AT+MQTTPUB=0,"主题","JSON数据",0,0\r\n
·功能:向平台发布传感器数据
·0,0:QoS=0,retain=0
5.完整执行流程
1)设备连 WiFi
2)连接 MQTT 服务器(任务 2 前半部分)
3)采集温湿度、光照
4)拼接成 JSON 字符串
5)使用AT+MQTTPUB上传
6)平台显示数据
五、硬件连接
ESP-01S模块与主控STM32F103C8T6的引脚连接如表1所示。
表1 ESP-01S模块与主控STM32F103C8T6的引脚连接
| 编号 | ESP-01S模块 | 主控STM32F103C8T6 |
| 1 | VCC | 3V3 |
| 2 | GND | GND |
| 3 | TX | PA3(USART2_RX) |
| 4 | RX | PA2(USART2_TX) |
硬件连接电路图如图1所示。

图1 硬件连接电路图
六、任务实现
任务 2.1 修改 main.c 代码
1.在/* USER CODE BEGIN 0 */和/* USER CODE END 0 */之间添加如下代码:
char LED[10]="false" ,fan[10]="false";
2. /* USER CODE BEGIN 2 */后的代码如下:
/* USER CODE BEGIN 2 */
Led_Init(); //LED初始化
Init_BH1750(); //光照传感器初始化
PWM_Init(); // 风扇驱动初始化
Led_Set(LED_ON); //开启LED灯
strcpy(LED,"true");
OLED_Init();
printf("任务2 数据上传OneNET平台\r\n");
HAL_UART_Receive_IT(&huart2,(uint8_t *)&Uart2_RxData, 1);//开启串口中断
HAL_Delay(500);
esp01s_Init(); //初始化esp01s,连接wifi
HAL_Delay(500);
while(OneNet_DevLink()) //连接OneNET
HAL_Delay(1000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
DHT11_Read_Data(&temp, &humi);
light = Value_GY30();
printf("OneNet_SendData\r\n");
OneNet_SendData(); //发送数据
esp01s_Clear(); //清空数据缓存区
HAL_Delay(3000); //3s发送一次
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
任务 2.2 修改 onenet.c 代码
修改OneNet_FillBuf()函数的代码如下:
extern uint8_t temp,humi;
extern uint16_t light;
extern char LED[10] ,fan[10];
unsigned char OneNet_FillBuf(char *buf)
{
char text[120];
memset(text, 0, sizeof(text));
strcpy(buf, "{\"id\":\"123\",\"params\":{");
memset(text, 0, sizeof(text));
sprintf(text, "\"temp\":{\"value\":%d},", temp);
strcat(buf, text);
memset(text, 0, sizeof(text));
sprintf(text, "\"humi\":{\"value\":%d},", humi);
strcat(buf, text);
memset(text, 0, sizeof(text));
sprintf(text, "\"light\":{\"value\":%d},", light);
strcat(buf, text);
memset(text, 0, sizeof(text));
sprintf(text, "\"LED\":{\"value\":%s},", LED);
strcat(buf, text);
memset(text, 0, sizeof(text));
sprintf(text, "\"fan\":{\"value\":%s}", fan);
strcat(buf, text);
strcat(buf, "}}");
return strlen(buf);
}
任务 2.3 编译、下载、查看结果
1.点击编译按钮
,编译程序。
2.点击下载按钮
,下载程序。
3.打开串口调试助手,按stm32f103c8t6主控板上的复位键,在串口调试助手中输出打印信息,如图2所示。

图2 输出打印信息
4.刷新 OneNET设备详情页面,设备数据已经上传到OneNet平台,如图3所示。

图3 设备数据上传到OneNet平台
更多推荐
所有评论(0)