Найти в Дзене
K12 :: О ESP32 и не только

Arduino ESP32 шаг за шагом. Телеметрия через WiFi и MQTT для чайников. Часть 3

Продолжение. Начало на Дзене здесь и здесь, полная статья на сайте kotyara12.ru здесь. Следующий шаг, который мы должны выполнить после подключения к сети интернет – получить актуальную дату и время с серверов NTP. Правильное время на сетевом микроконтроллере – не блажь, а требование безопасности. Правильное время используется не только для работы по расписанию, но и для проверки SSL и TLS-сертификатов при установке защищенных соединений. Конечно, можно подключить к ESP32 микросхему часов реального времени, например DS3231 и пропустить этот этап. Но и в отправке запроса к SNTP службе нет ничего сложного, поэтому чаще всего в часах нет особой необходимости. Как работать с датой и временем, я уже подробно описывал в другой статье: Работа с датой и временем и SNTP-синхронизация на ESP32 и ESP8266, повторяться не вижу особого смысла – с тех пор ничего не изменилось. Но с учетом того, что код выполняется на ESP32, появляются некоторые особенности… Итак, напишем функцию для синхронизации вр
Оглавление

Продолжение. Начало на Дзене здесь и здесь, полная статья на сайте kotyara12.ru здесь.

3. Получение актуальной даты и времени с серверов NTP

Следующий шаг, который мы должны выполнить после подключения к сети интернет – получить актуальную дату и время с серверов NTP. Правильное время на сетевом микроконтроллере – не блажь, а требование безопасности. Правильное время используется не только для работы по расписанию, но и для проверки SSL и TLS-сертификатов при установке защищенных соединений.

Конечно, можно подключить к ESP32 микросхему часов реального времени, например DS3231 и пропустить этот этап. Но и в отправке запроса к SNTP службе нет ничего сложного, поэтому чаще всего в часах нет особой необходимости.

Как работать с датой и временем, я уже подробно описывал в другой статье: Работа с датой и временем и SNTP-синхронизация на ESP32 и ESP8266, повторяться не вижу особого смысла – с тех пор ничего не изменилось. Но с учетом того, что код выполняется на ESP32, появляются некоторые особенности…

3.1. Вариант “на языке Arduino”

Итак, напишем функцию для синхронизации времени, примеры я уже приводил не раз:

-2

Разумеется, сразу же возникает соблазн запихнуть её в обработчик событий WiFi:

-3

И это вполне успешно работает:

-4

Но… это плохой путь (если вы использовали обработчик событий WiFi). Поясню почему.

Как я уже не один раз сказал – обработчик события вызывается из контекста задачи цикла событий. И, в принципе, здесь нам абсолютно все равно, из контекста какой задачи запускается эта синхронизация – все равно она запускается еще в одной, отдельной задаче (да-да-да, еще один сервис будет выполняться параллельно). Но есть другой фактор риска.

Цикл событий просто тупо перебирает список подписчиков тех или иных событий и в цикле выполняет их callback-и. Соответственно, если какой-то из обработчиков будет выполняться долго или зависнет – остальные подписчики будут ждать. Чего доброго, еще и WDT сработает (сторожевой таймер задач – прим. авт.). Поэтому необходимо всегда стремиться к тому, что бы обратного вызова выполнялась как можно быстрее. Этого правила стоит придерживаться для любых callback-ов. А здесь мы намеренно ждем аж до 60 секунд, чем ввергаем в шок вышеупомянутый цикл событий. Нехорошо это…

Разумеется, все вышеописанное относится только к случаю, когда вы используете функцию обратного вызова при определении состояния WiFi подключения (вариант из раздела 2.3.2). Если вы использовали вариант, описанный в разделе 2.3.1 – можете смело использовать предложенный выше вариант и не читать далее.

3.2. Вариант “на языке ESP-IDF”

Данную проблему можно решить, на мой взгляд, тем же способом, что и в предыдущем случае – то есть использованием соответствующей callback-функции, тем более что ESP-IDF SNTP API предполагает её использование. Но… разработчики Arduino ESP32, а конкретно модуля esp32-hal-time.с, видимо, посчитали это архитектурным излишеством, и исключили из Arduino SNTP API.

Поэтому нам придется “вернуться к корням” и переписать это на “языке ESP-IDF” с использованием ещё одной функции обратного вызова:

-5

Проверяем результаты:

-6

Очевидным плюсом такого подхода будет также то, что callback будет срабатывать при каждой синхронизации времени, а не только в первый раз – и в ы при желании можете узнать об этом.

Вот так мы вполне удачным образом скрестили ежа и ужа код ESP-IDF и Arduino ESP32. Это вариант, разумеется, вы можете использовать при любом варианте проверки состояния WiFi.

Продолжение следует....