要想實(shí)現(xiàn)通過(guò)代碼實(shí)現(xiàn)STM32連入阿里云服務(wù)器,要首先實(shí)現(xiàn)使用AT指令通過(guò)串口連接阿里云,大家可以參考我之前的兩篇文章,鏈接如下
鏈接: 零基礎(chǔ)STM32+ESP12F+MQTT連接阿里云服務(wù)器完整流程(一、給ESP12F燒寫(xiě)AT/MQTT固件)
鏈接: 零基礎(chǔ)STM32+ESP12F+MQTT連接阿里云服務(wù)器完整流程(二、創(chuàng)建阿里云平臺(tái)并使用AT指令連接阿里云)
`
一、下載STM32工程文件
工程文件要用keil5 MDK打開(kāi),在燒錄程序時(shí)會(huì)出現(xiàn)各種各樣的問(wèn)題,只要堅(jiān)持百度,問(wèn)題一般都可以解決。
代碼下載地址
鏈接:https://pan.baidu.com/s/1gtDpW0-ecaXMYNBSTA-ENQ
提取碼:5542
說(shuō)明:我的工程文件是在ai-thinker下載的示例代碼進(jìn)行修改得來(lái)。
二、解讀STM32工程文件
1、默認(rèn)接線方式
UASRT3: 連接USB轉(zhuǎn)TTL模塊,用來(lái)打印信息(自己可以改用其他串口)
UASRT3: 用來(lái)與ESP12F通信
STM32引腳 | 連接說(shuō)明 |
---|---|
GPIOA2 | 連接ESPF12的RX引腳 |
GPIOA3 | 連接ESPF12的TX引腳 |
GPIOA4 | 連接ESPF12的RST引腳 |
GPIOA5 | 連接ESPF12的EN引腳 |
GPIOB10 | 連接USB轉(zhuǎn)TTL的RX引腳 |
GPIOB11 | 連接USB轉(zhuǎn)TTL的TX引腳 |
注意:ESP12F的GPIO15引腳仍要接地。
2、部分代碼內(nèi)容
- mqtt.h(此部分代碼需要大家自行修改)
#ifndef __MQTT_H
#define __MQTT_H
#include "stm32f10x.h"
/*
*以下參數(shù)需要用戶(hù)自行修改才能測(cè)試用過(guò)
*/
#define User_ESP8266_SSID "abgo" //wifi名字
#define User_ESP8266_PWD "1234567889" //wifi密碼
#define User_ESP8266_client_id "12345|securemode=3\\,signmethod=hmacsha1|" //MQTTclientID 用于標(biāo)志client身份 最長(zhǎng)256字節(jié)
#define User_ESP8266_username "STM32F103C8T6&gvksFxpgc8R" //用于登錄 MQTT 服務(wù)器 的 username, 最長(zhǎng) 64 字節(jié)
#define User_ESP8266_password "A256A5DE1F22B4EAB28CA00974D115D074169E9F" //用于登錄 MQTT 服務(wù)器 的 password, 最長(zhǎng) 64 字節(jié)
#define User_ESP8266_MQTTServer_IP "gvksFxpgc8R.iot-as-mqtt.cn-shanghai.aliyuncs.com" //MQTT本地服務(wù)器IP或者域名
#define User_ESP8266_MQTTServer_PORT 1883 //服務(wù)器端口號(hào)
//自定義Topic
#define User_ESP8266_MQTTServer_Topic "/gvksFxpgc8R/STM32F103C8T6/user/test"
//屬性上報(bào)
#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"
//屬性設(shè)置
#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"
//事件上報(bào)
#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"
//服務(wù)調(diào)用
#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; //連接狀態(tài)標(biāo)志
extern volatile uint8_t MQTTReceiveFlag; //接收數(shù)據(jù)標(biāo)志
void ESP8266_STA_MQTTClient_Link(void); //MQTT連接阿里云服務(wù)器
void Wait_SUB(void); //等待接收消息并對(duì)消息進(jìn)行解析
#endif
- mqtt.c(其中void Wait_SUB()這個(gè)函數(shù)是對(duì)接收到的數(shù)據(jù)進(jìn)行解析,用到了兩個(gè)很有用的函數(shù)strstr函數(shù)和atoi函數(shù),大家可以在嗶哩嗶哩上觀看一下我鏈接里老師講的課,思路很清晰,講的很棒。)
鏈接: 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(); //恢復(fù)出廠默認(rèn)
ESP8266_Net_Mode_Choose(STA); //配置熱點(diǎn)信息
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) //通過(guò)topic給MQTT服務(wù)器發(fā)送消息
{
char mqtt_message[1024];
char str[128] = {0};
//STM32向阿里云發(fā)送消息
memset(str, sizeof(str),0);
memset(mqtt_message,sizeof(mqtt_message),0);
//sprintf(str,"PowerSwitch:1");//格式化發(fā)送字符串到MQTT服務(wù)器
//MQTT_SendString (User_ESP8266_MQTTServer_Topic,str);//發(fā)送數(shù)據(jù)到MQTT服務(wù)器
//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);//發(fā)送數(shù)據(jù)到MQTT服務(wù)器
}
void Wait_SUB(void) //STM32接收阿里云發(fā)來(lái)的消息并對(duì)消息進(jìn)行解析
{
char *ret;
char str[20];
int val;
if(MQTTReceiveFlag == 1) //判斷是否接收到TCP網(wǎng)絡(luò)數(shù)據(jù)
{
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函數(shù)是找到powerSwitch指針位置
if(ret!=NULL)
{
//printf("This is : %s\r\n",ret); //測(cè)試
str[0]=*(ret+13); //將powerswith后邊的數(shù)字提取到str中(但是1此時(shí)還是字符型)
str[1]='\0';
//printf("This is str : %s\r\n",str); //測(cè)試
val=atoi(str); //atoi函數(shù)是將字符型數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制數(shù)字1或者0
//printf("This is val : %d\r\n",val); //測(cè)試
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接收標(biāo)志,準(zhǔn)備接收下一條消息
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(); // 配置系統(tǒng)時(shí)鐘為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(); //測(cè)試串口通訊
//ESP8266_STA_TCPClient_UnvarnishSend_Test(); //測(cè)試TCP透?jìng)髂J酵ㄓ? //ESP8266_STA_TCPClient_Test(); //測(cè)試TCP非透?jìng)髂J酵ㄓ?
while(1)
{
delay_ms(60000);
//ESP8266_STA_MQTTClient_Pub(); //通過(guò)topic給阿里云發(fā)送消息
Wait_SUB(); //檢測(cè)阿里云發(fā)送的消息并顯示
}
}
三、測(cè)試MQTT通訊
- 將程序燒錄進(jìn)STM32中,并打開(kāi)串口調(diào)試助手??梢钥吹酱诖蛴〕鱿?img src="https://imgs.yssmx.com/Uploads/2023/05/438377-1.png" alt="零基礎(chǔ)STM32+ESP12F+MQTT連接阿里云服務(wù)器完整流程(三、STM32通過(guò)代碼連接阿里云服務(wù)器)" referrerpolicy="no-referrer" />
- 我們發(fā)布和接收到的所有數(shù)據(jù)都可以在日志服務(wù)中看到,其中物理型模型可以在設(shè)備中看到并且實(shí)時(shí)刷新
四、實(shí)現(xiàn)阿里云控制STM32單片機(jī)LED燈的亮滅
我大概做了一個(gè)流程圖來(lái)解釋阿里云控制LED亮滅的過(guò)程(APP端大家可以進(jìn)一步學(xué)習(xí))這個(gè)過(guò)程主要在mqtt.c中的void Wait_SUB()函數(shù)中,大家可以認(rèn)真學(xué)習(xí)一下代碼。
下面是我的一個(gè)演示視頻: 在阿里云上發(fā)布"PowerSwitch":1,LED燈亮;發(fā)布"PowerSwitch":0,LED燈滅。(具體發(fā)布什么消息大家可以在代碼中改)
阿里云控制STM32的LED等亮滅
我是從零基礎(chǔ)學(xué)習(xí),自己不斷摸索完成的。主要參考了下面兩位大佬的文章
鏈接: 菜鳥(niǎo)小阿江
鏈接: 「已注銷(xiāo)」文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-438377.html
總結(jié)
整個(gè)過(guò)程沒(méi)有很復(fù)雜,但是會(huì)一直出現(xiàn)很多的小問(wèn)題,不要放棄,堅(jiān)持百度,所有的問(wèn)題都會(huì)被解決。
另外,大家也可以進(jìn)一步學(xué)習(xí)APP或者微信小程序的開(kāi)發(fā),可以通過(guò)APP端來(lái)進(jìn)行控制,我也打算在考研過(guò)后作進(jìn)一步的學(xué)習(xí)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438377.html
到了這里,關(guān)于零基礎(chǔ)STM32+ESP12F+MQTT連接阿里云服務(wù)器完整流程(三、STM32通過(guò)代碼連接阿里云服務(wù)器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!