问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

手把手教你完成STM32连接阿里云平台,代码开源

创作时间:
作者:
@小白创作中心

手把手教你完成STM32连接阿里云平台,代码开源

引用
CSDN
1.
https://m.blog.csdn.net/qq_42722796/article/details/143305283

本文将详细介绍如何使用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生成基础软件

  1. 选择主芯片,这里选择STM32F103ZET6,根据实际情况选择其他型号。
  2. 配置调试口

这里需要配置为图中所示,使用STLink仿真器,也可以使用Jlink。

  1. 配置时钟

使用外部8M晶振,系统时钟为72M。

  1. 串口配置

配置串口,波特率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
修改波特率
  1. 串口调试助手测试

发送复位指令,串口会返回相应指令。

  1. 连接WiFi热点

需要将模块固件更新为MQTT固件。连接流程如下:

  1. 发送指令:AT+RST
  2. 发送指令:AT+RESTORE
  3. 发送指令:AT+CWMODE=1
  4. 发送指令: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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号