• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 ранее такие программы работали.
 
Сверху Снизу