手把手教你完成STM32连接阿里云平台,代码开源
手把手教你完成STM32连接阿里云平台,代码开源
本文将详细介绍如何使用STM32单片机连接阿里云平台,实现数据上传与接收。通过使用ESP32-01S模块作为WiFi通信模块,结合MQTT协议,可以实现单片机与云平台之间的数据交互。本文将从硬件连接、软件配置到代码实现,为您提供一个完整的解决方案。
一、概要
本项目的目标是使用STM32单片机连接阿里云平台,实现数据上传与接收。具体来说,我们将使用STM32F103ZET6作为主控芯片,通过串口通信与ESP32-01S WiFi模块进行数据交互,最终实现与阿里云平台的连接。
二、整体架构流程
项目 | 详细说明 |
---|---|
主控 | STM32F103ZET6 |
通信 | 串口通信,波特率:115200、数据位:8、停止位:1、校验:None |
开发软件 | STM32CubeMX |
硬件 | ESP32-01S |
将ESP32-01S单片机串口连接到STM32串口二,使用AT指令控制WiFi模块,连接阿里云平台。
三、软件流程
3.1 STM32CubeMX生成基础软件
- 选择主芯片,这里选择STM32F103ZET6,根据实际情况选择其他型号。
- 配置调试口
这里需要配置为图中所示,使用STLink仿真器,也可以使用Jlink。
- 配置时钟
使用外部8M晶振,系统时钟为72M。
- 串口配置
配置串口,波特率115200,可以配置串口DMA。
以上就是基础工程配置,输出用Keil编程框架。
3.2 ESP32-01S初始化及配置
使用AT指令控制ESP32-01S模块:
指令 | 说明 | 实例 |
---|---|---|
AT | 测试AT启动 | 返回OK |
AT+RST | 重启模块 | 返回OK |
AT+GMR | 查看版本信息 | 返回8位版本号 |
AT+CWJAP="WiFi名字","密码" | 连接WiFi | |
AT+CWAUTOCONN=1 | 设置开机自动连入WiFi | |
AT+CIPMUX=1 | 设置单连接 | |
AT+CIOBAUD=115200 | 修改波特率 |
- 串口调试助手测试
发送复位指令,串口会返回相应指令。
- 连接WiFi热点
需要将模块固件更新为MQTT固件。连接流程如下:
- 发送指令:AT+RST
- 发送指令:AT+RESTORE
- 发送指令:AT+CWMODE=1
- 发送指令:AT+CWJAP="wifi名字","wifi密码"
3.3 STM32软件实现
通过串口发送字符串的参考程序:
void ESP8266_SendString(uint8_t *str,uint8_t len)
{
uint8_t i=0;
for(i=0;i<len;i++)
{
USART2->DR = *str;
str++;
HAL_Delay(1);
}
}
uint8_t ESP8266_SendCmd(uint8_t *cmd,uint8_t *res)
{
uint8_t num = 200;
ESP8266_Clear();
ESP8266_SendString(cmd,strlen((const char *)cmd));
while(num--)
{
if(strstr((const char*)esp_buff,(const char *)res)!=NULL)
{
ESP8266_Clear();
return 0;
}
HAL_Delay(10);
}
return 1;
}
连接WiFi的实现:
#define WIFI_NAME "spx24" // WiFi名
#define WIFI_PASS "52xiaobai999" // WiFi密码
void ESP8266_Init(void)
{
HAL_UART_Receive_DMA(&huart2,esp_buff,ESPBUFF_MAX_SIZE);
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
while(ESP8266_SendCmd("AT+RST\r\n", "ready"))
while(ESP8266_SendCmd("AT\r\n","OK")){}
while(ESP8266_SendCmd("AT+CWMODE=1\r\n","OK")){}
while(ESP8266_SendCmd("AT+CWJAP=\""WIFI_NAME"\",\""WIFI_PASS"\"\r\n","OK")){}
}
连接阿里云的实现:
#define ALI_USERNAME "xxx&k1v5xYRUyUn"
#define ALICLIENTLD "xxx"
#define ALI_PASSWD "xxx"
#define ALI_MQTT_HOSTURL "xxx"
#define ALI_PORT "1883"
#define ALI_TOPIC_SET "/sys/k1v5xYRUyUn/xxx/thing/service/property/set"
#define ALI_TOPIC_POST "/sys/k1v5xYRUyUn/xxx/thing/event/property/post"
void Ali_Yun_Init(void)
{
while(ESP8266_SendCmd("AT+MQTTUSERCFG=0,1,\"NULL\",\""ALI_USERNAME"\",\""ALI_PASSWD"\",0,0,\"\"\r\n","OK")){}
HAL_Delay(10);
while(ESP8266_SendCmd("AT+MQTTCLIENTID=0,\""ALICLIENTLD"\"\r\n","OK")){}
while(ESP8266_SendCmd("AT+MQTTCONN=0,\""ALI_MQTT_HOSTURL"\",1883,1\r\n","OK")){}
Ali_Yun_Topic();
}
void Ali_Yun_Topic(void)
{
while(ESP8266_SendCmd("AT+MQTTSUB=0,\""ALI_TOPIC_SET"\",0\r\n","OK")){}
while(ESP8266_SendCmd("AT+MQTTSUB=0,\""ALI_TOPIC_POST"\",0\r\n","OK")){}
}
上传数据至云平台的实现:
void Ali_Yun_Send(void)
{
uint8_t msg_buf[1024];
uint8_t params_buf[1024];
uint8_t data_value_buf[24];
uint16_t move_num = 0;
cJSON *send_cjson = NULL;
char *str = NULL;
int i=0;
cJSON *params_cjson = NULL;
memset(msg_buf,0,sizeof(msg_buf));
memset(params_buf,0,sizeof(params_buf));
memset(data_value_buf,0,sizeof(data_value_buf));
send_cjson = cJSON_CreateObject();
params_cjson = cJSON_CreateObject();
cJSON_AddNumberToObject(params_cjson,"temperature",temp_value++);
cJSON_AddNumberToObject(params_cjson,"Humidity",humi_value++);
cJSON_AddItemToObject(send_cjson, "params", params_cjson);
cJSON_AddItemToObject(send_cjson,"version",cJSON_CreateString("1.0.0"));
str = cJSON_PrintUnformatted(send_cjson);
for(i=0;*str!='\0';i++)
{
params_buf[i] = *str;
if(*(str+1)=='"'||*(str+1)==',')
{
params_buf[++i] = '\\';
}
str++;
move_num++;
}
str = str - move_num;
sprintf((char *)msg_buf,"AT+MQTTPUB=0,\""ALI_TOPIC_POST"\",\"%s\",0,0\r\n",params_buf);
ESP8266_SendCmd(msg_buf,"OK");
ESP8266_Clear();
cJSON_Delete(send_cjson);
if(str!=NULL)
{
free(str);
str = NULL;
}
}
四、技术细节
4.1 MQTT
MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。MQTT协议传输的最小报文只有两个字节。在MQTT协议中,有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。消息的发布者和订阅者都是客户端,消息代理是服务器。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
- Topic:可以理解为消息的类型,订阅者订阅后,就会收到该主题的消息内容(payload)
- payload:可以理解为消息的内容,是指订阅者具体要使用的内容
在本项目中,单片机上传数据时作为发布者,接收数据时作为订阅者。
4.2 cJson
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON具有简洁和清晰的层次结构,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON语法规则:
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号{}容纳对象
- 方括号[]容纳数组
例如:
{
"information": {
"school": "编程大学",
"grade": 4,
"专业": "软件工程"
}
}
在本项目中,使用cJson库来处理JSON数据,实现数据的上传和接收。
小结
本文提供了一个简单的STM32连接阿里云平台的实例,内容包括硬件连接、软件配置和代码实现。通过本项目,可以实现以下功能:
- 完成真实的数据上传,例如温湿度、GPS定位、烟雾等
- 云平台下发指令控制设备,如开灯、关灯、控制电机等
- 编写App对接平台,实现远程控制
- 通过云平台进行IAP升级
希望本文能帮助您快速掌握STM32连接阿里云平台的开发方法。如果在学习过程中遇到问题,欢迎在评论区留言交流。
本文原文来自CSDN