[MM32硬件] 【灵动微电子MM32F0121测评】11、外接WIFI模块实现MQTT云数据上传

[复制链接]
 楼主| sujingliang 发表于 2025-6-18 19:21 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2025-6-18 21:29 编辑

WIFI模块采用大夏龙雀的DX- WF24模块,主控BK7238,支持MQTT协议。

MQTT服务选用巴法云:https://cloud.bemfa.com/。
主要的原因是试用免费,接入比较简单。缺点只支持 MQTT3.1.1 协议。

11.png

MM32F0121使用USART2与wifi模块通讯,printf重定向到USART1做为LogTx。

1、DX- WF24 主要的AT指令

设置 Station需连接的 AP
AT+CWJAP=<ssid>,<pwd>

设置 Station需连接的 AP
AT+CWJAP=<ssid>,<pwd>

设置 MQTT 客户端 ID
AT+MQTTLONGCLIENTID=<client_id>

连接 MQTT 服务器
AT+MQTTCONN=<host>,<port>,<reconnect>

发布 MQTT 主题消息
AT+MQTTPUBRAW=<topic>,<length>, <qos>,<retain>

订阅 MQTT 主题
AT+MQTTSUB=<topic>,<qos>

2、巴法云准备
新建一个MQTT设备或者像我这样利用以前用过的设备主题:WATER004,
这个设备负责ADC采样值的分发。比如MCU通过WIFI模块将采集到的ADC数据发布到巴法云上,用户可以通过手机上的巴法APP获得该数据。
12.png

3、软件部分
1)USART配置
  1. //RX:PA9;TX:PA10
  2. void USART2_Configure(uint32_t Baudrate)
  3. {
  4.     GPIO_InitTypeDef  GPIO_InitStruct;
  5.     USART_InitTypeDef USART_InitStruct;

  6.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  7.     USART_StructInit(&USART_InitStruct);
  8.     USART_InitStruct.USART_BaudRate   = Baudrate;
  9.     USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  10.     USART_InitStruct.USART_StopBits   = USART_StopBits_1;
  11.     USART_InitStruct.USART_Parity     = USART_Parity_No;
  12.     USART_InitStruct.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
  13.     USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  14.     USART_Init(USART2, &USART_InitStruct);

  15.    
  16.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  17.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_3);
  18.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_3);

  19.     GPIO_StructInit(&GPIO_InitStruct);
  20.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10;
  21.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  22.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  23.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  24.     GPIO_StructInit(&GPIO_InitStruct);
  25.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9;
  26.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_FLOATING;
  27.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  28.                
  29.     USART_Cmd(USART2, ENABLE);
  30. }
2)封装一个TX_Polling函数
  1. void USART_TxData_Polling(uint8_t *Buffer, uint8_t Length)
  2. {
  3.     uint8_t i = 0;

  4.     for (i = 0; i < Length; i++)
  5.     {
  6.         USART_SendData(USART2, Buffer[i]);

  7.         while (RESET == USART_GetFlagStatus(USART2, USART_FLAG_TC))
  8.         {
  9.         }
  10.     }
  11.     printf("TX:%s,Length:%d\r\n",Buffer,Length);
  12. }
3)发送AT指令的函数
  1. void send_at_command(const char *cmd,uint16_t time_out_ms)
  2. {
  3.     // 添加AT前缀和终止符
  4.     char full_cmd[128];
  5.     snprintf(full_cmd, sizeof(full_cmd), "%s\r\n", cmd);
  6.                
  7.     USART_TxData_Polling((uint8_t*)full_cmd,strlen(full_cmd));
  8.     PLATFORM_DelayMS(time_out_ms); // 等待模块响应
  9. }
4)USART接收RX函数
  1. uint16_t receive_response(char *buffer, uint16_t size, uint32_t timeout_ms)
  2. {
  3.     uint32_t start_time = GetTick();  // 使用 SysTick 或 TIMx 计时
  4.     uint16_t received = 0;

  5.     while (received < size)
  6.     {
  7.         if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)
  8.         {
  9.             buffer[received++] = USART_ReceiveData(USART2);
  10.         }
  11.         else if (GetTick() - start_time >= timeout_ms)
  12.         {
  13.             break;  // 超时,返回已接收的字节数
  14.         }
  15.     }

  16.     return received;  // 返回实际接收的字节数
  17. }
