Instalar chan_dongle en Isabel 4 con asterisk 11

Para los que no lo sepan Issabel PBX es el proyecto que continuo con el legado del extinto proyecto elastix, muchos colaboradores del anterior proyecto se sumaron en una nueva aventura y dieron forma a Issabel una solución PBX al mero estilo de Elastix: fácil de manejar e intuitiva en su configuración.

En este manual explicare como instalar chan_dongle para tener un Gateway GSM operativo al 100% en conjunto con Isabbel PBX, no entrare en tema en como instalar Issabel puesto que existen infinidad de manuales e internet para poder instalar Issabel, por lo cual, partiré que ya tienen Issabel PBX funcionando y con una sesión de root lista.

NOTA: A día de hoy Issabel PBX se encuentra en su version 47, que nos brinda la posibilidad de realizar la instalación con diversas versiones de asterisk, para este manual emplee la version 11 (como lo indica el título del manual).

issabel-pbx-4-chan_dongle
issabel-pbx-4-chan_dongle

Configurando e instalando chan_dongle en Issabel 4

Para comenzar con la instalación deberemos instalar algunas dependencias:

yum install git

Después dentro del directorio de /root/ (por practicidad) procederemos a clonar el repositorio de chan_dongle:

[root@issabel ~]# git clone https://github.com/wdoekes/asterisk-chan-dongle

Después empezaremos el proceso de compilación:

[root@issabel asterisk-chan-dongle]# ./bootstrap
configure.ac:6: installing './config.guess'
configure.ac:6: installing './config.sub'
configure.ac:7: installing './install-sh'
configure.ac:7: installing './missing'

Despues:

[root@issabel asterisk-chan-dongle]# ./configure --with-astversion=11.25.3
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... none
checking how to run the C preprocessor... gcc -E
checking for strip... strip
checking for rm... rm
checking for library containing iconv... none required

Despues:

[root@issabel asterisk-chan-dongle]# make
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT app.o -MF .app.o.d -MP -o app.o -c app.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_command.o -MF .at_command.o.d -MP -o at_command.o -c at_comman
d.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_parse.o -MF .at_parse.o.d -MP -o at_parse.o -c at_parse.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_queue.o -MF .at_queue.o.d -MP -o at_queue.o -c at_queue.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_read.o -MF .at_read.o.d -MP -o at_read.o -c at_read.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_response.o -MF .at_response.o.d -MP -o at_response.o -c at_res
ponse.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT chan_dongle.o -MF .chan_dongle.o.d -MP -o chan_dongle.o -c chan_d
ongle.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT channel.o -MF .channel.o.d -MP -o channel.o -c channel.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT char_conv.o -MF .char_conv.o.d -MP -o char_conv.o -c char_conv.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT cli.o -MF .cli.o.d -MP -o cli.o -c cli.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT helpers.o -MF .helpers.o.d -MP -o helpers.o -c helpers.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT manager.o -MF .manager.o.d -MP -o manager.o -c manager.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT memmem.o -MF .memmem.o.d -MP -o memmem.o -c memmem.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT ringbuffer.o -MF .ringbuffer.o.d -MP -o ringbuffer.o -c ringbuffe
r.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT cpvt.o -MF .cpvt.o.d -MP -o cpvt.o -c cpvt.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT dc_config.o -MF .dc_config.o.d -MP -o dc_config.o -c dc_config.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT pdu.o -MF .pdu.o.d -MP -o pdu.o -c pdu.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT mixbuffer.o -MF .mixbuffer.o.d -MP -o mixbuffer.o -c mixbuffer.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT pdiscovery.o -MF .pdiscovery.o.d -MP -o pdiscovery.o -c pdiscover
y.c
gcc -shared -Xlinker -x -o chan_dongle.so app.o at_command.o at_parse.o at_queue.o at_read.o at_response.o chan_dongle.o channel.o char_conv.o cli.o helpers.o manager.o memmem.o ringbuffer.o cpvt.o dc_config.o pdu.o mixbuffer.o pdiscovery.o

Despues:

[root@issabel asterisk-chan-dongle]# make install
strip chan_dongle.so
/usr/bin/install -c -m 644 chan_dongle.so /usr/lib64/asterisk/modules

Después una vez generado el modulo, procederemos a copiarlo al directorio de asterisk:

cp /root/asterisk-chan-dongle/etc/dongle.conf /etc/asterisk/

Después ingresaremos a asterisk y cargaremos el modulo recién compilado:

asterisk –rv
Connected to Asterisk 11.25.3 currently running on issabel (pid = 9216)
issabel*CLI> module load chan_dongle.so
Loaded chan_dongle.so
== Parsing '/etc/asterisk/dongle.conf': Found
[2020-01-31 12:37:05] NOTICE[11486]: chan_dongle.c:1588 reload_config: [dongle0] Loaded device
== Registered channel type 'Dongle' (Huawei 3G Dongle Channel Driver)
== Registered application 'DongleStatus'
== Registered application 'DongleSendSMS'
== Registered application 'DongleSendUSSD'
== Manager registered action DongleShowDevices
== Manager registered action DongleSendUSSD
== Manager registered action DongleSendSMS
== Manager registered action DongleSendPDU
== Manager registered action DongleSetCCWA
== Manager registered action DongleReset
== Manager registered action DongleRestart
== Manager registered action DongleStop
== Manager registered action DongleStart
== Manager registered action DongleRemove
== Manager registered action DongleReload

