2024年【开源】STM32+ESP8266+MQTT多传感器数据上云OneNET(易拓展,2024年最新物联网嵌入式开发面试题汇总

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

1.2 无操作系统简易版(旧版,有OneNET云平台设备创建和应用配置,本文不再赘述):
  1. github(源码): https://github.com/Mbwide/DHT11_ToOneNetByMqtt
  2. CSDN(图文解析):https://blog.csdn.net/ssssadw/article/details/111584510
  3. Bilibili(视频解析):https://www.bilibili.com/video/BV1Vi4y1w7U1
2. 具体功能
  1. 基于嵌入式操作系统FreeRTOS进行多任务管理,降低模块间耦合性,增删模块和功能简单方便,提高开发效率
  2. DHT11采集环境温湿度数据,ESP8266模块通过MQTT协议将温湿度数据传输至OnenNet云平台
  3. BH1750采集光照强度数据,ESP8266模块通过MQTT协议将光照强度数据传输至OnenNet云平台
  4. OneNET可以通过云平台远程控制LED1的亮灭
  5. OneNET可以通过云平台远程控制LED2功能任务是否执行
  6. 串口显示相关数据信息
3. 硬件环境
  1. 正点原子STM32F103RCT6(正点原子MiniSTM32)
  2. DHT11温湿度传感器
  3. BH1750(GY30)光照强度传感器
  4. ESP8266-01S无线模块
4. 云平台环境配置

见1.2无操作系统简易版(旧版,有OneNET云平台设备创建和应用配置,本文不再赘述)

5. 接线
  1. ESP8266-01S(5根线)

    • RX PA2
    • TX PA3
    • 复位 PA4
    • VCC 3V3
    • GND GND
  2. DHT11(3根线)

    • DATA PA6
    • VCC 3V3
    • GND GND
  3. BH1750(5根线)

    • SCL PC12
    • SDA PC11
    • ADDR GND
    • VCC 5V
    • GND GND
  4. LED

    • LED1 PD2
    • LED2 PA8
6. 功能展示
6.1 数据流

在这里插入图片描述

6.2 APP应用管理

在这里插入图片描述

6.3 串口数据

在这里插入图片描述

7. 源码详解

本次代码改写目的是增强拓展性,降低开发难度,所以加入操作系统FreeRTOS进行多任务管理,降低模块(传感器,控制)间耦合性,增删模块和功能简单方便,提高开发效率

7.1 源码文件解析

在这里插入图片描述

  • stm32f10x_it.c:中断处理函数
  • FreeRTOSConfig.h:FreeRTOS配置头文件
  • usart1.c:与串口住手通信
  • usart2.c:与ESP8266通信
  • timer3.c:定时器3中断用来发送心跳包(ping,用于保持和服务器连接,长时间没给服务器发送数据会被踢下线),2s和30s两种模式
  • timer4.c:将串口2接收到的服务器数据依次存放在MQTT接收缓存数组中,50ms没有新数据收到执行
  • control.c:发送控制设备数据,存放至发送缓冲区
  • dht11.c:DHT11(温湿度传感器)驱动
  • bh1750.c:BH1750(GY30,光照强度传感器)驱动
  • wifi.c:esp8266的wifi驱动
  • mqtt.c:mqtt协议处理
  • FreeRTOS_CORE:freeRTOS功能核心
  • FreeRTOS_PORTABLE:freeRTOS板级支持包,和芯片相关,包括接口和内存分配
7.2 服务器与wifi配置相关
/\*-------------------------------------------------------------\*/
/\* WIFI网络与ONENET配置(配置) \*/
/\*-------------------------------------------------------------\*/
const char SSID[] =  "PPP";       //路由器名称
const char PASS[] = "qaz123qaz";  //路由器密码

const char PRODUCTID[] 	     = "394499";  	   //产品ID(改成自己的)
const char DEVICEID []	     = "661126800";    //设备ID(改成自己的)
const char AUTHENTICATION[]  = "123456";       //鉴权信息(改成自己的) 
const char DATA_TOPIC_NAME[] = "$dp";		   //topic,Onenet数据点上传topic(不用改)
const char SERVER_IP[]	     = "183.230.40.39";//存放服务器IP或域名(不用改)
const int  SERVER_PORT 		 = 6002;		   //存放服务器的端口号(不用改)


  1. 具体OneNET云平台设备创建和应用配置见:

1.2 无操作系统简易版(旧版,有OneNET云平台设备创建和应用配置,本文不再赘述

​ Bilibili(视频解析):https://www.bilibili.com/video/BV1Vi4y1w7U1

  1. 拓展传感器模块详细演示见:

1.1 本项目相关连接

​ Bilibili(视频解析)

7.3 源码框架
  1. 括号里有“配置”字样的部分是用户必须修改的部分(例程已经配置了LED控制,环境温湿度检测和光照强度监测)
  2. 红色部分为拓展功能模块需要独立编写或者修改的地方

红色虚线部分根据功能更改,设备控制更改创建MQTT命令缓冲处理任务,传感器设备任务需要向消息队列发送传感器数据

* 初始化功能模块:添加**拓展模块的初始化函数**
* 创建用户任务:添加**拓展模块任务**(传感器数据读取或设备控制)
* 创建MQTT命令缓冲处理任务:添加**设备控制**命令,并发送设备状态(**传感器设备无需修改**)
* 创建其他模块任务:实现**传感器数据采集**功能或者**设备控制**相关功能,实现传感器数据采集功能时需要红色虚线部分,设备控制不需要。
  1. 要实现连接服务器时发送控制设备初始状态的功能需要在创建MQTT数据接收发送缓冲处理任务的connect成功部分添加数据发送函数
  2. 其他部分可根据实际需求修改

在这里插入图片描述

7.4 main.c源码及解析
/\*------------------------------------------------------\*/
/\* \*/
/\* 程序main函数,入口函数源文件 \*/
/\* \*/
/\*------------------------------------------------------\*/

#include "sys.h"
#include "delay.h" //包含需要的头文件
#include "usart1.h" //包含需要的头文件
#include "usart2.h" //包含需要的头文件
#include "timer3.h" //包含需要的头文件
#include "timer4.h" //包含需要的头文件

#include "FreeRTOS.h" //FreeRTOS配置头文件
#include "semphr.h" //信号量
#include "queue.h" //队列
#include "event\_groups.h"//事件标志组

#include "wifi.h" //包含需要的头文件
#include "mqtt.h" //包含需要的头文件
#include "control.h" //包含需要的头文件 控制模块相关数据发送给服务器
#include "led.h" //包含需要的头文件 LED
#include "dht11.h" //包含需要的头文件 空气温湿度
#include "bh1750.h" //包含需要的头文件 光照传感器

/\*-------------------------------------------------------------\*/
/\* WIFI网络与ONENET配置(配置) \*/
/\*-------------------------------------------------------------\*/
const char SSID[] 			 = "PPP";          //路由器名称
const char PASS[] 			 = "qaz123qaz";    //路由器密码

const char PRODUCTID[] 	     = "394499";  	   //产品ID
const char DEVICEID []	     = "661126800";    //设备ID 
const char AUTHENTICATION[]  = "123456";       //鉴权信息 
const char DATA_TOPIC_NAME[] = "$dp";		   //topic,Onenet数据点上传topic(不用改)
const char SERVER_IP[]	     = "183.230.40.39";//存放服务器IP或域名(不用改)
const int  SERVER_PORT 		 = 6002;		   //存放服务器的端口号(不用改)

/\*-------------------------------------------------------------\*/
/\* 控制命令以及控制模块初始状态设置(配置) \*/
/\*-------------------------------------------------------------\*/
	/\* 消息体:
 \* {
 \* "data\_1":"value\_1",
 \* "data\_2":"value\_2"
 \* }
 \* 消息体示例:
 \* {"led1\_flag":"LED1ON"}
 \*/

const char \*LED1_LABER  = "led1\_flag";//LED1标签,发送给ONENET的数据流名称
const char \*CMD_LED1ON  = "LED1ON";   //LED1打开
const char \*CMD_LED1OFF = "LED1OFF";  //LED1关闭
char 	   \*led1_flag   = "LED1OFF";  //LED1状态,初始化为关闭状态

const char \*LED2_LABER 	= "led2\_flag";//LED2标签
const char \*CMD_LED2ON  = "LED2ON";   //LED2打开
const char \*CMD_LED2OFF = "LED2OFF";  //LED2关闭
char 	   \*led2_flag   = "LED2ON";   //LED2状态,初始化为打开状态
/\*-------------------------------------------------------------\*/
/\* freerto任务通信控制(固定) \*/
/\*-------------------------------------------------------------\*/

/\* 二值信号量句柄 
 \* 作用:用于控制MQTT命令缓冲处理任务,在MQTT数据接收发送缓冲处理任务中发出
 \* 当命令缓冲区收到命令数据时,发出信号量 
 \*/
SemaphoreHandle_t BinarySemaphore;
	
/\* 事件标志组 
 \* 作用:标志WIFI连接,PING心跳包发送模式控制wifi是否重启连接,是否发送数据,传感器是否运行 
 \* 具体:1.事件标志组位1为0,位0为1时,即0x03(0000 0001),wifi连接至服务器时位0置位1,此时connect报文还未发送。 
 \* 2.事件标志组位1为1,位0为1时,即0x03(0000 0011),connect报文发送,返回连接成功报文时位1置位1,PING心
 \* 跳包开启30s发送模式,传感器任务开启,数据开始上传,设备远程控制(LED控制)功能开启。 
 \*/
EventGroupHandle_t Event_Handle = NULL;     //事件标志组(位0:WIFI连接状态 位1:PING心跳包2S快速发送模式)
const int WIFI_CONECT = (0x01 << 0);        //设置事件掩码的位 0;服务器连接模式,值1表示已经连接,0表示未连接
const int PING_MODE   = (0x01 << 1);        //设置事件掩码的位 1;PING心跳包发送模式,1表示开启30S发送模式,0表示未开启发送或开启2S快速发送模式

/\* 传感器数据发送消息队列 
 \* 作用:将传感器的数据发送到传感器消息队列 
 \*/
QueueHandle_t Message_Queue;		 		//消息队列句柄 
const UBaseType_t MESSAGE_DATA_TX_NUM = 5;	//消息队列最大消息数目 
const UBaseType_t MESSAGE_DATA_TX_LEN = 100;//消息队列单元大小,单位为字节 

/\*-------------------------------------------------------------\*/
/\* 任务句柄及任务函数声明1(配置) \*/
/\*-------------------------------------------------------------\*/
//开始任务
TaskHandle_t StartTask_Handler;
void my\_start\_task(void \*pvParameters);
//LED任务 
TaskHandle_t Led2_Task_Handler;
void my\_led2\_task(void \*pvParameters);
//DHT11任务 温湿度传感器
TaskHandle_t DHT11_Task_Handler;
void my\_dht11\_task(void \*pvParameters);
//SUN任务,光照传感器
TaskHandle_t SUN_Task_Handler;
void my\_sun\_task(void \*pvParameters);
//MQTT命令缓冲处理任务
TaskHandle_t MQTT_Cmd_Task_Handler;
void my\_mqtt\_buffer\_cmd\_task(void \*pvParameters);

/\*-------------------------------------------------------------\*/
/\* 任务句柄及任务函数声明2(固定) \*/
/\*-------------------------------------------------------------\*/
//WIFI任务
TaskHandle_t WIFI_Task_Handler;
void wifi\_task(void \*pvParameters);
//MQTT数据接收发送缓冲处理任务
TaskHandle_t MQTT_RxTx_Task_Handler;
void mqtt\_buffer\_rx\_tx\_task(void \*pvParameters);
//传感器数据处理任务,处理待发送的传感器数据,移入MQTT数据发送缓冲区
TaskHandle_t DATA_TX_Task_Handler;
void data\_tx\_to\_buffer\_task(void \*pvParameters);

/\*---------------------------------------------------------------\*/
/\*函数名:int main() \*/
/\*功 能:主函数 \*/
/\* 1.初始化各功能模块 \*/
/\* 2.创建开始任务(在开始任务里创建所有其他任务) \*/
/\* 3.开启任务调度 \*/
/\*参 数:无 \*/
/\*返回值:无 \*/
/\*---------------------------------------------------------------\*/
int main()
{
	NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay\_init();	       //延时函数初始化
	usart1\_init(115200);   //串口1功能初始化,波特率115200,与串口住手通信 
	usart2\_init(115200);   //串口2功能初始化,波特率115200,wifi通信 
	tim4\_init(500,7200);   //TIM4初始化,定时时间 500\*7200\*1000/72000000 = 50ms 
	led\_init();		  	   //初始化LED
	dht11\_init();  		   //初始化DHT11 温湿度
	iic\_by30\_init();       //初始化IIC接口 光照强度
	
	wifi\_reset\_io\_init();  //初始化esp8266
	IoT\_parameter\_init();  //初始化OneNET平台MQTT服务器的参数 
	
	//创建开始任务
	xTaskCreate((TaskFunction_t	) my_start_task,		//任务函数
			    (const char\* 	)"my\_start\_task",		//任务名称
				(uint16_t 		) 128,				  	//任务堆栈大小
				(void\* 		  	) NULL,				 	//传递给任务函数的参数
				(UBaseType_t 	) 1, 				  	//任务优先级
				(TaskHandle_t\*  ) &StartTask_Handler);	//任务控制块 
			
	vTaskStartScheduler();  							//开启任务调度
}

/\*---------------------------------------------------------------\*/
/\*函数名:void my\_start\_task(void \*pvParameters) \*/
/\*功 能:开始任务(配置) \*/
/\* 1.创建信号量,消息队列等任务通信方式 \*/
/\* 2.创建所有任务 \*/
/\* 3.删除本身 \*/
/\*参 数:无 \*/
/\*返回值:无 \*/
/\*---------------------------------------------------------------\*/
void my\_start\_task(void \*pvParameters)
{
	taskENTER\_CRITICAL(); //进入临界区
	
	//创建二值信号量
	BinarySemaphore = xSemaphoreCreateBinary();	
	//事件标志组,用于标志wifi连接状态以及ping发送状态
	Event_Handle = xEventGroupCreate(); 
	//创建传感器消息体消息队列
	Message_Queue = xQueueCreate(MESSAGE_DATA_TX_NUM, MESSAGE_DATA_TX_LEN); 
	
	//任务创建函数参数;1.任务函数 2.任务名称 3.任务堆栈大小 3.传递给任务函数的参数 4.任务优先级 5.任务控制块
	//创建WIFI任务
    xTaskCreate(wifi_task, 				"wifi\_task", 				128, NULL, 7, &WIFI_Task_Handler); 			
	//创建MQTT命令缓冲处理任务
    xTaskCreate(my_mqtt_buffer_cmd_task,"my\_mqtt\_buffer\_cmd\_task",  128, NULL, 6, &MQTT_Cmd_Task_Handler); 			
	//创建MQTT数据接收发送缓冲处理任务
    xTaskCreate(mqtt_buffer_rx_tx_task, "mqtt\_buffer\_rx\_tx\_task", 	256, NULL, 5, &MQTT_RxTx_Task_Handler); 
	//创建led控制任务
	xTaskCreate(my_led2_task, 			"my\_led2\_task",				128, NULL, 4, &Led2_Task_Handler);  
    //创建DHT11任务,温湿度传感器
    xTaskCreate(my_dht11_task, 			"my\_dht11\_task", 			128, NULL, 3, &DHT11_Task_Handler);
    //创建SUN任务,光照传感器
    xTaskCreate(my_sun_task, 			"my\_sun\_task",        		128, NULL, 3, &SUN_Task_Handler);	
	//创建传感器数据处理任务,处理待发送的传感器数据,移入MQTT数据发送缓冲区
    xTaskCreate(data_tx_to_buffer_task, "data\_tx\_to\_buffer\_task", 	512, NULL, 2, &DATA_TX_Task_Handler); 
			
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT\_CRITICAL();            //退出临界区
}

/\*---------------------------------------------------------------\*/
/\*函数名:void my\_mqtt\_buffer\_cmd\_task(void \*pvParameters) \*/
/\*功 能:MQTT命令缓冲处理任务(配置) \*/
/\* 1.MQTT命令缓冲区处理,并执行相应命令 \*/
/\* 2.将命令执行结果发送给服务器 \*/
/\*参 数:无 \*/
/\*返回值:无 \*/
/\*其 他:获取到二值信号量时执行(收到服务器命令) \*/
/\*---------------------------------------------------------------\*/
void my\_mqtt\_buffer\_cmd\_task(void \*pvParameters)	
{
	while(1)
	{
		xSemaphoreTake(BinarySemaphore, portMAX_DELAY);	//获取信号量,获取到信号量,继续执行,否则进入阻塞态,等待执行
		if(MQTT_CMDOutPtr != MQTT_CMDInPtr)				//if成立的话,说明命令缓冲区有数据了 
		{                             		       
			printf("命令:%s\r\n", &MQTT_CMDOutPtr[2]);              	   
			
			if(!memcmp(&MQTT_CMDOutPtr[2], CMD_LED1ON, strlen(CMD_LED1ON)))
			{                                            
				led1\_on();  		  //LED1开启
				led1_flag = "LED1ON"; //LED1状态,用于发送给服务器
				send\_data(LED1_LABER, led1_flag);
			}
			else if(!memcmp(&MQTT_CMDOutPtr[2], CMD_LED1OFF, strlen(CMD_LED1OFF)))
			{                                           
				led1\_off(); 		  //LED1关闭
				led1_flag = "LED1OFF";//LED1状态,用于发送给服务器 
				send\_data(LED1_LABER, led1_flag);
			}
			if(!memcmp(&MQTT_CMDOutPtr[2], CMD_LED2ON, strlen(CMD_LED2ON)))
			{                                            
				vTaskResume(Led2_Task_Handler);  //LED2任务由挂起态转为就绪态,LED2任务运行
				led2_flag = "LED2ON"; 		     //LED2状态,用于发送给服务器
				send\_data(LED2_LABER, led2_flag);
			}
			else if(!memcmp(&MQTT_CMDOutPtr[2], CMD_LED2OFF, strlen(CMD_LED2OFF)))
			{                                      
				vTaskSuspend(Led2_Task_Handler); //LED2任务由就绪态(运行态)转为挂起态,LED2任务挂起(停止) 
				led2_flag = "LED2OFF";			 //LED2状态,用于发送给服务器 
				send\_data(LED2_LABER, led2_flag);
			}					
			//不做处理,后面会发送状态
			else printf("未知指令\r\n");				
		
			MQTT_CMDOutPtr += CBUFF_UNIT;		//指针下移
			if(MQTT_CMDOutPtr == MQTT_CMDEndPtr)//如果指针到缓冲区尾部了
			MQTT_CMDOutPtr = MQTT_CMDBuf[0];    //指针归位到缓冲区开头 
					
		}
		delay\_ms(10);	  
	}
}

/\*---------------------------------------------------------------\*/
/\*函数名:void my\_dht11\_task(void \*pvParameters) \*/
/\*功 能:DHT11任务 温湿度传感器(配置) \*/
/\* 1.检测环境温湿度数据 \*/
/\* 2.将环境温湿度数据放入传感器数据消息队列 \*/
/\*参 数:无 \*/
/\*返回值:无 \*/
/\*其 他:服务器连接以及PING心跳包30S发送模式事件发生时执行此任务, \*/
/\* 否则挂起任务 \*/
/\*---------------------------------------------------------------\*/
void my\_dht11\_task(void \*pvParameters)
{
	
	while(1)
	{
		char humidity;		   //定义一个变量,保存湿度值
		char temperature;	   //定义一个变量,保存温度值 
		char data_of_sensor[50] = {0};
		
		//服务器连接以及PING心跳包30S发送模式事件发生时执行此任务,否则挂起任务
		xEventGroupWaitBits((EventGroupHandle_t	)Event_Handle,		
							(EventBits_t		)PING_MODE,
							(BaseType_t			)pdFALSE,				
							(BaseType_t			)pdTRUE,
							(TickType_t			)portMAX_DELAY);
	
		
		dht11\_read\_data(&temperature, &humidity);//读取温湿度值
		//构建消息体
		//消息体:"temperature":"%d","humidity":"%d",
		sprintf(data_of_sensor, "\"temperature\":\"%d\",\"humidity\":\"%d\",", temperature, humidity);  		
	
		
		xQueueSend(Message_Queue, &data_of_sensor, portMAX_DELAY);//向消息队列发送消息体,将温湿度数据放入传感器数据消息队列
		//printf("temperature: %d, humidity: %d \r\n", temperature, humidity);
		delay\_ms(10 \* 1000);//延时10s
	}
} 

/\*---------------------------------------------------------------\*/
/\*函数名:void my\_led2\_task(void \*pvParameters) \*/
/\*功 能:LED任务(配置) \*/
/\* 1.LED2任务执行 \*/
/\*参 数:无 \*/
/\*返回值:无 \*/
/\*其 他:服务器连接以及ping心跳包30S发送模式事件发生时执行此任务, \*/
/\* 否则挂起任务 \*/
/\*---------------------------------------------------------------\*/
void my\_led2\_task(void \*pvParameters)
{
	while(1)
	{
		//服务器连接以及ping心跳包30S发送模式事件发生时执行此任务,否则挂起任务
		xEventGroupWaitBits((EventGroupHandle_t	)Event_Handle,		
							(EventBits_t		)PING_MODE,
							(BaseType_t			)pdFALSE,				
							(BaseType_t			)pdTRUE,
							(TickType_t			)portMAX_DELAY);
		led2\_on();
		delay\_ms(500);	//延时500ms
		led2\_off();
		delay\_ms(500);	//延时500ms
	}
}

/\*---------------------------------------------------------------\*/
/\*函数名:void my\_sun\_task(void \*pvParameters) \*/
/\*功 能:SUN任务,光照传感器(配置) \*/
/\* 1.检测光照强度 \*/
/\* 2.将光照强度数据放入传感器数据消息队列 \*/
/\*参 数:无 \*/
/\*返回值:无 \*/
/\*其 他:服务器连接以及PING心跳包30S发送模式事件发生时执行此任务, \*/
/\* 否则挂起任务 \*/
/\*---------------------------------------------------------------\*/
void my\_sun\_task(void \*pvParameters)
{

	while(1)
	{
		int  sun_light;	 //定义一个变量,保存光照强度
		char data_of_sensor[50] = {0};
		
		//服务器连接以及ping心跳包30S发送模式事件发生时执行此任务,否则挂起任务
		xEventGroupWaitBits((EventGroupHandle_t	)Event_Handle,		
							(EventBits_t		)PING_MODE,
							(BaseType_t			)pdFALSE,				
							(BaseType_t			)pdTRUE,
							(TickType_t			)portMAX_DELAY);	
	
		
		sun_light = get\_sunlight\_value();	
		//构建消息体
		//消息体:"sunlight":"%d",
		sprintf(data_of_sensor, "\"sunlight\":\"%d\",", sun_light); //构建消息体的一部分
	
		
		xQueueSend(Message_Queue, &data_of_sensor, portMAX_DELAY);  //向消息队列发送消息体,将光照强度数据放入传感器数据消息队列
		//printf("sunlight: %d \r\n", sun\_light);
		delay\_ms(10 \* 1000);	    //延时10s
	}
} 

/\*---------------------------------------------------------------\*/
/\*函数名:void wifi\_task(void \*pvParameters) \*/
/\*功 能:WIFI任务(固定) \*/
/\* 1.连接wifi以及云服务器 \*/


![img](https://img-blog.csdnimg.cn/img_convert/210124f07373f6eb81405a5a3442a94d.png)
![img](https://img-blog.csdnimg.cn/img_convert/1bc380ce3df246b66174c2eff9d5774a.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

rintf("sunlight: %d \r\n", sun\_light);
		delay\_ms(10 \* 1000);	    //延时10s
	}
} 

/\*---------------------------------------------------------------\*/
/\*函数名:void wifi\_task(void \*pvParameters) \*/
/\*功 能:WIFI任务(固定) \*/
/\* 1.连接wifi以及云服务器 \*/


[外链图片转存中...(img-qMEV9YNM-1715628183979)]
[外链图片转存中...(img-sh6YsG1c-1715628183979)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: app+stm32+esp8266+mqtt协议可以实现将数据上传到onenet云平台。具体实现步骤如下: 1. 编写stm32程序,采集传感器数据并通过esp8266模块将数据发送到onenet云平台。 2. 在esp8266模块中使用mqtt协议连接onenet云平台,并将采集到的数据发布到指定的主题。 3. 在onenet云平台上创建设备,并将设备与mqtt主题绑定。 4. 在onenet云平台上创建数据流,并将数据流与设备绑定。 5. 在onenet云平台上创建数据模板,并将数据模板与数据流绑定。 6. 在app中使用onenet提供的api接口,获取设备数据并进行展示。 通过以上步骤,就可以实现将stm32采集到的数据上传到onenet云平台,并在app中进行展示。 ### 回答2: STM32是意法半导体公司推出的一款32位微控制器芯片,具有低功耗、高性能、高可靠性等特点,广泛应用于物联网、工业自动化、智能家居等领域。ESP8266是一款集成WiFi模块的微控制器芯片,具有低成本、低功耗、于上手等特点,也广泛应用于物联网、智能家居等领域。MQTT协议是一款轻量级的物联网通信协议,可以实现低功耗、高可靠性、高扩展性等特点,特别适用于物联网场景的设备间通信。 OneNet是中国移动推出的物联网云平台,提供设备管理、数据存储和可视化展示等功能,支持多种通信协议,包括MQTT。基于STM32ESP8266,我们可以通过MQTT协议将设备数据上传至OneNet云平台,实现对设备状态的监控和远程控制。 具体实现步骤包括: 1. 在STM32ESP8266中分别实现MQTT协议的相关功能,如连接服务器、发布订阅消息、接收数据等。 2. 接入OneNet云平台,创建设备和数据流,并获取设备ID和API Key。 3. 在STM32中发送设备数据ESP8266ESP8266通过MQTT协议将数据上传到OneNet云平台,并记录上传数据的时间戳。 4. 在OneNet云平台中可以实现对设备数据的监控、历史数据查询、报警设置等功能。同时,也可以通过API接口实现数据的远程控制。 总之,基于STM32ESP8266MQTT协议上云OneNet,是一种方便快捷、低成本高效的物联网应用方案。通过实现设备与互联网的连接,可以实现智能化控制、远程监控等功能,提高工作效率和生活品质。 ### 回答3: STM32ESP8266都是常用的嵌入式单片机,而MQTT是一种轻量级的消息传输协议,通常被用于物联网设备间的通信。而OneNet是国内比较知名的物联网云平台,它提供开发者友好的接口以及强大的数据管理功能,方便开发者快速构建物联网应用。在使用STM32ESP8266进行物联网开发上,MQTT协议和OneNet的结合能够为开发带来很多便利。 首先讲一下STM32ESP8266的配合。在嵌入式系统中,STM32通常作为主控制器,用于控制各种传感器以及执行设备控制操作。而ESP8266则可以作为一种无线模块,用于与网络进行通信。在物联网应用中,ESP8266作为WiFi模块,可以将STM32采集到的数据或进行的控制操作通过WiFi连接发送到数据云平台上,用于实时数据监控或设备远程控制等。 而MQTT协议可以帮助我们快速实现消息传输和设备控制。MQTT协议相较于HTTP等传统网络协议来说,它的传输速度更快、开销更小,且支持低功耗的设备。比如在家庭物联网系统中,我们可以将一些传感器(比如温度、湿度、烟雾检测等)通过STM32采集到,然后通过ESP8266模块发送到OneNet。这样就可以实现实时的数据监控和远程控制等功能了。 最后,OneNet平台是国内较为知名的物联网云平台,支持MQTT协议,提供了丰富的接口和SDK,可以帮助开发者快速构建物联网应用。在使用MQTT协议与OneNet平台结合时,我们只需要在设备端运用MQTT协议,将采集到的数据发送到OneNet平台上,然后在云平台上进行数据存储、处理和分析等操作,从而实现对设备的远程监控和控制。 总的来说,STM32ESP8266的配合,MQTT协议的应用以及OneNet平台的支持,可以为物联网设备的快速开发和应用提供很大的帮助。未来,随着物联网的普及和发展,这一领域的应用前景将会更加广阔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值