Raspberry PI : GPS, client NTP & serveur NTP

Raspberry PI B+, Raspbian Debian Wheezy 3.12 (09/09/2014) et GPS USGloalsat BU-353 SiRF III.

En fonction du modèle de Raspberry PI, du Kernel et du GPS utilisés il est possible que les commandes à appliquer soit légèrement différentes, ne pas hésiter à utiliser 'man' pour vérifier les commandes et les options.

Les manipulations qui suivent sont une synthèse de nombreux tutos disponibles sur le net, complets ou incomplets et parfois contradictoires. Il est possible également que pour arriver à obtenir la même chose c'est à dire le fonctionnement du GPS, de 'gpsd' et du service 'ntp' d'autres moyens ou solutions soient utilisés, c'est la magie de Linux.

Dans l'exemple présent le GPS est connecté tout le temps et 'gpsd' exécute automatiquement. Le GPS est forcé à fournir les informations dans le format NMEA (ce GPS peut également fournir les informations au format SiRF).

Commençons les opérations :

Sans rien installer, arrêter le Raspberry PI, connecter le GPS et démarrer le Raspberry PI, logiquement dans le /var/log/syslog doivent apparaître les lignes ci après ou quelques chose qui y ressemble fortement.


Dec 17 12:17:23 raspberrypi kernel: [ 3.291163] usb 1-1.2: new full-speed USB device number 4 using dwc_otg
Dec 17 12:17:23 raspberrypi kernel: [ 3.413413] usb 1-1.2: New USB device found, idVendor=067b, idProduct=2303
Dec 17 12:17:23 raspberrypi kernel: [ 3.422680] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Dec 17 12:17:23 raspberrypi kernel: [ 3.431710] usb 1-1.2: Product: USB-Serial Controller
Dec 17 12:17:23 raspberrypi kernel: [ 3.439681] usb 1-1.2: Manufacturer: Prolific Technology Inc.
Dec 17 12:17:23 raspberrypi kernel: [ 3.541038] usb 1-1.5: new high-speed USB device number 5 using dwc_otg
Dec 17 12:17:23 raspberrypi kernel: [ 3.652881] usb 1-1.5: New USB device found, idVendor=7392, idProduct=7811
Dec 17 12:17:23 raspberrypi kernel: [ 3.665871] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Dec 17 12:17:23 raspberrypi kernel: [ 3.675154] usb 1-1.5: Product: 802.11n WLAN Adapter
Dec 17 12:17:23 raspberrypi kernel: [ 3.681845] usb 1-1.5: Manufacturer: Realtek
Dec 17 12:17:23 raspberrypi kernel: [ 3.687686] usb 1-1.5: SerialNumber: 00f04e000001
Dec 17 12:17:23 raspberrypi kernel: [ 5.994591] usbcore: registered new interface driver usbserial
Dec 17 12:17:23 raspberrypi kernel: [ 6.135111] usbcore: registered new interface driver usbserial_generic
Dec 17 12:17:23 raspberrypi kernel: [ 6.268420] usbserial: USB Serial support registered for generic
Dec 17 12:17:23 raspberrypi kernel: [ 6.368919] usbcore: registered new interface driver pl2303
Dec 17 12:17:23 raspberrypi kernel: [ 6.455410] usbserial: USB Serial support registered for pl2303
Dec 17 12:17:23 raspberrypi kernel: [ 6.666514] pl2303 1-1.2:1.0: pl2303 converter detected
Dec 17 12:17:23 raspberrypi kernel: [ 6.911865] usb 1-1.2: pl2303 converter now attached to ttyUSB0

Vérifier également les messages via la commande 'dmesg'.

pi@raspberrypi ~ $ dmesg | grep tty
[ 0.000000] console [tty1] enabled
[ 0.532967] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83, base_baud = 0) is a PL011 rev3
[ 0.896287] console [ttyAMA0] enabled
[ 6.911865] usb 1-1.2: pl2303 converter now attached to ttyUSB0

