[MontelLUG] Gpsd su Debian Squeeze

Samuele samuele.zanin a tiscali.it
Mar 24 Ago 2010 15:47:25 CEST


Premessa: non so se esistono soluzioni migliori. Penso di si. Io non ne 
ho trovate. Se le sapete siete invitati a postarle.

Come qualcuno saprà, sono stato costretto qualche tempo fa ad 
abbandonare la fida etch per passare alla testing-congelata squeeze.

Ieri sera ho provato a collegare il gps alla squeeze.
Il proverbio dice: chi lascia la strada vecchia per la nuova, sà quel 
che perde, ma non sà quel che trova.
Infatti, non funzionava una mazza.
Colpa del bluetooth integrato?
Colpa dei driver inclusi in squeeze?
Colpa del demone gps?
Boh. Inizia la caccia alle streghe.
Dopo avere fatto spezzatino di demoni vari, apparentemente sembra tutto 
funzionare.
Premessa, come funziona l'ambaradam.

0) Attraverso hcitool ed hciconfig, si riesce a collegarsi al gps e 
sparare il contenuto su /dev/rfcomm0.
A questo punto, è come si avesse il vecchio gps collegato via seriale/usb.
Facendo un bel cat /dev/rfcomm0 si vedono dati venire giù.

1) In linux, esiste un demone gpsd che legge il device a cui è collegato 
il gps (/dev/rfcomm0 in questo caso) e spara il contenuto sulla porta 
tcp 2947.

2) Facendo un telnet su localhost 2947 e premendo r, dovrebbero venire 
fuori i comandi gps.

Io ero nella situazione in cui al punto 2, non accadeva nulla, se non 
l'outpudi di una stringa con una formattazione un po' particolare.
{"class":"VERSION","release":"2.95","rev":"2010-07-16T10:05:11","proto_major":3,"proto_minor":3}
C4$$0 xea questa?!?
Va ben, forse avranno fatto che il demone spari fuori qualche 
informazione riguardo se stesso.

Guglando, trovo che c'è un comando gpspipe che legge l'output di gpsd.
Oh, questo funziona e spara fuori roba tipo:
$GPGGA,133201,4544.antani,N,01150.supercazzola,E,1,05,2.60,111.50,M,46.345,M,,*4B
$GPRMC,133201,A,4544.antani,N,01150.supercazzola,E,0.0000,0.000,240810,,*2E
$GPGSA,A,3,30,29,31,02,12,,,,,,,,2.9,2.6,2.2*36
$GPGBS,133201,14.74,M,25.41,M,50.64,M*0F

Una lettura alla man page di gpsd e salta fuori l'arcano.
Precisamente dove scrivono:

The GPSD protocol is built on top of JSON, JaveScript Object Notation. 
Use of this metaprotocol to pass structured data between daemon and 
client avoids the non-extensibility problems of the old protocol, and 
permits a richer set of record types to be passed up to clients.

Sti beduini, hanno rifatto il protocollo di comunicazione. Scriverlo a 
caratteri cubitali da qualche parte no eh?
Guardo se c'è un'opzione per far sparare fuori al programma i dati nel 
formato vecchio.
Io non l'ho trovata.

Ok. E' l'ora dei barbatrucchi.
Posto che gpspipe -r butta fuori l'output come a me serve, se lo sparo 
su una connessione tcp sono a posto.
Quindi:
vi /etc/services
alla fine aggiungiamo
antani 1717

vi /etc/inetd.conf
alla fine aggiungiamo
antani    stream    tcp    nowait    nobody    /gpsmio

vi /gpsmio
con dentro
#!/bin/sh
gpspipe -r

Sono dovuto passare attraverso un file di shell, perché apparentemente, 
inetd non mi prendeva i parametri specificati in inetd.conf

/etc/init.d/openbsd-inetd restart

telnet 127.0.0.1 antani
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
netlib_connectsock() returns socket on fd 3
{"class":"VERSION","release":"2.95","rev":"2010-07-16T10:05:11","proto_major":3,"proto_minor":3}
{"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/rfcomm0"}]}
{"class":"WATCH","enable":true,"json":false,"nmea":true,"raw":0,"scaled":false,"timing":false}
$GPGGA,133201,4544.2548,N,01150.5411,E,1,05,2.60,111.50,M,46.345,M,,*4B
$GPRMC,133201,A,4544.2548,N,01150.5411,E,0.0000,0.000,240810,,*2E
$GPGSA,A,3,30,29,31,02,12,,,,,,,,2.9,2.6,2.2*36
$GPGBS,133201,14.74,M,25.41,M,50.64,M*0F
^C*
^[^]

telnet> quit
Connection closed.

Sembra andare.

Modifica veloce a kismet per farlo puntare alla porta 1717 invece che 
2947 e...
tombola. Funziona. Riporta le coordinate gps giuste.
Maledetti!!!

Ovviamente, visto che ci sono alcuni programmi che non permettono di 
cambiare la porta dove vanno a connettersi al demone gps, per fare le 
cose per benino bisogna fare in modo che gpsd sia in ascolto su una 
porta diversa da 2947, e nel file /etc/services, sostituire 1717 con 2947.

Detto questo, buon tedio a tutti, nella speranza che la calura infernale 
che c'è fuori cessi al più presto.









More information about the montellug mailing list