Управляем чем угодно откуда угодно

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

Глупых вопросов не бывает! Раздел для тех, кто только начинает.

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

Сообщение akril » 24 дек 2014, 17:25

Доброго времени суток!
А не заморачивался ли кто-либо получением текущего времени со спутника и синхронизации с ним системных часов? Судя по мануалам, этим должна заниматься связка gpsd и ntpd. Оба демона в виртурилке имеются, запускаются и по отдельности вполне себе что-то делают - по крайней мере GPS-координаты видны и точное время по интернету берется. А вот взять время от GPSa не удается. В /etc/ntp.conf согласно мануалу прописано
Код: Выделить всё
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 time1 0.420 refid GPS

однако толку никакого: ntpq -p показывает, что информации там нет.
Делал ли кто нибудь что-то подобное и с каким результатом?
akril
 
Сообщения: 23
Зарегистрирован: 24 апр 2014, 14:50
Откуда: Россия, Воронеж

Re: Синхронизация времени по GPS

Сообщение akril » 22 янв 2015, 21:30

Не прошло и трёх лун, как задача получения текущего времени со спутников благополучно разрешилась. Для тех, кому надо, рассказываю.
Запущен gpsd. С помощью gpspipe выдаваемая приемником информация заносится во временный файл, откуда с помощью sed парсятся строки $GPGGA и $GPRMC. Из первых вытаскивается признак наличия истинной информации о времени, из вторых - самоё время, которое с помощью date загоняется в систему. В результате этого имеем время с околосекундной точностью.
Помимо этого, анализируется ситуация, когда GPS-приемник в системе вообще отсутствует.
Всё вышесказанное (кроме запуска gpsd) делает следующий скрипт gpsdate.sh:
Код: Выделить всё
#!/bin/sh
gps_sunc_flag=no
/usr/bin/gpspipe -d -r -o /tmp/gpsdata
sleep 1
killall -9 gpspipe
gps_str=$(cat /tmp/gpsdata | grep '$GP')
if [ ! "$gps_str" == ""  ]; then
#GPS receiver is ON
while [ "$gps_sunc_flag" != "yes" ]
do
/usr/bin/gpspipe -n 12 -r -o /tmp/gpsdata
#wait for GPS fix now
gps_qi=$(cat /tmp/gpsdata | awk -F, '/GPGGA/ {print($7)}' | sed '$!d')
case "$gps_qi" in
    "1" | "2" )
        #set time now
        gps_time=$(cat /tmp/gpsdata | sed -n '/^$GPRMC/p' | sed '$!d')
        str_data=$(echo ${gps_time} | sed -n '/[^,]*[,]*\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)[^,]*[,]*[^,]*[,]*[^,]*[,]*[^,]*[,]*[^,]*[,]*[^,]*[,]*[^,]*[,]*[^,]*[,]*\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)[,]*.*/s//20\6\.\5\.\4-\1:\2:\3/p')
        /bin/date -u ${str_data}
        gps_sunc_flag=yes
    ;;
    * )
    ;;

esac

done

fi

который для удобства пользования помещается в /etc/virt2real и запускается скриптом /etc/init.d/S52gpsdate:
Код: Выделить всё
#!/bin/sh
/etc/virt2real/gpsdate.sh > /dev/null &

Для достижения более высокой точности используем ntpd, который в течение десятка минут подгоняет точность системного времени до сотых долей секунды. Чтобы ntpd не отключался после установки системного времени, как это предусмотрено сейчас, в скрипте запуска S49ntp нужно убрать опцию -q, то есть должно быть так:
Код: Выделить всё
   echo -n "Starting $DESC: $NAME"
   $DAEMON -g > /dev/null 2>&1 &
   echo "."

Далее, чтобы нормально шло взаимодействие между gpsd и ntpd, в файл /etc/ntp.conf нужно добавить
Код: Выделить всё
server 127.127.28.0 prefer iburst
fudge 127.127.28.0 time1 0.475 refid GPS

где величина "0.475" подобрана для приемника ЕМ-480 при выдаче NMEA и скорости обмена 4800 бод.

Отдельное спасибо andy за парсинг строки на sed.
akril
 
Сообщения: 23
Зарегистрирован: 24 апр 2014, 14:50
Откуда: Россия, Воронеж


Вернуться в Раздел "для чайников"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron