基于stm32(103)+ESP01S使用http协议连接OnetNet平台上传采集数据

该教程详细介绍了如何使用STM32微控制器配合ESP01SWiFi模块,通过HTTP协议连接ONENET物联网平台,上传由温湿度传感器、烟雾传感器和光敏传感器采集的数据。STM32通过UART2与ESP01S通信,代码包括WiFi模块的配置和HTTP协议的封装,实现了物联网设备与云平台的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于stm32(103)+ESP01S使用http协议连接OnetNet平台上传采集数据
stm32通过ESP01用HTTP协议连接ONENET云平台,实现STM32连接云平台实现物联网需要用到ESP01S来进行数据的上传,对于WiFi模块,我相信很多人可能会用到。
首先,当我们第一次拿到模块,我们需要先对模块进行测试,确定模块是否是正常,在这里我就不做讲解,之前写过一篇博客,供大家参考:
https://blog.youkuaiyun.com/yanw1234/article/details/118709934?spm=1001.2014.3001.5502
本次采用的模块还有:温湿度传感器(dht11) 烟雾传感器 光敏传感器;
将通过对三个传感器数据的采集后,封装http协议上传到onenet平台上,实现物联网的交互;
在STM32端采用uart2接口连接esp进行通信;
对于stm32的连接方式如下:

sem32esp
RX(PA3)TX
TX(PA2)RX
3V33V3
GNDGND
PA7RST

不说了,直接上代码,需要的可自取不收费,网上扣扣嗖嗖的还有收费然后内容杂乱无章,本人不喜欢这样的,在这一切代码开源:
硬件连接图:
在这里插入图片描述

该代码框架如下:
在这里插入图片描述
onenet云平台:
在这里插入图片描述
串口打印信息:
在这里插入图片描述

wifi模块的主要配置流程代码,接口封装好,不管在什么平台只要调用接口即可:
wifi.h

#ifndef __WIFI_H
#define __WIFI_H
#include "usart.h"

#define  LYSSID   "XXXXXXXXXXX"                      //!< 路由器或热点账号
#define  LYPASSWD "XXXXXXXXXXX"                       //!< 路由器或热点密码

void wifi_reset(void);		

void WiFi_WiFiconfig(void); 
void WiFi_RecdataPut(void);
#endif


wifi.c:

#include "wifi.h"
#include "public.h"
#include "delay.h"

void wifi_reset(void)	// 模块复位
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_7);
	delay_ms(500);
	GPIO_SetBits(GPIOA,GPIO_Pin_7);
	delay_ms(500);

}

void WiFi_WiFiconfig(void) // 模式配置
{
   char SendATData[200];
  switch(WiFiStatus.modeStatus) {
    case CMD_AT:
			u2_printf("AT\r\n",strlen("AT\r\n"));	//测试通信是否正常
			printf("\r\n**CSGSM Connect To MODULE...\r\n");
			break;
		case CMD_CWMODE:
			u2_printf("AT+CWMODE=3\r\n",strlen("AT+CWMODE=3\r\n")); // 设置AP+ STA
			printf("Set WiFi ModuleAP+STA..\r\n");
			break;
    case CMD_CIPMODE:
      u2_printf("AT+CIPMODE=1\r\n",strlen("AT+CIPMODE=1\r\n"));//设置透传
      printf("Set WiFi Module transparent\r\n"); //??????????
			break;
		case CMD_CWJAP:
			memset(SendATData,0,200);
			sprintf((char *)SendATData, "AT+CWJAP=\"%s\",\"%s\"\r\n",LYSSID, LYPASSWD);
			u2_printf(SendATData,strlen((char *)SendATData));
			printf("Connect To WiFi Route... [name : %s] \r\n", LYSSID); //绑定路由器或者热点的账号密码
			break;
		case CMD_CIPSTART:	// 连接服务器,这个指的是onenet
			u2_printf("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n",
                   strlen("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n"));
			break;
		case CMD_CIPSEND:	//开始发送数据
			u2_printf("AT+CIPSEND\r\n",strlen("AT+CIPSEND\r\n"));
			printf(" set wifi CIPSEND\r\n");
			break;
	}
}

