零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三、STM32通过代码连接阿里云服务器)

零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三、STM32通过代码连接阿里云服务器)STM32 通过代码连接阿里云服务器

`

一、下载STM32工程文件

工程文件要用keil5 MDK打开,在烧录程序时会出现各种各样的问题,只要坚持百度,问题一般都可以解决。

二、解读STM32工程文件

1、默认接线方式

STM32引脚 连接说明
GPIOA2 连接ESPF12的RX引脚
GPIOA3 连接ESPF12的TX引脚
GPIOA4 连接ESPF12的RST引脚
GPIOA5 连接ESPF12的EN引脚
GPIOB10 连接USB转TTL的RX引脚
GPIOB11 连接USB转TTL的TX引脚

注意:ESP12F的GPIO15引脚仍要接地。

2、部分代码内容

  1. mqtt.h(此部分代码需要大家自行修改)
#ifndef __MQTT_H #define __MQTT_H #include "stm32f10x.h" /* *以下参数需要用户自行修改才能测试用过 */ #define User_ESP8266_SSID "abgo" //wifi名字 #define User_ESP8266_PWD "" //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 
  1. 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 
  
    #include "led.h" volatile u8 MQTTClosedFlag = 0; volatile u8 MQTTReceiveFlag = 0; void ESP8266_STA_MQTTClient_Link(void) //MQTT连接阿里云 { printf("正在配置 ESP8266 MQTT ...\r\n"); 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 配置完成 ...\r\n"); 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\\\":\\\"\\\"\\,\\\"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 : %s\r\n",ESP8266_Fram_Record_Struct .Data_RX_BUF); printf("Length Of Message : %d\r\n",ESP8266_Fram_Record_Struct.InfBit.FramLength); ret=strstr(ESP8266_Fram_Record_Struct .Data_RX_BUF,"PowerSwitch"); /rstr函数是找到powerSwitch指针位置 if(ret!=NULL) { //printf("This is : %s\r\n",ret); //测试 str[0]=*(ret+13); //将powerswith后边的数字提取到str中(但是1此时还是字符型) str[1]='\0'; //printf("This is str : %s\r\n",str); //测试 val=atoi(str); //atoi函数是将字符型数据转换为十进制数字1或者0 //printf("This is val : %d\r\n",val); //测试 if(val==0) { LED1( OFF ); // 灭 delay_ms(50000); } else if(val==1) { LED1( ON ); // 亮 delay_ms(50000); } } } ESP8266_Fram_Record_Struct.InfAll = 0; //清空ESP8266_Fram_Record_Struct接收标志,准备接收下一条消息 MQTTReceiveFlag = 0; } 
  
  1. main.c
#include "stm32f10x.h" #include "stm32f10x_it.h" #include "stdio.h" #include "string.h" #include "delay.h" #include "usart.h" #include "esp8266.h" #include "tcp.h" #include "mqtt.h" #include "led.h" int main(void) { SystemInit(); // 配置系统时钟为72M LED_GPIO_Config(); //LED 端口初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); uart3_Init(); ESP8266_Init(); ESP8266_STA_MQTTClient_Link(); //MQTT连接阿里云 //UASRT3_RX_TX_TEST(); //测试串口通讯 //ESP8266_STA_TCPClient_UnvarnishSend_Test(); //测试TCP透传模式通讯 //ESP8266_STA_TCPClient_Test(); //测试TCP非透传模式通讯 while(1) { delay_ms(60000); //ESP8266_STA_MQTTClient_Pub(); //通过topic给阿里云发送消息 Wait_SUB(); //检测阿里云发送的消息并显示 } } 

三、测试MQTT通讯

  1. 将程序烧录进STM32中,并打开串口调试助手。可以看到串口打印出消息在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述




  2. 我们发布和接收到的所有数据都可以在日志服务中看到,其中物理型模型可以在设备中看到并且实时刷新在这里插入图片描述

四、实现阿里云控制STM32单片机LED灯的亮灭

我大概做了一个流程图来解释阿里云控制LED亮灭的过程(APP端大家可以进一步学习)这个过程主要在mqtt.c中的void Wait_SUB()函数中,大家可以认真学习一下代码。在这里插入图片描述
下面是我的一个演示视频: 在阿里云上发布”PowerSwitch”:1,LED灯亮;发布”PowerSwitch”:0,LED灯灭。(具体发布什么消息大家可以在代码中改)

零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三、STM32通过代码连接阿里云服务器)

阿里云控制STM32的LED等亮灭

总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210895.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:39
下一篇 2026年3月18日 下午11:40


相关推荐

  • Unity之协程

    Unity之协程老早就对Unity这个功能产生了强烈的好奇,今天就要把这块骨头给啃了。目前我对协程的理解相当于有点像线程,但它实际上不是线程。话不多说先来个代码给个初印象:一、开启协程:我在Unity下创建了一个Cube(随便什么物体都行),然后把我的cs文件挂载上去。点击Unity上的开始按钮,运行:代码如下:usingSystem.Collections;usingSystem…

    2022年6月21日
    70
  • java基础—java的Io操作学习(3)

    学习Io操作(3),javaIo文件的复制!

    2022年2月24日
    50
  • 仿QQ聊天室项目_仿QQ程序设计与开发

    仿QQ聊天室项目_仿QQ程序设计与开发创建普通Java项目并创建model、view、tools、common四个包在view下创建QqClientLogin.java/***功能:qq客户端登录界面*/packagecom.qq.client.view;importjavax.swing.*;importjava.awt.*;importjava.awt.e…

    2025年9月8日
    7
  • 方差及常见分布的方差计算与推导公式_超几何分布的期望和方差

    方差及常见分布的方差计算与推导公式_超几何分布的期望和方差1.介绍方差定义和性质2.离散型随机变量(01分布,二项分布,泊松分布,几何分布,超几何分布)和连续型随机变量(均匀分布,指数分布,正态分布)分布的方差计算以及推导过程,并汇总形成表格,方便查阅和记录

    2026年1月14日
    5
  • ASP.NET跳转网页的三种方法的比较(转+修)

    ASP.NET跳转网页的三种方法的比较(转+修)方法1response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护。但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端。需要注意的是跳转后内部空间保存的所…

    2022年7月20日
    18
  • 大疆网上测评题库_大疆科技题目

    大疆网上测评题库_大疆科技题目Const:1、定义常量(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。TYPEconstValueName=value;constTYPEValueName=value;(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进…

    2022年6月16日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号