jueves, 24 de mayo de 2012

Asterisk en el RaspberryPi

Instalación básica de Asterisk

... el segundo superpoder de mi RaspberryPi

En este post voy a tratar uno de los temas que más me gustan: Asterisk. Para el que no lo sepa (que seguro que lo sabes) se trata de una centralita de teléfonos o PBX, en software libre. Poco a poco Asterisk esta desbancando a las grandes empresas (CISCO, Avaya, Panasonic ...) en a lo que centralitas se refiere. Es escalable en todos los sentidos, siendo perfectamente valido desde una instalación chiquitilla (como la mía) hasta una gran multinacional con sedes por todo el mundo, miles de extensiones y conexiones con el mundo. Vamos allá.

Asterisk lo podemos encontrar en los repositorios oficiales de Debian, e incluso en el que actualmente tenemos configurado en nuestro Raspberry. Lo que pasa, es que se tratan de versiones no demasiado actualizadas, son validas ... pero les faltan algunas cosas voy a usar más adelante. Es por eso que voy a compilar la ultima versión de Asterisk.
Compilar en Debian es muy entretenido y fácil. Como siempre, hay cientos de formas de hacerlo, yo diría que cada sysadmin tiene sus trucos. La versión 10.x de Asterisk tiene cientos de integraciones posibles, por lo que tiene muchas dependencias que hay que ir cumpliendo. Como soy un poco vago:
sudo vim /etc/apt/sources.list
Para asegurarme que tengo el repositorio de la siguiente forma:
deb http://ftp.uk.debian.org/debian/ squeeze main non-free contrib
deb-src http://ftp.uk.debian.org/debian/ squeeze main non-free contrib
Y ahora un poco de magia Debian:
apt-get update
apt-get build-dep asterisk
eso instalará mucho ... mucho ... si eres un poco experto, puedes saltarte estos pasos e ir directamente a la parte de la compilación. A los que no tenéis una dilatada experiencia, es mejor hacerlo así. Por cierto este paso TARDA bastante.
Empecemos a hacer algo interesante:
mkdir -p /usr/src/asterisk
cd /usr/src/asterisk/
Desde este enlace bajamos la última versión disponible de Asterisk, en el momento de redactar este post:
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-10.4.0.tar.gz
tar -xvzf asterisk-10.4.0.tar.gz
cd asterisk-10.4.0
./configure
Y podemos ir a por un café tranquilamente, tarda un buen rato. Cuando vuelvas del café verás que te ha dado un pete:
configure: WARNING: *** Asterisk now uses SQLite3 for the internal Asterisk database.
configure: WARNING: *** Please install the SQLite3 development package.
Y claro es lógico, hemos instalado las dependencias de un Asterisk anterior. Es a partir de la version 10.x cuando Asterisk usa SQLite para la db interna. Resolvemos la dependencia y continuamos:
apt-get install libsqlite3-dev
./configure
Cuando nos devuelva el prompt:
make menuselect
y nos saldrá una de estas dos capturas, dependiendo de cómo estemos conectados a la maquina virtual:
Ahora lo más inteligente es desmarcar aquellas features, opciones y recursos que estemos seguros que no vamos a usar (que serán muchas). Lo dejo un poco a vuestra elección, yo no voy a quitar nada :)
Salimos del menuselect, y ahora toca compilar de verdad y como no se hacer una compilación cruzada aprovechando el Core7 de 8 núcleos que tengo:
make && make install && make config && make samples
Dependiendo de la cantidad de opciones, este proceso puede tardar muchísimo o puede tardar una barbaridad ... unas dos horas...
Cuando termine, podemos arrancar el servicio con:
/etc/init.d/asterisk start
Y podemos entrar en la consola de Asterisk con:
asterisk -r
En los siguientes post iré completando la instalación, le pondré varias configuraciones muy interesantes y lo integraré con la domótica ;) ahora una pequeña prueba.

Configurando Asterisk