En este instante, deberemos conectar nuestro modem y en “teoría” debería de funcionar pero resulta que nos arroja un error:

[dongle0] Trying to connect on /dev/ttyUSB2...
[2020-01-31 12:37:35] ERROR[11487]: chan_dongle.c:137 lock_create: open('/var/lock/LCK..ttyUSB2') failed: Permission denied
[2020-01-31 12:37:35] WARNING[11487]: chan_dongle.c:222 opentty: unable to open /dev/ttyUSB2: No such file or directory
issabel*CLI>
-- [dongle0] Trying to connect on /dev/ttyUSB2...
[2020-01-31 12:37:50] ERROR[11487]: chan_dongle.c:137 lock_create: open('/var/lock/LCK..ttyUSB2') failed: Permission denied
[2020-01-31 12:37:50] WARNING[11487]: chan_dongle.c:222 opentty: unable to open /dev/ttyUSB2: No such file or directory
-- [dongle0] Trying to connect on /dev/ttyUSB2...
[2020-01-31 12:38:05] ERROR[11487]: chan_dongle.c:137 lock_create: open('/var/lock/LCK..ttyUSB2') failed: Permission denied
[2020-01-31 12:38:05] WARNING[11487]: chan_dongle.c:222 opentty: unable to open /dev/ttyUSB2: No such file or directory

Esto hace alusión a que el dispositivo /dev/ttyUSBX no puede ser accedido por asterisk, esto es un tema de permisos por lo que debemos de cambiarle permisos al dispositivo, esto lo logramos con:

[root@issabel asterisk-chan-dongle]# chmod 777 /dev/ttyUSB*

Donde después volveremos a ingresar a asterisk y nos percataremos que ya está funcionando y operativo nuestro modem:

-- [dongle0] Dongle has connected, initializing...
-- [dongle0] Dongle initialized and ready
issabel*CLI> dongle show devices
ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number
dongle0 0 Free 27 0 0 weex E153 11.609.18.00.00 861435000361846 334030882534042 Unknown
issabel*CLI>
issabel*CLI>

Configurar Isabel vía Web para llamar a travez de chan_dongle

Ahora una vez que está configurado y cargado el módulo de chan_dongle procedemos a acceder a la interface web de Issabel para poder ejecutar llamadas a través de nuestro nuevo gateway GSM.

Lo primero que haremos será generar una extensión, esto lo realizaremos (como en el viejo Elastix) dentro de:

PBX > Configuración PBX > Extensiones > Añadir una extensión > Dispositivo SIP genérico > Enviar

No voy a explicar cómo crear una extensión dentro de Issabel/Elastix porque es algo bastante documentado en internet, pero solo mencionare que es fundamental tener presente el usuario/número de extensión y el password generado o el secret (como lo nombra Issabel).

extension-Issabel-PBX
extension-Issabel-PBX

Para validar que nuestra extensión configurada se registró de manera correcta en nuestro PBX veremos un mensaje como el siguiente en la consola:

Registered SIP '1337' at 172.16.151.1:59107
> Saved useragent "Z 5.3.5 rv2.9.26-mod" for peer 1337
[2020-01-31 15:19:51] NOTICE[9341]: chan_sip.c:23892 handle_response_peerpoke: Peer '1337' is now Reachable. (1ms / 2000ms)

Una vez que tenemos registrada nuestra extensión generaremos una troncal, esto lo realizaremos en:

PBX > Configuración PBX > Básico > Troncales > Añadir línea troncal personalizada

troncal-GSM-Issabel
troncal-GSM-Issabel

Donde los datos importantes serán el nombre de la troncal (para temas de identificación/control) y la “Cadena de marcación peronalizada”, que como vemos en la imagen es:

dongle/dongle0/$OUTNUM$

Esto es de suma importancia para que salgan las llamadas.
Después de realizado esto procederemos a generar una “Ruta Saliente” esto lo podremos efectuar desde:
PBX > Configuración PBX > Básico > Rutas Salientes > Añadir ruta

ruta-de-salida-Issabel-GSM
ruta-de-salida-Issabel-GSM

Donde los datos más importantes serán: “Dial Patterns that will use this Route” que básicamente es la coincidencia en la marcación, en este caso emplee un “punto” que nos dice que todo lo que se marque saldrá por ahí, de igual forma, otro campo importante es “Trunk Sequence for Matched Routes” que es la ruta que empleara para sacar el tráfico, en la imagen aparece seleccionada la troncal chan_dongle porque es así como nombre la troncal personalizada en el paso anterior.

Una vez efectuados todos los pasos que se mencionaron anteriormente, en la consola de asterisk podremos observar la correcta salida de las llamadas cuando marcamos a un número cualquiera des nuestra extension: 5556581111 (una dependencia de gobierno aquí en MX).

-- Goto (macro-dialout-trunk,s,29)
-- Executing [s@macro-dialout-trunk:29] Set("SIP/1337-00000000", "the_num=5556581111") in new stack
-- Executing [s@macro-dialout-trunk:30] Dial("SIP/1337-00000000", "dongle/dongle0/5556581111,300,T") in new stack
-- Called dongle/dongle0/5556581111
-- Dongle/dongle0-0100000000 is making progress passing it to SIP/1337-00000000
> 0x7f0a1c03bfd0 -- Strict RTP switching source address to 172.16.151.1:8000
> 0x7f0a1c03bfd0 -- Strict RTP learning complete - Locking on source address 172.16.151.1:8000
-- Dongle/dongle0-0100000000 answered SIP/1337-00000000

