ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
espnow_platform_esp32.cpp
Go to the documentation of this file.
1#include "espnow_platform.h"
2
3#ifdef USE_ESP32
4
5#include "espnow_component.h"
6
7#include <esp_idf_version.h>
8#include <esp_now.h>
9#include <esp_wifi.h>
10
11#include <cstring>
12
14
15static void on_data_received(const esp_now_recv_info_t *info, const uint8_t *data, int size) {
16 global_esp_now->packet_received(info->src_addr, info->des_addr, data, size, info->rx_ctrl->rssi,
17 info->rx_ctrl->timestamp);
18}
19
20#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
21static void on_send_report(const esp_now_send_info_t *info, esp_now_send_status_t status) {
22 global_esp_now->send_reported(info->des_addr, status);
23}
24#else
25static void on_send_report(const uint8_t *mac_addr, esp_now_send_status_t status) {
26 global_esp_now->send_reported(mac_addr, status);
27}
28#endif
29
30void init_radio() {
31 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
32 ESP_ERROR_CHECK(esp_wifi_init(&cfg));
33 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
34 ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
35 ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE));
36 ESP_ERROR_CHECK(esp_wifi_start());
37 ESP_ERROR_CHECK(esp_wifi_disconnect());
38}
39
40void set_channel(uint8_t channel) {
41 esp_wifi_set_promiscuous(true);
42 esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE);
43 esp_wifi_set_promiscuous(false);
44}
45
46uint8_t get_channel() {
47 uint8_t channel = 0;
48 wifi_second_chan_t second;
49 esp_wifi_get_channel(&channel, &second);
50 return channel;
51}
52
53void read_mac(uint8_t *mac) { esp_wifi_get_mac(WIFI_IF_STA, mac); }
54
56 esp_err_t err = esp_now_init();
57 if (err == ESP_OK) {
58 err = esp_now_register_recv_cb(on_data_received);
59 }
60 if (err == ESP_OK) {
61 err = esp_now_register_send_cb(on_send_report);
62 }
63 return err;
64}
65
71
73 uint32_t version = 0;
74 esp_now_get_version(&version);
75 return version;
76}
77
78bool peer_exists(const uint8_t *mac) { return esp_now_is_peer_exist(mac); }
79
80esp_err_t add_peer(const uint8_t *mac) {
81 esp_now_peer_info_t peer_info = {};
82 peer_info.ifidx = WIFI_IF_STA;
83 memcpy(peer_info.peer_addr, mac, ESP_NOW_ETH_ALEN);
84 return esp_now_add_peer(&peer_info);
85}
86
87esp_err_t del_peer(const uint8_t *mac) { return esp_now_del_peer(mac); }
88
89// Peers are added on channel 0, which ESP-IDF treats as whatever channel the radio is on
90void rebind_peers() {}
91
92esp_err_t send(const uint8_t *mac, const uint8_t *data, uint16_t size) { return esp_now_send(mac, data, size); }
93
94} // namespace esphome::espnow::platform
95
96#endif // USE_ESP32
uint8_t second
esp_err_t esp_now_del_peer(const uint8_t *peer_addr)
esp_err_t esp_now_get_version(uint32_t *version)
esp_err_t esp_now_unregister_recv_cb(void)
esp_err_t esp_now_unregister_send_cb(void)
esp_err_t esp_now_register_send_cb(esp_now_send_cb_t cb)
esp_err_t esp_now_deinit(void)
esp_err_t esp_now_add_peer(const esp_now_peer_info_t *peer)
esp_err_t esp_now_send(const uint8_t *peer_addr, const uint8_t *data, size_t len)
bool esp_now_is_peer_exist(const uint8_t *peer_addr)
esp_err_t esp_now_register_recv_cb(esp_now_recv_cb_t cb)
esp_err_t esp_now_init(void)
esp_err_t del_peer(const uint8_t *mac)
esp_err_t send(const uint8_t *mac, const uint8_t *data, uint16_t size)
void set_channel(uint8_t channel)
bool peer_exists(const uint8_t *mac)
esp_err_t add_peer(const uint8_t *mac)
ESPNowComponent * global_esp_now
uint16_t size
Definition helpers.cpp:34
static void uint32_t