E' passato circa un anno da quando ho installato per la prima volta Asterisk a casa, un po' per curiosità ed un po' per adeguarmi a quello che aziendalmente mi attendeva nel prossimo futuro. Ho cominciato con una classica scheda analogica per gestire i telefoni e le linee di casa, sono passato per un classicone, il telefono SIP BT200, per poi passare al Cisco 7912, 7940 ed infine il 7931, finalmente felice di avere un telefono usabile e gradevole da vedere (nulla che accomunasse i due Cisco precedenti).
Non contento mi sono detto: perché non interfacciare anche Asterisk con il mio telefono cellulare? Basta dopotutto un dongle USB-Bluetooth, il pairing tra server e telefono ed ovviamente un modulo per asterisk. Beh, non ci crederete ma esistono almeno cinque moduli possibili, tra annunciati, rilasciati, funzionanti solo su Asterisk 1.2, futuri e rilasciati solo per il prossimo Asterisk 1.6.
Il più promettente sembra essere chan_mobile, appunto rilasciato dal gruppo di sviluppo di asterisk per la versione 1.6 e gentilmente backported verso la 1.4 da un team parallelo, che però fornisce una patch valida per una specifica release del modulo.
Dopo una ricerca non breve ho trovato una buona soluzione che opportunamente documentata può servire a chiunque, premettendo che la mia piattaforma di riferimento è Debian Etch. Per prima cosa si installa il necessario per il supporto bluetooth e per darsi alla compilazione folle, senza per questo dover ricompilare l'intero Asterisk ma utilizzando gli strumenti di sviluppo e la compilazione come modulo esterno. Per farlo i prerequisiti sono:
mricecoffee:~# apt-get install asterisk-dev libbluetooth2-dev
mricecoffee:~# apt-get install bluetooth bluez-utils
a questo punto si può iniziare a verificare che il proprio dongle USB-Bluetooth funzioni, sia verificandolo con il dmesg, sia con lsusb ed infine verificando che il sistema veda sia la presenza di un adattatore bluetooth e di un telefono (primo e secondo comando):
mricecoffee:~# hcitool dev
Devices:
hci0 00:0A:3A:5B:XX:XX
mricecoffee:~# hcitool scan
canning ...
00:17:83:17:XX:XX angeloxx
I due dati appena reperiti sono importanti: il primo è l'identificativo dell'host e il secondo è l'identificativo del nostro telefono che dovrà vedere il server Asterisk come un auricolare. Ora si passa ad Asterisk: si trova un posto comodo in cui effettuare una breve compilazione e si scarica da qui il sorgente adattato di chan_mobile.
A questo punto, ipotizzando di trovarci in /usr/src/chan_mobile si compila semplicemente (due righe, comando unico con un a-capo) con:
mricecoffee:/usr/src/chan_mobile# gcc -D_GNU_SOURCE -lbluetooth -shared \
-o /usr/lib/asterisk/modules/chan_mobile.so chan_mobile.c
Non dovrebbero apparire errori e si è già piazzato il modulo dove deve stare. A questo punto bisogna risolvere due problemi: la configurazione di asterisk ma ancora prima la gestione del pairing. Se correttamente configurato Asterisk al prossimo avvio deciderà di contattare il cellulare e la prima volta verrà tentato il pairing; ipotizzando un ambiente server non ci sarà una applet KDE che ci dirà di immettere un PIN possibile, ma sarà necessario stabilirne uno a priori. Un modo possibile e reso disponibile out-of-box è passkey-agent, un programmuzzo da avviare che risponde a qualsiasi richiesta di immissione del pin da parte dell'agente bluetooth con "xxxx", ovviamente configurabile.
Il simpatico agente però non è fornito in formato binario perché è solamente un esempio di come fare, non un ottimo esempio. In Debian però è disponibile nella documentazione accessoria e quindi volendolo compilare al volo:
mricecoffee:~# cd /usr/share/doc/bluez-utils/examples
mricecoffee:/usr/share/doc/bluez-utils/examples# gzip -d passkey-agent.c.gz
mricecoffee:/usr/share/doc/bluez-utils/examples# make
mricecoffee:/usr/share/doc/bluez-utils/examples# cp passkey-agent /usr/bin/
mricecoffee:/usr/share/doc/bluez-utils/examples# passkey-agent --default 1234 &
A questo punto a qualsiasi scambio di PIN il nostro server sceglierà 1234. Ora è il momento di configurare asterisk, per prima cosa con /etc/asterisk/mobile.conf dove sistemiamo:
[general]
interval=30 ; Number of seconds between trying to connect to devices.
[adapter]
id=blue
address=00:0A:3A:5B:XX:XX
[HTC-TOUCH]
address=00:17:83:17:XX:XX
port=1
context=mobile
dtmfskip=50
adapter=blue
In pratica si dichiarano gli adapter e cioè i dongle Bluetooth, gli si assenga un nome (blue) e si dichiara l'address ottenuto con hcitool dev. Si dichiara quindi anche un apparato (HTC-TOUCH), la porta con cui viene visto (port=1, da rilevare con "sdptool browse 00:17:83:XX:XX:XX" alla ricerca del profilo "Handsfree Gateway", prendendo nota del "Channel") il contesto nell'extension.conf da considerare per le chiamate in ingresso, l'indirizzo Bluetooth ottenuto con hcitool scan ed infine l'adapter a cui è collegato (blue). A questo punto nell'extension.conf si può fare quanto segue:
[mobile]
exten => s,1,NoOp()
exten => s,n,Dial(SCCP/*1)
exten => s,n,Hangup()
.....
[context-di-uscita]
exten => _8.,1,Noop
exten => _8.,n,Dial(Mobile/HTC-TOUCH/${EXTEN:1})
exten => _8.,n,Hangup
Cosa abbiamo fatto? Con il context mobile riceviamo le chiamate dal cellulare e le giriamo ad un telefono fisso determinato (oppure i soliti dialplan con segreteria & Co.), mentre nel context di gestione delle chiamate in uscite decidiamo che un numero prefissato dall'8 deve uscire... dal cellulare HTC-TOUCH. Al riavvio di Asterisk come detto (oppure al comando di caricamento di chan_mobile.so) asterisk cercherà di effettuare la connessione con relativa richiesta di PIN da parte del telefono. Una volta fatto peering e attivazione del profilo auricolare, sarà da subito possibile ricevere ed effettuare chiamate dai telefoni fissi (o portatili) di casa verso la linea cellulare.
Sempre con lo stesso modulo è possibile fare un'altra cosa: assegnare ad un auricolare un interno ed utilizzarlo come auricolare globale di Asterisk (per tutte le chiamate, in casa, o per determinati interni in una realtà aziendale) sia che si tratti di telefonia fissa che mobile, anche proveniente da più cellulari.
Nota
Il modulo è stato testato con asterisk 1.4.10, 1.4.18 e 1.4.19; il modulo è una riedizione di un modulo già modificato da qualcun'altro ma che ha avuto bisogno di un adattamento pro-debian (l'include di asterisk.h), la rimozione di ast_debug e la ricerca della stringa di compilazione per gestirlo separatamente senza includerlo in una compilazione più ampia. E' necessario, sempre su Debian, utilizzare libbluetooth 3.30, ci sono stati problemi con la versione unstable ma la cosa non mi sorprende.
Per le chiamate uscenti ho notato un certo ritardo della voce, aggiungendo alla singola definizione del telefono "nocallsetup=Y".