你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 ESP8266刷固件-模式设置-HAL库移植MQTT

[复制链接]
STMCU小助手 发布时间:2022-4-12 10:00
(一)模式设置
ESP8266有两种模式,AP和Station。可设置为AP、Station、AP&Station三种工作模式。
AP模式:无线接入点,例如路由器。
Station:AP的Client模式,例如手机连接路由器,手机就是Station模式。

1、AP模式设置
设置为AP模式:
AT+AT+CWMODE_DEF=2

设置WIFI名、密码、通道、加密方式、最大连接数:
AT+CWSAP_DEF="esp8266-ap","1234567890",5,3,1

设置WIFI的IP地址、网关、掩码:
AT+CIPAP_DEF="192.168.166.4.1","192.168.4.1","255.255.255.0"

重启使配置生效(选做,如果命令不带DEF字样,此步骤不需要):
AT+RST

开启WIFI多连接:
AT+CIPMUX=1

开启WIFI服务器:
AT+CIPSERVER=1

AP模式ESP8266数据接收并解析:

  1. void WIFI_APModeRecvHanler(void)
  2. {
  3.         if (WIFI_RX_STA & 0x8000)
  4.         {
  5.                 char* start = NULL;
  6.                 const char* header = "+IPD,0,";

  7.                 if ((start = strstr((const char *) WIFI_RX_BUF, header)) != NULL)
  8.                 {
  9.                         if ((start = strstr((const char *) start, ":")) != NULL)
  10.                         {
  11.                                 uint32_t datalen = WIFI_RX_STA & 0x3FFF;
  12.                                 const uint8_t* dataptr = (uint8_t *) (start + 1);
  13.                                 WIFI_RX_BUF[datalen] = '\0';
  14.                                 printf("tcp:%s\r\n", dataptr);
  15.                         }
  16.                 }
  17.                 WIFI_RX_STA = 0;
  18.         }
  19. }
复制代码

2、Station模式与透传
设置为Station模式:
AT+CWMODE_DEF=1

加入路由器:
AT+CWJAP_DEF="路由器WIFI名","密码"

重启配置生效(不带DEF字样,此步骤不需要):
AT+RST

关闭多连接(多连接模式关闭才能开启透传):
AT+CIPMUX=0

设置为透传模式:
AT+CIPMODE=1

连接到服务器:
AT+CIPSTART="TCP","服务器IP地址",服务器端口号

进入透传模式:
AT+CIPSEND

退出透传模式(不加回车):
+++

(二)固件更新

