標(biāo)題:
基于STM32執(zhí)行的MQTT協(xié)議 源程序與資料下載
[打印本頁]
作者:
15961840023
時間:
2020-7-3 20:50
標(biāo)題:
基于STM32執(zhí)行的MQTT協(xié)議 源程序與資料下載
自己根據(jù)MQTT協(xié)議報文在STM32上成功運(yùn)行。
51hei.png
(11.2 KB, 下載次數(shù): 63)
下載附件
2020-7-3 22:40 上傳
單片機(jī)源程序如下:
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "xianshispi.h"
#include "MQTT_8266.H"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 大于printf重定向 */
uint8_t USART1_TX_BUF[200];
#define u1_printf(...) HAL_UART_Transmit(&huart1,USART1_TX_BUF,sprintf((char *)USART1_TX_BUF,__VA_ARGS__),0xffff)
uint8_t USART2_TX_BUF[200];
#define u2_printf(...) HAL_UART_Transmit(&huart2,USART2_TX_BUF,sprintf((char *)USART2_TX_BUF,__VA_ARGS__),0xffff)
/* esp8266加入的WIFI(熱點(diǎn))名稱和密碼 */
#define WIFI_Name "EnHahaha7"
#define WIFI_Key "hjj1234567890"
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint8_t Uart2_RX_Buf,WIFI_IP[15];
uint8_t num,Buf[150],time;
extern uint8_t Connect_Flag;
extern uint16_t MQTT_PING_Time; //PING報文計數(shù)變量
uint8_t PING_Flag;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* 連接WIFI程序 */
void ESP_Connect_WIFI()
{
char *Start;
char *End;
u1_printf("正在連接WIFI...\r\n");
u2_printf("AT\r\n"); //測試AT啟動
HAL_Delay(300);
u2_printf("AT+CWMODE=1\r\n"); //設(shè)置esp8266 STA模式
HAL_Delay(300);
u2_printf("AT+CWJAP_CUR=\"%s\",\"%s\"\r\n",WIFI_Name,WIFI_Key); //臨時接入WIFI(熱點(diǎn))
HAL_Delay(11000);
u2_printf("AT+CIFSR\r\n"); //獲取IP地址
HAL_Delay(300);
if(strstr((char *)Buf,"\"") != NULL) //軟檢測到IP地址,OLED顯示IP地址
{
//顯示IP地址
OLED_ShowString(0,0,"IP:",1);
Start = strstr((char *)Buf,"\"") + 1;
End = strstr(Start,"\"");
memcpy(WIFI_IP,Start,End - Start);
WIFI_IP[End - Start] = '\0';
OLED_ShowString(0,2,WIFI_IP,1);
//串口1打印熱點(diǎn)名、IP地址
u1_printf("WIFI Name:%s\nWIFI IP:%s\r\n",WIFI_Name,WIFI_IP);
}
else u1_printf("WIFI連接失敗");
}
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2,&Uart2_RX_Buf,1); //開啟串口2接收中斷
HAL_TIM_Base_Start_IT(&htim1); //開啟T1中斷
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
OLED_Init(); //OLED初始化
ESP_Connect_WIFI(); //ESP8266連接WIFI,并顯示在OLED
Connect_Sever(); //TCP連接服務(wù)器
MQTT_Conect(); //連接云平臺
MQTT_SUBSCRIBE(); //訂閱主題
// MQTT_PUBLISH("HJJ"); //發(fā)送消息
while (1)
{
if(PING_Flag == 1)
{
PING_Flag=0;
MQTT_PING(); //發(fā)送心跳包
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口接收中斷回調(diào)函數(shù)
{
if(huart == &huart2)
{
HAL_UART_Receive_IT(&huart2,&Uart2_RX_Buf,1);//開啟串口2接收中斷
Buf[num] = Uart2_RX_Buf;//將串口2接收到的數(shù)據(jù)存入Buf緩存區(qū)
num++;time=0;
}
}
//uint8_t i;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時器中斷回調(diào)函數(shù)
{
time++;
if(time>=20 && num>0)
{
Buf[num] = '\0';
MQTT_RxData((char *)Buf,num); //判斷串口2接收到的數(shù)據(jù)
// for(i=0;i<num;i++) u1_printf("%c",Buf[i]); //串口1打印串口2接收的數(shù)據(jù)
time=0;num=0;
}
if(Connect_Flag == 1) //只有在連接了云平臺且訂閱了主題才需要發(fā)送PING報文
{
MQTT_PING_Time++; //每隔10S發(fā)送一次心跳包,防止服務(wù)器將客戶端踢走
if(MQTT_PING_Time >= 40000)
{
PING_Flag=1;
MQTT_PING_Time=0;
}
}
}
/* USER CODE END 4 */
/**
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
MQTT_Demo.7z
(4.18 MB, 下載次數(shù): 122)
2020-7-3 22:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
MikeCai
時間:
2020-7-6 14:59
感恩 樓主,謝了,收藏
作者:
xzh5508
時間:
2024-9-2 09:26
謝謝分享,最近在用mqtt,剛好有用
作者:
mazj
時間:
2024-9-14 15:15
使用8266 MQTT
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1