失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三 STM32通过代码连接阿里云服务器)

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

时间:2020-04-16 12:04:55

相关推荐

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

要想实现通过代码实现STM32连入阿里云服务器,要首先实现使用AT指令通过串口连接阿里云,大家可以参考我之前的两篇文章,链接如下

链接: 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(一、给ESP12F烧写AT/MQTT固件)

链接: 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(二、创建阿里云平台并使用AT指令连接阿里云)

文章目录

一、下载STM32工程文件二、解读STM32工程文件1、默认接线方式2、部分代码内容三、测试MQTT通讯四、实现阿里云控制STM32单片机LED灯的亮灭总结

`

一、下载STM32工程文件

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

代码下载地址

链接:/s/1gtDpW0-ecaXMYNBSTA-ENQ

提取码:5542

说明:我的工程文件是在ai-thinker下载的示例代码进行修改得来。

二、解读STM32工程文件

1、默认接线方式

UASRT3: 连接USB转TTL模块,用来打印信息(自己可以改用其他串口)

UASRT3: 用来与ESP12F通信

注意: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本地服务器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函数,大家可以在哔哩哔哩上观看一下我链接里老师讲的课,思路很清晰,讲的很棒。)

链接: /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 ...\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\\\":\\\"934115\\\"\\,\\\"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;}

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(115200);ESP8266_Init(115200);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通讯

将程序烧录进STM32中,并打开串口调试助手。可以看到串口打印出消息

我们发布和接收到的所有数据都可以在日志服务中看到,其中物理型模型可以在设备中看到并且实时刷新

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

我大概做了一个流程图来解释阿里云控制LED亮灭的过程(APP端大家可以进一步学习)这个过程主要在mqtt.c中的void Wait_SUB()函数中,大家可以认真学习一下代码。

下面是我的一个演示视频: 在阿里云上发布"PowerSwitch":1,LED灯亮;发布"PowerSwitch":0,LED灯灭。(具体发布什么消息大家可以在代码中改)

阿里云控制STM32的LED等亮灭

我是从零基础学习,自己不断摸索完成的。主要参考了下面两位大佬的文章

链接: 菜鸟小阿江

链接: 「已注销」

总结

整个过程没有很复杂,但是会一直出现很多的小问题,不要放弃,坚持百度,所有的问题都会被解决。

另外,大家也可以进一步学习APP或者微信小程序的开发,可以通过APP端来进行控制,我也打算在考研过后作进一步的学习。

如果觉得《零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三 STM32通过代码连接阿里云服务器)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。