De esta forma ya tendríamos configurado chan_dongle e Issabel y se encontrarían listos para sacar cualquier cantidad de tráfico que deseemos. Para cualquier duda o comentario puedes escribirlo en la sección de comentarios y con gusto responderé. O en su caso en la sección de contacto si tu duda es muy específica.

Chan_dongle en asterisk 13 y superiores

Hace algunos años escribi un post donde explique de una manera muy detallada como hacer funcionar chan_dongle en dupla con asterisk para poder tener un telular, que como vimos más tarde se podría hacer crecer para generar un Gateway GSM medianamente decente.

Gateway GSM con asterisk
Fuente : http://wiki.e1550.mobi

La información en su momento funcionaba puesto que por aquellos años (2014 aproximadamente) el lanzamiento de Asterisk 13 era relativamente reciente y esa versión en particular de asterisk no era que se empleara con regularidad (por ser muy fresca), ahora, algunos años después tras intentar efectuar una instalación me percate que dicho proyecto ya no era del todo funcional por una infinidad de errores de compilación que generaba.

Por lo cual, recientemente encontré un fork bastante funcional del proyecto original en Github que esta justamente pensado para versiones recientes de asterisk y los kernels modernos, por lo cual, proceso a compartir el nuevo procedimiento de instalación para dejar funcionando chan_dongle y asterisk de una manera óptima.

Yo particularmente lo probé en asterisk 16 por lo cual, para versiones anteriores no debería generar mayor problema, incluso para la versión 17 de asterisk (personalmente yo no la ocupo puesto que no es LTS), una vez que se tiene el contexto entremos en materia.

Manual para poder instalar chan_dongle en versiones recientes de Asterisk

Emplee una distribución basada en Debian (Raspbian) aunque esta manual aplica para sistemas hijos de este sistema como: Ubuntu, Linux Mint, Kali Linux, etc.

Antes de comenzar propiamente con la configuración de chan_dongle debemos instalar algunas dependencias necesarias para poder evitarnos futuros dolores de cabeza, sin más, procederemos a instalarlas:

apt install build-essential automake autoconf asterisk asterisk-dev

Una vez instaladas las dependencias estaremos listos para proceder a instalar chan_dongle.
Para ello nos dirigiremos al repositorio fork del proyecto original en Github y clonaremos el proyecto:

git clone https://github.com/wdoekes/asterisk-chan-dongle

O en el espejo que genere en mi sitio: Mirror Chan_dongle

Des pues nos dirigiremos dentro de la carpeta que nos generó git:

cd asterisk-chan-dongle

En este punto ya estaremos listos para poder compilar el software, pero antes de ello debemos de tener presente que versión de asterisk tenemos instalada con el siguiente comando:

asterisk -V
Asterisk 16.2.1~dfsg-1+deb10u1

Como apreciamos la versión que tenemos instalada es la 16.2.1
Ahora que tenemos la versión de asterisk instalada en nuestro sistema procedemos a efectuar la compilación de chan_dongle, ingresando el siguiente comando:

./bootstrap

Después de ello emplearemos la versión de asterisk que en su momento obtuvimos:

./configure --with-astversion=16.2.1

Y efectuara el proceso como se aprecia en la siguiente salida:

root@raspberrypi:~/asterisk-chan-dongle# ./configure --with-astversion=16.2.1
checking build system type... armv6l-unknown-linux-gnueabihf
checking host system type... armv6l-unknown-linux-gnueabihf
checking target system type... armv6l-unknown-linux-gnueabihf
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... none
checking how to run the C preprocessor... gcc -E
checking for strip... strip
checking for rm... rm
checking for library containing iconv... none required
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes

Después del paso anterior procederemos a:

make

Y nos mostrara una salida similar a la siguiente:

root@raspberrypi:~/asterisk-chan-dongle# make
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT app.o -MF .app.o.d -MP  -o app.o -c app.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_command.o -MF .at_command.o.d -MP  -o at_command.o -c at_comman
d.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_parse.o -MF .at_parse.o.d -MP  -o at_parse.o -c at_parse.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_queue.o -MF .at_queue.o.d -MP  -o at_queue.o -c at_queue.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_read.o -MF .at_read.o.d -MP  -o at_read.o -c at_read.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT at_response.o -MF .at_response.o.d -MP  -o at_response.o -c at_res
ponse.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT chan_dongle.o -MF .chan_dongle.o.d -MP  -o chan_dongle.o -c chan_d
ongle.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT channel.o -MF .channel.o.d -MP  -o channel.o -c channel.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT char_conv.o -MF .char_conv.o.d -MP  -o char_conv.o -c char_conv.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT cli.o -MF .cli.o.d -MP  -o cli.o -c cli.c
gcc -g -O2 -O6 -Wno-old-style-declaration -I. -DAST_MODULE_SELF_SYM=__internal_chan_dongle_self -D_GNU_SOURCE -I/usr/include -I/usr/include -DHAVE_CONFIG_H  -fvisibility=hidden -fPIC -Wall -Wextra -MD -MT helpers.o -MF .helpers.o.d -MP  -o helpers.o -c helpers.c
helpers.c: In function ‘send_reset’:
helpers.c:158:111: warning: cast between incompatible function types from ‘int (*)(struct cpvt *)’ to ‘int (*)(struct cpvt *, const char *, const char *, unsigned int,  int,  void **)’ [-Wcast-function-type]

