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
#
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
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 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 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 |