Синхронизация времени NTPD с GPS

Материал из Belgorod Linux User Group - Белгород

Перейти к: навигация, поиск

Содержание

Аппаратная часть

Подключаем GPS устройство. К примеру это /dev/ttyUSB0. В правилах UDEV желательно описать, чтобы устройство было /dev/gps0

cat /etc/udev/rules.d/99-gpsd-usb.rules
SUBSYSTEM!="tty", GOTO="gpsd-usb_rules_end"
SYSFS{idVendor}=="067b", SYSFS{idProduct}=="2303", SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB[0-9]*",  SYMLINK="gps0", RUN+="/etc/hotplug/usb/gpsd.hotplug add $root/%k"
SYSFS{idVendor}=="067b", SYSFS{idProduct}=="2303", SUBSYSTEM=="tty", ACTION=="remove", KERNEL=="ttyUSB[0-9]*",    RUN+="/etc/hotplug/usb/gpsd.hotplug remove $root/%k"
SYSFS{idVendor}=="0403", SYSFS{idProduct}=="6001", SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB[0-9]*",  SYMLINK="gps0", RUN+="/etc/hotplug/usb/gpsd.hotplug add $root/%k"
SYSFS{idVendor}=="0403", SYSFS{idProduct}=="6001", SUBSYSTEM=="tty", ACTION=="remove", KERNEL=="ttyUSB[0-9]*", RUN+="/etc/hotplug/usb/gpsd.hotplug remove $root/%k"
SYSFS{idVendor}=="1163", SYSFS{idProduct}=="0100", SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB[0-9]*",  SYMLINK="gps0", RUN+="/etc/hotplug/usb/gpsd.hotplug add $root/%k"
SYSFS{idVendor}=="1163", SYSFS{idProduct}=="0100", SUBSYSTEM=="tty", ACTION=="remove", KERNEL=="ttyUSB[0-9]*", RUN+="/etc/hotplug/usb/gpsd.hotplug remove $root/%k"
SYSFS{idVendor}=="067b", SYSFS{idProduct}=="aaa0", SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB[0-9]*", SYMLINK="gps0", RUN+="/etc/hotplug/usb/gpsd.hotplug add $root/%k"
SYSFS{idVendor}=="067b", SYSFS{idProduct}=="aaa0", SUBSYSTEM=="tty", ACTION=="remove", KERNEL=="ttyUSB[0-9]*", RUN+="/etc/hotplug/usb/gpsd.hotplug remove $root/%k"
SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB[0-9]*", SYMLINK="gps0", RUN+="/etc/hotplug/usb/gpsd.hotplug add $root/%k"
SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", SUBSYSTEM=="tty", ACTION=="remove", KERNEL=="ttyUSB[0-9]*", RUN+="/etc/hotplug/usb/gpsd.hotplug remove $root/%k"
#SYSFS{idVendor}=="", SYSFS{idProduct}=="", SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB[0-9]*", SYMLINK="gps%n", RUN+="/etc/hotplug/usb/gpsd.hotplug add $root/%k"
#SYSFS{idVendor}=="", SYSFS{idProduct}=="", SUBSYSTEM=="tty", ACTION=="remove", KERNEL=="ttyUSB[0-9]*", RUN+="/etc/hotplug/usb/gpsd.hotplug remove $root/%k"
LABEL="gpsd-usb_rules_end"


Конфиг

в /etc/ntpd.conf дописываем строки:

server 127.127.20.0 minpoll 4 maxpoll 4 prefer
fudge 127.127.20.0 time1 0.420
enable auth monitor

Перезапускаем

/etc/ntpd restart

Проверяем:

ntpq -p

Должно быть что-то типа:

    remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*GPS_NMEA(0)     .GPS.            0 l    5   16  357    0.000   -8.362  12.404

Если колонка reach = 0, в течении большого времени - см. ошибки.

Ошибки

  • К строке запуска ntpd добавьте параметр -g, позволяющий сделать большую коррекцию времени. Возможно ваше системное время сильно отличается от того, что отдает спутник.
cat /etc/conf.d/ntpd
NTPD_OPTS="-g"

При желании можно добавить и параметр -d, показывающий отладку (если ntpd собран с флагом debug).

  • В /etc/ntpd.conf дописываем строку для записи логов:
logconfig +all
logfile /var/log/ntp.log

перезапускаем

  • Если валят ошибки:
clock GPS_NMEA(0) event 'clk_noreply' (0x01)
peer GPS_NMEA(0) event 'event_peer_clock' (0x85) status 'unreach, conf, 2 events, event_peer_clock' (0x8025)

Проверьте, не запущен ли gpsd или кто-то, кто может использовтаь /dev/gps0. Проверьте, чтобы gps использовал только ntpd:

lsof /dev/gps0

COMMAND   PID USER   FD   TYPE DEVICE SIZE NODE NAME
ntpd    20768 root    5u   CHR  188,0      4821 /dev/ttyUSB0
  • Если ошибки типа:
clock GPS_NMEA(0) event 'clk_fault' (0x03)

Проверьте уровень сигнала, возможно прием неуверенный. Попробуйте переместить устройство в другое место (к примеру за окно).

  • Так же можно проверить скорость и настройки порта
stty -F /dev/gps0

Как правило должно быть 4800 8N1

Запустите

minicom -s

Подключитесь к этому порту, и посмотрите идут ли данные.

GPSD

Проверить работоспособность можно используя GPSD

emerge gpsd
gpsd -n /dev/gps0
telnet localhost 2947

> i
GPSD,I=SiRF binary
> d
GPSD,D=2009-03-10T07:40:09.00Z

Так же управлять устройством можно через gpsctl

gpsctl
gpsctl -n /dev/gps0 # переключить в NMEA
gpsctl -b /dev/gps0 # переключить в SiRF binary
Личные инструменты