Сервер времени с синхронизацией от GPS приемника

Поступила задача настроить сервер времени, не имеющий выхода в интернет, для синхронизации времени устройств внутри сети. В наличии имеется сервер под Linux и GPS приемник ED170MP. Описываю работоспособный вариант настройки.

Основная идея такая: gps приемник выдает информацию о времени в формате NMEA и сигнал PPS, которые через порт RS232 поступают на сервер. Демон gpsd принимает эту информацию и передает ее демону ntpd который синхронизирует системное время и предоставляет ее клиентам по протоколу ntp.
Вооружившись гуглом, изучаем документацию на gps приемник. Ссылки см. внизу статьи.
Как указано в мануале к gps приемнику, на его задней панели есть два RS232 выхода, через которые он передает информацию gps, а также несколько выходов Pulse Output ( все сигналы имеют TTL уровень ) через которые передаются, в том числе, импульсы PPS частотой 1Гц, которые мы будем использовать в качестве источника сигнала времени. Согласно распиновки разъемов задней панели приемника, мы будем использовать 2-й и 3-й контакты порта DCE2(COM1), на которых имеется RXD и TXD с информацией GPS, и 1-й контакт порта Time Capture, на котором имеется частота 1Гц - Pulse Per Second (PPS). Для соединения портов RS232 и TimeCapture с RS232 портом сервера изготовим кабель требуемой длины согласно схемы, желательно экранированный, см. схему внизу статьи. Не забываем что подключать кабель нужно при обесточенных устройствах.
Согласно мануала gps приемник может управляться программой GPSMON32.
http://www.meinbergglobal.com/download/utils/windows/mbg-gpsmon32-v228.exe
Чтобы он выдавал понятную демону gpsd информацию, необходимо настроить его параметры. Предварительно, прочитав документацию, устанавливаем ip адрес на интерфейсе gps приемника. Подключаемся к ethernet интерфейсу через порт LANXPT. В программе GPSMON32 выбираем Connection - Settings - Network - Find, после установки коннекта вводим пароль для доступа, по умолчанию это meinberg. В Outputs - Serial parameters-COM1 выставить : 9600; 8N1; NMEA; per second. После этого можно проверить наличие информации на COM порту сервера с помощью команды

stty -F /dev/ttyS0 ispeed 9600
cat </dev/ttyS0
Если все сделано правильно, то последняя команда дает вывод с интересующей нас информацией о времени.
Для проверки работы gpsd даем команду ( можно указать опцию D5 - максимально подробный вывод )
gpsd -n -N -D2 /dev/ttyS0
если получаем примерно такой вывод,
gpsd: launching (Version 2.91dev)
gpsd: listening on port gpsd
gpsd: running with effective group ID 0
gpsd: running with effective user ID 0
gpsd: opening GPS data source at '/dev/ttyS0'
...
gpsd: speed 9600, 8N1
gpsd: gpsd_activate(): opened GPS (fd 4)
gpsd: NTPD ntpd_link_activate: 0
gpsd: => Probing device subtype 0
.......
gpsd: PPS cycle: 584180992, duration: 584180992 @ 1263141876.000000
gpsd: PPS pulse rejected
...........
то продолжаем. Настраиваем ntpd, для этого смотрим пример в man gpsd и берем оттуда примерно такой конфиг для ntp.conf:
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 time1 0.420 refid GPS

server 127.127.28.1 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.1 refid GPS1
где параметр time1 0.420 подбирается согласно
http://www.catb.org/gpsd/gpsd-time-service-howto.html
Запускаем gpsd и ntpd
/etc/init.d/gpsd start
/etc/init.d/ntpd start
Настраиваем автоматический запуск ntpd и gpsd во время загрузки системы
сhkconfig gpsd on
chkconfig ntpd on
Проверяем работу:
ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+SHM(0)          .GPS.            0 l    3   16  377    0.000    0.061   0.081
*SHM(1)          .GPS1.           0 l    2   16  377    0.000   -0.003   0.004
Из вывода видно, что мы имеем рабочий сервер времени, имеющий стратум 1, т.е. синхронизирующийся непосредственно от источника точного времени - GPS, имеющего стратум 0. Осталось проверить работу клиентов. Не забываем для этого открыть в iptables 123 udp порт и добавить в /etc/ntp.conf что-то вроде
restrict 192.168.15.0 mask 255.255.255.0 nomodify notrap
для разрешения машинам из сети 192.168.15.0/24 синхронизироваться с нашим сервером.

Полезные ссылки:
Назначение контактов rs-232
http://www.gpskit.nl/connections-en.htm
http://rs232.net.ru/doc/computer/COM9_rs232.php

http://www.lammertbies.nl/comm/info/GPS-time.html
http://www.catb.org/gpsd/installation.html
http://www.catb.org/gpsd/gpsd-time-service-howto.html

Мануал по ED170MP
ftp://41.208.38.197/Onsite_PC/FWSW/Meinberg/ED170/General/ED170-MQ_OCT-4...

Программа GPSMON32
http://www.meinbergglobal.com/download/utils/windows/mbg-gpsmon32-v228.exe
пароль для доступа по умолчанию
meinberg
Схема кабеля
http://files.nixadmin.ru/9nFelmDP_scheem_cable.gif

Пример настройки конфига ntpd - см man gpsd

Проверка наличия сигналов от gps на последовательном порту
stty -F /dev/ttyS0 ispeed 9600
cat < /dev/ttyS0

Проверка работы gpsd
gpsd -n -N -D2 /dev/ttyS0 ( или -D5 для большей детализации вывода )

rpm под Centos-6