我是靠谱客的博主 独特紫菜,最近开发中收集的这篇文章主要介绍零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三、STM32通过代码连接阿里云服务器)一、下载STM32工程文件二、解读STM32工程文件三、测试MQTT通讯四、实现阿里云控制STM32单片机LED灯的亮灭总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
要想实现通过代码实现STM32连入阿里云服务器,要首先实现使用AT指令通过串口连接阿里云,大家可以参考我之前的两篇文章,链接如下
链接: 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(一、给ESP12F烧写AT/MQTT固件)
链接: 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(二、创建阿里云平台并使用AT指令连接阿里云)
文章目录
- 一、下载STM32工程文件
- 二、解读STM32工程文件
- 1、默认接线方式
- 2、部分代码内容
- 三、测试MQTT通讯
- 四、实现阿里云控制STM32单片机LED灯的亮灭
- 总结
`
一、下载STM32工程文件
工程文件要用keil5 MDK打开,在烧录程序时会出现各种各样的问题,只要坚持百度,问题一般都可以解决。
代码下载地址
链接:https://pan.baidu.com/s/1gtDpW0-ecaXMYNBSTA-ENQ
提取码:5542
说明:我的工程文件是在ai-thinker下载的示例代码进行修改得来。
二、解读STM32工程文件
1、默认接线方式
UASRT3: 连接USB转TTL模块,用来打印信息(自己可以改用其他串口)
UASRT3: 用来与ESP12F通信
STM32引脚 | 连接说明 |
---|---|
GPIOA2 | 连接ESPF12的RX引脚 |
GPIOA3 | 连接ESPF12的TX引脚 |
GPIOA4 | 连接ESPF12的RST引脚 |
GPIOA5 | 连接ESPF12的EN引脚 |
GPIOB10 | 连接USB转TTL的RX引脚 |
GPIOB11 | 连接USB转TTL的TX引脚 |
注意:ESP12F的GPIO15引脚仍要接地。
2、部分代码内容
- mqtt.h(此部分代码需要大家自行修改)
#ifndef __MQTT_H
#define __MQTT_H
#include "stm32f10x.h"
/*
*以下参数需要用户自行修改才能测试用过
*/
#define User_ESP8266_SSID
"abgo"
//wifi名字
#define User_ESP8266_PWD
"1234567889"
//wifi密码
#define User_ESP8266_client_id
"12345|securemode=3\,signmethod=hmacsha1|"
//MQTTclientID 用于标志client身份
最长256字节
#define User_ESP8266_username
"STM32F103C8T6&gvksFxpgc8R"
//用于登录 MQTT 服务器 的 username, 最长 64 字节
#define User_ESP8266_password
"A256A5DE1F22B4EAB28CA00974D115D074169E9F"
//用于登录 MQTT 服务器 的 password, 最长 64 字节
#define User_ESP8266_MQTTServer_IP
"gvksFxpgc8R.iot-as-mqtt.cn-shanghai.aliyuncs.com"
//MQTT本地服务器IP或者域名
#define User_ESP8266_MQTTServer_PORT
1883
//服务器端口号
//自定义Topic
#define User_ESP8266_MQTTServer_Topic
"/gvksFxpgc8R/STM32F103C8T6/user/test"
//属性上报
#define User_ESP8266_MQTTServer_Topic_Property_Post
"/sys/gvksFxpgc8R/STM32F103C8T6/thing/event/property/post"
#define User_ESP8266_MQTTServer_Topic_Property_Post_Reply "/sys/gvksFxpgc8R/STM32F103C8T6/thing/event/property/post_reply"
//属性设置
#define User_ESP8266_MQTTServer_Topic_Property_Set
"/sys/gvksFxpgc8R/STM32F103C8T6/thingrvice/propertyt"
#define User_ESP8266_MQTTServer_Topic_Property_Set_Reply "/sys/gvksFxpgc8R/STM32F103C8T6/thingrvice/propertyt_reply"
//事件上报
#define User_ESP8266_MQTTServer_Topic_Event_Post
"/sys/gvksFxpgc8R/STM32F103C8T6/thing/event/${tsl.event.identifier}/post"
#define User_ESP8266_MQTTServer_Topic_Event_Post_Reply
"/sys/gvksFxpgc8R/STM32F103C8T6/thing/event/${tsl.event.identifier}/post_reply"
//服务调用
#define User_ESP8266_MQTTServer_Topic_Service_Post
"/sys/gvksFxpgc8R/STM32F103C8T6/thingrvice/${tsl.service.identifier}"
#define User_ESP8266_MQTTServer_Topic_Service_Post_Reply "/sys/gvksFxpgc8R/STM32F103C8T6/thingrvice/${tsl.service.identifier}_reply"
extern volatile uint8_t MQTTClosedFlag;
//连接状态标志
extern volatile uint8_t MQTTReceiveFlag;
//接收数据标志
void ESP8266_STA_MQTTClient_Link(void);
//MQTT连接阿里云服务器
void Wait_SUB(void);
//等待接收消息并对消息进行解析
#endif
- mqtt.c(其中void Wait_SUB()这个函数是对接收到的数据进行解析,用到了两个很有用的函数strstr函数和atoi函数,大家可以在哔哩哔哩上观看一下我链接里老师讲的课,思路很清晰,讲的很棒。)
链接: https://www.bilibili.com/video/BV1zR4y1G79f?spm_id_from=333.999.0.0
#include "mqtt.h"
#include "esp8266.h"
#include "usart.h"
#include "delay.h"
#include <stdlib.h>
#include "led.h"
volatile u8 MQTTClosedFlag = 0;
volatile u8 MQTTReceiveFlag = 0;
void ESP8266_STA_MQTTClient_Link(void)
//MQTT连接阿里云
{
printf("正在配置 ESP8266 MQTT ...rn");
ESP8266_AT_Test();
//恢复出厂默认
ESP8266_Net_Mode_Choose(STA);
//配置热点信息
while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD));
ESP8266_MQTTUSERCFG(User_ESP8266_client_id,User_ESP8266_username,User_ESP8266_password);
ESP8266_MQTTCONN( User_ESP8266_MQTTServer_IP, User_ESP8266_MQTTServer_PORT);
ESP8266_MQTTSUB( User_ESP8266_MQTTServer_Topic);
ESP8266_MQTTSUB(User_ESP8266_MQTTServer_Topic_Property_Set);
ESP8266_MQTTSUB( User_ESP8266_MQTTServer_Topic_Property_Set_Reply);
ESP8266_MQTTSUB( User_ESP8266_MQTTServer_Topic_Property_Post_Reply);
printf("ESP8266 MQTT 配置完成 ...rn");
ESP8266_Fram_Record_Struct.InfAll = 0;
}
void ESP8266_STA_MQTTClient_Pub(void)
//通过topic给MQTT服务器发送消息
{
char mqtt_message[1024];
char str[128] = {0};
//STM32向阿里云发送消息
memset(str, sizeof(str),0);
memset(mqtt_message,sizeof(mqtt_message),0);
//sprintf(str,"PowerSwitch:1");//格式化发送字符串到MQTT服务器
//MQTT_SendString (User_ESP8266_MQTTServer_Topic,str);//发送数据到MQTT服务器
//sprintf(mqtt_message,"{\"method\":\"thing.service.property.post\"\,\"id\":\"2012934115\"\,\"params\":{\"PowerSwitch\":1}\,\"version\":\"1.0.0\"}");
//MQTT_SendString (User_ESP8266_MQTTServer_Topic_Property_Post,mqtt_message);//发送数据到MQTT服务器
}
void Wait_SUB(void)
//STM32接收阿里云发来的消息并对消息进行解析
{
char *ret;
char str[20];
int
val;
if(MQTTReceiveFlag == 1)
//判断是否接收到TCP网络数据
{
printf("Message From ESP8266 : %srn",ESP8266_Fram_Record_Struct .Data_RX_BUF);
printf("Length Of Message
: %drn",ESP8266_Fram_Record_Struct.InfBit.FramLength);
ret=strstr(ESP8266_Fram_Record_Struct .Data_RX_BUF,"PowerSwitch");
/rstr函数是找到powerSwitch指针位置
if(ret!=NULL)
{
//printf("This is : %srn",ret);
//测试
str[0]=*(ret+13);
//将powerswith后边的数字提取到str中(但是1此时还是字符型)
str[1]='