Le periferiche Bluetooth stanno sempre più riscuotendo successo: ormai è praticamente presente su ogni dispositivo che si può tenere in una mano, in special modo in palmari e cellulari. Ma quali sono le possibilità offerte da GNU/Linux riguardo l'utilizzo di questa tecnologia? Cosa è possibile fare avendo un dispositivo Bluetooth e un PC con GNU/Linux?
Lo scopo di questo articolo sarà quello di darvi un primo approccio al supporto Bluetooth sotto GNU/Linux, per cercare magari di approfondire in seguito l'utilizzo in particolare di qualche servizio interessante. È importante tener presente che il supporto a Bluetooth consiste di due componenti: una a livello kernel, che gestisce i driver degli adattatori e come essi interagiscono con il sistema (ad esempio come dispositivi seriali), e un'altra in userspace gestita da appositi programmi, bluez nel nostro caso. Il supporto del kernel per Bluetooth è incluso di default praticamente in tutte le distribuzioni. Se siete soliti ricompilare il kernel allora ricordatevi di abilitarlo in Device Drivers / Networking Support / Bluetooth Subsystem Support. Sono supportati davvero molti dispositivi, soprattutto i dongle USB.
Come già detto sono necessari inoltre alcuni pacchetti per il funzionamento dell'adattatore Bluetooth. Il nome del progetto è Bluez, e comprende una vasta gamma di utility. Anche in questo caso, le distribuzioni più diffuse lo includono quantomeno sui CD o DVD di installazione. Provate a cercare il pacchetto relativo sul supporto oppure date un:
apt-get install bluez-*
se utilizzate una distribuzione Debian o derivate (quindi anche Ubuntu) per scaricare tutti i pacchetti relativi al progetto Bluez. In alternativa scaricate l'utility dal sito di riferimento.
Un'ultima cosa: una volta installato Bluez, è buona cosa impostare il pin (tipico delle connessioni bluetooth) editando il file /etc/bluetooth/pin
(contiene un numero, potete cambiarlo con quello che preferite). A questo punto il sistema dovrebbe essere in grado di caricare i driver necessari al funzionamento dell'adattatore. Ad esempio inserendo un dongle Bluetooth USB, dovremmo ottenere i seguenti messaggi del kernel (potete controllare con dmesg
oppure analizzando il contenuto del file /var/log/syslog
). Se l'output è simile a:
Jun 12 11:14:02 localhost kernel: ohci_hcd 0000:00:02.0: wakeup Jun 12 11:14:02 localhost kernel: usb 1-1: new full speed USB device using ohci_hcd and address 6 Jun 12 11:14:03 localhost kernel: Bluetooth: HCI USB driver ver 2.8 Jun 12 11:14:03 localhost kernel: usbcore: registered new driver hci_usb Jun 12 11:14:03 localhost usb.agent[11020]: hci_usb: loaded successfully Jun 12 11:14:03 localhost hcid[10965]: HCI dev 0 registered Jun 12 11:14:03 localhost hcid[10965]: HCI dev 0 up Jun 12 11:14:03 localhost hcid[10965]: Starting security manager 0
allora il vostro adattatore è stato riconosciuto correttamente. Possiamo sincerarcene utilizzando hcitool
. Questo programma è molto utile per la diagnostica e consente di far eseguire alcune operazioni al nostro adattatore Bluetooth. Ad esempio con hcitool dev
potremmo verificare che tutto sia andato per il meglio. Con un output del tipo:
Devices: hci0 00:60:57:02:68:51
Saremo in grado di sapere che la nostra periferica funziona, le è stato associato infatti l'identificativo hci0
e ha come id
(una sorta di mac address) 00:60:57:02:68:51.
Ora che abbiamo configurato correttamente il nostro adattatore non ci resta altro che utilizzarlo. Vi parleremo di questo nella prossima puntata, che sarà pubblicata il prossimo giovedì, dedicata a come fare a trasferire file da un dispositivo bluetooth a GNU/Linux.
Nella parte precedente dell'articolo abbiamo visto come fare a far riconoscere a GNU/Linux un generico adattatore Bluetooth. Se tutto è andato per il verso giusto ora dovremmo essere in grado di avere un device chiamato hci0
pronto per l'uso. Possiamo verificarlo con il comando hcitool dev
oppure con hciconfig -a
. Quest'ultimo dovrebbe dare come output qualcosa di simile a:
hci0: Type: USB BD Address: 00:60:57:02:68:51 ACL MTU: 192:8 SCO MTU: 64:8 UP RUNNING RX bytes:433 acl:0 sco:0 events:22 errors:0 TX bytes:327 acl:0 sco:0 commands:18 errors:0 Features: 0xff 0xff 0x09 0x00 0x00 0x00 0x00 0x00 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: SLAVE ACCEPT Name: 'lnxbox-0' Class: 0x3e0100 Service Classes: Networking, Rendering, Capturing, Object Transfer, Audio Device Class: Computer, Uncategorized HCI Ver: 1.1 (0x1) HCI Rev: 0xbc LMP Ver: 1.1 (0x1) LMP Subver: 0xbc Manufacturer: Cambridge Silicon Radio (10)
Potete notare come l'output sia molto simile a quello di ifconfig
.
Poniamo ora il caso di voler trasferire alcuni file da un dispositivo che supporta Bluetooth, come ad esempio un cellulare oppure un palmare. Il trasferimento di file tramite questa tecnologia avviene praticamente sempre sfruttando un protocollo conosciuto sotto il nome di Obex, abbreviazione di OBject EXchange, è nato per dispositivi a infrarossi, ma è stato adottato anche da Bluetooth.
Dovremmo installarlo, anche questo pacchetto di solito è presente tra quelli forniti ufficialmente dalla distribuzione. Sotto GNU/Linux l'implementazione di Obex prende il nome di OpenObex. Abbiamo la necessità di installare sia la versione client (obexftp
sotto Debian ad esempio) per inviare file da GNU/Linux, sia quella server (obexserver
sotto Debian) per riceverne. Una volta installato tutto il necessario procediamo con la configurazione.
Iniziamo prima di tutto con l'effettuare la scansione della rete alla ricerca di periferiche che supportino questo protocollo di trasmissione wireless. Ci torna utile ancora una volta hcitool
. Lanciamolo con il parametro scan per avviare la scansione:
andrea@lnxbox1:~$ hcitool scan Scanning ... 00:0E:07:C4:B3:28 Cellulare
In questo caso è stata rilevata una periferica, chiamata Cellulare, avente come id 00:0E:07:C4:B3:28
Ora non ci resta altro che stabilire una connessione tra i due dispositivi, e poi utilizzare obex per trasferire un file dal PC a "Cellulare". Per far questo dovremmo trovare il canale (è analogo a una porta del protocollo TCP/IP) dove è attivo il servizio per lo scambio di file. Ci viene incontro sdptool
.
Con sdptool browse
faremo una scansione della rete alla ricerca dei servizi che sono accessibili. Tra questi troveremo qualcosa del tipo "Obex File Transfer". A seconda del dispositivo (è ovvio che dispositivi diversi forniscono servizi diversi, ad esempio un GPS bluetooth difficilmente offrirà gli stessi servizi di un Cellulare o di un PDA o di una cuffia Bluetooth), potremmo avere una lista di servizi, nel caso di esempio tra l'output di "sdptool browse" è possibile rintracciare questo:
.............. Service Name: OBEX File Transfer Service RecHandle: 0x1000d Service Class ID List: "OBEX File Transfer" (0x1106) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 7 "OBEX" (0x0008) Profile Descriptor List: "OBEX File Transfer" (0x1106) Version: 0x0100 .............
Quello che a noi interessa di questo output è in particolar modo il canale, il parametro seguito da "Channel:" in questo caso 7. Ci servirà per instaurare la connessione tra i due dispositivi e inviare in seguito un file. Ipotizziamo di voler spedire un'immagine, chiamata html.jpg, dal nostro PC a "Cellulare" che come abbiamo visto ha come id 00:0E:07:C4:B3:28. Come leggiamo dal precedente output il canale è il 7. Useremo obexftp
, il comando sarà:
obexftp -b 00:0E:07:C4:B3:28 -B 7 -p html.jpg
L'opzione -b
ci consente di specificare il dispositivo al quale collegarsi, mentre l'opzione -B
il canale. L'opzione -p
indica che l'azione è quella di inviare un file al dispositivo. Fatto questo verrà avviato il trasferimento del file.
Il trasferimento in senso inverso, cioè da "Cellulare" al nostro PC può esser fatto in diversi modi. Io consiglio l'utilizzo di obexserver
. È innanzitutto necessario abilitare il servizio di ricezione file da parte del sistema operativo utilizzando sdptool
. La sintassi è:
sdptool add -channel=10 OPUSH
In questo modo specifichiamo come canale 10, corretto per la gran parte dei dispositivi. Ora lanciamo obexserver
e proviamo a inviare i file dal nostro dispositivo verso il PC. Il trasferimento dovrebbe avvenire senza grossi intoppi e dovremmo ritrovarci i file appena arrivati nella directory /tmp
.