Faire un 'ls' sur le /dev/ttyUSB0 ou éventuellement /dev/ttyUSB1 si le port USB serial a été rattaché au ttyUSB1

pi@raspberrypi ~ $ ls -l /dev/ttyUSB0
crw-rw---T 1 root dialout 188, 0 Jan 1 1970 /dev/ttyUSB0

A partir de là le GPS doit fonctionner en mode NMEA, pour s'en assurer exécuter un 'sudo apt-get update' puis installer l'appli screen avec un 'sudo apt-get install screen'. Plusieurs tutos proposent de faire un 'cat /dev/ttyUSB0' pour visualiser les informations du GPS, ça fonctionne aussi mais cela peut entraîner des dysfonctionnements du port.

pi@raspberrypi ~ $ screen /dev/ttyUSB0 4800

Il doit s'afficher les trames NMEA en provenance du GPS. Pour quitter screen faire un 'ctrl+a k' puis entrer 'yes' et valider.

Si des trames NMEA $GPAAM, $GPGGA, $GPRMC, … sont visibles le GPS fonctionne correctement.

Maintenant il faut installer 'gpsd' qui va permettre d'établir le lien entre le GPS et le service 'ntp', exécuter la commande 'sudo apt-get install gpsd gpsd-clients'. Si des applications en Python utilisant le GPS sont prévues, installer en plus 'python-gpsd'.

Lancer ensuite 'sudo dpkg-reconfigure gpsd' pour configurer le démarrage de 'gpsd'.

Répondre 'yes' au démarrage automatique de gpsd
Répondre 'no' au rattachement automatique du GPS USB
Entrer '/dev/ttyUSB0' pour le port de rattachement (toujours pareil si le port qui apparaît dans le log est ttyUSB1 entrer /dev/ttyUSB1)
Entrer '-n -b' dans les options de démarrage de gpsd (-n pour forcer le mode nmea et -b pour ne pas écrire sur le port)
Entrer '/var/run/gpsd.sock' pour le control socket path

Visualiser le fichier 'gpsd' il doit correspondre à ça :


pi@raspberrypi ~ $ more /etc/default/gpsd
# Default settings for gpsd.
# Please do not edit this file directly - use `dpkg-reconfigure gpsd' to
# change the options.
START_DAEMON="true"
GPSD_OPTIONS="-n -b"
DEVICES="/dev/ttyUSB0"
USBAUTO="false"
GPSD_SOCKET="/var/run/gpsd.sock"

Rebooter le Raspberry PI avec la commande 'sudo reboot' puis visualiser au redémarrage /var/log/syslog, il doit y avoir les lignes suivantes :

Dec 17 13:37:18 raspberrypi kernel: [ 32.009760] Adding 102396k swap on /var/swap. Priority:-1 extents:1 across:102396k SSFS
Dec 17 13:37:19 raspberrypi gpsd[2180]: gpsd:ERROR: can't create IPv6 socket
Dec 17 13:37:19 raspberrypi ntpd[2197]: ntpd 4.2.6p5@1.2349-o Fri May 18 20:30:57 UTC 2012 (1)
Dec 17 13:37:19 raspberrypi gpsd[2180]: gpsd:SHOUT: vendor/product match with 091e:0003 not found
Dec 17 13:37:19 raspberrypi ntpd[2198]: proto: precision = 1.000 usec
Dec 17 13:37:19 raspberrypi ntpd[2198]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
Dec 17 13:37:19 raspberrypi ntpd[2198]: Listen normally on 1 lo 127.0.0.1 UDP 123
Dec 17 13:37:19 raspberrypi ntpd[2198]: Listen normally on 2 wlan0 192.168.43.40 UDP 123
Dec 17 13:37:19 raspberrypi ntpd[2198]: peers refreshed
Dec 17 13:37:19 raspberrypi ntpd[2198]: Listening on routing socket on fd #19 for interface updates
Dec 17 13:37:19 raspberrypi ntpd[2198]: restrict: error in address '::' on line 38. Ignoring...
Dec 17 13:37:19 raspberrypi ntpd[2198]: restrict: error in address '::1' on line 42. Ignoring...
Dec 17 13:39:37 raspberrypi ntpd[2198]: Listen normally on 3 eth0 192.168.0.89 UDP 123
Dec 17 13:39:37 raspberrypi ntpd[2198]: peers refreshed

Les erreurs correspondent à l'IPv6 qui n'est pas activé par défaut sur le Raspberry PI, cela n'a pas d'incidence dans le fonctionnement en IPv4.

La ligne 'gpsd:SHOUT: vendor/product match with 091e:0003 not found' est lié à un bug d'affichage du driver des GPS ''SHOUT''. Ce message peut être différent avec un GPS d'un autre type.

Passons maintenant à la configuration du service 'ntp'. Dans la configuration par défaut celui ci utilise un pool de serveur de temps comme indiquer dans /etc/ntp.conf.


# pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
# pick a different set every time it starts up. Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

Comme le Raspberry est connecté à internet l'heure et la date doivent être à jour, vérifiez quand même avec la commande 'date'.

pi@raspberrypi /etc $ date
Wed Dec 17 13:55:31 CET 2014

En faisant un 'ntpq -p' il est possible de voir les serveurs de temps en cours et celui utilisé (ligne avec l'étoile dans l'exemple ci après).

pi@raspberrypi /etc $ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp.univ-angers 195.220.94.163 2 u 27 64 377 307.592 -39.992 36.473
+server.gigelf.f 138.195.130.62 3 u 23 64 357 301.398 -29.702 25.584
+host1.thefox.co 129.250.35.250 3 u 65 64 367 237.834 -4.937 40.110

Pour que le GPS soit pris en compte ajouter les lignes suivantes dans /etc/ntp.conf après la section pool.ntp. Si le GPS ne propose pas de PPS, les deux dernières lignes sont facultatives.

# gps ntp
server 127.127.28.0 minpoll 4
fudge 127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge 127.127.28.1 refid PPS

Afin d'être certain que le GPS fournisse le temps mettre les lignes des serveurs de temps en commentaire.

#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

Cela donne donc

# pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
# pick a different set every time it starts up. Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

 
# gps ntp
server 127.127.28.0 minpoll 4
fudge 127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge 127.127.28.1 refid PPS


Arrêter le service ntp et modifier l'heure du Raspberry PI avec par exemple 10 min de retard par rapport à l'heure actuelle.

pi@raspberrypi /etc $ sudo service ntp stop
[ok] Stopping NTP server: ntpd


pi@raspberrypi /etc $ sudo date --set="sun dec 14 14:00"
pi@raspberrypi /etc $ date
Sun Dec 14 14:00:03 CET 2014


Rebooter le Raspberry PI, visualiser le /var/log/syslog les lignes ci dessous doivent être présentes.

Dec 14 14:12:47 raspberrypi gpsd[2182]: gpsd:ERROR: can't create IPv6 socket
Dec 14 14:12:47 raspberrypi gpsd[2182]: gpsd:SHOUT: vendor/product match with 091e:0003 not found
Dec 14 14:12:47 raspberrypi ntpd[2202]: ntpd 4.2.6p5@1.2349-o Fri May 18 20:30:57 UTC 2012 (1)
Dec 14 14:12:47 raspberrypi ntpd[2205]: proto: precision = 1.000 usec
Dec 14 14:12:47 raspberrypi ntpd[2205]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
Dec 14 14:12:47 raspberrypi ntpd[2205]: Listen normally on 1 lo 127.0.0.1 UDP 123
Dec 14 14:12:47 raspberrypi ntpd[2205]: Listen normally on 2 wlan0 192.168.43.40 UDP 123
Dec 14 14:12:47 raspberrypi ntpd[2205]: peers refreshed
Dec 14 14:12:47 raspberrypi ntpd[2205]: Listening on routing socket on fd #19 for interface updates
Dec 14 14:12:47 raspberrypi ntpd[2205]: restrict: error in address '::' on line 43. Ignoring...
Dec 14 14:12:47 raspberrypi ntpd[2205]: restrict: error in address '::1' on line 47. Ignoring...
Dec 14 14:13:59 raspberrypi ntpd[2205]: Listen normally on 3 eth0 192.168.0.89 UDP 123
Dec 14 14:13:59 raspberrypi ntpd[2205]: peers refreshed