Una vez finalizado el proceso deberemos continuar con:

make install

Cuya salida será:

root@raspberrypi:~/asterisk-chan-dongle# make install
strip chan_dongle.so
/usr/bin/install -c -m 644 chan_dongle.so /usr/lib/asterisk/modules

A estas alturas del partido ya tendremos nuestro módulo de asterisk listo para hacer funcionar nuestro amado chan_dongle.


Pero antes de ello debemos tener presente que para que chan_dongle funcione requiere de un archivo de configuración, donde realizando una búsqueda del mismo nos percatamos que estará en:

/root/asterisk-chan-dongle/etc/dongle.conf

Como nos lo indico la búsqueda realizada:

root@raspberrypi:~/asterisk-chan-dongle# find / -name "*dongle.conf*"
/root/asterisk-chan-dongle/etc/dongle.conf

Ahora procederemos a copiar dicho archivo de configuración al directorio de asterisk por medio del siguiente comando:

cp /root/asterisk-chan-dongle/etc/dongle.conf /etc/asterisk/

En teoría ya tendríamos chan_dongle casi listo para funcionar pero antes de ello deberíamos conectar nuestro Modem usb Huawei (yo particularmente encuentro muy útil el Huawei E153) y validar que puerto se le asigno por medio del siguiente comando:

root@raspberrypi:/home/pi# dmesg | grep ttyUSB
[   20.588870] usb 1-1.3.1.2: GSM modem (1-port) converter now attached to ttyUSB0
[   20.619440] usb 1-1.3.1.2: GSM modem (1-port) converter now attached to ttyUSB1
[   20.632078] usb 1-1.3.1.2: GSM modem (1-port) converter now attached to ttyUSB2
[   20.668550] usb 1-1.3.2.1: GSM modem (1-port) converter now attached to ttyUSB3
[   20.697946] usb 1-1.3.2.1: GSM modem (1-port) converter now attached to ttyUSB4
[   20.707379] usb 1-1.3.2.1: GSM modem (1-port) converter now attached to ttyUSB5

Cabe mencionar que la asignación de los puertos es secuencial, por ejemplo, yo tengo 2 modems conectados donde cada modem recibe 3 puertos, es decir: al modem 1 le corresponde ttyUSB0, ttyUSB1,ttyUSB2 y al modem 2 le corresponde ttyUSB3, ttyUSB4 y ttyUSB5 respectivamente. Una vez que tengamos certeza de los puertos procedemos a validar dicha configuración en el archivo de configuración que anteriormente copiamos al directorio de asterisk:

cat /etc/asterisk/dongle.conf

Mostrando la siguiente salida:

; dongle required settings
[dongle0]
;audio=/dev/ttyUSB1		; tty port for audio connection; 	no default value
;data=/dev/ttyUSB2		; tty port for AT commands; 		no default value

Donde hasta al final nos percatamos que la sección de audio y data hacen referencia de manera correcta a los puertos del modem.
Ahora sí, una vez validados los requerimientos procederemos a cargar el modulo dentro de asterisk, ingresaremos en asterisk con:

asterisk -rv

Después ingresaremos el siguiente comando:

module load chan_dongle.so

Y al fin, tendremos nuestro chan dongle cargado como se aprecia en la salida del comando anterior:

raspberrypi*CLI> module load chand_dongle.so


raspberrypi*CLI> 
[Jan 15 20:58:32] NOTICE[2195]: chan_dongle.c:1588 reload_config: [dongle0] Loaded device
  == Registered channel type 'Dongle' (Huawei 3G Dongle Channel Driver)
  == Registered application 'DongleStatus'
  == Registered application 'DongleSendSMS'
  == Registered application 'DongleSendUSSD'
  == Manager registered action DongleShowDevices
  == Manager registered action DongleSendUSSD
  == Manager registered action DongleSendSMS
  == Manager registered action DongleSendPDU
  == Manager registered action DongleSetCCWA
  == Manager registered action DongleReset
  == Manager registered action DongleRestart

Por lo cual ya solo nos restara validar el estado de los modems con el siguiente comando:

raspberrypi*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number        
dongle0	     0     Free       25   0    0       weex           E153       11.609.18.00.00   XXXXXXXXXXXXXXX  XXXXXXXXXXXXXXX  Unknown       
dongle1      0     Free       27   0    0       weex           E153       11.609.18.00.00   XXXXXXXXXXXXXXX  XXXXXXXXXXXXXXX  Unknown

Ya tendremos listo y funcional chan_dongle para efectuar llamadas, el próximo paso solo será configurar el dial plan. 🙂

Para cualquier duda o comentario puedes escribirlo en la sección de comentarios y con gusto responderé. O en su caso en la sección de contacto si tu duda es muy específica.

Call Center en Elastix después de la compra por 3CX

