171 lines
6.1 KiB
C
171 lines
6.1 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
/* Get Start Example
|
|
|
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
|
|
|
Unless required by applicable law or agreed to in writing, this
|
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
CONDITIONS OF ANY KIND, either express or implied.
|
|
*/
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#include "nvs_flash.h"
|
|
|
|
#include "esp_mac.h"
|
|
#include "esp_log.h"
|
|
#include "esp_wifi.h"
|
|
#include "esp_netif.h"
|
|
#include "esp_now.h"
|
|
|
|
#define CONFIG_LESS_INTERFERENCE_CHANNEL 11
|
|
|
|
#if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C61 || (CONFIG_IDF_TARGET_ESP32C6 && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0))
|
|
#define CONFIG_WIFI_BAND_MODE WIFI_BAND_MODE_2G_ONLY
|
|
#define CONFIG_WIFI_2G_BANDWIDTHS WIFI_BW_HT40
|
|
#define CONFIG_WIFI_5G_BANDWIDTHS WIFI_BW_HT40
|
|
#define CONFIG_WIFI_2G_PROTOCOL WIFI_PROTOCOL_11N
|
|
#define CONFIG_WIFI_5G_PROTOCOL WIFI_PROTOCOL_11N
|
|
#else
|
|
#define CONFIG_WIFI_BANDWIDTH WIFI_BW_HT40
|
|
#endif
|
|
|
|
#define CONFIG_ESP_NOW_PHYMODE WIFI_PHY_MODE_HT40
|
|
#define CONFIG_ESP_NOW_RATE WIFI_PHY_RATE_MCS0_LGI
|
|
#define CONFIG_SEND_FREQUENCY 100
|
|
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)
|
|
#define ESP_IF_WIFI_STA ESP_MAC_WIFI_STA
|
|
#endif
|
|
|
|
static const uint8_t CONFIG_CSI_SEND_MAC[] = {0x1a, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
static const char *TAG = "csi_send";
|
|
|
|
static void wifi_init()
|
|
{
|
|
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
|
|
|
ESP_ERROR_CHECK(esp_netif_init());
|
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
|
|
|
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
|
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
|
|
|
|
#if CONFIG_IDF_TARGET_ESP32C5
|
|
ESP_ERROR_CHECK(esp_wifi_start());
|
|
esp_wifi_set_band_mode(CONFIG_WIFI_BAND_MODE);
|
|
wifi_protocols_t protocols = {
|
|
.ghz_2g = CONFIG_WIFI_2G_PROTOCOL,
|
|
.ghz_5g = CONFIG_WIFI_5G_PROTOCOL
|
|
};
|
|
ESP_ERROR_CHECK(esp_wifi_set_protocols(ESP_IF_WIFI_STA, &protocols));
|
|
wifi_bandwidths_t bandwidth = {
|
|
.ghz_2g = CONFIG_WIFI_2G_BANDWIDTHS,
|
|
.ghz_5g = CONFIG_WIFI_5G_BANDWIDTHS
|
|
};
|
|
ESP_ERROR_CHECK(esp_wifi_set_bandwidths(ESP_IF_WIFI_STA, &bandwidth));
|
|
#elif (CONFIG_IDF_TARGET_ESP32C6 && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)) || CONFIG_IDF_TARGET_ESP32C61
|
|
ESP_ERROR_CHECK(esp_wifi_start());
|
|
esp_wifi_set_band_mode(CONFIG_WIFI_BAND_MODE);
|
|
wifi_protocols_t protocols = {
|
|
.ghz_2g = CONFIG_WIFI_2G_PROTOCOL,
|
|
};
|
|
ESP_ERROR_CHECK(esp_wifi_set_protocols(ESP_IF_WIFI_STA, &protocols));
|
|
wifi_bandwidths_t bandwidth = {
|
|
.ghz_2g = CONFIG_WIFI_2G_BANDWIDTHS,
|
|
};
|
|
ESP_ERROR_CHECK(esp_wifi_set_bandwidths(ESP_IF_WIFI_STA, &bandwidth));
|
|
#else
|
|
ESP_ERROR_CHECK(esp_wifi_set_bandwidth(ESP_IF_WIFI_STA, CONFIG_WIFI_BANDWIDTH));
|
|
ESP_ERROR_CHECK(esp_wifi_start());
|
|
|
|
#endif
|
|
|
|
ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE));
|
|
#if CONFIG_IDF_TARGET_ESP32C5
|
|
if ((CONFIG_WIFI_BAND_MODE == WIFI_BAND_MODE_2G_ONLY && CONFIG_WIFI_2G_BANDWIDTHS == WIFI_BW_HT20)
|
|
|| (CONFIG_WIFI_BAND_MODE == WIFI_BAND_MODE_5G_ONLY && CONFIG_WIFI_5G_BANDWIDTHS == WIFI_BW_HT20)) {
|
|
ESP_ERROR_CHECK(esp_wifi_set_channel(CONFIG_LESS_INTERFERENCE_CHANNEL, WIFI_SECOND_CHAN_NONE));
|
|
} else {
|
|
ESP_ERROR_CHECK(esp_wifi_set_channel(CONFIG_LESS_INTERFERENCE_CHANNEL, WIFI_SECOND_CHAN_BELOW));
|
|
}
|
|
#elif (CONFIG_IDF_TARGET_ESP32C6 && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)) || CONFIG_IDF_TARGET_ESP32C61
|
|
if (CONFIG_WIFI_BAND_MODE == WIFI_BAND_MODE_2G_ONLY && CONFIG_WIFI_2G_BANDWIDTHS == WIFI_BW_HT20) {
|
|
ESP_ERROR_CHECK(esp_wifi_set_channel(CONFIG_LESS_INTERFERENCE_CHANNEL, WIFI_SECOND_CHAN_NONE));
|
|
} else {
|
|
ESP_ERROR_CHECK(esp_wifi_set_channel(CONFIG_LESS_INTERFERENCE_CHANNEL, WIFI_SECOND_CHAN_BELOW));
|
|
}
|
|
#else
|
|
if (CONFIG_WIFI_BANDWIDTH == WIFI_BW_HT20) {
|
|
ESP_ERROR_CHECK(esp_wifi_set_channel(CONFIG_LESS_INTERFERENCE_CHANNEL, WIFI_SECOND_CHAN_NONE));
|
|
} else {
|
|
ESP_ERROR_CHECK(esp_wifi_set_channel(CONFIG_LESS_INTERFERENCE_CHANNEL, WIFI_SECOND_CHAN_BELOW));
|
|
}
|
|
#endif
|
|
ESP_ERROR_CHECK(esp_wifi_set_mac(WIFI_IF_STA, CONFIG_CSI_SEND_MAC));
|
|
}
|
|
|
|
static void wifi_esp_now_init(esp_now_peer_info_t peer)
|
|
{
|
|
ESP_ERROR_CHECK(esp_now_init());
|
|
ESP_ERROR_CHECK(esp_now_set_pmk((uint8_t *)"pmk1234567890123"));
|
|
ESP_ERROR_CHECK(esp_now_add_peer(&peer));
|
|
esp_now_rate_config_t rate_config = {
|
|
.phymode = CONFIG_ESP_NOW_PHYMODE,
|
|
.rate = CONFIG_ESP_NOW_RATE,
|
|
.ersu = false,
|
|
.dcm = false
|
|
};
|
|
ESP_ERROR_CHECK(esp_now_set_peer_rate_config(peer.peer_addr, &rate_config));
|
|
}
|
|
|
|
void app_main()
|
|
{
|
|
/**
|
|
* @brief Initialize NVS
|
|
*/
|
|
esp_err_t ret = nvs_flash_init();
|
|
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
|
ESP_ERROR_CHECK(nvs_flash_erase());
|
|
ret = nvs_flash_init();
|
|
}
|
|
ESP_ERROR_CHECK(ret);
|
|
|
|
/**
|
|
* @brief Initialize Wi-Fi
|
|
*/
|
|
wifi_init();
|
|
|
|
/**
|
|
* @brief Initialize ESP-NOW
|
|
* ESP-NOW protocol see: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html
|
|
*/
|
|
esp_now_peer_info_t peer = {
|
|
.channel = CONFIG_LESS_INTERFERENCE_CHANNEL,
|
|
.ifidx = WIFI_IF_STA,
|
|
.encrypt = false,
|
|
.peer_addr = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
|
|
};
|
|
wifi_esp_now_init(peer);
|
|
|
|
ESP_LOGI(TAG, "================ CSI SEND ================");
|
|
ESP_LOGI(TAG, "wifi_channel: %d, send_frequency: %d, mac: " MACSTR,
|
|
CONFIG_LESS_INTERFERENCE_CHANNEL, CONFIG_SEND_FREQUENCY, MAC2STR(CONFIG_CSI_SEND_MAC));
|
|
|
|
for (uint32_t count = 0; ; ++count) {
|
|
esp_err_t ret = esp_now_send(peer.peer_addr, (const uint8_t *)&count, sizeof(count));
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGW(TAG, "free_heap: %ld <%s> ESP-NOW send error", esp_get_free_heap_size(), esp_err_to_name(ret));
|
|
}
|
|
|
|
usleep(1000 * 1000 / CONFIG_SEND_FREQUENCY);
|
|
}
|
|
}
|