ESP8266-01S引脚说明:
}BLU1E7[]43ME0@2A`DD3@4.png

所以ESP8266-01S刷机需要将GPIO0拉低,接线图如下:

{XQZ[4B8CQW_RZZH00I{6MX.png
注意:如果点击start后,一直处于等待上电同步,需要我们拉低一下复位引脚,或者直接断电再上电。

刷AT固件配置:

2019111109583540.png

刷MQTT固件配置:


`){8BO8KL2F3}RAR8RB(PDG.png

(三)STM32移植MQTT
平台:战舰mini板(stm32f03rb)
软件版本:STM32CUBEMX V5.3、TrueSTUDIO V9.3
MQTT服务器:emqx
效果:stm32订阅主题led_control,数据为on和off,以此来控制mini板上的led灯。


注意:ESP8266需要首先初始化为Station模式并进入透传。

嵌入式移植工作比较简单,只需要修改transport文件的硬件驱动读写函数即可,打开和关闭
函数暂时不需要。MQTTClient.c和MQTTClient.h文件是我自己编写,可根据需要自行修改。完整目录如下图所示:

O)3QOP(Y3EHTNMWPF~{X4DK.png

transport.c
  1. #include "../inc/transport.h"
  2. #include "../Inc/usart.h"
  3. #include "../Inc/main.h"
  4. #include "../Inc/app.h"

  5. int transport_sendPacketBuffer(unsigned char* buf, int buflen)
  6. {
  7.         if (HAL_UART_Transmit(&huart3, (uint8_t *) buf, buflen, 0xFFFF) == HAL_OK)
  8.                 return buflen;
  9.         return 0;
  10. }

  11. int transport_getdata(unsigned char* buf, int count)
  12. {
  13.         static uint32_t index = 0;
  14.         uint32_t datalen = WIFI_RX_STA & 0x3FFF;

  15.         if (WIFI_RX_STA & 0x8000)
  16.         {
  17.                 if(datalen >= count)
  18.                 {
  19.                         memcpy(buf, WIFI_RX_BUF + index, count);
  20.                         index += count;
  21.                         if(index == datalen)
  22.                         {
  23.                                 WIFI_RX_STA = 0;
  24.                                 index = 0;
  25.                         }
  26.                         return count;
  27.                 }
  28.         }
  29.         return 0;
  30. }
复制代码

MQTTClient.c
  1. /*
  2. * MQTTClient.c
  3. *
  4. *  Created on:
  5. *      Author:
  6. */

  7. #include "../inc/MQTTClient.h"
  8. #include "../Inc/app.h"

  9. uint8_t MQTT_ClientConnect(const void* clientId, const void* username, const void* password, uint16_t keepalive, bool cleansession)
  10. {
  11.         int len = 0;
  12.         int buflen = 256;
  13.         uint8_t buf[256];
  14.         uint8_t sessionPresent, connack_rc;
  15.         MQTTPacket_connectData data = MQTTPacket_connectData_initializer;

  16.         data.clientID.cstring = (char *) clientId;
  17.         data.keepAliveInterval = keepalive;
  18.         data.cleansession = cleansession;
  19.         data.username.cstring = (char *) username;
  20.         data.password.cstring = (char *) password;
  21.         data.MQTTVersion = 4;

  22.         if ((len = MQTTSerialize_connect((unsigned char *) buf, buflen, &data)) <= 0)
  23.                 return 1;

  24.         WIFI_RX_STA = 0;
  25.         if (transport_sendPacketBuffer(buf, len) != len)
  26.                 return 2;

  27.         delay_ms(1000);

  28.         if (MQTTPacket_read(buf, buflen, transport_getdata) != CONNACK)
  29.                 return 3;

  30.         if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)
  31.                 return 4;

  32.         return 0;
  33. }

  34. uint8_t MQTT_ClientPublish(const void* topic, const void* data)
  35. {
  36.         uint8_t buf[256];
  37.         MQTTString topicString = MQTTString_initializer;
  38.         int len = 0;

  39.         topicString.cstring = (char *) topic;
  40.         if ((len = MQTTSerialize_publish((uint8_t *) buf, sizeof(buf), 0, 0, 0, 0,
  41.                         topicString, (uint8_t*) data, strlen((const char*) data))) <= 0)
  42.                 return 1;
  43.         if (transport_sendPacketBuffer(buf, len) != len)
  44.                 return 2;
  45.         return 0;
  46. }

  47. uint8_t MQTT_ClientSubscribe(const void* topic, int qos)
  48. {
  49.         uint8_t buf[200] =
  50.         { 0 };
  51.         uint32_t buflen = sizeof(buf);
  52.         uint32_t len = 0;
  53.         uint16_t packetid;
  54.         int maxcount = 1;
  55.         int count;
  56.         int grantedQoSs;
  57.         MQTTString topicString = MQTTString_initializer;
  58.         topicString.cstring = (char *) topic;

  59.         if ((len = MQTTSerialize_subscribe(buf, buflen, 0, 1, 1, &topicString, &qos)) <= 0)
  60.                 return 1;

  61.         WIFI_RX_STA = 0;
  62.         if (transport_sendPacketBuffer(buf, len) != len)
  63.                 return 2;

  64.         delay_ms(1000);

  65.         if (MQTTPacket_read(buf, buflen, transport_getdata) != SUBACK)
  66.                 return 3;

  67.         if (MQTTDeserialize_suback(&packetid, maxcount, &count, &grantedQoSs, buf, buflen) == 0)
  68.                 return 4;

  69.         return 0;
  70. }

  71. extern bool G_isConnected;

  72. void MQTT_RecvParser(void)
  73. {
  74.         size_t topiclen = 0;
  75.         size_t datalen = 0;
  76.         static uint8_t topic[0xFF];
  77.         static uint8_t message[0xFF];
  78.         static const uint8_t* buf = WIFI_RX_BUF;

  79.         if(G_isConnected == true)
  80.         {
  81.                 if (WIFI_RX_STA & 0x8000)
  82.                 {
  83.                         WIFI_RX_BUF[WIFI_RX_STA & 0x3FFF] = '\0';
  84.                         if(strstr((char *)WIFI_RX_BUF, "CLOSED") != 0)
  85.                         {
  86.                                 G_isConnected = false;
  87.                                 WIFI_RX_STA = 0;
  88.                                 return;
  89.                         }

  90.                         topiclen = buf[3];
  91.                         datalen = buf[1] - buf[3] - 2;
  92.                         memcpy((char *) topic, (const char *) (buf + 4), topiclen);
  93.                         memcpy((char *) message, (const char *) (buf + 4 + topiclen), datalen);

  94.                         topic[topiclen] = '\0';
  95.                         message[datalen] = '\0';

  96.                         if(strncmp(TOPIC_LED, (const char *)topic, strlen(TOPIC_LED)) == 0)
  97.                         {
  98.                                 if(strncmp(MSG_LED_ON, (const char *)message, strlen(MSG_LED_ON)) == 0)
  99.                                 {
  100.                                         HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
  101.                                 }else if(strncmp(MSG_LED_OFF, (const char *)message, strlen(MSG_LED_OFF)) == 0){
  102.                                         HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
  103.                                 }
  104.                         }

  105.                         printf("\r\n");
  106.                         printf("topic:%s\r\ndara:%s\r\n", (char *) topic, (char *) message);
  107.                         WIFI_RX_STA = 0;
  108.                 }
  109.         }
  110. }
复制代码

main.c

20191111102717276.png

ends…



收藏 评论0 发布时间:2022-4-12 10:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版