Hace algunos meses fue un golpe duro para el mundo del Software Libre, en específico para el mundo del VOIP y asterisk. Ya que PaloSanto la empresa encargada de haber creado el proyecto Elastix (si esa distro que era un todo en uno de comunicaciones unificadas) decidió vender el proyecto a 3CX una empresa que de unos años a la fecha se ha dedicado a comprar todo aquel proyecto de software libre que le pueda generar competencia en el mundo de las PBX, como fue el caso del proyecto pbxinaflash un proyecto muy similar a Elastix, además 3CX compro bastantes acciones en la empresa Sangoma, si, la misma que compro el proyecto FreepBX, a simple vista se observa que las intenciones de 3CX son claras …

Por lo cual, las preguntas eminentes seria: ¿Qué sigue ahora?, ¿Ahí murió todo?, ¿Qué pasara con mis actuales instalaciones de Elastix?,¿Acaso es el principio del fin?

venta-Elastix-a-3CX
venta-Elastix-a-3CX

Pues como siempre la solución la genera la comunidad, ya que en su momento Elastix fue grande por la misma comunidad de desarrollo y usuarios que se gestionó a lo largo del proyecto. Por lo tanto fue la misma comunidad la que genero 2 proyectos alternativos: Issabel y OpenELX.

El paradigma de estas 2 distribuciones Linux enfocadas a comunicaciones unificadas básicamente es retomar el legado que dejo el proyecto Elastix y no dejarlo morir ya que tal cual se escucha existen miles de instalaciones Elastix que se quedaron en “ascuas” con la venta de Elastix a 3CX o simplemente generaciones venideras que planeen ocupar el sistema ya no podrán ocuparlo a su antojo sin pagar antes a la omnipresente 3CX.

Ahora bien, el enfoque de las 2 distros mencionadas es diferente ya que mientras OpenELX se centra en dar soporte a todas las instalaciones que ocupan Elastix 2.5 como núcleo (un porcentaje de mercado muy representativo) el proyecto Issabel planea dar seguimiento al proyecto Elastix 4, como se ve, ambas tienen algo que ofrecer y no estaría de más echarle una revisada a ambos proyectos en su página oficial.

issabel-PBX-logo
issabel-PBX-logo
openelx-pbx-logo
openelx-pbx-logo

Una vez aclarado el panorama pasare a describir los pasos que lleve a cabo para dejar a punto el módulo Call Center de Elastix 2.5 ya que como bien sabrán para instalarlo era necesario registrarse por medio de nuestro servidor Elastix una cuenta en PaloSanto y solo así podíamos descargar y ocupar el módulo de Call Center, que se encontraba en los repositorios de PaloSanto.

Entonces, sin más preámbulos a darle. Para ello necesitamos tener instalada Elastix 2.5, no documentare esa parte ya que existen infinidad de tutoriales en internet sobre ello. Posteriormente instalaremos el repositorio de OpenELX por medio de los siguientes comandos.

wget http://openelx.org/mirror/openelx-repo-install.sh

chmod u+x openelx-repo-install.sh

./openelx-repo-install.sh

Despues procederemos a “actualizar” nuestro repositorio con el comando:

/usr/bin/yum list

Pero cuál es nuestra sorpresa que nunca pasa del siguiente error:

Loaded plugins: fastestmirror, kmod
Determining fastest mirrors
YumRepo Error: All mirror URLs are not using ftp, http or file.
Eg. Invalid release/
removing mirrorlist with no valid mirrors: /var/cache/yum/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base

La pregunta eminente es: ¿Por qué? Básicamente se debe a que Elastix 2.5 está basada en CentOS 5 y al Centos 5 ya no tener soporte (EOL 31/Marzo/2017) según Wikipedia pues simplemente los repositorios ya no son funcionales.

Por lo cual me di a la tarea de buscar un poco en el foro del proyecto hermano (Issabel) y di con la solución gracias al amigo @ecaniz La misma consiste en sustituir el contenido de /etc/yum.repos.d/CentOS-Base.repo por lo siguiente:

[base]
name=CentOS-$releasever – Base
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://vault.centos.org/5.11/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=redhat-logos php53*

#released updates
enabled=1

[updates]
name=CentOS-$releasever – Updates
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://vault.centos.org/5.11/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=redhat-logos php53*

#additional packages that may be useful
enabled=1

[extras]
name=CentOS-$releasever – Extras
#mirrorlist=http://vault.centos.org/?release=$releasever&arch=$basearch&repo=extras
baseurl=http://vault.centos.org/5.11/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=redhat-logos php53*

Posteriormente ya solo nos restara ejecutar un

/usr/bin/yum list
yum install elastix-callcenter

Ahora la configuración del módulo Call Center ya es otro tema aparte … Para ello pueden seguir el siguiente manual de @Juan Oliva que es bastante bueno: Configurar Call Center Elastix.

Eso sería todo para dejar funcionando el módulo Call Center de Elastix de nuevo. Si tienes dudas o tu call center no funciona postealas en la sección de comentarios y con gusto te ayudare en lo que pueda.

Voice GSM Gateway: El poder del software libre

Si hay algo que me apasiona del mundo informático es la magnificencia que pueden llegar a alcanzar un sistema informático, cosa que a día de hoy no he logrado a encontrar en alguna otra rama del conocimiento (abogados, contadores, etc.) de igual manera algo que me fascina y hasta cierto punto me llena de éxtasis son los proyectos de software libre: si, esos proyectos sin ánimo de lucro (en la mayoría de los casos) que solo se realizan por el solo placer de hacer las cosas para el beneficio de la humanidad, pero sobre todo por satisfacción personal.

