Добрый день и с Новым Годом!!
--------------------------------------
Хочу рассказать, выражаясь образно,
как смотреть гланды можно гораздо проще,
если не решать эту задачу через зад.
---------------------------
немного теории.
----------------------------
Синхронизация часов двух ESP сводится к привязке их счетчиков времени к некоторой общей базе.
Проще говоря, надо, чтобы показания счетчиков были скорректированы на некоторую константу так, чтобы их значения были одинаковые в момент коррекции.
Участник данной темы pvvx предложил для этой цели использовать значение TSF, которое существует в глубине недокументированного кода оборудования WIFI. (Назовем это - Вариант 1)
------
В результате , занявшись своим любимым делом -взломом чужого софта и патчем SDK недокументированными заплатками,
он породил некоторую временную поделку,
которая не будет работать на новых SDK.
---------------------------------
Но самое удивительное,
что синхронизацию часов с тем же результатом можно сделать в рамках документированных функций SDK,
ничего не взламывая.
--------------------------
Что бы понять как это делать,
давайте сначала разберем в чем суть TSF и с чем его едят.
--------------------------------
Объясняю без несущественных деталей.
-----------------------
В беспроводных сетях есть необходимость синхронизировать работу сети для решения проблем коллизий.
Это делается с помощью рассылаемых AP периодически всем с интервалом 100 мс специального пакета,
в котором AP передает значение своего счетчика времени. это значение и есть TSF.
--------------------
Все станции принимают эти пакеты и сохраняют у себя значение TSF,
чтобы относительно него отсчитывать единое время в сети,
корректируя начальное значение своего счетчика времени.
--------------------------------
Но в задаче данного топика необходимо синхронизировать две ESP.
Поэтому мы может сделать совершенно тоже самое, если с некоторым интервалом будет посылать с одной ESP на другую показание счетчика системного времени этой ESP.
Принимающая eSP запоминает это значение как базу. (Назовем это Вариант 2)
-----------------------------------
Давайте сравним Вариант 1 и 2.
------------------------------
1) существенная разница в том,
что во втором варианте не надо ничего взламывать и патчить,
все можно делать в рамках существующей документации и SDK.
---------------------
2) Во втором варианте мы может использовать любой протокол в том числе и ESP-now и любое железо, например NRF.
------------------
3) Во-втором варианте мы может использовать обе ESP в режимах станций.
---------------------------
4) Счетчик TSF имеет разрядность 64 бита, а системное время , получаемое документированной функцией system_get_time() 32 бита.
Но 32 бита достаточно для интервала 1 час, что вполне достаточно.
--------------------------------------
Таким образом, оба варианта идентичны для синхронизации часов ESP.
Причем второй вариант применим для любого SDK, любого протокола и любых аппаратных средств без взлома чужого софта.
-----------------------
Ошибка синхронизации, вызванная случайными помехами не устраняется этими методами.
--------------------
Для этого надо использовать алгоритмические методы синхронизации. Но взламывать SDK для этого не надо.
Но это уже другая тема.