Necesitamos comprobar que nuestro Asterisk funciona, para ello vamos a crear una extensión de tipo sip:
vim /etc/asterisk/sip.conf
Es un archivo extensísimo con miles de ejemplos, recomiendo hacerle una copia y dejarlo vacío. Nuestra prueba es la siguiente:
[general]
port=5060
bindaddr=0.0.0.0
context=nulo
videosupport=no
language=es
disallow=all
allow=alaw,gsm
localnet=192.168.1.0/255.255.255.0    ; RED DE USUARIO
nat=no
;externalip=0.0.0.0 ; tu ip pública en si es fija
externhost=TU_HOST.dyndns.org ; si usas un dyndns como yo
echocancel=yes
echocancelwhenbridged=yes
Creo que se entiende por si mismo ¿no? Realmente lo de externhost sólo vale en caso de que vayamos a registrarnos SIN VPN al asterisk. Ahora creamos una extensión (en sip.conf):
[1000]
host=dynamic
context=usuarios
type=friend
qualify=yes
canreinvite=no
dtmfmode=rfc2833
limitonpeers=yes
call-limit=2
nat=no
allow=all
callerid=MANOLITO
secret=clavesegura
defaultuser=1000
Fááááácil fácil, guardamos y nos conectamos a asterisk con:
asterisk -r
Y hacemos un reload, para que pille la nueva configuración:
reload
Vamos a aumentar el nivel de detalle de los mensajes, por si nos sale algún aviso: core set verbose 10 Y comprobamos que existe nuestra nueva extensión:
sip show peers
Name/username             Host                                    Dyn Forcerport ACL Port     Status      Description                      
1000/1000                 (Unspecified)                            D                 0        UNKNOWN                                      
1 sip peers [Monitored: 0 online, 1 offline Unmonitored: 0 online, 0 offline]
Bien, vamos bien. Ahora nos registramos con algún softphone, por ejemplo desde el twinkle (en Domain tienes que poner la IP de tu RaspberryPi):
Aceptamos y veremos en la consola de asterisk el resultado:
1 sip peers [Monitored: 0 online, 1 offline Unmonitored: 0 online, 0 offline]
    -- Registered SIP '1000' at 192.168.1.54:5060
       > Saved useragent "Twinkle/1.4.2" for peer 1000
[May 24 19:47:53] NOTICE[24716]: chan_sip.c:21402 handle_response_peerpoke: Peer '1000' is now Reachable. (1ms / 2000ms)
BIEN!, ahora de nuevo en la consola vamos a hacer la prueba:
originate sip/1000 application echo
Descolgamos en twinkle y ya puedes hablarte a ti mismo, enhorabuena ;)
Gracias Chuck!