Un claro ejemplo de ello es asterisk un sistema que nos da la posibilidad de tener un sistema PBX a nuestra medida sin desembolsar un solo peso, ya que el mismo está basado en la filosofía de software libre. Si queremos darnos tan solo una idea de a lo que me refiero cuando mencione magnificencia, basta tan solo en plantear los costos que se conllevarían en implementar un PBX con tecnología asterisk que es software libre y un PBX con tecnología CISCO (si ese gigante del networking), donde este último resultaría ser más caro y nos llevaría a desembolsar presupuesto que no está al alcance de muchas pequeñas y medianas empresas, cosa diferente ocurre con un sistema basado en asterisk que puede ser implementado hasta con un equipo que pudiera ser rescatado del reciclaje. Como bien se observa la diferencia puede ser abismal.
Una vez planteado el panorama de los beneficios del mundo del software libre les platicare de un pequeño caso de éxito con software libre.

GSM Gateway con Asterisk

Resulta que me contacto una empresa Argentina (que por confidencialidad me reservare el nombre) que se veía en la necesidad de implementar un GSM Gateway para poder realizar llamadas. Después de varias búsquedas en google llego con mi post de: Como montar un telular en asterisk/Elastix. Su necesidad era poder enrutar llamadas (una media de 100 000 minutos mensuales) por medio de líneas celulares ya que los costos que se manejan hacia líneas celulares suelen ser bastante altos, por lo que planeaba sacar ese tráfico por SIM’s , en terminos practicos necesitaba un telular VOIP. Pero en mi tutorial yo solo realice la salida de tráfico por tan solo 1 linea sim y el por la cantidad de tráfico que necesitaba enviar iba a requerir al menos 20 canales de voz simultáneos.

Después de platicar a detalle con el me dijo las cosas sin “pelos en la lengua”, me dijo: cotice un equipo telular VOIP y es estúpidamente caro, cuesta alrededor $5000.00 USD (a día de hoy por el tipo de cambio en México serian $100000.00 MXN) y es un gasto que por ahora no puedo pagar. Por lo cual después de llegar a un acuerdo con el tema de mis honorarios como consultor procedimos a realizar la implementación.

He aquí lo maravilloso del mundo del software libre, gracias a foros, documentación oficial del proyecto asterisk y en general todos los blogs de geeks y apasionados de la informática fue como pudimos hacer funcionar su proyecto. El sistema quedo implementado bajo un sistema Ubuntu (si soy nena y que) con asterisk corriendo como núcleo, nuestro amado chan_Dongle y diversos modems Huawei banda ancha E303 con la función de voz activada. De igual manera se realizó la instalación del proyecto FreePBX en el servidor para poder brindar reportes de llamadas (CDR) algo fundamental si se tiene un call center y se desean medir resultados.

A continuación algunas fotografías del Gateway GSM:

GSM Gateway Server
GSM Gateway Server
chan_dongle
chan_dongle
chan_dongle asterisk-elastix
chan_dongle asterisk-elastix
VOIP GSM Gateway in asterisk
VOIP GSM Gateway in asterisk

Revisando el estado de nuestros modems Huawei E303 dentro de la consola de Asterisk:

asterisk-chan-dongle-huawei
asterisk-chan-dongle-huawei

Por lo cual: ¡amen por el software libre! Ademas, si tienes alguna duda o deseas contar con alguna implementación similar o simplemente algo no te sale como debiera funcionar no dudes en ponerte en contacto conmigo en la sección de contacto y con gusto te ayudare en lo que pueda.

Asignar reglas dinamicas en firewall IPTABLES con un DNS Dinamico

iptables-dinamico

Si eres un administrador de sistemas debes de estar consiente que llevar a cabo buenas practicas es fundamental para que nuestros sistemas funcionen de la mejor manera, una de esas buenas practicas es la cuestión de la seguridad y yo personalmente me tomo esa parte muy enserio, ya que el hacer o no hacer bien las cosas puede salvarnos de perder literalmente todo…

Yo particularmente protejo el acceso a los servidores que no son públicos a que sean accesibles desde una sola IP, esto lo hago por medio del firewall que viene de facto en la mayoría de las distribuciones GNU / Linux : Iptables. Pero, ¿Qué ocurre cuando tenemos una IP Dinámica que cambia cada determinado tiempo?
Esto como bien sabrán es así en la mayoría de las conexiones domésticas, ya que en las empresas y grandes corporativos en general es menos problemático contratar una IP dedicada por una renta mensual, pero como yo soy un usuario doméstico no le veo razón de ser en contratar una IP dedicada cuando para lo único que la ocuparía es para acceder a mis servidores por SSH y gestionar algún otro sistema. Por lo cual me di a la tarea de buscar la forma de poder actualizar las reglas de Iptables de manera dinámica de tal manera que cuando cambiara mi IP en automático se actualizara la respectiva regla en Iptables.

Otro aspecto a considerar es que ya sea en su modem, en su servidor o en su PC tengan instalado y configurado el cliente de DNS Dinámico para que cada vez que cambie la Ip este se actualice con la nueva IP, con respecto a este tema no me gustaría alargarme ya que no es tema de este post, tan solo me limitare a decir que puedes elegir al proveedor de tu elección: dyndns.org o no-ip.com , a mí personalmente me resulta más cómodo trabajar con DynDNS por lo que empleare un dominio del tipo dominio.dyndns.org

