Господа, у меня снова нестандартный вопрос про ESPNOW на ESP8266 (FreeRTOS).
Проблема следующая: в режиме бродскаста всё работает, оба модуля передают и принимают.
Но стоит перейти в юникаст (задать конкретный MAC вместо FFок) и всё ломается: функция отправки возвращает ESP_OK, а затем sending callback возвращает ESP_NOW_SEND_FAIL в статусе, т.е. данные не доставлены получателю.
Мак верный, PMK прописан, каналы одинаковые, wifi включен.
UPD: разобрался, всё работает.
Оказалось, что мои ESPшки отправляют данные, но по какой-то причине не могут их принять.
Нагуглил, что esp_now_set_self_role() на ардуине управляет режимом работы Wifi (STA / AP / AP+STA), после чего решил поменять режимы у себя.
Итоги:
1. Если обе борды находятся в Station Mode, то ESPNOW работает в обе стороны.
#define ESPNOW_WIFI_MODE WIFI_MODE_STA
#define ESPNOW_WIFI_IF ESP_IF_WIFI_STA
2. Если обе борды находятся в режиме SoftAP, то ESPNOW работает только на передачу. Unicast невозможен вообще, т.к. ESPNOW не работает на прием. Broadcast при этом работает.
#define ESPNOW_WIFI_MODE WIFI_MODE_AP
#define ESPNOW_WIFI_IF ESP_IF_WIFI_AP
3. Если обе борды настроены как SoftAP + Station, ESPNOW работает в обе стороны (unicast и broadcast).
#define ESPNOW_WIFI_MODE WIFI_MODE_APSTA
#define ESPNOW_WIFI_IF ESP_IF_WIFI_AP
Это всё справедливо для ESP8266 и RTOS_SDK v3.4.
Ирония в том, что в примере от Espressif используется вариант №2, и он нерабочий от слова "совсем".
Связано это скорее всего с тем, что пример скопирован с ESP32, а там ESPNOW работает во всех режимах работы Wifi.
Это подтверждается тем, что в ардуино-примерах ESPNOW для ESP32 нет функции управления ролями esp_now_set_self_role()
А на 8266 разрабы свой пример не тестили. Там, кстати, пары дефайнов еще не хватает.