HOWTO: chan_cellphone en Asterisk 1.4 trunk

Hace un par de días que leí en voipnovatos la existencia de este chan, que permite conectar Asterisk con un teléfono móvil por Bluetooth. El caso es que inmediatamente me puse a probarlo y estoy gratamente sorprendido, ya que en una semana han sacado 4 versiones, lo que indica que el desarrollo es constante.

Bueno, pues manos a la obra!

Lo primero que necesitamos es el soporte bluetooth en el Kernel (por defecto viene) y un dongle compatible. Una vez tenemos esto vamos a instalar los paquetes necesarios:

Añadimos esto al nuestro sources.list

#bluetooth
deb http://bluez.sourceforge.net/download/debian/ ./
deb-src http://bluez.sourceforge.net/download/debian/ ./

Ahora instalamos:

apt-get install bluetooth bluez-utils libbluetooth2 libbluetooth2-dev

Vale, ahora suponiendo que nuestro PC ya tiene el bluetooth operativo, es hora de instalar la versión trunk de Asterisk. Para ello ejecutamos:

svn checkout http://svn.digium.com/svn/asterisk/trunk asterisk-trunk

Y esto nos descargará la versión trunk de Asterisk en la carpeta asterisk-trunk

Ahora necesitamos el parche del chan_cellphone, que podemos bajar de aquí, y lo metemos en la carpeta asterisk-trunk.

Para aplicar el parche hay que ejecutar lo siguiente dento de la carpeta asterisk-trunk:

patch -p0 < chan_cellphone.patch

Ojo que el nombre puede variar dependiendo de la revisión del parche.

Para compilar Asterisk primero ejecutamos:

./bootstrap.sh

Para esto hay que tener instalados los paquetes autoconf y automake, asi que si no los tienes ejecuta:

apt-get install autoconf automake

Una vez hecho esto ya esta todo listo para compilar Asterisk:

./configure
make menuselect
make
make install

Al hacer make menuslect, comprueba en la seccion de channels que el chan_cellphone se encuentra marcado para su compilación.

Una vez Asterisk esta instalado tenemos que copiar algunos ficheros de la carpeta asterisk-trunk:

cp -R contrib/bluetooth/* /etc/bluetooth
cp configs/cellphone.conf.sample /etc/asterisk/cellphone.conf

Esto copiará los ficheros de configuración del sistema bluetooth de nuestro pc. El fichero pinhelper contiene el password necesario para emparejas los dispositivos, y es necesario hacerlo ejecutable:

chmod +x /etc/bluetooh/pinhelper

Una vez todo el sistema esta funcionando, solo queda arrancar Asterisk y configurar el fichero cellphone.conf. Para ello, desde el CLI de Asterisk ejecutamos:

CLI>cell search

Esto nos mostrará la MAC y el puerto del dispositivo de los dispositivos bluetooth que esten al alcance, así que copiamos estos datos para ponerlos en el fichero cellphone.conf

[pruebas]
address=00:12:56:90:6E:00
port=4
context=incoming-mobile

Las llamadas que se hagan a ese móvil pasarán al contexto indicado en el fichero.

Ya casi esta. Solo queda emparejar el teléfono y el ordenador, para ello paramos Asterisk y ejecutamos:

dbus-send --system --dest=org.bluez /org/bluez/hci0 org.bluez.Adapter.SetMode string:discoverable

Esto hará que el ordenador sea visible a otros dispositivos. Acto seguido, los emparejamos (el PC se identifica como Asterisk PBX) y fijamos a Asterisk PBX como autorizado. Al arrancar Asterisk veremos un mensaje que dice que el dispositivo «pruebas» esta conectado. Ya esta!!! Para llamar a través de el móvil:

exten => _6XXXXXXXX,1,Dial(CELL/pruebas/${EXTEN})

Para consultar el estado de los dispositivos basta con ejecutar desde el CLI:

CLI>cell show devices

NOTA IMPORTANTE: Este canal esta todavía en pruebas y no todos los teléfonos estan soportados.

20 thoughts on “HOWTO: chan_cellphone en Asterisk 1.4 trunk

  1. Al compilarlo me da error, si desactivo el chan_cellphone en make menuselect, se compila el asterisk sin problemas.

    He probado con las versiones 3.4 y 4.1 del gcc y me da el mismo error:

    [CC] chan_cellphone.c -> chan_cellphone.o
    chan_cellphone.c:1486: error: redefinition of ‘__register_file_version’
    chan_cellphone.c:34: error: previous definition of ‘__register_file_version’ was here
    chan_cellphone.c:1486: error: redefinition of ‘__unregister_file_version’
    chan_cellphone.c:34: error: previous definition of ‘__unregister_file_version’ was here
    chan_cellphone.c:1525: error: redefinition of ‘prefformat’
    chan_cellphone.c:73: error: previous definition of ‘prefformat’ was here
    chan_cellphone.c:1526: error: redefinition of ‘type’
    chan_cellphone.c:74: error: previous definition of ‘type’ was here
    chan_cellphone.c:1528: error: redefinition of ‘discovery_interval’
    chan_cellphone.c:76: error: previous definition of ‘discovery_interval’ was here
    chan_cellphone.c:1531: error: nested redefinition of ‘enum cel_state’
    chan_cellphone.c:1531: error: redeclaration of ‘enum cel_state’
    chan_cellphone.c:1532: error: redeclaration of enumerator ‘CEL_STATE_INIT’
    chan_cellphone.c:80: error: previous definition of ‘CEL_STATE_INIT’ was here
    chan_cellphone.c:1533: error: redeclaration of enumerator ‘CEL_STATE_INIT1’
    chan_cellphone.c:81: error: previous definition of ‘CEL_STATE_INIT1’ was here
    chan_cellphone.c:1534: error: redeclaration of enumerator ‘CEL_STATE_INIT2’
    chan_cellphone.c:82: error: previous definition of ‘CEL_STATE_INIT2’ was here
    chan_cellphone.c:1535: error: redeclaration of enumerator ‘CEL_STATE_INIT3’
    chan_cellphone.c:83: error: previous definition of ‘CEL_STATE_INIT3’ was here
    chan_cellphone.c:1536: error: redeclaration of enumerator ‘CEL_STATE_INIT4’
    chan_cellphone.c:84: error: previous definition of ‘CEL_STATE_INIT4’ was here
    chan_cellphone.c:1537: error: redeclaration of enumerator ‘CEL_STATE_INIT5’
    chan_cellphone.c:85: error: previous definition of ‘CEL_STATE_INIT5’ was here
    chan_cellphone.c:1538: error: redeclaration of enumerator ‘CEL_STATE_INIT6’
    chan_cellphone.c:86: error: previous definition of ‘CEL_STATE_INIT6’ was here
    chan_cellphone.c:1539: error: redeclaration of enumerator ‘CEL_STATE_INIT7’
    chan_cellphone.c:87: error: previous definition of ‘CEL_STATE_INIT7’ was here
    chan_cellphone.c:1540: error: redeclaration of enumerator ‘CEL_STATE_IDLE’
    chan_cellphone.c:88: error: previous definition of ‘CEL_STATE_IDLE’ was here
    chan_cellphone.c:1541: error: redeclaration of enumerator ‘CEL_STATE_DIAL’
    chan_cellphone.c:89: error: previous definition of ‘CEL_STATE_DIAL’ was here
    chan_cellphone.c:1542: error: redeclaration of enumerator ‘CEL_STATE_DIAL1’
    chan_cellphone.c:90: error: previous definition of ‘CEL_STATE_DIAL1’ was here
    chan_cellphone.c:1543: error: redeclaration of enumerator ‘CEL_STATE_OUTGOING’
    chan_cellphone.c:91: error: previous definition of ‘CEL_STATE_OUTGOING’ was here
    chan_cellphone.c:1544: error: redeclaration of enumerator ‘CEL_STATE_RING’
    chan_cellphone.c:92: error: previous definition of ‘CEL_STATE_RING’ was here
    chan_cellphone.c:1545: error: redeclaration of enumerator ‘CEL_STATE_RING2’
    chan_cellphone.c:93: error: previous definition of ‘CEL_STATE_RING2’ was here
    chan_cellphone.c:1546: error: redeclaration of enumerator ‘CEL_STATE_RING3’
    chan_cellphone.c:94: error: previous definition of ‘CEL_STATE_RING3’ was here
    chan_cellphone.c:1547: error: redeclaration of enumerator ‘CEL_STATE_INCOMING’
    chan_cellphone.c:95: error: previous definition of ‘CEL_STATE_INCOMING’ was here
    chan_cellphone.c:1549: error: redeclaration of enumerator ‘CEL_STATE_HANGUP’
    chan_cellphone.c:97: error: previous definition of ‘CEL_STATE_HANGUP’ was here
    chan_cellphone.c:1551: error: redefinition of ‘struct cel_pvt’
    chan_cellphone.c:1586: error: redefinition of ‘struct devices’
    chan_cellphone.c:1586: error: redefinition of ‘devices’
    chan_cellphone.c:134: error: previous definition of ‘devices’ was here
    chan_cellphone.c:1589: error: redefinition of ‘discovery_thread’
    chan_cellphone.c:137: error: previous definition of ‘discovery_thread’ was here
    chan_cellphone.c:1591: error: redefinition of ‘sco_listener_thread’
    chan_cellphone.c:139: error: previous definition of ‘sco_listener_thread’ was here
    chan_cellphone.c:1594: error: redefinition of ‘show_usage’
    chan_cellphone.c:142: error: previous definition of ‘show_usage’ was here
    chan_cellphone.c:1598: error: redefinition of ‘search_usage’
    chan_cellphone.c:146: error: previous definition of ‘search_usage’ was here
    chan_cellphone.c:1605: error: redefinition of ‘cel_cli’
    chan_cellphone.c:153: error: previous definition of ‘cel_cli’ was here
    chan_cellphone.c:1611: error: redefinition of ‘app_celstatus’
    chan_cellphone.c:159: error: previous definition of ‘app_celstatus’ was here
    chan_cellphone.c:1612: error: redefinition of ‘celstatus_synopsis’
    chan_cellphone.c:160: error: previous definition of ‘celstatus_synopsis’ was here
    chan_cellphone.c:1613: error: redefinition of ‘celstatus_desc’
    chan_cellphone.c:161: error: previous definition of ‘celstatus_desc’ was here
    chan_cellphone.c:1636: error: redefinition of ‘cel_tech’
    chan_cellphone.c:184: error: previous definition of ‘cel_tech’ was here
    chan_cellphone.c:1653: error: redefinition of ‘do_show_devices’
    chan_cellphone.c:201: error: previous definition of ‘do_show_devices’ was here
    chan_cellphone.c:1669: error: redefinition of ‘do_search_devices’
    chan_cellphone.c:217: error: previous definition of ‘do_search_devices’ was here
    chan_cellphone.c:1712: error: redefinition of ‘cel_status_exec’
    chan_cellphone.c:260: error: previous definition of ‘cel_status_exec’ was here
    chan_cellphone.c:1752: error: redefinition of ‘cel_request’
    chan_cellphone.c:300: error: previous definition of ‘cel_request’ was here
    chan_cellphone.c:1809: error: redefinition of ‘cel_call’
    chan_cellphone.c:357: error: previous definition of ‘cel_call’ was here
    chan_cellphone.c:1842: error: redefinition of ‘cel_hangup’
    chan_cellphone.c:390: error: previous definition of ‘cel_hangup’ was here
    chan_cellphone.c:1876: error: redefinition of ‘cel_answer’
    chan_cellphone.c:424: error: previous definition of ‘cel_answer’ was here
    chan_cellphone.c:1893: error: redefinition of ‘cel_digit_begin’
    chan_cellphone.c:441: error: previous definition of ‘cel_digit_begin’ was here
    chan_cellphone.c:1900: error: redefinition of ‘cel_digit_end’
    chan_cellphone.c:448: error: previous definition of ‘cel_digit_end’ was here
    chan_cellphone.c:1946: error: redefinition of ‘cel_read’
    chan_cellphone.c:494: error: previous definition of ‘cel_read’ was here
    chan_cellphone.c:2005: error: redefinition of ‘cel_write’
    chan_cellphone.c:553: error: previous definition of ‘cel_write’ was here
    chan_cellphone.c:2046: error: redefinition of ‘cel_fixup’
    chan_cellphone.c:594: error: previous definition of ‘cel_fixup’ was here
    chan_cellphone.c:2058: error: redefinition of ‘cel_devicestate’
    chan_cellphone.c:606: error: previous definition of ‘cel_devicestate’ was here
    chan_cellphone.c:2088: error: redefinition of ‘cel_new’
    chan_cellphone.c:636: error: previous definition of ‘cel_new’ was here
    chan_cellphone.c:2118: error: redefinition of ‘rfcomm_connect’
    chan_cellphone.c:666: error: previous definition of ‘rfcomm_connect’ was here
    chan_cellphone.c:2148: error: redefinition of ‘rfcomm_write’
    chan_cellphone.c:696: error: previous definition of ‘rfcomm_write’ was here
    chan_cellphone.c:2182: error: redefinition of ‘rfcomm_read’
    chan_cellphone.c:730: error: previous definition of ‘rfcomm_read’ was here
    chan_cellphone.c:2242: error: redefinition of ‘sco_flush’
    chan_cellphone.c:790: error: previous definition of ‘sco_flush’ was here
    chan_cellphone.c:2261: error: redefinition of ‘sdp_search’
    chan_cellphone.c:809: error: previous definition of ‘sdp_search’ was here
    chan_cellphone.c:2324: error: redefinition of ‘do_monitor’
    chan_cellphone.c:872: error: previous definition of ‘do_monitor’ was here
    chan_cellphone.c:2608: error: redefinition of ‘start_monitor’
    chan_cellphone.c:1156: error: previous definition of ‘start_monitor’ was here
    chan_cellphone.c:2632: error: redefinition of ‘do_discovery’
    chan_cellphone.c:1180: error: previous definition of ‘do_discovery’ was here
    chan_cellphone.c:2667: error: redefinition of ‘do_sco_listen’
    chan_cellphone.c:1215: error: previous definition of ‘do_sco_listen’ was here
    chan_cellphone.c:2742: error: redefinition of ‘cel_load_config’
    chan_cellphone.c:1290: error: previous definition of ‘cel_load_config’ was here
    chan_cellphone.c:2806: error: redefinition of ‘reload_module’
    chan_cellphone.c:1354: error: previous definition of ‘reload_module’ was here
    chan_cellphone.c:2813: error: redefinition of ‘unload_module’
    chan_cellphone.c:1361: error: previous definition of ‘unload_module’ was here
    chan_cellphone.c:2858: error: redefinition of ‘load_module’
    chan_cellphone.c:1406: error: previous definition of ‘load_module’ was here
    chan_cellphone.c:2900: error: redefinition of ‘__mod_info’
    chan_cellphone.c:1448: error: previous definition of ‘__mod_info’ was here
    chan_cellphone.c:2900: error: redefinition of ‘__reg_module’
    chan_cellphone.c:1448: error: previous definition of ‘__reg_module’ was here
    chan_cellphone.c:2900: error: redefinition of ‘__unreg_module’
    chan_cellphone.c:1448: error: previous definition of ‘__unreg_module’ was here
    chan_cellphone.c:2900: error: redefinition of ‘ast_module_info’
    chan_cellphone.c:1448: error: previous definition of ‘ast_module_info’ was here
    make[1]: *** [chan_cellphone.o] Error 1
    make: *** [channels] Error 2

  2. Me responderé yo mismo:

    Buscando información sobre errores en C++, encontré que podía ser por incluir múltiples veces el mismo fichero de cabecera.

    Revisando el código me di cuenta que estaba repetido todo 1 vez, no se, igual apliqué el parche 2 veces, ahora lo dudo xD

  3. n0ob:/etc/apt# apt-get install bluetooth bluez-utils libbluetooth2 libbluetooth2-dev
    Reading Package Lists… Done
    Building Dependency Tree… Done
    W: Couldn’t stat source package list http://bluez.sourceforge.net ./ Packages (/var/lib/apt/lists/bluez.sourceforge.net_download_debian_._Packages) – stat (2 No such file or directory)
    W: Couldn’t stat source package list http://bluez.sourceforge.net ./ Packages (/var/lib/apt/lists/bluez.sourceforge.net_download_debian_._Packages) – stat (2 No such file or directory)
    W: You may want to run apt-get update to correct these problems
    E: Couldn’t find package bluetooth

    Help me Plz

  4. i have the same problem.
    with debian sarge 3r5 stable.
    I believe that bluetooth libbluetooth2 libbluetooth2-dev are unstable.

    excuseme my poor English.
    I from mexico.

  5. Cambie los repositorios a testing, realize
    #apt-get dist-upgrade

    y actualice a etch, segui los pasos y compilo bien, soy novato pero me dio problemas por que esta mal escrito
    «./bootstarp.sh» deberia de ser «./bootstrap.sh» espero que no sea un error muy obvio pero a mi me paso por novato, espero que a alguien le ayude, con testing ya no se tiene que agregar los repositorios de blueZ ya trae los paquetes etch, ya termine de compilar e instalar sin problemas GRACIAS a toda la comunidad. ahora a probar

  6. Hi all!!

    I installed everything in my mandriva 2007 and it works, i tried with nokias and sony ericson!!
    However, now I have my tdm11b in my computer and i am afraid that the svn does not support chan_zaptel.

    I found out that in asterisk/channels there is a chan_zap.c but not chan_zap.o. Do you have any about that!!

    Thanks in advance!!

  7. It does support Zap channels, but you have to compile Zaptel BEFORE compiling Asterisk, so that chan_zap is generated, that’s why your chan_zap.o file is missing. 😉

  8. A mi me da este error al hacer make:

    [CC] chan_cellphone.c -> chan_cellphone.o
    chan_cellphone.c: In function âcel_requestâ:
    chan_cellphone.c:324: warning: passing argument 7 of âast_channel_allocâ makes pointer from integer without a cast
    chan_cellphone.c:324: error: too few arguments to function âast_channel_allocâ
    chan_cellphone.c: In function âdo_monitorâ:
    chan_cellphone.c:893: warning: passing argument 7 of âast_channel_allocâ makes pointer from integer without a cast
    chan_cellphone.c:893: error: too few arguments to function âast_channel_allocâ
    chan_cellphone.c: In function âcel_load_configâ:
    chan_cellphone.c:1117: error: too few arguments to function âast_config_loadâ
    make[1]: *** [chan_cellphone.o] Error 1
    make: *** [channels] Error 2

    Al bajarme el patch he tenido que hacerlo de una forma un poco guarra: bajarmelo en el Windows y luego abrir desde PuTTY el vi y pegar el contenido del archivo, pero no me ha dado problemas asi que no creo que sea eso.

    Tal vez sea por tener una versión anterior de Asterisk instalada.

    Uso Debian Etch. ¿Alguna de idea de lo que está pasando?

  9. Vale, me parece que el error que he cometido ha sido elegir el .patch erroneo. El que he usado cuando me daba ese error era el primero de todos. Luego he probado con el ultimo (chan_cellphone-22-1.4.4.patch.gz) y me dice que no le da la gana de parchear jajaj:

    ibm:/usr/src/asterisk-trunk# patch -p0

  10. Al final usando el patch «chan_cellphone-22.patch» me seguida dando error de que faltaban argumentos a la llamada ast_configure_load. He investigado un poco y añadiendo lo siguiente en channel_cellphone.c me ha compilado. Otra cosa es que funcione luego jajaj:

    struct ast_flags config_flags = { 0 };
    cfg = ast_config_load(CEL_CONFIG, config_flags);

    Un saludo!

  11. Me di cuenta despues de que han metido chan_cellphone en asterisk-addons. Pero ahora tengo problemas con Zaptel :S Al instalar la version trunk parece que Asterisk no se entera de que tiene el chan_zap, y eso que en el menuconfig está marcado.

    Ya te ire comentando los progresos. Bastante que he conseguido conectar por bluetooth…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *