• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Подменился MAC адрес передающего

После обновлений, прошедших примерно месяц назад, возникли трудности с использованием esp_now. С большим трудом, (попытки вернуть версию Boards не прошли) удалось очистить и обновить список библиотек и все заработало. Но существовавшая система сбора информации и ряда постов, использовавшая esp_now, перестала при приеме информации получать правильный МАК адрес посылающего.
```
void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len)
{
char macStr[18];String Str="";
uint8_t mac8[] = {0xc8,0xf0,0x9e,0x4f,0x1b,0xd4};
uint8_t mac7[] = {0xc8,0xf0,0x9e,0x4e,0xf0,0xbc};
uint8_t mac5[] = {0x54,0x43,0xb2,0xa9,0x34,0xec};

snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);

Serial.print("mac_addr ");Serial.println(macStr);
```
выводит один и тот же адрес, независимо от реального Sendera. Проверка МАК адресов Сендеров стандартным способом подтвердил различие их адресов и совпадение их с ранее известными. Значения выдаваемые Ресептором 46:f3:fa:3f:40:f3 все одинаковы и не совпадают ни с одним из реальных адресов.
Конечно можно различать Сендера по получаемому сообщению, но это не удобно, так как структуры сообщений отличаются и легко распаковываются, если известна их структура.
 

aZholtikov

Active member
Если не вдаваться в подробности перехода Ардуино на ESP-IDF версии 5.х, то просто поменяйте каждое значение, например mac_addr[0] на mac_addr[0+6]. И тд по шаблону.
В ESP-IDF версии 5.х, MAC адрес отправителя находится начиная с 7-го байта.
Код:
/**
 * @brief ESPNOW packet information
 */
typedef struct esp_now_recv_info {
    uint8_t * src_addr;                      /**< Source address of ESPNOW packet */
    uint8_t * des_addr;                      /**< Destination address of ESPNOW packet */
    wifi_pkt_rx_ctrl_t * rx_ctrl;            /**< Rx control info of ESPNOW packet */
} esp_now_recv_info_t;
 

aZholtikov

Active member
Но могу и ошибаться. Попробуйте так:
Код:
void OnDataRecv(const esp_now_recv_info_t *esp_now_info, const uint8_t *incomingData, int len)
    {
        char macStr[18];
        String Str = "";
        uint8_t mac8[] = {0xc8, 0xf0, 0x9e, 0x4f, 0x1b, 0xd4};
        uint8_t mac7[] = {0xc8, 0xf0, 0x9e, 0x4e, 0xf0, 0xbc};
        uint8_t mac5[] = {0x54, 0x43, 0xb2, 0xa9, 0x34, 0xec};

        snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", esp_now_info->src_addr[0], esp_now_info->src_addr[1], esp_now_info->src_addr[2], esp_now_info->src_addr[3], esp_now_info->src_addr[4], esp_now_info->src_addr[5]);

        Serial.print("mac_addr ");
        Serial.println(macStr);
    }
 
В первом варианте что-то другое, но знакомого МАК адреса не появилось.
Во втором при компиляции error: 'esp_now_info' was not declared in this scope;
 

aZholtikov

Active member
Изучите исходники Espressif касательно ESP-NOW:
Особенно строчку 105 static void _esp_now_rx_cb(const esp_now_recv_info_t *info, const uint8_t *data, int len)

Еще будет полезно изучить разницу между объявлением функции и самой функцией. Это решит все проблемы.
 
Во всех примерах приема с esp_now функция onDataReceiv появляется в тексте только один раз. И раньше все работал. Работает и сейчас. Если использовать strtok, то можно обойтись и без МАК адреса. Но интересно решить проблему.
В ссылке на github нет строки 105
 
Предложенный путь мной проверен. Примеры исполняются, но не удалось разобраться в деталях и найти способ работы с несколькими Сендерами. Первая передача устанавливает Сендера как мастера, и только со вторая передача визуализируется. Появление второго Сендера все портит.
 
Так и не удалось организовать прием от нескольких Сендеров.
Обнаружилась еще одна потеря, связанная с изменением библиотек. Оказалось невозможно пользоваться программами с использованием команды
hw_timer_t ранее такие программы работали.
 
Сверху Снизу