Regresando al tema de la actualización de manera dinámica de las reglas de Iptables, me di a la tarea de navegar por la inmensidad de internet y encontré que a alguien más ya le había surgido la necesidad y lo soluciono por medio de un Script en BASH que muy amablemente compartió con toda la comunidad. Yo lo adapte a mis necesidades y a continuación procedo a describir cómo es que lo hice funcionar.

El script para actualización dinámica de Iptables es el siguiente:


#!/bin/bash
# filename: firewall-dynhosts.sh
#
# A script to update iptable records for dynamic dns hosts.
# Written by: Dave Horner (http://dave.thehorners.com)
# Released into public domain.
#
# Run this script in your cron table to update ips.
#
# You might want to put all your dynamic hosts in a sep. chain.
# That way you can easily see what dynamic hosts are trusted.
#
# create the chain in iptables.
# /sbin/iptables -N dynamichosts
# insert the chain into the input chain @ the head of the list.
# /sbin/iptables -I INPUT 1 -j dynamichosts
# flush all the rules in the chain
# /sbin/iptables -F dynamichosts

HOST=$1
HOSTFILE=”/root/dynhosts/host-$HOST”
CHAIN=”dynamichosts” # change this to whatever chain you want.
IPTABLES=”/sbin/iptables”

# check to make sure we have enough args passed.
if [ “${#@}” -ne “1” ]; then
echo “$0 hostname”
echo “You must supply a hostname to update in iptables.”
exit
fi

# lookup host name from dns tables
IP=`/usr/bin/dig +short $HOST | /usr/bin/tail -n 1`
if [ “${#IP}” = “0” ]; then
echo “Couldn’t lookup hostname for $HOST, failed.”
exit
fi

OLDIP=””
if [ -a $HOSTFILE ]; then
OLDIP=`cat $HOSTFILE`
# echo “CAT returned: $?”
fi

# has address changed?
if [ “$OLDIP” == “$IP” ]; then
echo “Old and new IP addresses match.”
exit
fi

# save off new ip.
echo $IP>$HOSTFILE

echo “Updating $HOST in iptables.”
if [ “${#OLDIP}” != “0” ]; then
echo “Removing old rule ($OLDIP)”
`$IPTABLES -D $CHAIN -s $OLDIP/32 -j ACCEPT`
fi
echo “Inserting new rule ($IP)”
`$IPTABLES -A $CHAIN -s $IP/32 -j ACCEPT`

Ahora la forma de hacerlo funcionar es relativamente fácil (si sabes lo que está haciendo). Pero primero que nada deberás de copiar y pegar ese script en un archivo y guardarlo con extensión .sh Después deberás darle permisos de ejecución por medio del comando:

chmod + x nombrescript.sh

Y con eso ya estaremos casi listos, también en la carpeta raíz donde se encuentre alojado el script deberemos crear una carpeta de nombre: “dynhosts” y dentro de ella crearemos un archivo de configuración, este archivo deberá llamarse con el nombre de nuestro DNS dinámico. En este ejemplo para el dominio: midominio.dyndns.org deberemos crear el archivo de configuración de la siguiente manera:

touch host-midominio.dyndns.org

Este comando nos creara un archivo vacío y es en ese archivo donde se guardaran las viejas direcciones IP de nuestro DNS dinámico. Ahora bien si mi memoria no me falla lo corrí en una maquina con Debian pero el Script no me funciono, ya que resulta que ocupa el comando dig para hacer la consulta DNS, y mi todopoderoso debían no lo tenía instalado, pero no se alarmen nada que no se pudiera solucionar haciendo un:

apt-get install dnsutils

Ahora bien, existe un tema a tratar en el script y es que el script recomienda que tú crees tu propia chain y esa misma la ingreses a Iptables en INPUT, en este caso para mí por practicidad, lo que hice fue ingresarlo directamente en la chain de INPUT, por lo cual se tendrá que modificar la siguiente línea:

CHAIN=”dynamichosts” # change this to whatever chain you want.

Por un

CHAIN=”INPUT”

Pero esto ya es a gusto de cada quien o de cómo es que tengan configuradas sus reglas de Iptables. Una vez realizado esto ya tendríamos todos los elementos para probar nuestro script, tan fácil como correrlo de la siguiente manera:

/root/firewall-dynhosts.sh midominio.dyndns.org

Y nos indicara que las reglas de Iptables fueron actualizadas con éxito, después de ahí solo nos restara probar que realmente se ingresó la regla en Iptables con el siguiente comando:

iptables –nL

Lo restante sería tan solo ingresar nuestro comando a que se ejecute al menos cada 5 minutos (a mí me gusta así) por medio del demonio cron, en este caso lo podemos editar el crontab con el comando:

crontab –e

y ahí a manera de ejemplo ingresaríamos lo siguiente:

*/5 * * * * /root/firewall-dynhosts.sh midmonio.dyndns.org

Esto ejecutara el script cada 5 minutos, por lo cual tendremos solucionado de esta manera la actualización de manera automática y dinámica las reglas de iptables. Y si nos ponemos guapos podemos hacer que nuestro servidor solo reciba conexiones desde ahí, cerrando todo y asegurando al máximo nuestro servidor. 🙂

Tutorial de cómo formatear el Nokia N810 basado en Maemo

Recientemente me encontré en la necesidad de formatear mi Nokia N810 ya que por la serie de “experimentos” que he realizado con el… su rendimiento ha bajado significativamente. Entonces me dispuse a hacer la típica búsqueda en google: “como formatear N810” y no encontré nada del todo útil ni mucho menos en mi idioma, así que indagando aun mas di con la solución en ingles, así que procedo a hacer este mini-tutorial en español 🙂

Primero que nada cabe aclarar que para darle formato / actualizar el N810 debemos tenerlo completamente cargado ya que esto nos evitara futuros dolores de cabeza. Una vez comprobado que tenemos todo nuestro nivel de carga procedemos a descargar la herramienta que nos servirá para formatear /actualizar nuestro N810  directamente de la pagina de Nokia. A continuación la URL:

Una vez descargada la aplicación procedemos a instalarla  y a conectar nuestro N810 a nuestro PC y una vez realizado esto procederemos a apagarlo, sin desconectarlo de nuestro ordenador.
Una vez completamente apagado nuestro dispositivo, procederemos a encenderlo presionando al mismo tiempo el botón que se enmarca en rojo en la imagen de abajo, hasta que aparezca en la esquina superior derecha del N810 un icono USB.

formatear-nokia-n810

Una vez realizado esto procederemos a inicializar el Software que acabamos de instalar y le daremos en siguiente hasta que reconozca nuestro dispositivo.

Después de esto tendremos que aceptar las condiciones de servicio, y automáticamente se comenzara a formatear/actualizar nuestro dispositivo. El proceso se llevara un estimado de 20 min.

formatear-nokia-n810-2

Una vez actualizado nuestro dispositivo debemos desconectarlo del PC y proceder a hacer las configuraciones iníciales (hora, idioma, etc.).

Después de eso ya podremos disfrutar de un Nokia N810 recién actualizado/formateado para experimentar de nuevo con el…. 🙂

Configurando Drivers High Definition Audio en ubuntu

Bueno pues en esta ocasion voy a publicar un tutorial de como configurar los dirvers High Definition en Ubuntu 10.04 LTS, aunque “en teoria” deberia poderse en cualquier version de ubuntu.

Este manaul se debio a que recientemente instale ubuntu 10.04 en mi laptop HP G62, la version instalada en esta laptop es la version 10.04 LTS.

Para comenzar necesitamos saber que tarjeta de audio poseemos esto lo podemos lograr en windows dando click derecho en mi Pc para windows Xp o en sistema para windows 7, después de eso nos vamos a propiedades y después de ahí seleccionamos administrador de dispositivos, donde nos aparecera una ventana como la que muestro a continuación:

drivers-realtek-HD-windows-7

En esta ventana se detallan los dispositivos de nuestra PC, como podrán darse cuenta mi dispositivo de audio es: “Realtek High definition Audio”
Aunque para ser honestos esto no nos aporta mucho… pero algo es algo …

Después de eso una vez obtenida esta información nos trasladamos a nuestro ubuntu, donde buscaremos con mayor exactitud el nombre de nuestra tarjeta.

Para ello en una terminal deberán teclear lo siguiente:

[code]lspci-v[/code]

Donde nos mostrara los dispositivos de nuestro PC (es como el administrador de dispositivos de windows pero con mas datos), deberemos buscar entre esos datos el de nuestra tarjeta de audio:

audio-HD-realtek-1

Aunque para ser mas específicos el dato que nosotros necesitamos es el que dice: “Kernel Driver in use”, donde para nuestro caso es: “HDA intel”.

Despues de eso tenemos varias alternativas… La mas practica y por ende mas fácil es bajar los drivers directamente de la pagina de realtek, a continuacion les proporciono los links de descarga:

Link desde Realtek:Drivers HD Linux Realtek

Estos drivers son básicamente los drivers del Proyecto Alsa que a groso modo es un proyecto que se encarga de desarrollar drivers de audio para sistemas operativos Linux. Para mas detalles pueden visitar el sitio oficial: www.alsa-project.org

Como nota preliminar deberemos instalar las herramientas de compilación, para ello debemos teclear esto en la consola como SuperUsuario para asegurarnos que no se pueda producir ningún error durante la instalación.

[code]apt-get install build-essential module-assistant linux-headers-‘uname -r'[/code]

Una vez realizado esto procedemos a descomprimir el archivo descargado y localizarnos en la nueva carpeta generada: “/realtek-linux-audiopack-5.15/”, donde nos apareceran una serie de archivos como se muestran a continuacion:

audio-HD-realtek-2
Después de eso entraremos en la consola en el directorio anterior y cambiamos al usuario root, esto lo realizamos tecleando:

[code]su[/code]

después de eso ingresamos nuestro password de root y nos habremos convertido en SuperUsuario.

Una vez situados en el directorio donde descomprimimos el driver procedemos a teclear en la consola:

[code]./install[/code]

Que es una instalación automática del driver, después de haber finalizado correctamente la instalacion y cerciorarnos que nos retorna prompt de root, procederemos a reiniciar el equipo.

Hasta este punto el sonido después de la instalación debería funcionar sin inconveniente alguno.

Saludos