void WiFi_RecdataPut(void)//WiFi配置响应数据处理
{
  char *strx;
	switch(WiFiStatus.modeStatus){
		case CMD_AT:
      strx=strstr((const char*)WiFiStatus.Recbuffer,(const char*)"OK");//·µ»Øok£¬ËµÃ÷Ä£¿éͨÐÅÕý³£
			if (strx) {
				printf("WiFi CONNET MODULE OK\r\n");
				WiFiStatus.modeStatus = CMD_CWMODE;
			}
			break;
		case CMD_CWMODE:
			strx=strstr((const char*)WiFiStatus.Recbuffer,(const char*)"OK");//ÉèÖÃģʽ3
			if (strx) {
				printf("WiFi CONNET MODULE OK\r\n");
				WiFiStatus.modeStatus=CMD_CIPMODE;
			}
			break;
		case CMD_CIPMODE:
			strx=strstr((const char*)WiFiStatus.Recbuffer,(const char*)"OK");//ÉèÖÃ͸´«Ä£Ê½
			if(strx){
				printf("TRANSPARNET [OK]\r\n");
				WiFiStatus.modeStatus=CMD_CWJAP;
			}
			break;
		case CMD_CWJAP:
			strx=strstr((const char*)WiFiStatus.Recbuffer,(const char*)"OK");
			if(strx){
				printf("CONNECT Route OK\r\n");
				WiFiStatus.modeStatus=CMD_CIPSTART;
			}
			break;
		case CMD_CIPSTART:
			strx=strstr((const char*)WiFiStatus.Recbuffer,(const char*)"OK");
			if(strx){
				printf( "CONNECT CLOUD OK\r\n");
				WiFiStatus.modeStatus=CMD_CIPSEND;
			}
			break;
		case CMD_CIPSEND:
     strx=strstr((const char*)WiFiStatus.Recbuffer,(const char*)"OK");//??????c s t x
     if(strx){
        printf("SEND CLOUD DATA.\r\n");
		LED1_SET(0);	// 连接成功后指示灯亮起
        WiFiStatus.modeStatus=CMD_SEND;//?????????
		}
		break; 
		default:
			break;
	}
	memset(WiFiStatus.Recbuffer, 0, strlen((char *)WiFiStatus.Recbuffer));

}



http协议封装接口代码:
http.h

#ifndef __HTTP_H
#define __HTTP_H

#include "public.h"
//onenet云平台的设备信息
#define  devkey   "XXXXXXXXXXXXX"   //!< api-key(Master-APIkey)
#define  devid    "XXXXXXXXX"       //!< 设备id

unsigned int http_send_post(sensor_data senData);
unsigned int http_receive_response(void);
#endif

http.c

#include "http.h"
#include <stdio.h>
#include "usart.h"
static char sendPostPack[MAX_BUFF_SIZE]= {0};

unsigned int http_send_get() // 获取数据流,没写
{
	
	return 1;
}


unsigned int http_send_post(sensor_data senData) // 上传数据流
{
	unsigned char datastrem[256] = {0};
	
	sprintf(sendPostPack,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\napi-key:%s\r\nHost:api.heclouds.com\r\n",devid,devkey);
	u2_printf((char *)sendPostPack, strlen(sendPostPack));
	printf("%s",sendPostPack);
	memset(sendPostPack,0,MAX_BUFF_SIZE);
  	sprintf((char *)datastrem, "{'temp':%d,'humi':%d,'light':%d,'smoke':%d}\r\n",
				senData.temp_sen,senData.humi_sen,
				senData.light_status, senData.smoke_sen);
	sprintf((char *)sendPostPack, "Content-Length:%d\r\n\r\n%s",
					strlen((char *)datastrem),datastrem);
	u2_printf((char *)sendPostPack, strlen(sendPostPack));
	printf("%s",sendPostPack);

	memset(sendPostPack,0,MAX_BUFF_SIZE);
	if (http_receive_response()) {
		return 1;
	}
	return 0;
}

unsigned int http_receive_response(void) // 服务器响应信息
{
	if (strstr((const char*)WiFiStatus.Recbuffer,"succ")) {
		printf(" %s \r\n",WiFiStatus.Recbuffer);
		memset(WiFiStatus.Recbuffer, 0, strlen((char *)WiFiStatus.Recbuffer));
		return 1;
	}
	return 0;
}

main.c

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "public.h"
#include "sys_config.h"
#include "wifi.h"
#include "http.h"
#include "dht11.h"

sensor_data	g_senorData;
int main(void)
{
	unsigned int send_http_req = 0, adc_get_timer = 0, light_get_timer = 0, dht11_get_timer = 0;
	float smoke_sen;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	sys_config();
	
	TIM3_Init(199,7199);//设置20ms  
	usart_config(115200);
	usart2_config(115200);
	wifi_reset();
	while(1) {
		if (WiFiStatus.modeStatus != CMD_SEND) { // wifiÅäÖóõʼ»¯
			WiFi_WiFiconfig();
			delay_ms(5);
			WiFi_RecdataPut();
			delay_ms(5);
		} else {
			if ((get_time_ms() - adc_get_timer)> 3 * 1000) { // 3s采集一次烟雾数据
				smoke_sen = Get_Adc_Average(ADC_Channel_1,10);
				g_senorData.smoke_sen = (int)((smoke_sen / 4096) * 100);
				adc_get_timer = get_time_ms();
			}
			if ((get_time_ms() - dht11_get_timer)> 3 * 1000) {//采集一次温湿度数据
				DHT11_readData(&g_senorData.temp_sen, &g_senorData.humi_sen);
				dht11_get_timer = get_time_ms();
			}
			if ((get_time_ms() - light_get_timer)> 3 * 1000) {	
				if (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)) { 
					if (g_senorData.light_status == LIGHT_OFF) {
						GPIO_SetBits(GPIOA,GPIO_Pin_12);
						g_senorData.light_status = LIGHT_ON;
					}
				} else {
					if (g_senorData.light_status == LIGHT_ON) {
						GPIO_ResetBits(GPIOA,GPIO_Pin_12);
						g_senorData.light_status = LIGHT_OFF;
					}
				}
				light_get_timer = get_time_ms();
			}
			
			if ((get_time_ms() - send_http_req) > 10 * 1000) { //10s上传一次数据到云平台
				if (http_send_post(g_senorData)) {
					printf("\r\n[debug]----->> http request success !!!\r\n");
					send_http_req = get_time_ms();
				}
			}
			
		}
		
	}
}



