java & bluetooth

Ciao a tutti,
vorrei cercare di fare un punto della situazione riguardo a java e
bluetooth, visto che e' alcuni gironi che cerco di capirci qualcosa.
Tutto parte dal fatto che vorrei sviluppare un plugin che tracci
percorsi GPS all'interno di un mobile GIS (mobile si fa per dire, table
pc :)). Comunque potendo il gps essere collegato sia via bluetooth, sia
via usb, ho pensato che la javax.comm api sarebbe stata la via migliore.

Torno sul sito sun che la distribuisce dopo un anno e lo scenario e'
cambiato:
- prima vi erano pacchetti per solaris e window e stavo aspettando
quelli per linux
- ora i pacchetti esistono per linux e solaris, ma non piu' per windows.

Considerando che vorrei una portabilita' per linux, win e mac, dopo aver
trovato infiniti pacchetti proprietari, credo di aver capito che
l'implementazione free e open si trova qui:

http://www.rxtx.org

Qualcuno si trova in quello che scrivo?
Se qualcuno fosse interessato, vorrei poi proseguire con una
chiaccherata riguardante i passaggi di configurazione su linux e poi
l'accesso da java al GPS per ottenere in stream le frasi NMEA che
definiscono la posizione.

Fatemi sapere,
Andrea

Alle 09:32, giovedì 14 giugno 2007, Andrea Antonello ha scritto:

Ciao a tutti,

Ciao!

[snip]

Se qualcuno fosse interessato, vorrei poi proseguire con una
chiaccherata riguardante i passaggi di configurazione su linux e poi
l'accesso da java al GPS per ottenere in stream le frasi NMEA che
definiscono la posizione.

Ho un portatile dual boot (con bluetooth funzionante anche in linux, ma non
riapriamo vecchie ferite :wink: e un ricevitore GPS bluetooth. Se ti può servire
per fare del testing sono disponibile :slight_smile:

Inoltre ti segnalo:
http://code.google.com/p/mobile-trail-explorer/
che sembra un progetto vivo e che, a quanto dichiarano, fa quello che vorresti
fare tu su un qualsiasi telefono che supporti le J2ME (e le JSR-82 per il
bluetooth). Ed è pure GPL :slight_smile:

Fatemi sapere,
Andrea

Ciao,
DAniele

[...]

[snip]

Se qualcuno fosse interessato, vorrei poi proseguire con una
chiaccherata riguardante i passaggi di configurazione su linux e poi
l'accesso da java al GPS per ottenere in stream le frasi NMEA che
definiscono la posizione.

Ho un portatile dual boot (con bluetooth funzionante anche in linux, ma non
riapriamo vecchie ferite :wink: e un ricevitore GPS bluetooth. Se ti può servire
per fare del testing sono disponibile :slight_smile:

Ciao Daniele, speravo mi rispondesse un hardwarista come te :slight_smile:

Visto che grazie a Dio anche il mio bluetooth ora funzia, vorrei
descrivere quello che ho fatto e invece quello che non mi funziona e
magari confrontarci su questo.

Quindi parto con la brodaglia:
- cerco il gps collegato:

hcitool scan

Scanning ...
        00:0B:0D:6F:F9:C5 SJA GPS

- trovato il gps attraverso l'indirizzo hardware trovo il canale sul
quale chiacchera:

sdptool browse 00:0B:0D:6F:F9:C5

Browsing 00:0B:0D:6F:F9:C5 ...
Service Name: SPP slave
Service Description: Bluetooth SPP V1.01
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding: 0x6a
  base_offset: 0x100

- creo una porta seriale virtuale alla quale lego il gps via hardware
adress e canale al device rfcomm0:

rfcomm bind /dev/rfcomm0 00:0B:0D:6F:F9:C5 1

- testo la connessione e vedo che funziona, vista la brodaglia nmea che
ne fuoriesce :):

cat /dev/rfcomm0

$GPGGA,135000.730,0,00,M,0.0,M,0000*55

$GPGSA,A,1,*1E

$GPGSV,3,1,12,08,66,042,10,65,239,28,51,140,29,43,304,*7C

$GPGSV,3,2,12,27,40,055,26,29,299,25,20,060,24,15,292,*7F

$GPGSV,3,3,12,13,06,105,21,03,326,19,03,051,02,02,217,*76

$GPRMC,135000.730,V,140607,N*4A

Alle 16:12, giovedì 14 giugno 2007, Andrea Antonello ha scritto:
[snip]

************
A questo punto ho una prima domanda:
- come mai non mi funziona se faccio

rfcomm bind /dev/ttyS50 00:0B:0D:6F:F9:C5 ???

Perche' me lo lega solo a rfcomm* e non a un tty*?
************

Questa sera provo (appena metto le mani sulla mia "saponetta" GPS), ma come
prova da fare in due secondi mi viene in mente di creare un link simbolico
da /dev/ttyS50 a /dev/rfcomm0 dopo che hai stabilito la connessione... Hai
già provato senza risultati?
E' possibile che le librerie rxtx facciano la scansione solo dei dispositivi
tty*?

Ti tengo aggiornato sugli esiti delle mie prove :slight_smile:

Ciao,
DAniele

[snip]

************
A questo punto ho una prima domanda:
- come mai non mi funziona se faccio

rfcomm bind /dev/ttyS50 00:0B:0D:6F:F9:C5 ???

Perche' me lo lega solo a rfcomm* e non a un tty*?
************

Questa sera provo (appena metto le mani sulla mia "saponetta" GPS), ma come
prova da fare in due secondi mi viene in mente di creare un link simbolico
da /dev/ttyS50 a /dev/rfcomm0 dopo che hai stabilito la connessione... Hai
già provato senza risultati?

Potrei giurarti di aver gia' provato, visto che e' cosi'. Ma nella
precisa scienza dei pc (pilotati da me) mi viene da riprovare piu' e
piu' volte le cose quando consigliate... e incredibilmente... ora funziona:
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
Port found: /dev/ttyS80 - 1 <- quella linkata da me
Port found: /dev/ttyS0 - 1

Ora tu dirai che e' la ubuntu e vorrei darti ragione, ma mi sa che a
forza di provare cose alla fine ho perso dei pezzi per strada. :slight_smile:

Molto meglio della soluzione temporanea che avevo trovato, che era
quella di passare alla virtual machine da riga di comando:
-Dgnu.io.rxtx.SerialPorts=/dev/rfcomm0

Almeno non dipendo dai parametri di avvio.

E' possibile che le librerie rxtx facciano la scansione solo dei dispositivi
tty*?

Ti tengo aggiornato sugli esiti delle mie prove :slight_smile:

Beh, grazie, a questo punto tutto funziona... se riesci a replicarlo in
modo da avere la sensazione che possa essere la via giusta, mi fai un
favore e almeno queste mail formeranno un piccolo gps-bluetooth-howto :slight_smile:

Ciao
Andrea

Alle 17:30, giovedì 14 giugno 2007, Andrea Antonello ha scritto:

> [snip]
>
>> ************
>> A questo punto ho una prima domanda:
>> - come mai non mi funziona se faccio
>>
>> rfcomm bind /dev/ttyS50 00:0B:0D:6F:F9:C5 ???
>>
>> Perche' me lo lega solo a rfcomm* e non a un tty*?
>> ************
>
> Questa sera provo (appena metto le mani sulla mia "saponetta" GPS), ma
> come prova da fare in due secondi mi viene in mente di creare un link
> simbolico da /dev/ttyS50 a /dev/rfcomm0 dopo che hai stabilito la
> connessione... Hai già provato senza risultati?

Potrei giurarti di aver gia' provato, visto che e' cosi'. Ma nella
precisa scienza dei pc (pilotati da me) mi viene da riprovare piu' e
piu' volte le cose quando consigliate... e incredibilmente... ora funziona:
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
Port found: /dev/ttyS80 - 1 <- quella linkata da me
Port found: /dev/ttyS0 - 1

Questa è una buona notizia! Lieto che funzioni :slight_smile:

Ora tu dirai che e' la ubuntu e vorrei darti ragione, ma mi sa che a
forza di provare cose alla fine ho perso dei pezzi per strada. :slight_smile:

Nono, non c'entra ubuntu. Credo sia Murphy (come quando a un certo workshop
uno ha tediato un sacco di gente con aircrack e poi non ha beccato la chiave
wep... :slight_smile:

Molto meglio della soluzione temporanea che avevo trovato, che era
quella di passare alla virtual machine da riga di comando:
-Dgnu.io.rxtx.SerialPorts=/dev/rfcomm0

Ma essendo scritto SerialPorts (con l'accento sulla _s_ finale) forse potresti
passargli l'intera famiglia /dev/rfcomm* ?

> E' possibile che le librerie rxtx facciano la scansione solo dei
> dispositivi tty*?
>
>
> Ti tengo aggiornato sugli esiti delle mie prove :slight_smile:

Beh, grazie, a questo punto tutto funziona... se riesci a replicarlo in
modo da avere la sensazione che possa essere la via giusta, mi fai un
favore e almeno queste mail formeranno un piccolo gps-bluetooth-howto :slight_smile:

Una cosa che ho in mente (ma non so se funziona, la volevo provare prima di
scriverla ma forse la puoi provare direttamente tu) è di vedere a che punto
udev "si ferma" nella creazione di porte tty e provare a inserire
dentro /etc/bluetooth/rfcomm.conf una dichiarazione del tipo

--8<--
ttyS(+infinito) {
device DE:AD:BE:EF;
channel 1;
}
--8<--

fare un bel restart del servizio, verosimilmente creare il device e vedere se
la cosa funziona.

Siccome però tutto questo porta in ballo anche altri servizi (udev) e non è
per niente elegante (su un kernel moderno avrebbe molto più senso usare dbus)
facciamo finta che io non abbia scritto niente :wink:

A proposito, immagino che il discorso java-dbus sia tutta un'altra cosa di cui
è meglio non parlare per evitare che salgano lamenti dagli inferi, o no? :slight_smile:

Ciao
Andrea

Ciao, DAniele

[...]

Una cosa che ho in mente (ma non so se funziona, la volevo provare prima di
scriverla ma forse la puoi provare direttamente tu) è di vedere a che punto
udev "si ferma" nella creazione di porte tty e provare a inserire
dentro /etc/bluetooth/rfcomm.conf una dichiarazione del tipo

--8<--
ttyS(+infinito) {
device DE:AD:BE:EF;
channel 1;
}
--8<--

fare un bel restart del servizio, verosimilmente creare il device e vedere se
la cosa funziona.

Si', e' una cosa che funziona, ma anche qui solo con le rfcomm*

Siccome però tutto questo porta in ballo anche altri servizi (udev) e non è
per niente elegante (su un kernel moderno avrebbe molto più senso usare dbus)
facciamo finta che io non abbia scritto niente :wink:

A proposito, immagino che il discorso java-dbus sia tutta un'altra cosa di cui
è meglio non parlare per evitare che salgano lamenti dagli inferi, o no? :slight_smile:

Mi fa paura anche solo sentirti citare certe cose... pur protetto dalla
mia ignoranza dbus... :slight_smile:

Ciao
Andrea

Ciao,
ieri sera niente prove per motivi di forza maggiore, ma prometto di rifarmi...
comunque:
Alle 18:09, giovedì 14 giugno 2007, Andrea Antonello ha scritto:

[...]

> --8<--
> ttyS(+infinito) {
> device DE:AD:BE:EF;
> channel 1;
> }
> --8<--
Si', e' una cosa che funziona, ma anche qui solo con le rfcomm*

Oh perdindirindina... questo non è bello!

Mi fa paura anche solo sentirti citare certe cose... pur protetto dalla
mia ignoranza dbus... :slight_smile:

In realtà dbus è molto bello e abbastanza semplice come idea, in sostanza lo
stack bluetooth si accorge che c'è un nuovo amico con cui parlare e lo
annuncia (usando dbus), se la tua applicazione fosse dbus-aware potrebbe
accorgersi in tempo reale dell'inserimento del ricevitore e parlarci
(indirizzando la comunicazione usando dbus stesso). La comunicazione a questo
livello già avviene (proprio per il bluetooth) per alcune funzioni, ad
esempio la richiesta del PIN (croce e delizia).
Un altro esempio di comunicazione dbus quello che succede quando inserisci un
disco usb, che viene montato dinamicamente e poi ti fa uscire il file
browser... :slight_smile:

Certo che però dbus è molto linux-specifico, e quindi forse non fa al caso
tuo...

Ciao
Andrea

Ciao,
DAniele