Logiquement en lançant un 'screen /dev/ttyUSB0 4800' l'écran doit devenir noir avec le message [screen is terminating]

Pour s'assurer que le GPS est bien fonctionnel lancer un 'cgps -s' les informations du GPS doivent apparaître comme dans la fenêtre ci dessous. Vérifier surtout que le GPS est synchronisé.




A ce stade le service ntp devrait mettre à jour la date et l'heure du Raspberry PI.

Attention lorsque la différence entre l'heure et la date du Raspberry PI et l'heure et la date du GPS est trop importante, le service 'ntp' ne fera pas de mise à jour. Modifier l'heure et la date comme indiqué précédement.

Attendre quelques instant (jusqu'à quelques minutes), faire un 'date' et 'ntpq -p' régulièrement, le Raspberry PI doit se mettre à l'heure.


pi@raspberrypi ~ $ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*SHM(0) .NMEA. 0 l 6 16 1 0.000 -1.304 0.001
SHM(1) .PPS. 0 l - 16 0 0.000 0.000 0.000

La ligne NMEA est précédée d'une étoile, tout fonctionne.

Si le Raspberry Pi est connecté à internet autant utiliser le GPS et le pool de serveur de temps, supprimer alors les # des ligne ci après dans /etc/ntp.conf.


server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

Maintenant que le Raspberry PI est équipé d'une source de temps, pourquoi ne pas l'utiliser comme serveur de temps Stratum ?

En fait il n'y a rien à faire sur le Raspberry PI, éventuellement modifier /etc/ntp.conf comme ci après pour restreinte l'accès à une IP avec la ligne 'restrict 192.168.0.20 mask 255.255.255.0'.


# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
restrict 192.168.0.20 mask 255.255.255.0

Relance le service ntp pour que les modifications soient bien prises en compte.

Sur le client modifier /etc/ntp.conf en ajoutant l'adresse du Raspberry PI ou son nom avec la ligne 'server 192.168.0.89 iburst' au niveau des serveurs de temps.

Relancer le service NTP et exécuter un 'ntpq -p', il doit s'afficher les lignes suivantes après quelques instants, l'affichage des infos peu prendre quelques secondes :


~$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.0.89 .NMEA. 1 u 6 64 1 0.531 0.204 0.064

Pour utiliser le serveur de temps depuis un poste Windows, sous WindowsXP utiliser Dimension4 ( http://www.thinkman.com/dimension4/ ) et configurer la connexion vers le serveur avec le protocole SNTP.

Dans tout les cas il est fortement conseillé d'équiper le Raspberry PI d'un module RTC (Real Time Clock) ce qui permettra de garder le Raspberry à la bonne heure et à la bonne date après une coupure de courant et/ou si la liaison internet et le GPS venaient à ne plus être disponibles.

H. Lee & F1src op. Michel - maj 18/12/2014

Bibliographie du net :
http://www.raspberrypi.org/
http://www.raspbian.org/
 
http://en.wikipedia.org/wiki/Gpsd
http://www.catb.org/gpsd/
 
http://uplatetinkering.blogspot.fr/2013/10/pi-lab-4-gps-on-pi.html
http://astrobeano.blogspot.fr/2012/10/pharosmicrosoft-gps-360-on-raspberry-pi.html
http://blog.retep.org/2012/06/18/getting-gps-to-work-on-a-raspberry-pi/
http://tech.kulish.com/2007/10/30/ntp-ntpq-output-explained/ 


> Sommaire