esp now 的坑

博主在尝试使用ESP8266的ESPNow协议进行无线通信时,发现其稳定性不佳,无法确保数据传输的可靠性。经过排查和查阅官方文档,了解到ESPNow本身并不保证数据传输的稳定性,这与最初的预期相悖。博主提醒开发者在使用该协议时需自行实现数据确认机制以确保数据传递成功。

由于实际需要,今天试了一下 esp now 这种方式在两块esp8266 nodemcu 情况下进行通信。

结果发觉稳定性奇差无比,也就是说esp now进行数据传输的时候不能保证传输的稳定性。必须自己想办法来保证数据传到了另外一个设备

说实话,这是没有压根想到的,最初还以为是什么AP STA ,CONTROL 和Slave 之类的配置问题,以及是不是距离的问题,折腾了很久找原因。

直到看到官方文档才明白这其实不是保证稳定的协议;它只是一种看起来很方便的协议,但是协议本身不保证稳定性,大哭!

官方的说明如下:

 

 

 

07-21
ESP-NOW 是一种由 Espressif 开发的低功耗、快速连接的无线通信协议,特别适用于 ESP32 系列芯片。该协议允许设备在无需建立 Wi-Fi 连接的情况下直接进行点对点通信,从而降低了延迟并提高了效率。ESP-NOW 被广泛应用于物联网(IoT)设备、传感器网络和智能家居系统中。 ### 协议特点 - **低功耗**:ESP-NOW 协议设计用于低功耗场景,非常适合电池供电的设备。 - **快速连接**:由于不需要完整的 Wi-Fi 连接过程,ESP-NOW 的连接速度非常快。 - **安全性**:支持 AES 加密,可以实现安全的数据传输。 - **多设备支持**:支持多个设备之间的通信,可以配置为单播、组播或广播模式。 ### 使用场景 - 传感器网络:例如温度、湿度、光照传感器之间的数据传输。 - 智能家居:遥控器与智能设备之间的通信。 - 工业自动化:用于设备之间的实时通信。 ### 实现步骤 在 ESP32 上实现 ESP-NOW 通信,通常需要以下几个步骤: 1. **初始化 Wi-Fi 模块**:即使 ESP-NOW 不需要完整的 Wi-Fi 连接,仍然需要初始化 Wi-Fi 模块。 2. **初始化 ESP-NOW**:调用 `esp_now_init()` 函数来初始化 ESP-NOW。 3. **注册发送和接收回调函数**:通过 `esp_now_register_send_cb()` 和 `esp_now_register_recv_cb()` 注册回调函数来处理发送和接收的数据。 4. **添加对等设备**:使用 `esp_now_add_peer()` 函数添加目标设备的 MAC 地址,以便进行通信。 5. **发送数据**:通过 `esp_now_send()` 函数发送数据。 ### 示例代码 以下是一个简单的 ESP-NOW 发送数据的示例代码: ```cpp #include <esp_now.h> #include <WiFi.h> // 定义接收设备的 MAC 地址 uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 发送数据的结构体 typedef struct struct_message { int x; int y; } struct_message; struct_message myData; // 发送回调函数 void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { Serial.print("Last Packet Send Status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); } void setup() { // 初始化串口 Serial.begin(115200); // 设置 Wi-Fi 模式为 STA WiFi.mode(WIFI_STA); // 初始化 ESP-NOW if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } // 注册发送回调函数 esp_now_register_send_cb(OnDataSent); // 添加对等设备 esp_now_peer_info_t peerInfo; 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() { // 设置要发送的数据 myData.x = random(0, 100); myData.y = random(0, 100); // 发送数据 esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); // 延迟 1 秒 delay(1000); } ``` ### 注意事项 - **MAC 地址**:确保正确配置目标设备的 MAC 地址。可以使用 `ESP_MAC_WIFI_STA` 或 `ESP_MAC_WIFI_SOFTAP` 来获取设备的 MAC 地址 [^3]。 - **加密**:如果需要安全通信,可以在 `esp_now_peer_info_t` 结构体中启用加密,并设置相应的密钥。 - **信道**:确保发送设备和接收设备在相同的 Wi-Fi 信道上。 ### 调试和优化 - **调试**:使用串口打印调试信息,检查发送和接收的回调函数是否正常工作。 - **优化**:根据具体应用场景调整数据包的大小和发送频率,以降低功耗和提高传输效率。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值