39 comentarios:

  1. hola, al agregar las dependecias al principio del manual e intentar hacer el update falla al cargar, sabes a que se debe.

    Por cierto en esta web dejan una imagen preinstalada con Asterisk + FreePBX.

    Gracias por dedicar tu tiempo a escribir estos manuales, nos sirven de mucha ayuda.

    ResponderEliminar
  2. raspberry-asterisk.org

    ResponderEliminar
  3. soriano copia aquí el fallo que te da, a ver si podemos hacer algo.
    Sinceramente no creo que sea útil una imagen preinstalada, además no se aprende nada.

    ResponderEliminar
  4. Esto obtengo despues de realizar un update:


    W: Error de GPG: http://ftp.uk.debian.org squeeze Release: Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY AED4B06F473041FA
    W: Imposible obtener http://ftp.uk.debian.org/debian/dists/squeeze/main/binary-armhf/Packages 404 Not Found

    W: Imposible obtener http://ftp.uk.debian.org/debian/dists/squeeze/non-free/binary-armhf/Packages 404 Not Found

    W: Imposible obtener http://ftp.uk.debian.org/debian/dists/squeeze/contrib/binary-armhf/Packages 404 Not Found

    E: Some index files failed to download. They have been ignored, or old ones used instead.

    ResponderEliminar
    Respuestas
    1. prueba editar el /etc/apt/sources.list y cambia los ftp.uk.debian.org por ftp.debian.org a ver si va mejor.

      Eliminar
    2. sigo con el mismo error:

      W: Error de GPG: http://ftp.debian.org squeeze Release: Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY AED4B06F473041FA
      W: Imposible obtener http://ftp.debian.org/debian/dists/squeeze/main/binary-armhf/Packages 404 Not Found

      W: Imposible obtener http://ftp.debian.org/debian/dists/squeeze/non-free/binary-armhf/Packages 404 Not Found

      W: Imposible obtener http://ftp.debian.org/debian/dists/squeeze/contrib/binary-armhf/Packages 404 Not Found

      E: Some index files failed to download. They have been ignored, or old ones used instead.


      alguna otra solución? u otra manera de descargarlo?

      Eliminar
    3. Donde pone http:// debería decir ftp://
      Un saludo

      Eliminar
    4. Hola, tengo el mismo problema, al final como lo has arreglado?
      Gracias

      Eliminar
  5. he conseguido instalar asterisk, despues de dar muchas vueltas, en cuanto pueda comento como lo he solucionado

    ResponderEliminar
  6. Buenas, yo estoy intentando seguir el tutorial y me pasa lo mismo que a Soriano...

    De todas formas no queria perder la oportunidad de darte las gracias por compartir todo esto con nosotros.

    Un saludo

    ResponderEliminar
  7. cuando pongo la dirección de dyndns.org no me deja hacer el echo de la llamada para ver si funciona.
    en cambio si pongo la direccion interna funciona perfectamente.
    NOTICE[14145]: channel.c:5346 __ast_request_and_dial: Unable to request channel sip/1000

    ResponderEliminar
    Respuestas
    1. hola, no entiendo muy bien a qué te refieres. Pon el código en pastebin o algo por el estilo y pon aquí el enlace, a ver si puedo ayudarte.

      Eliminar
  8. Este post me salio PERFECTO!!!
    Y mira que no era facil para un novato como yo...

    MIL GRACIAS Juanmol!!! Tu si que vales!

    ResponderEliminar
  9. Hola Juanmol,

    Soy muy novato en esto y tengo un problema que seguro que tu sabes, estoy en el paso de compilar asterix, pongo lo siguiente " sudo make && make install && make config && make samples " y empieza a compilar pero al rato me dice esto " sudo make && make install && make config && make samples
    Generating embedded module rules ...
    [CC] astcanary.c -> astcanary.o
    [LD] astcanary.o -> astcanary
    [CC] astdb2sqlite3.c -> astdb2sqlite3.o
    [CC] hash/hash.c -> hash/hash.o
    [CC] hash/hash_bigkey.c -> hash/hash_bigkey.o
    [CC] hash/hash_buf.c -> hash/hash_buf.o
    [CC] hash/hash_func.c -> hash/hash_func.o
    [CC] hash/hash_log2.c -> hash/hash_log2.o
    [CC] hash/hash_page.c -> hash/hash_page.o
    [CC] hash/ndbm.c -> hash/ndbm.o
    [CC] btree/bt_close.c -> btree/bt_close.o
    [CC] btree/bt_conv.c -> btree/bt_conv.o
    [CC] btree/bt_debug.c -> btree/bt_debug.o
    [CC] btree/bt_delete.c -> btree/bt_delete.o
    [CC] btree/bt_get.c -> btree/bt_get.o
    [CC] btree/bt_open.c -> btree/bt_open.o
    [CC] btree/bt_overflow.c -> btree/bt_overflow.o
    [CC] btree/bt_page.c -> btree/bt_page.o
    [CC] btree/bt_put.c -> btree/bt_put.o
    [CC] btree/bt_search.c -> btree/bt_search.o
    [CC] btree/bt_seq.c -> btree/bt_seq.o
    [CC] btree/bt_split.c -> btree/bt_split.o
    [CC] btree/bt_utils.c -> btree/bt_utils.o
    [CC] db/db.c -> db/db.o
    [CC] mpool/mpool.c -> mpool/mpool.o
    [CC] recno/rec_close.c -> recno/rec_close.o
    [CC] recno/rec_delete.c -> recno/rec_delete.o
    [CC] recno/rec_get.c -> recno/rec_get.o
    [CC] recno/rec_open.c -> recno/rec_open.o
    [CC] recno/rec_put.c -> recno/rec_put.o
    [CC] recno/rec_search.c -> recno/rec_search.o
    recno/rec_search.c:126:1: fatal error: closing dependency file .recno_rec_search.o.d: No space left on device
    compilation terminated.
    {standard input}: Assembler messages:
    {standard input}: Fatal error: can't write recno/rec_search.o: No space left on device
    {standard input}: Fatal error: can't close recno/rec_search.o: No space left on device
    make[2]: *** [recno/rec_search.o] Error 1
    make[1]: *** [db1-ast/libdb1.a] Error 2
    make: *** [utils] Error 2 "

    Entiendo que dice que no tengo espacio, pero la SD es de 16Gb y no se como seguir.

    Un saludo y muchas gracias por tu blog.

    ResponderEliminar
  10. puede que estes trabajando en una particion con poco espacio. Haz un fdisk -l y un mount y pon aqui los resultados.

    ResponderEliminar
  11. Gracias por contestar tan pronto,

    sudo fdisk -l

    Disk /dev/mmcblk0: 15.9 GB, 15904800768 bytes
    4 heads, 16 sectors/track, 485376 cylinders, total 31064064 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00017b69

    Device Boot Start End Blocks Id System
    /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
    /dev/mmcblk0p2 122880 31064063 15470592 83 Linux


    sudo mount

    /dev/root on / type ext4 (rw,noatime,user_xattr,barrier=1,data=ordered)
    devtmpfs on /dev type devtmpfs (rw,relatime,size=224436k,nr_inodes=56109,mode=75 5)
    tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=44900k,mode=755)
    tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=89780k)
    devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
    /dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=cp
    437,iocharset=ascii,shortname=mixed,errors=remount-ro)

    ResponderEliminar
    Respuestas
    1. pues eso esta todo correcto. Se me ocurre que hayas puesto a descargar torrents o bien que se haya fastidiado la particion (lo dudo). Con un df -h te dira el espacio ocupado y libre de cada punto de montaje.

      Eliminar
  12. Muy buenas, buenisimo el foro, no estoy muy puesto con voip, el caso es que me funciona a la perfeccion tu manual, pero el problema lo tengo al intentar introducir otros SIP, que no los detecta de ninguna manera

    ResponderEliminar
    Respuestas
    1. Hola, otros sip? te refieres a meter la configuracion para más clientes?

      Eliminar
    2. Efectivamente a eso me refiero... pero como has podido comprobar no se mucho de asterisk, de echo este ha sido mi primer contacto con el. he estado leyendo algo y me parece que tengo que configurar los ruteos de llamada en extensions.conf... Bueno en ello estoy, si me puedes recomendar algun manual PARA PRINCIPIANTES sobre asterisk agradecido quedo.

      Por cierto El blog es LA LECHE! xDD

      Eliminar
    3. Manual para principiantes no hay, pero porque realmente es fácil. Hay muchas webs con ejemplos, pero lo mejor en estos casos es que busques directamente lo que quieres, en plan "asterisk cola de llamadas" o "asterisk contestador automático" y cosas por el estilo. O busca a RSPPI en las redes sociales y pregúntanos ;)

      Eliminar
    4. Ya lo he solucionado, la verdad esque es mucho mas facil de lo que me esperaba. Muchas Gracias por la ayuda.

      Eliminar
  13. Primero que nada ya me recorrí tu blog y de entrada aplaudo tu gran esfuerzo por mantenerlo actualizado y vivo respondiendo comentarios y posteando tus proyectos. Este es mi primer comentario aquí.

    Intenté seguir el tutorial pero nada, no pude instalar Asterisk en mi Pi, supongo que el post ya está des-actualizado. Así que seguí San Googleando y encontré esta página: http://www.raspberry-asterisk.org/faq/#selfcompile

    En ella explican como compilarlo, me fue muy útil. Dejo la liga por si a alguien más le sirve.

    Saludos.

    ResponderEliminar
  14. ¡Buenas!

    Soy Juan. Ya sabes que estoy enganchándome al blog, pero empezando desde cero...

    Al hacer:

    make && make install && make config && make samples

    La consola me muestra el siguiente error y pasa a mostrarme el prompt(antes mostró alguno similar, pero continuó):

    cc1: error: bad value (armv6l) for -march switchAssembler messages:
    Error: unknown architecture `armv6l'

    Error: unrecognized option -march=armv6l

    cc1: error: bad value (armv6l) for -march switch
    make[2]: *** [src/add.o] Error 1
    make[1]: *** [gsm/lib/libgsm.a] Error 2
    make: *** [codecs] Error 2

    ResponderEliminar
    Respuestas
    1. vaya error raro...
      ¿as puesto/tocado algo en /etc/apt/sources.list ? Cópialo en pastebin y copia aquí el enlace.
      Tiene pinta de que en algún momento as instalado o intentado instalar una librería que no corresponde a la arquitectura del micro. Pero para provocar un fallo así, hay que esmerarse.

      Eliminar
    2. No lo descarto para nada, pues al agregar el repositorio que indicabas, me lié un poco editando el fichero. Finalmente dejé el repositorio que venía y añadí los dos tuyos ¿Hice algo mal?

      Aquí /etc/apt/sources.list: http://pastebin.com/hwcDdafc

      Eliminar
    3. He editado /etc/apt/sources.list dejándolo así:

      deb http://ftp.uk.debian.org/debian/ squeeze main non-free contrib
      deb-src http://ftp.uk.debian.org/debian/ squeeze main non-free contrib

      Y el error que recibo (directamente, no tarda ni 5 segundos) al hacer

      make && make install && make config && make samples

      es éste:

      [CC] src/add.c -> src/add.o
      cc1: error: bad value (armv6l) for -march switchAssembler messages:
      Error: unknown architecture `armv6l'

      Error: unrecognized option -march=armv6l

      cc1: error: bad value (armv6l) for -march switch
      make[2]: *** [src/add.o] Error 1
      make[1]: *** [gsm/lib/libgsm.a] Error 2
      make: *** [codecs] Error 2

      ¿Alguna idea? ¡Gracias!

      Eliminar
    4. jeje ... no se porque te dice eso. Lamento decírtelo pero tiene pinta de que vas a tener que empezar de 0 no se me ocurre como se puede quejar por la arquitectura del sistema :-/

      Eliminar
    5. Te he hecho caso. He empezado desde cero y ahora me atasco antes jaja...

      apt-get build-dep asterisk
      Reading package lists... Done
      Building dependency tree
      Reading state information... Done
      E: Build-Depends dependency for asterisk cannot be satisfied because the package libgmime2-dev cannot be found

      Ya sabes que estoy re-empezando con Linux...

      He hecho sudo apg-get libgmime2-dev y me dice que no se encuentra el paquete.

      ¡Gracias!

      Eliminar
    6. tienes que tener una linea en el archivo sources.list que empiece por "deb-src" para que se descargue la lista de paquetes del repositorio de las fuentes. Antes de instalar nada, asegúrate de hacer un apt-get update, con eso ya te encontrara todos los paquetes, de verdá de la güena.

      Eliminar
  15. Juan en cuanto al error que mencionas:

    [CC] src/add.c -> src/add.o
    cc1: error: bad value (armv6l) for -march switchAssembler messages:
    Error: unknown architecture `armv6l'

    Error: unrecognized option -march=armv6l

    cc1: error: bad value (armv6l) for -march switch
    make[2]: *** [src/add.o] Error 1
    make[1]: *** [gsm/lib/libgsm.a] Error 2
    make: *** [codecs] Error 2

    La solución es la siguiente

    Debes modificar el archivo makeopts.in en la carpeta del source de asterisk, en la parte donde sale PROC=.... a PROC=arm.

    Luego hacer el make, ....


    ResponderEliminar
    Respuestas
    1. Muchas gracias, "Anónimo".

      La impaciencia me pudo y ahora he empezado de cero, lo que ha hecho que me atasque antes de llegar a ese punto :) Si se me repitiera el error, lo tendré en cuenta.

      ¡Muchísimas gracias!

      Eliminar
  16. Buenas a todos.

    Por inútil acabo de borrar un buen tocho que había escrito, así que intentaré resumir lo que tenía.

    He registrado en "/etc/asterisk/sip.conf" las extensiones 1000 y 2000 y las he registrado en twinkle.

    Al ejecutar "sip show peers" puedo verlas (no creo que sea por registrarlas en twinkle sino por estar incluídas en "/etc/asterisk/sip.conf"):

    El resultado exacto es: http://pastebin.com/8aPkZX0x

    Hasta aquí parece que todo correcto, pero ahora tengo dos "problemillas":

    --Problemilla 1-------------

    Al ejecutar:

    originate sip/1000 application echo

    Recibo el siguiente mensaje:

    [Aug 8 18:13:11] NOTICE[3019]: channel.c:5539 __ast_request_and_dial: Unable to request channel sip/1000

    Y ni me escucho a mí, ni a tí, ni a nadie...

    --Problemilla 2-------------

    Espero no salirme del tema. He registrado la extensión 1000 en mi teléfono android para usarlo como cliente. Me mostró un error ayer, cuando creé la extensión en "sip.conf", pero hoy bien.

    Ahora, cuando intento registrar la extensión 2000 recibo el mismo error que recibía con la 1000 ayer y, aparentemente, están configuradas igual:

    "Error al registrar la cuenta. transaction terminated. Inténtelo más tarde"

    No creo que haya que esperar más de 10 minutos ¿No?

    Gracias y saludos.

    ResponderEliminar
    Respuestas
    1. según pones en pastebin, as creado las dos extensiones, pero están sin registro, al menos en el momento en el que pones eso, por eso mismo cuando te dice lo de "Unable to request channel sip/XXXX" lo que te está diciendo es que no hay un cliente registrado con esa extensión.
      Pon en pastebin también el sip.conf, a ver si se ha traspapelado algo.

      Eliminar
    2. Gracias, Juan Mol.

      Por miedo a borrar lo que no debía, no vacié el sip.conf y añadí al final las dos extensiones. Ahora he borrado el resto del contenido, como decías.

      Por otro lado, he conseguido configurar en el MV la extensión 2000 también (parece que hay que esperar bastante, no basta con 10-15 minutos desde que se registra en sip.conf) o hay que hacer un reload que yo no había hecho...

      Tras estas dos cosas, he conseguido llamarme y escuchar mi dulce voz.

      Post finalizado ¡Gracias!

      Eliminar
    3. ea! ya has conseguido la primera prueba de Asterisk: hablarte a ti mismo. Ahora sólo te queda decirte cosas interesantes ;)

      Eliminar
  17. Buen blog. Me lo estoy leyendo entero. :) El caso es que yo he instalado un Asterisk en Raspbian, con FreePBX. Hasta aquí todo correcto. Tengo un dominio NO-IP y también me funciona. Pero así como con IAX consigo que todo funcione "dentro" y "fuera" de mi casa, con SIP soy incapaz de hacerlo. Sabes qué puede estar pasando? (Me he vuelto ya loco con el NAT, puertos, etc). Gracias de antemano.

    ResponderEliminar
    Respuestas
    1. no uses FreePBX, atrévete con Asterisk a pelo.
      En el ruter nat del 5060 udp y del 10.000 al 20.000 udp -> al asterisk
      en el sip.conf general:
      nat=no
      externhost=TU_HOST.no-ip.org

      en el sip.conf, en la extension:
      nat=force_rport,comedia

      recarga y prueba. Si estas conectandote desde tu red a tu no-ip NO TE VA A FUNCIONAR, necesitas hacer la prueba desde fuera de tu red, por 3G por ejemplo.

      Tambien te digo que esto es sólo para una prueba, porque si te fijas en el log de seguridad, verás cientos de ataques por fuerza bruta al puerto 5060. Si de verdad quieres usar esto es mejor hacerlo por vpn, sin natear el 5060.


      Eliminar
  18. tengo el problema despues de enviar la instruccion make menuselect no me muestra nada... solo me lanza error

    ResponderEliminar