ESP32 WIFI_AP_STA模式调用WiFi.begin时ESP-NOW发送失败求助
ESP32 WIFI_AP_STA模式下启用WiFi连接后ESP-NOW发送端误报失败问题
- 所用代码修改自Rui Santos的公开ESP-NOW教程
- 实现逻辑:通过ESP-NOW协议将ESP32发送端采集的读数传输至ESP32接收端,再由接收端向ESP32网页服务器发送HTML消息;根据教程指引,需将WiFi设置为
WIFI_AP_STA模式,同时支持两类WiFi连接方式 - 本次测试所用发送端、接收端代码见下文。
测试场景与现象
场景1:接收端仅配置WIFI_AP_STA模式,不调用WiFi.begin
- 操作:接收端设置为
WIFI_AP_STA模式,注释掉WiFi.begin代码行直接运行 - 发送端状态:发送成功
- 接收端状态:正常接收
- 测试结果:ESP-NOW消息从发送端到接收端传输完全正常,
WIFI_STA模式下运行效果一致。
场景2:接收端配置WIFI_AP_STA模式同时调用WiFi.begin连接路由器
- 操作:接收端设置为
WIFI_AP_STA模式,取消注释WiFi.begin(WiFiSSID, WiFiPassword)代码行,连接路由器实现向网页服务器发送消息的功能 - 发送端状态:发送失败
- 接收端状态:发送失败场景下的接收状态
- 测试结果:发送动作判定为失败,但接收端实际仍可正常收到数据;使用
WIFI_AP模式时也会出现完全相同的故障。初步判断在WIFI_AP_STA模式下调用WiFi.begin后,接收端会向发送端返回错误的状态响应。
现象总结
- 接收端使用
WIFI_AP_STA模式但不调用WiFi.begin时,ESP-NOW端到端传输完全符合预期。 - 接收端同时使用
WIFI_AP_STA模式和WiFi.begin功能时,发送端的ESP-NOW发送动作会判定为失败;后续补充网页功能代码后,HTML消息的发送可正常运行。 - 该故障可通过下方简化代码直接复现,当前使用的WiFi库版本为
WiFi@2.0.0。 - 已尝试多种排查思路均未解决问题,需可行的排查方向建议。
发送端代码
#include <Arduino.h> #include <WiFi.h> #include <esp_now.h> uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0xAA, 0x84, 0x10}; typedef struct struct_message { char ESP32NowText[33]; } struct_message; struct_message ESP32NowMessage; // String text = "AAA000010000200003000040000500006"; esp_now_peer_info_t peerInfo; // 数据发送回调函数 void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { Serial.print("\r\nLast Packet Send Status:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); } void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } esp_now_register_send_cb(OnDataSent); // 注册对等设备 memcpy(peerInfo.peer_addr, broadcastAddress, 6); peerInfo.channel = 0; peerInfo.encrypt = false; // 添加对等设备 if (esp_now_add_peer(&peerInfo) != ESP_OK) { Serial.println("Failed to add peer"); return; } } void loop() { strncpy(ESP32NowMessage.ESP32NowText, text.c_str(), text.length()); Serial.println("Msg to send:" + String(ESP32NowMessage.ESP32NowText)); Serial.println("Snd Len:" + String(sizeof(ESP32NowMessage))); // 通过ESP-NOW发送消息 esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&ESP32NowMessage, sizeof(ESP32NowMessage)); if (result == ESP_OK) { Serial.println("Sent with success"); } else { Serial.println("Error sending the data"); } delay(2000); }
接收端代码
#include <Arduino.h> #include <WiFi.h> #include <esp_now.h> typedef struct struct_message { char ESP32NowValues[33]; } struct_message; struct_message ESP32NowMessage; // 数据接收回调函数 void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) { memcpy(&ESP32NowMessage, incomingData, sizeof(ESP32NowMessage)); Serial.println("Bytes received: " + String(len)); Serial.println("Values:" + String(ESP32NowMessage.ESP32NowValues)); Serial.println("---------------------------------------"); } const char WiFiSSID[] = "SSID"; const char WiFiPassword[] = "PASSWORD"; // void setup() { Serial.begin(115200); WiFi.mode(WIFI_AP_STA); // WiFi.begin(WiFiSSID, WiFiPassword); // 初始化ESP-NOW if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } esp_now_register_recv_cb(OnDataRecv); } void loop() { }
内容的提问来源于stack exchange,提问作者ESP32Noob
相关产品推荐
相关产品推荐