5)配网及MQTT配置
  1. void configure_wifi(void)
  2. {
  3.         char response[256];
  4.         
  5.         //重启
  6.         send_at_command("AT+RST",1500);
  7.         receive_response(response, sizeof(response),500);
  8.         printf("%s\r\n",response);
  9.         
  10.         //查询是否自动连接wifi
  11.         send_at_command("AT+CWSTATE?",1500);
  12.         receive_response(response, sizeof(response),500);
  13.         printf("%s\r\n",response);
  14.         if (strstr(response, "+CWSTATE:2") == NULL)
  15.         {
  16.                 //连接wifi
  17.                 send_at_command("AT+CWJAP=ssid,password",1500);
  18.                 receive_response(response, sizeof(response),500);
  19.                 printf("%s\r\n",response);
  20.         }
  21.         
  22.         //设置MQTT clientID
  23.         send_at_command("AT+MQTTLONGCLIENTID=1892ce3cc45c43a39f66b9b8xxxxxxxx",1500);
  24.         receive_response(response, sizeof(response),500);
  25.         printf("%s\r\n",response);
  26.         
  27.         //连接巴法云
  28.         send_at_command("AT+MQTTCONN=bemfa.com,9501,0",1500);
  29.         receive_response(response, sizeof(response),500);
  30.         printf("%s\r\n",response);
  31.         
  32.         //up 指令:向主题WATER004/推送数据。只更新云端数据,不进行任何推送
  33.         //发布者**n
  34.         send_at_command("AT+MQTTPUBRAW=WATER004/up,7,0,0",1500);
  35.         receive_response(response, sizeof(response),500);
  36.         printf("%s\r\n",response);
  37.         
  38.         send_at_command("**n",1500);
  39.         //receive_response(response, sizeof(response),500);
  40.         
  41.         //订阅 MQTT 主题
  42.         send_at_command("AT+MQTTSUB=WATER004,0",1500);
  43.         receive_response(response, sizeof(response),500);
  44.         printf("%s\r\n",response);
  45.         
  46.         //发布 MQTT 主题消息,先发1个数字25做为测试
  47.         send_at_command("AT+MQTTPUBRAW=WATER004,4,0,0",1500);
  48.         receive_response(response, sizeof(response),500);
  49.         printf("%s\r\n",response);
  50.         
  51.         send_at_command("25",1500);
  52.         
  53. }
6)发送ADC采样的测试程序
  1. void wifi_mqtt_Sample(void)
  2. {
  3.         uint8_t  i   = 0;
  4.         uint32_t Sum1 = 0;
  5.         uint32_t Sum2 = 0;
  6.         uint32_t Sum3 = 0;
  7.         float    Voltage1;//,Voltage2, Voltage3;
  8.         
  9.         char cmd[50];
  10.         char response[256];
  11.         
  12.         ADC_Configure();
  13.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  14.         
  15.         USART2_Configure(115200);
  16.         configure_wifi();
  17.         
  18.         while(1)
  19.         {
  20.                 if (0 != ADC_DMA_InterruptFlag)
  21.         {
  22.             ADC_DMA_InterruptFlag = 0;

  23.             Sum1 = 0;
  24.                                                 Sum2 = 0;
  25.                                                 Sum3 = 0;
  26.             for (i = 0; i < 30; i++)
  27.             {
  28.                                                         if(i%3==0){
  29.                                                                 Sum1 += ADC_Buffer[i];
  30.                                                         }else if(i%3==1){
  31.                                                                 Sum2 += ADC_Buffer[i];
  32.                                                         }else{
  33.                                                                 Sum3 += ADC_Buffer[i];
  34.                                                         }
  35.             }

  36.             Voltage1 = (float)Sum1 / (float)10.0 * (float)3.3 / (float)4096.0;
  37.                                                 
  38.                         //AT+MQTTPUBRAW发布 MQTT 主题消息
  39.                         sprintf(cmd,"AT+MQTTPUBRAW=WATER004,%d,0,0",6);
  40.       send_at_command(cmd,500);
  41.                         receive_response(response, sizeof(response),500);
  42.       sprintf(cmd,"%.2f",Voltage1);
  43.       send_at_command(cmd,500);
  44.                         receive_response(response, sizeof(response),500);
  45.                
  46.                         PLATFORM_LED_Toggle(LED1);
  47.                         PLATFORM_LED_Toggle(LED2);
  48.                                                 
  49.                         PLATFORM_DelayMS(1000);
  50.                                         }
  51.         }
  52. }
4、效果

调整开发板上的电位器,ADC采集数据发生变化,通过MQTT发送给巴法云。
通过巴法app可以获得ADC数据。

3.jpg
4.jpg

MQTTX接收订阅:
13.png

手机APP:
tutieshi_480x853_8s.gif

AdaMaYun 发表于 2025-7-31 17:56 | 显示全部楼层
外接WIFI模块实现MQTT云数据上传
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部