====== Simulare un GPS via gpsd o via seriale ======
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.