Il problema: simulare la presenza di un GPS in modo che un programma client possa leggere i dati via via che arrivano. Vogliamo fornire in input i dati memorizzati in un tracciato GPX.
Il programma client potrebbe voler leggere via TCP/IP tramite gpsd
oppure aprire direttamente la seriale (es. /dev/ttyS0
) per leggere le stringhe NMEA.
Anzitutto convertiamo il file .gpx in stringhe NMEA:
gpsbabel -i gpx -f track.gpx -o nmea -F track.nmea
Quindi si lancia il comando gpsfake
(fornito dal pacchetto Debian python-gps):
gpsfake -b -c 0.5 percorso.nmea
In questo caso facciamo il replay del tracciato intervallando ogni stringa NMEA di 0.5 secondi. Aggiustare l'intervallo fino ad ottenere la velocità di replay desiderata.
gpsfake
si comporta cone un gpsd
, cioè si pone in ascolto sulla porta 2947 TCP e risponde ai client che si connettono. Se il programma client utilizza una connessione del genere abbiamo finito.
Se invece il programma client vuole aprire una porta seriale, dobbiamo scoprire quale pseudo terminale sta usando gpsfake
:
niccolo@delfi:~$ lsof | grep gpsfake | grep pts gpsfake 6031 niccolo 0u CHR 136,7 0t0 10 /dev/pts/7 gpsfake 6031 niccolo 1u CHR 136,7 0t0 10 /dev/pts/7 gpsfake 6031 niccolo 2u CHR 136,7 0t0 10 /dev/pts/7 gpsfake 6031 niccolo 5u CHR 136,10 0t0 13 /dev/pts/10
In questo caso si vede che il programma utilizza due terminali: /dev/pts/7
e /dev/pts/10
. Il primo di solito è il terminale dal quale abbiamo lanciato il comando, il secondo (/dev/pts/10
nel nostro caso) è il terminale su cui sta ripetendo i dati NMEA.
Per conferma possiamo vedere se escono le stringhe NMEA con:
cat /dev/pts/10
Sarebbe fatta, a meno che il progrmma client in questione voglia per forza usare /dev/ttySx
, allora tocca fare un link simbolico:
rm /dev/ttyS4 ln -s /dev/pts/10 /dev/ttyS4
Abbiamo utilizzato /dev/ttyS4
perché è una porta seriale inesistente sul nostro computer. Al prossimo reboot il /dev/ttyS4
dovrebbe essere ripristinato come in origine.