零基础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打开,在烧录程序时会出现各种各样的问题,只要坚持百度,问题一般都可以解决。

    代码下载地址
    链接: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、部分代码内容

    1. 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
    
    
    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 <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\\\":\\\"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 : %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(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通讯

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

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

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

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

    阿里云控制STM32的LED等亮灭

    我是从零基础学习,自己不断摸索完成的。主要参考了下面两位大佬的文章
    链接: 菜鸟小阿江
    链接: 「已注销」

    总结

    整个过程没有很复杂,但是会一直出现很多的小问题,不要放弃,坚持百度,所有的问题都会被解决。
    另外,大家也可以进一步学习APP或者微信小程序的开发,可以通过APP端来进行控制,我也打算在考研过后作进一步的学习。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 零基础STM32+ESP12F+MQTT连接阿里云服务器完整流程(三、STM32通过代码连接阿里云服务器)

    发表评论