找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2007|回复: 1
收起左侧

基于STM32执行的MQTT协议 源程序与资料下载

[复制链接]
ID:473679 发表于 2020-7-3 20:50 | 显示全部楼层 |阅读模式
自己根据MQTT协议报文在STM32上成功运行。
51hei.png
单片机源程序如下:
  1. /* USER CODE END Header */

  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"
  4. #include "tim.h"
  5. #include "usart.h"
  6. #include "gpio.h"

  7. /* Private includes ----------------------------------------------------------*/
  8. /* USER CODE BEGIN Includes */

  9. #include "string.h"
  10. #include "xianshispi.h"
  11. #include "MQTT_8266.H"

  12. /* USER CODE END Includes */

  13. /* Private typedef -----------------------------------------------------------*/
  14. /* USER CODE BEGIN PTD */

  15. /* USER CODE END PTD */

  16. /* Private define ------------------------------------------------------------*/
  17. /* USER CODE BEGIN PD */

  18. /* 大于printf重定向 */
  19. uint8_t USART1_TX_BUF[200];
  20. #define u1_printf(...)  HAL_UART_Transmit(&huart1,USART1_TX_BUF,sprintf((char *)USART1_TX_BUF,__VA_ARGS__),0xffff)
  21.                                                                                                                                                                        
  22. uint8_t USART2_TX_BUF[200];
  23. #define u2_printf(...)  HAL_UART_Transmit(&huart2,USART2_TX_BUF,sprintf((char *)USART2_TX_BUF,__VA_ARGS__),0xffff)

  24. /* esp8266加入的WIFI(热点)名称和密码 */
  25. #define WIFI_Name         "EnHahaha7"
  26. #define WIFI_Key                "hjj1234567890"

  27. /* USER CODE END PD */

  28. /* Private macro -------------------------------------------------------------*/
  29. /* USER CODE BEGIN PM */

  30. /* USER CODE END PM */

  31. /* Private variables ---------------------------------------------------------*/

  32. /* USER CODE BEGIN PV */

  33. uint8_t Uart2_RX_Buf,WIFI_IP[15];
  34. uint8_t num,Buf[150],time;
  35. extern uint8_t Connect_Flag;
  36. extern uint16_t MQTT_PING_Time;                        //PING报文计数变量
  37. uint8_t PING_Flag;

  38. /* USER CODE END PV */

  39. /* Private function prototypes -----------------------------------------------*/
  40. void SystemClock_Config(void);
  41. /* USER CODE BEGIN PFP */

  42. /* 连接WIFI程序 */
  43. void ESP_Connect_WIFI()
  44. {
  45.         char *Start;
  46.         char *End;
  47.         u1_printf("正在连接WIFI...\r\n");
  48.        
  49.         u2_printf("AT\r\n");                                                                                                                                                                                //测试AT启动
  50.         HAL_Delay(300);
  51.         u2_printf("AT+CWMODE=1\r\n");                                                                                                                                                //设置esp8266 STA模式
  52.         HAL_Delay(300);
  53.         u2_printf("AT+CWJAP_CUR=\"%s\",\"%s\"\r\n",WIFI_Name,WIFI_Key);        //临时接入WIFI(热点)
  54.         HAL_Delay(11000);
  55.         u2_printf("AT+CIFSR\r\n");                                                                                                                                                        //获取IP地址
  56.         HAL_Delay(300);
  57.        
  58.         if(strstr((char *)Buf,"\"") != NULL)                                //软检测到IP地址,OLED显示IP地址
  59.         {
  60.                 //显示IP地址
  61.                 OLED_ShowString(0,0,"IP:",1);       
  62.                 Start = strstr((char *)Buf,"\"") + 1;
  63.                 End = strstr(Start,"\"");
  64.                 memcpy(WIFI_IP,Start,End - Start);
  65.                 WIFI_IP[End - Start] = '\0';
  66.                 OLED_ShowString(0,2,WIFI_IP,1);
  67.                
  68.                 //串口1打印热点名、IP地址
  69.                 u1_printf("WIFI Name:%s\nWIFI IP:%s\r\n",WIFI_Name,WIFI_IP);
  70.         }
  71.         else u1_printf("WIFI连接失败");
  72. }
  73.                                                                                                                                                                        
  74. /* USER CODE END PFP */

  75. /* Private user code ---------------------------------------------------------*/
  76. /* USER CODE BEGIN 0 */

  77. /* USER CODE END 0 */

  78. /**
  79.   * @brief  The application entry point.
  80.   * @retval int
  81.   */
  82. int main(void)
  83. {
  84.   /* USER CODE BEGIN 1 */
  85.        
  86.   /* USER CODE END 1 */

  87.   /* MCU Configuration--------------------------------------------------------*/

  88.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  89.   HAL_Init();

  90.   /* USER CODE BEGIN Init */

  91.   /* USER CODE END Init */

  92.   /* Configure the system clock */
  93.   SystemClock_Config();

  94.   /* USER CODE BEGIN SysInit */

  95.   /* USER CODE END SysInit */

  96.   /* Initialize all configured peripherals */
  97.   MX_GPIO_Init();
  98.   MX_USART1_UART_Init();
  99.   MX_USART2_UART_Init();
  100.   MX_TIM1_Init();
  101.   /* USER CODE BEGIN 2 */

  102.         HAL_UART_Receive_IT(&huart2,&Uart2_RX_Buf,1);        //开启串口2接收中断
  103.         HAL_TIM_Base_Start_IT(&htim1);                                                                //开启T1中断

  104.   /* USER CODE END 2 */

  105.   /* Infinite loop */
  106.   /* USER CODE BEGIN WHILE */
  107.         OLED_Init();                                //OLED初始化
  108.        
  109.         ESP_Connect_WIFI();        //ESP8266连接WIFI,并显示在OLED
  110.        
  111.         Connect_Sever();                //TCP连接服务器
  112.         MQTT_Conect();                        //连接云平台
  113.        
  114.         MQTT_SUBSCRIBE();                //订阅主题

  115. //        MQTT_PUBLISH("HJJ");                        //发送消息
  116.   while (1)
  117.   {
  118.                 if(PING_Flag == 1)
  119.                 {
  120.                         PING_Flag=0;
  121.                         MQTT_PING();                        //发送心跳包
  122.                 }
  123.     /* USER CODE END WHILE */

  124.     /* USER CODE BEGIN 3 */
  125.   }
  126.   /* USER CODE END 3 */
  127. }

  128. /**
  129.   * @brief System Clock Configuration
  130.   * @retval None
  131.   */
  132. void SystemClock_Config(void)
  133. {
  134.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  135.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  136.   /**Initializes the CPU, AHB and APB busses clocks
  137.   */
  138.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  139.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  140.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  141.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  142.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  143.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  144.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  145.   {
  146.     Error_Handler();
  147.   }
  148.   /**Initializes the CPU, AHB and APB busses clocks
  149.   */
  150.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  151.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  152.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  153.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  154.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  155.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  156.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  157.   {
  158.     Error_Handler();
  159.   }
  160. }

  161. /* USER CODE BEGIN 4 */

  162. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口接收中断回调函数
  163. {
  164.         if(huart == &huart2)
  165.         {
  166.                 HAL_UART_Receive_IT(&huart2,&Uart2_RX_Buf,1);//开启串口2接收中断
  167.                 Buf[num] = Uart2_RX_Buf;//将串口2接收到的数据存入Buf缓存区
  168.                 num++;time=0;
  169.         }
  170. }

  171. //uint8_t i;
  172. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器中断回调函数
  173. {
  174.         time++;
  175.         if(time>=20 && num>0)
  176.         {
  177.                 Buf[num] = '\0';
  178.                 MQTT_RxData((char *)Buf,num);                //判断串口2接收到的数据
  179. //                for(i=0;i<num;i++) u1_printf("%c",Buf[i]);                                //串口1打印串口2接收的数据
  180.                 time=0;num=0;
  181.         }
  182.        
  183.         if(Connect_Flag == 1)        //只有在连接了云平台且订阅了主题才需要发送PING报文
  184.         {
  185.                 MQTT_PING_Time++;                //每隔10S发送一次心跳包,防止服务器将客户端踢走
  186.                 if(MQTT_PING_Time >= 40000)
  187.                 {
  188.                         PING_Flag=1;
  189.                         MQTT_PING_Time=0;
  190.                 }       
  191.         }
  192. }

  193. /* USER CODE END 4 */

  194. /**
  195. ……………………

  196. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
MQTT_Demo.7z (4.18 MB, 下载次数: 87)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:764088 发表于 2020-7-6 14:59 | 显示全部楼层
感恩 楼主,谢了,收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表