ESP-NOW 通讯 MAC 地址失败

问题描述 投票:0回答:1

我对 ESP32 板之间的 ESP-NOW 通信有疑问。我有一个简单的发送者/接收者代码。我遇到的问题是关于 MAC 地址。如果我使用广播地址 0xFF 0xFF...,我会收到传递成功消息,但如果我使用接收者的 MAC 地址,我会收到传递失败消息。我三次检查了 MAC 地址,但仍然不起作用。你们能帮我解决这个问题吗?

发件人代码:

#include <WiFi.h>
#include <esp_now.h>

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0x10, 0xAA, 0xBB, 0xCC, 0x33, 0xF5};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  char a[32];
  int b;
  float c;
  bool d;
} struct_message;

// Create a struct_message called myData
struct_message myData;

esp_now_peer_info_t peerInfo;

// callback when data is sent
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() {
  // Init Serial Monitor
  Serial.begin(115200);

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);

  // Register peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;

  // Add peer
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
}

void loop() {
  // Set values to send
  strcpy(myData.a, "THIS IS A CHAR");
  myData.b = random(1, 20);
  myData.c = 1.2;
  myData.d = false;

  // Send message via ESP-NOW
  esp_err_t result =
      esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));

  if (result == ESP_OK) {
    Serial.println("Sent with success");
  } else {
    Serial.println("Error sending the data");
  }
  delay(2000);
}

接收器代码:

#include <WiFi.h>
#include <esp_now.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
  char a[32];
  int b;
  float c;
  bool d;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// callback function that will be executed when data is received
void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("Char: ");
  Serial.println(myData.a);
  Serial.print("Int: ");
  Serial.println(myData.b);
  Serial.print("Float: ");
  Serial.println(myData.c);
  Serial.print("Bool: ");
  Serial.println(myData.d);
  Serial.println();
}

void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);
}

void loop() {}

我想看到消息一直发送成功。

protocols esp32
1个回答
0
投票

您提供的代码对于两个 ESP32 设备之间的基本 ESP-NOW 通信来说似乎基本正确。但是,由于您提到可以使用广播地址 (0xFF:0xFF:0xFF:0xFF:0xFF:0xFF) 成功发送数据,但不能使用接收者的 MAC 地址发送数据,因此导致此问题的原因可能有多种。以下是您可以采取的一些故障排除步骤:

  1. 验证 MAC 地址: 仔细检查您是否使用了正确的接收器 MAC 地址。它应该与您想要通信的 ESP32 的实际 MAC 地址匹配。一个错误的数字都会导致投递失败。

  2. 确保两个设备都在通信范围内: ESP-NOW 通过无线电波运行,因此请确保发送器和接收器设备都在彼此的通信范围内。如果距离太远或有障碍物,可能会导致投递失败。

  3. 检查 MAC 地址过滤: 某些路由器或接入点启用了 MAC 地址过滤,这可能会阻止 ESP-NOW 通信。确保您的网络上禁用 MAC 地址过滤或将其配置为允许 ESP32 的 MAC 地址。

  4. 检查 Wi-Fi 通道干扰: ESP-NOW 在 2.4 GHz ISM 频段运行,该频段可能会挤满 Wi-Fi 和其他无线设备。所选频道上的干扰可能会中断通信。尝试将发送方和接收方的通道 (peerInfo.channel) 更改为拥塞程度较低的通道。

  5. 使用不同的 ESP32 设备进行测试:如果您可以访问多个 ESP32 设备,请尝试在不同的设备对之间进行通信,看看问题是否仍然存在。这可以帮助确定问题是否特定于一台设备。

  6. 更新 ESP-NOW 库: 确保您使用的是最新的 ESP-NOW 库。有时,库更新可以解决错误或提高兼容性。

  7. 检查其他代码的干扰: 确保代码或库中没有其他部分干扰 ESP-NOW 通信。冲突的代码可能会导致意外的行为。

  8. 调试:要获取有关失败的更多信息,您可以在代码中添加其他调试语句。例如,您可以打印您尝试发送到的 MAC 地址,并将其与接收者的 MAC 地址进行比较,以验证它们是否匹配。

通过仔细检查这些要点并执行一些故障排除,您应该能够识别使用接收器 MAC 地址时传送失败的原因,并确保 ESP32 设备之间的成功通信。

© www.soinside.com 2019 - 2024. All rights reserved.