- PVSM.RU - https://www.pvsm.ru -
ESP-NOW может применяться в Интернете Вещей для управления интеллектуальными источниками света, реле, розетками, другими устройствами дистанционного управления, получения информации от датчиков и других приложений.
ESP-NOW применяет технологию фреймов IEEE802.11 Action Vendor вместе с функцией IE, разработанной Espressif, и технологией шифрования CCMP, реализуя безопасное коммуникационное решение без установления соединения. Устройство с Wi-Fi поддерживает основной мастер-ключ (PMK) и несколько локальных мастер-ключей (LMK)
На нижнем уровне протокола ESP_NOW поддерживается связанный список, содержащий информацию о локальном устройстве и о сопряженном устройстве, в том числе MAC-адреса и ключи. ESP-NOW также хранит часто используемые данные для прикладного уровня, чтобы избежать накладных расходов на повторную обработку связанного списка. Информация об устройствах используется для отправки и получения данных и включает в себя
Информацию о локальном устройстве:
Режим Состояние Приоритет WiFi IDLE не определено передача данных не разрешена CONTROLLER главный STA SLAVE подчиненный SoftAP COMBO главный&подчиненный SoftAP
Информацию о сопряженном устройстве в паре (включая часто используемую информацию и другую пользовательскую информацию):
Espressif не рекомендует использовать продолжительные операции в функциях обратного вызова при посылке/отправке пакетов, что связано, предположительно, с реализацией алгоритмов, использующих механизм прерываний. В пользу этого предположения так же говорят и проблемы, связанные с динамическим выделением памяти в функциях обратного вызова, что решается предпочтительным использованием статических переменных, а так же неоднозначность применения механизма исключений MicroPython.
Реализация асинхронности процессов запуска/завершения, установки связи в паре, получении/передачи пакетов Espressif не описывается, что так же не облегчает применение идеологии asyncio MicroPython.
Данные создателя пакета содержат следующие поля:
Так как ESP-NOW не использует протокол WiFi, заголовок MAC немного отличается от заголовка стандартных пакетов. Биты FromDS и ToDS поля FrameControl равны 0. В первом поле адреса задан адрес назначения. Во втором поле адреса указан адрес источника. Третье поле адреса установлено как широковещательный адрес (0xff: 0xff: 0xff: 0xff: 0xff: 0xff).
Перед началом использования ESP-NOW рекомендуется установить интерфейс Wi-Fi в нужном режиме. Обычно интерфейс Station устанавливается для CONTROLLER, интерфейс SoftAP для SLAVE и COMBO. Так же целесообразно остановить Wi-Fi после завершения использования ESP-NOW.
Для начала работы ESP-NOW вызвать esp_now_init() и esp_now_deinit() для завершения. Когда вызывается esp_now_deinit(), вся информация о сопряженных устройствах удаляется.
Функция обработки вызова при отправке пакета esp_now_register_send_cb() может использоваться для информирования прикладного уровня отправляющей стороны в паре об успешности или неудаче передачи, например, если информация на подуровне MAC передана успешно.
При использовании esp_now_register_send_cb() следует учитывать:
В связанной паре:
При множественной связи со всеми парами локального устройства:
Функция обработки вызова при получении пакета esp_now_register_receive_cb() возвращает информацию, включающую в себя MAC-адрес отправляющего устройства в паре и полезную информацию. Так же может использоваться для информирования прикладного уровня отправляющего устройства в паре от принимающего о том, что пакет был успешно принят.
Прежде чем отправлять данные необходимо добавить устройство в список пар сопряженных устройств вызовом esp_now_add_peer(). Перед отправкой данных группе установленных пар необходимо добавить устройство с групповым MAC-адресом. Диапазон канала сопряженных устройств составляет от 0 до 14. Если канал установлен на 0, данные будут отправляться по текущему каналу. В противном случае канал должен быть установлен как канал, на котором находится локальное устройство.
Если ключ необходимо зашифровать, для настройки можно вызвать esp_now_set_pmk(), чтобы установить PMK. Если PMK не установлен, будет использоваться PMK по умолчанию и выбрать один и тот же ключ для всех устройств. Так же для выбранных пар установить LMK.
Для отправки данных ESP-NOW используется esp_now_send (). При этом функция, установленная ранее в esp_now_register_send_cb() вернет ESP_NOW_SEND_SUCCESS при отправке функции обратного вызова, если данные были успешно приняты на уровне MAC. В противном случае вернется ESP_NOW_SEND_FAIL. Несколько причин могут привести к тому, что ESP-NOW не сможет отправить данные. В частности,
Не гарантируется, что прикладной уровень обязательно примет данные. При необходимости можно отправить подтверждение при получении данных ESP-NOW. При возникновении тайм-аута при подтверждении, передачу данных ESP-NOW следует повторить. Порядковый номер также может быть назначен для данных ESP-NOW для удаления дубликатов данных.
При отправке данных ESP-NOW через esp_now_send() следует учитывать, что за один раз можно отправлять не более 250 байтов информации.
ВНИМАНИЕ! Слишком короткий интервал между отправкой двух пакетов ESP-NOW может привести к ошибкам исполнения функции обратного вызова, в связи с чем рекомендуется отправлять следующий пакет данных ESP-NOW после того, как функция обратного вызова при обработке предыдущей отправки успешно завершилась. Функция обратного вызова отправляется из высокоприоритетной задачи Wi-Fi. Поэтому не рекомендуется выполнять продолжительные операции в функции обратного вызова. Вместо этого можно разместить необходимые данные в статическую очередь и обработать их из процессом с более низким приоритетом.
Если функция отправки возвращает MAC-адрес, то он будет отправлен на устройство с этим MAC-адресом. Если функция отправки возвращает NULL, то пакет будет отправлен всем устройствам, присоединенным к отправляющему, что может привести к сбою передачи или задержке из-за перегрузки сети.
Функция обратного вызова также запускается из задачи Wi-Fi. Поэтому не рекомендуется выполнять продолжительные операций в функции обратного вызова. Вместо этого можно разместить необходимые данные в статическую очередь и обработать их процессом с более низким приоритетом.
Мой опыт сборки Espressif IDE и MicroPython с ESP-NOW, описывающий ошибки, с которыми столкнулся при сборке и варианты их исправления собираюсь выложить после достижения устойчивого результата. Тогда же сделаю и описание библиотеки ESP-NOW на MicroPython с обнаруженными ошибками, способами их устранения. К сожалению, в связи с тем, что исходный код ESP-NOW закрыт и распространяется только в бинарном виде, понимание алгоритмов протокола ESP-NOW эмпирическое и существует ряд уже выявленных проблем, по которым не всегда находятся варианты их логичного преодоления, но в целом ESP-NOW успешно применяется в сообществе как C-пользователей, так и Питонистов исходя из более 300 применений, представленных на GitHub.
Описание библиотеки ESP-NOW на С от Espressif [1]
Описание и открытые источники ESP-NOW на MicroPython [2]
Автор: Андрей Золотарев
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-3/353077
Ссылки в тексте:
[1] Описание библиотеки ESP-NOW на С от Espressif: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#add-paired-device
[2] Описание и открытые источники ESP-NOW на MicroPython: https://github.com/shawwwn/micropython/tree/master/ports/esp32
[3] Источник: https://habr.com/ru/post/502260/?utm_source=habrahabr&utm_medium=rss&utm_campaign=502260
Нажмите здесь для печати.