понедельник, 23 сентября 2019 г.

Stratum NTP server ESP8266 + GPS - сервер точного времени

NTP Сервер точного времени.
NTP сервер понадобился нам для синхронной работы вещательных серверов. Так-же проведённый анализ мультикастовых потоков выявил незначительное появление ошибок в момент синхронизации OS с сервером времени. Происходил сбой генерации PTS меток, как и подрыв сервиса в кодирущем софте.
По простому - каждые 1-2 дня сыпится картинка на потоковом изображении с выхода плейаут сервера. Чаще сбой происходил при кодировании мультикаста UHD разрешения 50i.
Первым делом была настроена частая синхронизация времени WIN OS и CMOS - в реестре Polling interval. - каждые 600 секунд.
Но и центральный сервер точного времени тоже нужен. Решил собрать по готовому примеру из сети , на основе wifi сетевой карты (ESP8266) и GPS модуля, которые как раз были под рукой.
Потребовалось некоторое время чтобы адаптировать проект к заливке в сетевую карту, после чего в проекте выявлена проблема преобразования миллисекунд. Миллисекунды всегда были не правильными - по отслеживанию NTP логам и криво формировались сетевой картой.
Баг был обнаружен и успешно устранён. Миллисекунды передвавлись в NTP запрос в чистом виде, а должны были формироваться как фракция секунды.


Много времени потребовалось на подбор программ для работы с готовым проектом и его заливке в контроллер.
Ниже - необходимый софт который без труда ищется в сети:

Software:
jre-8u202-windows-x64.exe
eclipse-cpp-neon-R-win32-x86_64.zip
mingw-get-setup.exe
Espressif-ESP8266-DevKit-v2.0.9-x86.exe
Espressif-ESP8266-DevKit-Addon.zip
C project for ESP8266.

Ниже: часть кода устраняющая это недоразумение - преобразование миллисекунд в фракцию секунды (milliseconds to fraction of a second):


timetmp=SecondsSince1900(GPSyear, GPSmonth, GPSday, GPShour, GPSminute, GPSsecond);
fractmp=system_get_time();
if( fractmp >= RTCcounts )
{
useconds=fractmp - RTCcounts;
}
else
{
useconds= (0xFFFFFFFF - RTCcounts)+fractmp;
}
//os_printf("useconds: %d\r\n",useconds);

useconds=((useconds+GNRMC_US_OFFSET_BYTETIME)*4294967296*0.000001);//+GPSmillisecond*1000



Надо добавить, что получившийся сервер получился очень крохотным и работал без отказов. Но. Из-за того что это не Ethernet , WiFi вносит  погрешность времени при доставке пакетов. 

В результате погрешность синхронизации составила чуть меньше чем ±0,01 с. в то время как погрешность синхронизации с открытыми NTP серверами через интернет составляет ±0,005 с.
Фоток к сожалению не сохранилось...

convert colors to midi note for midi controllers

I recently (2 years ago) designed and built a simple MIDI controller for my intercom system using an Arduino Leonardo, USB hub, sound card, ...