代码自取,有不懂的可以评论或者私信,又看到就会回复
链接:https://pan.baidu.com/s/1AB6tblcSPNkGJCz2Er0Vhw?pwd=ptxp
提取码:ptxp
网址失效的话,评论或者私信留言!!!

欢迎大家的批评指正

### ESP01S 连接 OneNET 平台配置方法 #### 创建账号并登录OneNET平台 为了使ESP01S能够成功连接至OneNET平台,需先完成开发者账户注册,并进入OneNET物联网开放平台进行操作。在此平台上可获取设备所需的唯一身份标识与密钥等必要参数。 #### 注册产品和添加设备 在OneNET平台上创建一个新的产品条目,定义好产品的基本信息之后,按照指引进一步设置该类产品下的具体设备实例。对于每一个新增加的设备而言,都会分配唯一的Device ID以及激活码用于后续认证过程[^2]。 #### 准备硬件环境 确保拥有如下组件: - STM32系列单片机(本案例选用的是STM32F103RCT6) - Wi-Fi模块ESP8266(ESP-01S型号) 将上述提到的Wi-Fi模块通过串口通信接口与MCU相连,注意确认两者之间的工作电压匹配情况;通常情况下,默认波特率为9600bps。 #### 下载并安装必要的软件工具 从官方资源库或者其他可靠渠道获得适用于目标系统的固件烧录程序,比如ESPTOOL.py脚本文件可用于刷写ESP8266芯片上的初始镜像版本。另外还需准备支持MQTT协议的消息代理客户端应用来辅助开发调试工作,如MQTT.fx就是一个不错的选择[^1]。 #### 编译上传代码前准备工作 访问指定网址下载对应于所选微控制器架构优化过的源代码框架作为项目起点https://open.iot.10086.cn/bbs/thread-863-1-1.html 。解压压缩包后仔细阅读README文档了解整个工程结构布局特点及其依赖关系描述等内容介绍部分。 #### 修改配置项适应个人需求 编辑`config.h`头文件调整预处理器宏定义以适配实际应用场景中的网络参数设定、APIKEY以及其他个性化选项。特别要注意的地方在于如何正确填写由OneNET颁发给用户的三元组信息:Product Key, Device Name 和 Device Secret。 #### 实现核心功能逻辑编写 基于提供的模板继续完善业务处理流程的设计思路,重点围绕着初始化WiFi连接状态监测机制、建立安全可靠的传输通道等方面展开论述。当一切就绪以后就可以尝试发送一些简单的测试消息验证整体方案可行性了。 ```c #include "mqtt_client.h" void app_main(void){ // 初始化 WiFi 模块 wifi_init(); // 设置回调函数指针指向自定义事件响应例程地址处 esp_mqtt_set_event_handler(mqtt_event_handler); // 启动 MQTT 客户端服务进程 start_mqtt_client(MQTT_BROKER_URL,MQTT_PORT,"your_device_id","your_api_key"); } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值