Posts in Category: Asterisk

Asterisk, Sangoma A101 y OpenR2.

Instalaremos Asterisk, DAHDI, OpenR2 y WANPIPE para configurar un enlace telefónico E1 de TELMEX en México, sera la tercera guía rápida que hago cada una con distintas tarjetas, Digium y OpenVox.
El sistema operativo que utilizaremos sera Linux Red Hat Enterprise Linux 5.6 para arquitectura de 64 bits, el equipo donde desarrollaremos las pruebas es un HP Proliant ML150, una tarjeta Sangoma A101 1-port T1/E1/J1 y conectores para los coaxiales para la conversión a RJ45. Instalaremos el sistema y utilizaremos únicamente paquetes que vienen junto con los discos de instalación, no usaremos yum para instalar ni actualizar paquetes principalmente para verificar los paquetes que son necesarios para compilar asterisk, dahdi y wanpipe (puedes utilizar CentOS por aquello de la licencia de RedHat).

No cubriremos la instalación de Red Hat hay demasiada información en la red para consultar solo hacemos mención que se instala sin entorno gráfico y demás aplicaciones no necesarias para un servidor de las características mencionadas. Los paquetes los tomaremos y los instalaremos usando la imagen ISO de RHEL montándolo en un directorio para instalarlos mediante RPM, ya que tenemos instalado todo el sistema operativo y conectado adecuadamente a una red con acceso a Internet procederemos a lo siguiente:

Crearemos un directorio denominado IPBX dentro de /usr/src que sera nuestro directorio de instalación, dentro de el crearemos otro directorio denominado Disco donde montaremos la ISO de instalación de Red Hat, para acceder a los paquetes.

[root@asterisksangoma ~]# mkdir /usr/src/IPBX
[root@asterisksangoma ~]# cd /usr/src/IPBX/
[root@asterisksangoma IPBX]# mkdir Disco
[root@asterisksangoma IPBX]# mount -t iso9660 -o loop rhel-server-5.6-x86_64-dvd.iso Disco/
[root@asterisksangoma IPBX]# cd Disco/Server/

Estos son los paquetes que tuve que instalar para la compilación de wanpipe, dahdi, asterisk y openr2, hay dependencias entre ellos por lo tanto es necesario instalarlos todos, con yum o createrepo es mas automático sin embargo no son muchos paquetes y de esta manera uno se da cuenta de los necesarios.

[root@asterisksangoma Server]# rpm -ivh kernel-devel-2.6.18-238.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh ncurses-devel-5.5-24.20060715.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh ncurses-5.5-24.20060715.x86_64.rpm *
[root@asterisksangoma Server]# rpm -ivh kernel-headers-2.6.18-238.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh glibc-headers-2.5-58.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh glibc-devel-2.5-58.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh gcc-4.1.2-50.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh flex-2.5.4a-41.fc6.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh patch-2.5.4-31.el5.x86_64.rpm *
[root@asterisksangoma Server]# rpm -ivh libtermcap-devel-2.0.8-46.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh bison-2.3-2.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh imake-1.0.2-3.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh autoconf-2.59-12.noarch.rpm
[root@asterisksangoma Server]# rpm -ivh automake-1.9.6-2.3.el5.noarch.rpm
[root@asterisksangoma Server]# rpm -ivh libtool-1.5.22-7.el5_4.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh libstdc++-devel-4.1.2-50.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh gcc-c++-4.1.2-50.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh slang-devel-2.0.6-4.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh newt-devel-0.52.2-15.el5.x86_64.rpm 
[root@asterisksangoma Server]# rpm -ivh zlib-devel-1.2.3-3.x86_64.rpm 
[root@asterisksangoma Server]# rpm -ivh libxml2-devel-2.6.26-2.1.2.8.el5_5.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh e2fsprogs-devel-1.39-23.el5_5.1.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh keyutils-libs-devel-1.2-1.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh libsepol-devel-1.15.2-3.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh libselinux-devel-1.33.4-5.7.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh krb5-devel-1.6.1-55.el5.x86_64.rpm
[root@asterisksangoma Server]# rpm -ivh openssl-devel-0.9.8e-12.el5_5.7.x86_64.rpm

En el directorio de IPBX descargaremos las ultimas versiones de cada una de las aplicaciones que vamos a utilizar, para este caso usaremos Wanpipe 3.5.20, Asterisk 1.8.4, DAHDI linux 2.4.1.2, DAHDI tools 2.4.1 y OpenR2 1.3.1.

[root@asterisksangoma IPBX]# wget ftp://ftp.sangoma.com/linux/current_wanpipe/wanpipe-3.5.20.tgz
[root@asterisksangoma IPBX]# wget http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/dahdi-linux-2.4.1.2.tar.gz
[root@asterisksangoma IPBX]# wget http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools-2.4.1.tar.gz
[root@asterisksangoma IPBX]# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8.4.tar.gz
[root@asterisksangoma IPBX]# wget http://openr2.googlecode.com/files/openr2-1.3.1.tar.gz

Antes que nada debemos conectar al equipo la tarjeta y verificar que se reconocida por Linux, mediante lspci verificamos que adecuadamente el sistema operativo la reconoció y nos muestra donde esta conectada físicamente.
La tarjeta en cuestión:
A102
Puerto PCI del equipo.

[root@asterisksangoma ~]# lspci | grep Net
07:00.0 Network controller: Sangoma Technologies Corp. A200/Remora FXO/FXS Analog AFT card
07:01.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5703X Gigabit Ethernet (rev 02)

Procedemos con la instalación de los módulos de DAHDI y posteriormente la instalación de Wanpipe ya que vamos a utilizar DAHDI especificamos al script de instalación el parámetro dahdi.

[root@asterisksangoma IPBX]# tar xfz dahdi-linux-2.4.1.2.tar.gz
[root@asterisksangoma IPBX]# cd dahdi-linux-2.4.1.2
[root@asterisksangoma dahdi-linux-2.4.1.2]# make
[root@asterisksangoma dahdi-linux-2.4.1.2]# make install
[root@asterisksangoma dahdi-linux-2.4.1.2]# cd ..
 
[root@asterisksangoma IPBX]# tar xfz wanpipe-3.5.20.tgz
[root@asterisksangoma IPBX]# cd wanpipe-3.5.20


El script de instalación verificara los componentes necesarios como son paquetes, librerías del kernel utilizado y el directorio de DAHDI a utilizar.

[root@asterisksangoma wanpipe-3.5.20]# ./Setup dahdi
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE INSTALLATION FOR DAHDI
 
You are about to install WANPIPE TDM Voice drivers
for Asterisk/Dahdi framework.
 
You will be prompted for path to DAHDI source.
 
Wanpipe drivers will compile into dahdi WITHOUT any
dahdi patching or need to recompile dahdi modules.
 
You must have Linux Kernel Headers along with
full development tools (i.e. GNU C compiler and utilities)
installed in order to be able to install this product.
 
If you have previoulsy installed WANPIPE, this release
will overrite/upgrade full release without the need to
uninstall first!
 
IMPORTANT:
It is always recommended to say YES to all options
prompted during the install!
 
Please visit: http://wiki.sangoma.com for more info.
 
Would you like to install WANPIPE now? [y] (y/n) y
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
Fixing file permissions...
 
Verifying files and fixing permissions ...Done
Checking for C developement tools ...(gcc) OK
Checking for C++ developement tools ...OK
Checking for Make utility ...OK
Checking for ncurses library ... OK
Checking for Perl developement tools ...OK
Checking for AWK ...OK
Checking for FLEX ...OK
Checking for Patch ...OK
Checking for libtermcap-devel...OK
Checking for bison...OK
Checking for libtool...OK
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
Installing WANPIPE Device Drivers: Linux KERNEL
 
To integrate WANPIPE Multi-Protocol Voice & WAN Router 
modules into the Linux kernel, the kernel has to be 
updated with latest wanpipe sources.  Install will only
modify existing wanpipe source that is already in the
Kernel. 
 
IMPORTANT:
It is always recommended to say YES to all options 
prompted during the install!
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
Please specify absolute path name of your linux headers/source directory
 
Press Enter for Default: /lib/modules/2.6.18-238.el5/build
 
#>Setting linux directory to /lib/modules/2.6.18-238.el5/build
 
 
 
Upgrading WANPIPE kernel documentation ...Done.
 
 
Installing WANPIPE include headers ...Done.
 
WANPIPE device drivers upgraded successfully!
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE KERNEL DRIVER COMPILATION
 
The next step in WANPIPE installation involves compiling 
WANPIPE kernel modules.  
 
This script will compile and install WANPIPE modules
into the currently running linux kernel.
 
For greater customization you will be prompted to
select which Protocol/Drivers you would like to
build into the WANPIPE kernel modules.
 
Wanpipe for Asterisk/Dahdi/Zaptel
	Default for Asterisk/Dahdi/Zaptel
Wanpipe for Wan Routing/API 
	Default for Wan/IP Routing and Data API
Wanpipe for Asterisk SMG/SS7
	Default for Asterisk SS7
Wanpipe for TDM API
	Default for FreeSwitch and Voice API 	
 
Custom Compilation:
------------------
  Customise WANPIPE driver compilation to add only the
  protocols that you need.  This way one can reduce
  the size of the WANPIPE kernel drivers.
 
Refer to http://wiki.sangoma.com for more info
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
	Please Select Compilation Mode
 
1. WAN Protocols Support 
       Protocols: Frame Relay, CHDLC, PPP, ATM, X25, ADSL, TDM API
       Default for: Wan Routing, Data & Voice API devel.
 
2. TDM Voice (Dahdi/Zaptel) Support 
       Protocols: TDMV (Dahid/Zaptel), TDM API on AFT adatpers.
       Default for: Asterisk & CallWeaver
 
3. TDM Voice (Dahid/Zaptel) + WAN Protocol Support
 
4. SMG (SS7) (Default for Asterisk SMG/SS7 install)
 
5. SMG (SS7) + TDM Voice (Dahdi/Zaptel)
       Default for: Asterisk SS7 + PRI
 
6. SMG (BRI) (Default for Asterisk SMG/BRI install)
 
7. SMG (BRI) + TDM Voice (Dahdi/Zaptel)
       Default for: Asterisk BRI + PRI + Analog
 
8. SMG (PRI) (Default for Asterisk SMG/PRI install)
 
9. SMG (PRI) + TDM Voice (Dahdi/Zaptel)
       Default for: Asterisk SMG/PRI + Analog
 
10. TDM API  
       Protocols: TDM API on AFT adapters:
       Default for: FreeSwitch, Yate, Sunrise
                    Custom voice development 
 
11. Custom Compilation Mode
       Specify protocols to be added into the WANPIPE
       kernel drivers.
 
Please select (1-11) [Default: 1]: 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
 
Looking for zaptel/dahdi directory in /usr/src ...
-------------------------------------------
1 : /usr/src/IPBX/dahdi-linux-2.4.1.2 
------------------------------------------ 
------------------------------------------ 
m : Enter zaptel path manually
 
(ctrl-c to Exit)
Please select working zaptel directory [1-1][m]: 1
 
Enabling the TDM Voice Asterisk Support
 
Dahdi HW HDLC Support Detected: Enabling DCHAN Feature
Native Dahdi HW HDLC Support Detected - No patch required
Dahdi source unmodified
 
Checking for UDEV Zaptel compatibility...     Dahdi installed, no need to add UDEV rules
Enabling the AFT TE1 Support
 
Checking for SMP support ...Enabled.
 
Checking current processor type ...x86_64
 
Wan Update Flags:  -DAF_WANPIPE_2612_FORCE_UPDATE -DWANPIPE_MOD_266_FORCE_UPDATE
 
 
--------------------------------------------------
CFLAGS: gcc -Wp,-MD,.wanpipe.o.d -nostdinc -iwithprefix include -D__LINUX__ -Dlinux -D__KERNEL__ -I/usr/include/wanpipe -I/lib/modules/2.6.18-238.el5/build/include  -DMODULE   -DAF_WANPIPE_2612_FORCE_UPDATE -DWANPIPE_MOD_266_FORCE_UPDATE   -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Wstrict-prototypes -Wundef -Werror-implicit-function-declaration -fno-delete-null-pointer-checks -fwrapv -Os  -mtune=generic -m64 -mno-red-zone -mcmodel=kernel -pipe -fno-reorder-blocks -Wno-sign-compare -fno-asynchronous-unwind-tables -funit-at-a-time -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fomit-frame-pointer -g  -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -D__KERNEL__ -Iinclude  -include include/linux/autoconf.h  
--------------------------------------------------
 
Checking for REGPARM kernel option ...Disabled.
 
Compiling General WANPIPE Driver for 2.6.X Kernel .....Done.
 
 
WAN HWEC module enabled and compiled!
Linking Wanpipe Driver and protocols ...Done.
 
Updating Kernel Modules ...Done.
 
Compilation Successful.
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE META CONFIGURATION
 
There are two configuration files associated with WANPIPE.  
 
1) /usr/src/IPBX/wanpipe-3.5.20/wanrouter.rc: 
	- defines locations of important files such as lock
	  and configuration files as well as start/stop 
	  order of multiple WANPIPE devices.
2) /usr/src/IPBX/wanpipe-3.5.20/wanpipe1.conf:
	- main configuration file for each WANPIPE device.
	- defines interfaces, hardware and protocol information.
	- this file can be created using the 'wancfg' GUI
	  utility or manually based on sample files located
	  in /etc/wanpipe/samples.
 
Please read the WanpipeInstallation.(pdf/txt) manual for further
information.
 
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE UTILITIES SETUP
 
WANPIPE utilities are used to:
	1) create configuration files: for Zaptel and Asterisk
		/usr/sbin/wancfg_zaptel	#Zaptel and Asterisk
		/usr/sbin/wancfg_dahdi	#Dahdi and Asterisk
		/usr/sbin/wancfg_smg	#BRI/SS7, Zaptel and Asterisk
		/usr/sbin/wancfg_tdmapi	#TDM API
	2) create WANPIPE WAN/IP configuration files.
		(/usr/sbin/wancfg)
	3) start,stop,restart individual/all devices and interfaces.
		(/usr/sbin/wanrouter)
	4) debug line, protocol and driver problems.
		(/usr/sbin/wanpipemon)
	5) aid in WANPIPE API development
		(/etc/wanpipe/api)
 
Refer to the WanpipeInstallation.(pdf/txt) for more information.
 
 
Compiling WANPIPE Utilities ...Done.
 
 
Compiling WANPIPE WanCfg Utility ...Done.
 
 
Compiling WANPIPE LibSangoma API library ...Done.
 
 
Compiling WANPIPE LibStelephony API library ...Done.
 
 
Compiling WANPIPE API Development Utilities ...Done.
 
Compiling WANPIPE HWEC Utilities ...Done.
 
 
	WANPIPE Environment Setup Complete !!!
 
Installing WANPIPE Files ... !
Installing  WANPIPE Utilities in /usr/sbin
Installing wanrouter.rc in /etc/wanpipe
Installing wanpipe libraries in /etc/wanpipe
Installing firmware in /etc/wanpipe/firmware
Installing documentation in /usr/share/doc/wanpipe
Installing sample api code in /etc/wanpipe/api
Installing AFT Firmware update utility in /etc/wanpipe/util
Installing driver headers in /etc/wanpipe/api/include/linux
Installing Hardware Echo Cancel Utilites
 
	----------------------------------------------------------
	          WANPIPE v3.5.20 Installation Script
	    Copyright (c) 1995-2010, Sangoma Technologies Inc.
	----------------------------------------------------------
 
WANPIPE INSTALLATON: COMPLETE
 
WANPIPE installation is now complete. WANPIPE kernel drivers 
and configuration/debug utilities have been compiled and installed.
 
	1) Proceed to configure the WANPIPE drivers:
		Asterisk/Zaptel  : /usr/sbin/wancfg_zaptel
		Asterisk/Dahdi   : /usr/sbin/wancfg_dahdi
		TDM API          : /usr/sbin/wancfg_tdmapi
		SMG SS7/BRI/PRI  : /usr/sbin/wancfg_smg
		WAN Routing/API  : /usr/sbin/wancfg
	2) Use the /usr/sbin/wanrouter startup script to start and stop
	   the router. (eg: wanrouter start)
	3) To uninstall WANPIPE package run ./Setup remove
 
Please read http://wiki.sangoma.com for further instructions.
 
 
Wanpipe / Zaptel Configuration
==============================
 
wancfg_zaptel configurator can create all wanpipe config files
for ZAPTEL including /etc/zaptel.conf file.
Optionally: the configurator can also create Asterisk zapata.conf
-----------------------------------------------------
Would you like to configure wanpipe devices for DAHDI? (y/n) n
Wanpipe Installation Complete
-----------------------------
Please proceed to configure wanpipe user /usr/sbin/wancfg_dahdi

Hasta aquí termina la instalación le dimos la opción de que no configurara de momento los dispositivos esto lo haremos después con otro script del programa instalado aparte de que al final editaremos manualmente nuestro archivo de configuración.
Con el comando wanrouter recién instalado verificamos que nuestra tarjeta sea reconocida efectivamente por wanpipe.

[root@asterisksangoma wanpipe-3.5.20]# wanrouter hwprobe
 
-------------------------------
| Wanpipe Hardware Probe Info |
-------------------------------
1 . AFT-A101-SH : SLOT=0 : BUS=7 : IRQ=7 : CPU=A : PORT=1 : HWEC=32 : V=37
 
Card Cnt: A101-2=1

Vemos que satisfactoriamente esta reconocida por la aplicación, aquí en este punto especial introduzco el siguiente error que se presento en diversos intentos de instalación con otros kernel o sin la tarjeta E1 en el puerto PCI del equipo en cuestión.

FATAL: Error inserting wanpipe (/lib/modules/2.6.18-238.el5/kernel/drivers/net/wan/wanpipe.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Would you like to generate /etc/asterisk/zapata.conf

Iniciamos el script de configuración tomando los pasos de un white paper denominado “Running MFC/R2 with Sangoma Wanpipe® using OpenR2 (libopenr2)“, para generar el archivo de configuración de wanpipe.

[root@asterisksangoma wanpipe-3.5.20]# wancfg_dahdi 
 
########################################################################
#    		           Sangoma Wanpipe                             #
#        Dahdi/Zaptel/SMG/TDMAPI/BOOT Configuration Script             #
#                             v2.39                                  #
#                     Sangoma Technologies Inc.                        #
#                        Copyright(c) 2009.                            #
########################################################################
 
Would you like to generate /etc/asterisk/chan_dahdi.conf
 1. YES
 2. NO
[1-2]:1
 
---------------------------------------------
Configuring T1/E1 cards [A101/A102/A104/A108]
---------------------------------------------
A101 detected on slot:0 bus:7
 
-----------------------------------------------------------
Configuring port 1 on A101 slot:0 bus:7.
-----------------------------------------------------------
 
Select media type for AFT-A101 on port 1 [slot:0 bus:7 span:1]
 1. T1
 2. E1
 3. Unused
 4. Exit
[1-4]:2
 
Configuring port 1 on 101 as E1, line coding:HDB3, framing:CRC4 
 1. YES - Keep these settings
 2. NO  - Configure line coding and framing
[1-2, ENTER='YES']:1
 
Select clock for AFT-A101 on port 1 [slot:0 bus:7 span:1]
 1. NORMAL
 2. MASTER
[1-2]:1
 
Select signalling type for AFT-A101 on port 1 [slot:0 bus:7 span:1]
 1. Zaptel/Dahdi - PRI CPE
 2. Zaptel/Dahdi - PRI NET
 3. Zaptel/Dahdi - E & M
 4. Zaptel/Dahdi - E & M Wink
 5. Zaptel/Dahdi - FXS - Loop Start
 6. Zaptel/Dahdi - FXS - Ground Start
 7. Zaptel/Dahdi - FXS - Kewl Start
 8. Zaptel/Dahdi - FX0 - Loop Start
 9. Zaptel/Dahdi - FX0 - Ground Start
 10. Zaptel/Dahdi - FX0 - Kewl Start
 11. Sangoma SMG/sangoma_prid- PRI CPE
 12. Sangoma SMG/sangoma_prid- PRI NET
[1-12]:5
 
 
Would you like to enable hardware DTMF detection?
 1. YES
 2. NO
[1-2, ENTER='YES']:1
 
Would you like to enable hardware fax detection?
 1. YES
 2. NO
[1-2, ENTER='NO']:1
 
Configuring port 1 on AFT-A101 as a full E1
 1. YES - Use all channels
 2. NO  - Configure for fractional
[1-2, ENTER='YES']:1
 
Select dialplan context for AFT-A101 on port 1
 1. from-pstn
 2. from-internal
 3. Custom
[1-3]:1
 
 
Port 1 on AFT-A101 configuration complete...
Press any key to continue: 
 
T1/E1 card configuration complete.
Press any key to continue: 
 
------------------------------------
Configuring analog cards [A200/A400/B600/B700/B800]
------------------------------------
 
------------------------------------
Configuring USB devices [U100]
------------------------------------
 
###################################################################
#                             SUMMARY                             #
###################################################################
 
  1 T1/E1 port(s) detected, 1 configured
  0 ISDN BRI port(s) detected, 0 configured
  0 analog card(s) detected, 0 configured
  0 usb device(s) detected, 0 configured
 
Configurator will create the following files:
	1. Wanpipe config files in /etc/wanpipe
	2. Dahdi config file /etc/dahdi/system.conf
	3. Chan-Dahdi config file /etc/asterisk/chan_dahdi.conf
 
 
Your original configuration files will be saved to:
	1. /etc/dahdi/system.conf.bak 
	2. /etc/asterisk/chan_dahdi.conf.bak 
 
 
Your configuration has been saved in /etc/wanpipe/debug-2011-05-15.tgz.
When requesting support, email this file to techdesk@sangoma.com
 
 
###################################################################
 
Configuration Complete! Please select following:
 1. YES - Continue
 2. NO - Exit
[1-2]:
 
Dahdi and Wanpipe configuration complete: choose action
 1. Save cfg: Restart Asterisk & Wanpipe now
 2. Save cfg: Restart Asterisk & Wanpipe when convenient
 3. Save cfg: Stop Asterisk & Wanpipe now
 4. Save cfg: Stop Asterisk & Wanpipe when convenient
 5. Save cfg: Save cfg only (Not Recommanded!!!)
 6. Do not save cfg: Exit
[1-6]:5
 
 
Removing old configuration files...
 
Copying new Wanpipe configuration files...
 
Copying new Dahdi configuration file (/etc/dahdi/system.conf)...
cp: cannot create regular file `/etc/dahdi/system.conf': No such file or directory
Error executing command:
cp -f /etc/wanpipe/wancfg_zaptel/tmp_cfg/zaptel.conf /etc/dahdi/system.conf
 
Would you like to continue?
 1. No - exit
 2. YES
[1-2, ENTER='No']:2
 
 
Copying new Chan-Dahdi configuration files (/etc/asterisk/chan_dahdi.conf)...
cp: cannot create regular file `/etc/asterisk/chan_dahdi.conf': No such file or directory
Error executing command:
cp -f /etc/wanpipe/wancfg_zaptel/tmp_cfg/zapata.conf /etc/asterisk/chan_dahdi.conf
 
Would you like to continue?
 1. No - exit
 2. YES
[1-2, ENTER='No']:2
 
Saving files only
Current boot level is 3
 
Wanrouter boot scripts configuration...
 
Removing existing wanrouter boot scripts...OK
Would you like wanrouter to start on system boot?
 1. YES
 2. NO
[1-2]:1
 
Verifying Dahdi boot scripts...
Verifying Dahdi boot scripts...Not installed
Verifying Dahdi shutdown scripts...Not installed
Enabling wanrouter boot scripts ...(level:8)
Enabling wanrouter shutdown scripts ...(level:91)
Remvoing old smg_ctrl boot.....OK
Remvoing old smg_ctrl_safe boot.....OK

Posteriormente realizaremos unos cambios en el archivo de configuración, vamos a verificar que wanrouter nos muestre el dispositivo.

[root@asterisksangoma wanpipe-3.5.20]# wanrouter start
 
Starting up device: wanpipe1
--> Loading ec image OCT6116-64S.ima...
Configuring interfaces: w1g1 
done.
 
[root@asterisksangoma wanpipe-3.5.20]# wanrouter list
 
Devices currently active:
	wanpipe1
 
[root@asterisksangoma wanpipe-3.5.20]# wanrouter status
 
Devices currently active:
	wanpipe1
 
 
Wanpipe Config:
 
Device name | Protocol Map | Adapter  | IRQ | Slot/IO | If's | CLK | Baud rate |
wanpipe1    | N/A          | A101/1D/A102/2D/4/4D/8| 169 | 0       | 1    | N/A | 0         |
 
Wanrouter Status:
 
Device name | Protocol | Station | Status        |
wanpipe1    | AFT TE1  | N/A     | Disconnected  |

Instalamos las herramientas de DAHDI para usar dahdi_tool.

[root@asterisksangoma wanpipe-3.5.20]# cd ..
[root@asterisksangoma IPBX]# tar xfz dahdi-tools-2.4.1.tar.gz 
[root@asterisksangoma IPBX]# cd dahdi-tools-2.4.1
[root@asterisksangoma dahdi-tools-2.4.1]# ./configure
[root@asterisksangoma dahdi-tools-2.4.1]# make
[root@asterisksangoma dahdi-tools-2.4.1]# make install
[root@asterisksangoma dahdi-tools-2.4.1]# make config
[root@asterisksangoma dahdi-tools-2.4.1]# cd ..

Compilamos e instalamos OpenR2 según las indicaciones del manual colocado en la pagina del autor.

[root@asterisksangoma IPBX]# tar xvfz openr2-1.3.1.tar.gz 
[root@asterisksangoma IPBX]# cd openr2-1.3.1
[root@asterisksangoma openr2-1.3.1]# ./configure --prefix=/usr
[root@asterisksangoma openr2-1.3.1]# make
[root@asterisksangoma openr2-1.3.1]# make install

Por ultimo compilamos e instalamos Asterisk.

[root@asterisksangoma IPBX]# tar xfz asterisk-1.8.4.tar.gz 
[root@asterisksangoma IPBX]# cd asterisk-1.8.4
[root@asterisksangoma IPBX]# ./configure
[root@asterisksangoma IPBX]# make
[root@asterisksangoma IPBX]# make install
[root@asterisksangoma IPBX]# make samples

Verificamos que el soporte de OpenR2 este correctamente instalado en Asterisk.

[root@asterisksangoma asterisk-1.8.4]# ldd channels/chan_dahdi.so | grep openr2
	libopenr2.so.3 => /usr/lib64/libopenr2.so.3 (0x00002ab1f4dbe000)

Configuraremos DAHDI con los siguientes parámetros específicos para el E1 de TELMEX, son treinta canales posibles de comunicación con el canal 16 para señalización.

[root@asterisksangoma IPBX]# vi /etc/dahdi/system.conf 
span=1,1,0,cas,hdb3
cas=1-15:1101
dchan=16
cas=17-31:1101
 
loadzone=us
defaultzone=us

Cargamos la configuración.

[root@asterisksangoma IPBX]# dahdi_cfg -vv
DAHDI Tools Version - 2.4.1
 
DAHDI Version: 2.4.1.2
Echo Canceller(s): 
Configuration
======================
 
SPAN 1: CAS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
 
Channel map:
 
Channel 01: CAS / User (Default) (Echo Canceler: none) (Slaves: 01)
Channel 02: CAS / User (Default) (Echo Canceler: none) (Slaves: 02)
Channel 03: CAS / User (Default) (Echo Canceler: none) (Slaves: 03)
Channel 04: CAS / User (Default) (Echo Canceler: none) (Slaves: 04)
Channel 05: CAS / User (Default) (Echo Canceler: none) (Slaves: 05)
Channel 06: CAS / User (Default) (Echo Canceler: none) (Slaves: 06)
Channel 07: CAS / User (Default) (Echo Canceler: none) (Slaves: 07)
Channel 08: CAS / User (Default) (Echo Canceler: none) (Slaves: 08)
Channel 09: CAS / User (Default) (Echo Canceler: none) (Slaves: 09)
Channel 10: CAS / User (Default) (Echo Canceler: none) (Slaves: 10)
Channel 11: CAS / User (Default) (Echo Canceler: none) (Slaves: 11)
Channel 12: CAS / User (Default) (Echo Canceler: none) (Slaves: 12)
Channel 13: CAS / User (Default) (Echo Canceler: none) (Slaves: 13)
Channel 14: CAS / User (Default) (Echo Canceler: none) (Slaves: 14)
Channel 15: CAS / User (Default) (Echo Canceler: none) (Slaves: 15)
Channel 16: D-channel (Default) (Echo Canceler: none) (Slaves: 16)
Channel 17: CAS / User (Default) (Echo Canceler: none) (Slaves: 17)
Channel 18: CAS / User (Default) (Echo Canceler: none) (Slaves: 18)
Channel 19: CAS / User (Default) (Echo Canceler: none) (Slaves: 19)
Channel 20: CAS / User (Default) (Echo Canceler: none) (Slaves: 20)
Channel 21: CAS / User (Default) (Echo Canceler: none) (Slaves: 21)
Channel 22: CAS / User (Default) (Echo Canceler: none) (Slaves: 22)
Channel 23: CAS / User (Default) (Echo Canceler: none) (Slaves: 23)
Channel 24: CAS / User (Default) (Echo Canceler: none) (Slaves: 24)
Channel 25: CAS / User (Default) (Echo Canceler: none) (Slaves: 25)
Channel 26: CAS / User (Default) (Echo Canceler: none) (Slaves: 26)
Channel 27: CAS / User (Default) (Echo Canceler: none) (Slaves: 27)
Channel 28: CAS / User (Default) (Echo Canceler: none) (Slaves: 28)
Channel 29: CAS / User (Default) (Echo Canceler: none) (Slaves: 29)
Channel 30: CAS / User (Default) (Echo Canceler: none) (Slaves: 30)
Channel 31: CAS / User (Default) (Echo Canceler: none) (Slaves: 31)
 
31 channels to configure.
 
Setting echocan for channel 1 to none
Setting echocan for channel 2 to none
Setting echocan for channel 3 to none
Setting echocan for channel 4 to none
Setting echocan for channel 5 to none
Setting echocan for channel 6 to none
Setting echocan for channel 7 to none
Setting echocan for channel 8 to none
Setting echocan for channel 9 to none
Setting echocan for channel 10 to none
Setting echocan for channel 11 to none
Setting echocan for channel 12 to none
Setting echocan for channel 13 to none
Setting echocan for channel 14 to none
Setting echocan for channel 15 to none
Setting echocan for channel 16 to none
Setting echocan for channel 17 to none
Setting echocan for channel 18 to none
Setting echocan for channel 19 to none
Setting echocan for channel 20 to none
Setting echocan for channel 21 to none
Setting echocan for channel 22 to none
Setting echocan for channel 23 to none
Setting echocan for channel 24 to none
Setting echocan for channel 25 to none
Setting echocan for channel 26 to none
Setting echocan for channel 27 to none
Setting echocan for channel 28 to none
Setting echocan for channel 29 to none
Setting echocan for channel 30 to none
Setting echocan for channel 31 to none

Configuramos los parámetros con respecto a MFCR2, los DNIS, el contexto y los canales a utilizar, en este caso de los canales uno al veintiuno (el 16 se usa señalización) debido a que mi E1 tiene veinte lineas disponibles.

[root@asterisksangoma ~]# cat /etc/asterisk/chan_dahdi.conf 
[channels] 
signalling=mfcr2 
mfcr2_variant=mx 
mfcr2_get_ani_first=no 
mfcr2_max_ani=10 
mfcr2_max_dnis=4 
mfcr2_category=national_subscriber 
mfcr2_mfback_timeout=-1 
mfcr2_metering_pulse_timeout=-1 
; this is for debugging purposes 
mfcr2_logdir=log 
mfcr2_logging=all 
; end debugging configuration 
context=from-pstn 
group=1 
restrictcid=yes 
hidecallerid=yes 
channel => 1-15 
channel => 17-21

Con esto ya tenemos configurada la parte de Asterisk y DAHDI para solo recibir la señal del E1, vamos a terminar de configurar Wanpipe. Conectar el E1 no basta para que nuestra tarjeta inmediatamente empiece a trabajar, en dado caso wanpipemon nos ayudara a identificar las posibles alarmas existente para lograr poner en verde el led indicador del estado de nuestra tarjeta.
Aquí cito una pagina de la wiki de sangoma donde nos muestran la descripción de cada una de estas alarmas. Aquí wanpipemon muestra las alarmas cuando no tenemos conexión alguna en la tarjeta, nota la alarma de open circuit, loss of framing y loss of frame signal.

[root@asterisksangoma IPBX]# wanpipemon -i w1g1 -c Ta
 
***** w1g1: E1 Rx Alarms (Framer) *****
 
ALOS:	OFF	| LOS:	ON
RED:	ON	| AIS:	OFF
LOF:	ON	| RAI:	OFF
 
***** w1g1: E1 Rx Alarms (LIU) *****
 
Short Circuit:	OFF
Open Circuit:	ON
Loss of Signal:	ON
 
***** w1g1: E1 Tx Alarms *****
 
AIS:	OFF	| YEL:	ON
 
 
***** w1g1: E1 Performance Monitoring Counters *****
 
Line Code Violation	: 0
Far End Block Errors	: 0
CRC4 Errors		: 0
FAS Errors		: 0
 
 
Rx Level	: < -44db

Aquí un ejemplo de la tarjeta conectada con un loop en los coaxiales, esto con el fin de comparar ciertas alarmas que van desde una mala señal enviada por el otro lado de nuestro enlace así como cables invertidos en la conexión, la alarma es la de loss of framing.

[root@asterisksangoma IPBX]# wanpipemon -i w1g1 -c Ta
 
***** w1g1: E1 Rx Alarms (Framer) *****
 
ALOS:	OFF	| LOS:	OFF
RED:	ON	| AIS:	OFF
LOF:	ON	| RAI:	OFF
 
***** w1g1: E1 Rx Alarms (LIU) *****
 
Short Circuit:	OFF
Open Circuit:	OFF
Loss of Signal:	OFF
 
***** w1g1: E1 Tx Alarms *****
 
AIS:	OFF	| YEL:	ON
 
 
***** w1g1: E1 Performance Monitoring Counters *****
 
Line Code Violation	: 725
Far End Block Errors	: 0
CRC4 Errors		: 0
FAS Errors		: 0
 
 
Rx Level	: > -2.5db

En los logs del sistema se pueden presentar mensajes similares a los siguientes haciendo referencia al reloj, en mi caso fue por que el Rx y Tx de los coaxiales estaban invertidos en el balun, sin embargo en la FAQ de Sangoma hay mas causas posibles, también nota que aparecen otras alarmas diferentes en especial la de short circuit que nos indica que los cables están cruzados, y la de remote alarm indication.

[root@asterisksangoma ~]# wanpipemon -i w1g1 -c Ta 
 
***** w1g1: E1 Rx Alarms (Framer) ***** 
 
ALOS:	OFF	| LOS:	OFF 
RED:	ON	| AIS:	OFF 
LOF:	ON	| RAI:	ON 
 
***** w1g1: E1 Rx Alarms (LIU) ***** 
 
Short Circuit:	ON 
Open Circuit:	OFF 
Loss of Signal:	OFF 
 
***** w1g1: E1 Tx Alarms ***** 
 
AIS:	OFF	| YEL:	ON 
 
 
***** w1g1: E1 Performance Monitoring Counters ***** 
 
Line Code Violation	: 826634 
Far End Block Errors	: 0 
CRC4 Errors		: 0 
FAS Errors		: 2166 
 
 
Rx Level	: -40db to -44db
[root@asterisksangoma ~]# tail -f /var/log/messages 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:53 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The CT_C8_A clock behavior does not conform to the H.100 spec! 
May 19 20:48:54 asterisksangoma kernel: wanec1: The H100 slave has lost its framing on the bus!

En los casos anteriores el comando dahdi_tool nos mostrara la alarma en la tarjeta y mientras exista Asterisk no podra usarla.


La alarma RED se quitara hasta que logremos configurar adecuadamente la tarjeta y nos deje de mostrar las demás alarmas, anteriormente configuramos con el script, necesitamos cambiar en el archivo wanpipe1.conf dentro del directorio /etc/wanpipe, el tipo de framing a NCRC4 en vez de CRC4 y confirmar la configuración del reloj se encuentre en modo normal.

FE_FRAME	= NCRC4 
TE_CLOCK 	= NORMAL

Conectamos el E1 a la tarjeta y comprobamos las alarmas en ella.

[root@asterisksangoma ~]# wanpipemon -i w1g1 -c Ta 
 
***** w1g1: E1 Rx Alarms (Framer) ***** 
 
ALOS:	OFF	| LOS:	OFF 
RED:	OFF	| AIS:	OFF 
LOF:	OFF	| RAI:	OFF 
 
***** w1g1: E1 Rx Alarms (LIU) ***** 
 
Short Circuit:	OFF 
Open Circuit:	OFF 
Loss of Signal:	OFF 
 
***** w1g1: E1 Tx Alarms ***** 
 
AIS:	OFF	| YEL:	OFF 
 
 
***** w1g1: E1 Performance Monitoring Counters ***** 
 
Line Code Violation	: 2620 
Far End Block Errors	: 0 
CRC4 Errors		: 0 
FAS Errors		: 1507 
 
 
Rx Level	: > -2.5db




Satisfactoriamente no hay ninguna alarma, nuestra tarjeta se pone en verde y esta lista para recibir llamadas, confirmamos con dahdi_tool.


Entramos a la consola de Asterisk y verificamos que los canales estén listos.

asterisksangoma*CLI> mfcr2 show channels 
Chan Variant Max ANI Max DNIS ANI First Immediate Accept Tx CAS   Rx CAS  
   1 MX      10      4        No        No               IDLE     IDLE    
   2 MX      10      4        No        No               IDLE     IDLE    
   3 MX      10      4        No        No               IDLE     IDLE    
   4 MX      10      4        No        No               IDLE     IDLE    
   5 MX      10      4        No        No               IDLE     IDLE    
   6 MX      10      4        No        No               IDLE     IDLE    
   7 MX      10      4        No        No               IDLE     IDLE    
   8 MX      10      4        No        No               IDLE     IDLE    
   9 MX      10      4        No        No               IDLE     IDLE    
  10 MX      10      4        No        No               IDLE     IDLE    
  11 MX      10      4        No        No               IDLE     IDLE    
  12 MX      10      4        No        No               IDLE     IDLE    
  13 MX      10      4        No        No               IDLE     IDLE    
  14 MX      10      4        No        No               IDLE     IDLE    
  15 MX      10      4        No        No               IDLE     IDLE    
  17 MX      10      4        No        No               IDLE     IDLE    
  18 MX      10      4        No        No               IDLE     IDLE    
  19 MX      10      4        No        No               IDLE     IDLE    
  20 MX      10      4        No        No               IDLE     IDLE    
  21 MX      10      4        No        No               IDLE     IDLE    
asterisksangoma*CLI>

DAHDI también se muestra configurado adecuadamente.

asterisksangoma*CLI> dahdi show channels 
   Chan Extension  Context         Language   MOH Interpret        Blocked    State     
 pseudo            default                    default                         In Service 
      1            from-pstn                  default                         In Service 
      2            from-pstn                  default                         In Service 
      3            from-pstn                  default                         In Service 
      4            from-pstn                  default                         In Service 
      5            from-pstn                  default                         In Service 
      6            from-pstn                  default                         In Service 
      7            from-pstn                  default                         In Service 
      8            from-pstn                  default                         In Service 
      9            from-pstn                  default                         In Service 
     10            from-pstn                  default                         In Service 
     11            from-pstn                  default                         In Service 
     12            from-pstn                  default                         In Service 
     13            from-pstn                  default                         In Service 
     14            from-pstn                  default                         In Service 
     15            from-pstn                  default                         In Service 
     17            from-pstn                  default                         In Service 
     18            from-pstn                  default                         In Service 
     19            from-pstn                  default                         In Service 
     20            from-pstn                  default                         In Service 
     21            from-pstn                  default                         In Service 
asterisksangoma*CLI>

Si tenemos la tarjeta con alarma los canales se nos mostraran de la siguiente manera:

asterisksangoma*CLI> dahdi show channels 
   Chan Extension  Context         Language   MOH Interpret        Blocked    State     
 pseudo            default                    default                         In Service 
      1            from-pstn                  default               R         In Service 
      2            from-pstn                  default               R         In Service 
      3            from-pstn                  default               R         In Service 
      4            from-pstn                  default               R         In Service 
      5            from-pstn                  default               R         In Service 
      6            from-pstn                  default               R         In Service 
      7            from-pstn                  default               R         In Service 
      8            from-pstn                  default               R         In Service 
      9            from-pstn                  default               R         In Service 
     10            from-pstn                  default               R         In Service 
     11            from-pstn                  default               R         In Service 
     12            from-pstn                  default               R         In Service 
     13            from-pstn                  default               R         In Service 
     14            from-pstn                  default               R         In Service 
     15            from-pstn                  default               R         In Service 
     17            from-pstn                  default               R         In Service 
     18            from-pstn                  default               R         In Service 
     19            from-pstn                  default               R         In Service 
     20            from-pstn                  default               R         In Service 
     21            from-pstn                  default               R         In Service 
 
asterisksangoma*CLI> mfcr2 show channels 
Chan Variant Max ANI Max DNIS ANI First Immediate Accept Tx CAS   Rx CAS  
   1 MX      10      4        No        No               IDLE     BLOCK   
   2 MX      10      4        No        No               IDLE     BLOCK   
   3 MX      10      4        No        No               IDLE     BLOCK   
   4 MX      10      4        No        No               IDLE     BLOCK   
   5 MX      10      4        No        No               IDLE     BLOCK   
   6 MX      10      4        No        No               IDLE     BLOCK   
   7 MX      10      4        No        No               IDLE     BLOCK   
   8 MX      10      4        No        No               IDLE     BLOCK   
   9 MX      10      4        No        No               IDLE     BLOCK   
  10 MX      10      4        No        No               IDLE     BLOCK   
  11 MX      10      4        No        No               IDLE     BLOCK   
  12 MX      10      4        No        No               IDLE     BLOCK   
  13 MX      10      4        No        No               IDLE     BLOCK   
  14 MX      10      4        No        No               IDLE     BLOCK   
  15 MX      10      4        No        No               IDLE     BLOCK   
  17 MX      10      4        No        No               IDLE     BLOCK   
  18 MX      10      4        No        No               IDLE     BLOCK   
  19 MX      10      4        No        No               IDLE     BLOCK   
  20 MX      10      4        No        No               IDLE     BLOCK   
  21 MX      10      4        No        No               IDLE     BLOCK   
asterisksangoma*CLI>

Configuramos rápidamente un extensión SIP 1000 con el contexto from-pstn para que pueda recibir las llamadas, marcamos y vemos como la llamada entra con el primer DNI y se dirige a la extensión 1000.

asterisksangoma*CLI> 
New MFC/R2 call detected on chan 11. 
MFC/R2 call offered on chan 11. ANI = , DNIS = 5900, Category = National Priority Subscriber 
MFC/R2 call has been accepted on backward channel 11 
    -- Executing [5900@from-pstn:1] Dial("DAHDI/11-1", "SIP/1000") in new stack 
  == Using SIP RTP CoS mark 5 
    -- Called 1000 
    -- SIP/1000-00000001 is ringing 
    -- SIP/1000-00000001 answered DAHDI/11-1 
  == Spawn extension (from-pstn, 5900, 1) exited non-zero on 'DAHDI/11-1' 
    -- Hungup 'DAHDI/11-1' 
MFC/R2 call end on channel 11

Sobre esa misma extensión realizamos una llamada de salida.

asterisksangoma*CLI> 
  == Using SIP RTP CoS mark 5 
    -- Executing [46028079@pruebas:1] Dial("SIP/1000-00000007", "DAHDI/g1/46028079") in new stack 
    -- Called g1/46028079 
MFC/R2 call has been accepted on forward channel 1 
    -- DAHDI/1-1 is ringing 
    -- DAHDI/1-1 is making progress passing it to SIP/1000-00000007 
MFC/R2 call has been answered on channel 1 
    -- DAHDI/1-1 answered SIP/1000-00000007 
Chan 1 - Far end disconnected. Reason: Normal Clearing 
MFC/R2 call disconnected on channel 1 
    -- Hungup 'DAHDI/1-1' 
  == Spawn extension (pruebas, 46028079, 1) exited non-zero on 'SIP/1000-00000007'


El teléfono es un MITEL 5312, diseñados específicamente para el protocolo MINET sin embargo tiene soporte para SIP, solo es cuestión de que inicie con el protocolo, y lo podremos registrar con cualquier proxy SIP mediante su pagina web de configuración.

Utilizamos dos tipos de conectores de coaxial a RJ45 que se muestran a continuación:


Este conector lo utiliza el conmutador MITEL de donde tome el E1.


Y aquí el conector de la marca AC and E, 408809069 K162.

De momento es todo configuraciones mas especificas quedan fuera de esta guía, quedan puntos pendientes como instalar una tarjeta Digium junto con la Sangoma, la instalación de Wanpipe en Debian que esperamos abordar en otro momento. Saludos dejo las paginas de donde se tomo la información.

Referencias:
http://code.google.com/p/openr2/downloads/list
http://wiki.sangoma.com/wanpipemon-T1-E1-line-alarms-0
http://www.fonality.com/trixbox/forums/vendor-forums-certified/sangoma/sangoma-a101d-alarm-redon-lofon
http://wiki.sangoma.com/konrads-cheat-sheet
http://wiki.sangoma.com/mfcr2
http://wiki.sangoma.com/wanpipe-linux-asterisk-debugging#pri_span_debugging
http://wiki.sangoma.com/wanpipe-linux-asterisk-appendix
http://libopenr2.org
http://code.google.com/p/openr2/downloads/list
http://edocs.mitel.com/UG/EN/5312-5324_SIP7.2_UG_GA.pdf
http://sangoma.com/assets/docs/misc/MFCR2_and_Sangoma_English.pdf

Ancho de banda y codecs.

Me llego una pagina de servicios en la nube, el famoso cloud computing, probando las posibilidades que ofrece instale un par de servidores linux para verificar unas ideas que traigo, y en eso se me ocurrió verificar el ancho de banda que ofrecen estos servicios y hacer una observación gráfica de diferentes codecs de audio existentes en Asterisk y en un teléfono IP Aastra que cayo en mis manos.

Después de la instalación de Debian GNU/Linux y Asterisk, creamos un sencillo dialplan con el fin de crear un contador usando los dígitos existentes en el paquete de sonidos.

[default]
exten => 200,1,Goto(test,s,1) 
 
[test] 
exten => s,1,Answer() 
exten => s,n,Set(COUNT=${DB(test/count)}) 
exten => s,n,GotoIf($[${ISNULL(${COUNT})}]?:continue) 
exten => s,n,Set(DB(test/count)=1) 
exten => s,n,Goto(1) 
exten => s,n(continue),NoOp() 
exten => s,n,SayNumber(${COUNT}) 
exten => s,n,Set(COUNT=$[${COUNT} + 1]) 
exten => s,n,Set(DB(test/count)=${COUNT}) 
exten => s,n,Goto(1)

Aquí vemos la ejecución donde apreciamos que el contador ya se encuentra en el número 1760, para este caso la ejecución es en GSM sin embargo cada llamada fue realizada con el codec correspondiente y para evitar conversión de un codec a otro (transcoding) se instalaron los paquetes de sonidos de cada uno de ellos.

agua*CLI> 
  == Using SIP RTP CoS mark 5
    -- Executing [200@default:1] Goto("SIP/1000-00000013", "test,s,1") in new stack
    -- Goto (test,s,1)
    -- Executing [s@test:1] Answer("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:2] Set("SIP/1000-00000013", "COUNT=1759") in new stack
    -- Executing [s@test:3] GotoIf("SIP/1000-00000013", "0?:continue") in new stack
    -- Goto (test,s,6)
    -- Executing [s@test:6] NoOp("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:7] SayNumber("SIP/1000-00000013", "1759") in new stack
    -- <SIP/1000-00000013> Playing 'digits/1.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/thousand.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/7.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/hundred.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/50.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/9.gsm' (language 'en')
    -- Executing [s@test:8] Set("SIP/1000-00000013", "COUNT=1760") in new stack
    -- Executing [s@test:9] Set("SIP/1000-00000013", "DB(test/count)=1760") in new stack
    -- Executing [s@test:10] Goto("SIP/1000-00000013", "1") in new stack
    -- Goto (test,s,1)
    -- Executing [s@test:1] Answer("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:2] Set("SIP/1000-00000013", "COUNT=1760") in new stack
    -- Executing [s@test:3] GotoIf("SIP/1000-00000013", "0?:continue") in new stack
    -- Goto (test,s,6)
    -- Executing [s@test:6] NoOp("SIP/1000-00000013", "") in new stack
    -- Executing [s@test:7] SayNumber("SIP/1000-00000013", "1760") in new stack
    -- <SIP/1000-00000013> Playing 'digits/1.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/thousand.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/7.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/hundred.gsm' (language 'en')
    -- <SIP/1000-00000013> Playing 'digits/60.gsm' (language 'en')

Cada imagen se obtuvo mediante el programa iftop (aptitude install iftop), para darnos una idea general del uso de ancho de banda de cada codec en un flujo constante de datos, las imágenes muestran una conexión mediante IAX2 y el ejemplo del dialplan esta en SIP sin embargo es igual para ambos caso de un modo general.

Codec ALAW

Codec ULAW

Codec GSM

Codec G722

Codec G729

El ejemplo del contador fue tomado del libro Asterisk: The Future of Telephony.

Transferencia SIP

Una de las cosas mas sencillas en este mundo actual es transferir una llamada. Ya que andamos probando el proxy SIP al que hacemos mención, verificaremos que es lo que pasa cuando realizamos este procedimiento comparándolo con el que hace Asterisk.

Tenemos tres usuarios SIP, 1000, 1001 y 1002. El dispositivo asociado a cada uno respectivamente son un SPA941, SPA2102 y el softphone Zoiper, el mas importante de estos tres es el teléfono IP que gracias a su display podemos verificar el comportamiento que estamos buscando.

Vamos a poner un sencillo ejemplo para ilustrarlo, el cual de manera general sera el siguiente.

1001 recibe una llamada de 1002.
1001 inicia transferencia atendida con 1000.
1000 contesta la llamada y aparece en el CALLERID 1001.
1000 acepta la llamada.
1001 cuelga.
1000 tiene la llamada y el CALLERID cambia de 1001 a 1002.
1002 cambia su CALLERID ahora a 1000.

Vamos a realizar una primera llamada, marcamos del usuario 1002 al 1001.

Establecemos la llamada, y en la lista de contactos de nuestro Softphone se nos muestra que estamos hablando con el usuario 1001.

Ahora 1001 pone en espera a 1002, y le marca a 1000 para transferirle la llamada, en este paso en el display del teléfono asociado al usuario 1000, aparece que esta recibiendo una llamada de 1001, acepta la llamada se establece la llamada y le indican que le van a transferir al usuario 1002. 1001 transfiere la llamada y termina su participación en la llamada.

Y es aquí donde vemos el comportamiento deseado, después de un instante en el display del teléfono se muestra que estamos hablando ahora con el usuario 1002, y en el softphone de igual manera cambia de que ahora hablamos con el usuario 1000.

Con Asterisk no pasa esto, los estados de los teléfonos en su CALLERID no cambian, el teléfono 1002 se queda con el primer numero que marco y el teléfono 1000 mantiene en su pantalla el numero de donde recibió la transferencia.

¿Y cuál es el motivo de esto?,debido a detalles del protocolo SIP que esta implementado en Asterisk esta característica por el momento no se encuentra disponible. Mas información acerca de esto en un buen debate en la lista de asterisk-es en el siguiente hilo: CALLER ID en transferencias atendidas.

Y como anexo, se muestra la traza SIP de la transferencia capturada con Wireshark.

MySQL y Asterisk CDR

Realizaremos una pequeña descripción de como conectar mediante MySQL diferentes servidores Asterisk para que guarden los registros de las llamadas realizadas. En el ejemplo que se mencionara a continuación se tienen siete equipos Asterisk funcionando cada uno de ellos con tarjetas analógicas y/o digitales. En el diagrama que se muestra a continuación, se puede observar que estos Asterisk están conectados mediante una topología de estrella por así decirlo, cada servidor esta conectado al Asterisk principal mediante un túnel UDP (VTUN), de esta manera puede haber comunicación entre todos ellos pasando por el servidor central mediante trunks SIP e IAX2.

mysqlasterisk

Cada servidor almacenara en una base de datos alojada en el servidor principal todos los registros de llamadas que se realizan, en este caso solo es de mi interés primordial las llamadas que se realizan a la PSTN por cada equipo, ya que las llamadas realizadas entre servidores (de extensión a extensión) son fácilmente registradas en el CDR del servidor principal, por lo cual tendremos una base de datos con ocho tablas.

Asumimos que ya contamos nuestro Asterisk funcionando en cada conmutador, y que en cada uno de ellos hemos instalado el modulo cdr_addon_mysql, presente en los addons de Asterisk, es preciso indicar que se utilizara el campo uniqueid, este de manera predeterminada no viene activo cuando trabajamos con MySQL al guardar el CDR, así que debemos agregar la siguiente linea en el archivo Makefile que se encuentra de la carpeta de asterisk-addons-1.4.7 y despues de esto compilar e instalar.

ASTCFLAGS+=-DMYSQL_LOGUNIQUEID

Mas información al respecto la podemos encontrar en el siguiente enlace: http://www.voip-info.org/wiki/view/Asterisk+cdr+mysql

Instalamos MySQL mediante aptitude y establecemos una contraseña para el usuario root de nuestro sistema de base de datos.

asteriskpbx:~# aptitude install mysql-server-5.0 libmysqlclient-dev

Probando QueueMetrics

Vamos a probar el monitoreo en tiempo real para ver que sucede al “loguear” un par de agentes y recibir una llamada. En esta imagen nos aparece una pagina de datos donde se nos muestras diversos parámetros, y aun no muestra ningún agente ni alguna llamada entrante.

quemetricsmon1

Como vimos en el post de Agentes y Colas, “logueamos” un par de agentes, con lo cual en la siguiente actualización de la pagina se nos muestran listos para recibir llamadas. Entre otros datos que se nos muestran como el número de agentes que están disponibles o en pausa y la fecha del ultimo registro del agente.

quemetricsmon2

Realizamos la simulación de una llamada entrante que se asignara a la cola de Telecontacto, esperando a que algún agente tome la llamada. Se nos muestra la hora de ingreso de la llamada así como el tiempo que lleva esperando la persona.

quemetricsmon3

En este caso la llamada la ha tomado el agente dos, se nos muestran mas datos, como el tiempo de la llamada entrante así como el agente que ha contestado, en el panel se nos muestra de un color distinto al agente dos para indicarnos que se encuentra en llamada en la cola que le ha sido asignada.

quemetricsmon4

Instalando QueueMetrics – 2

Al entrar a la aplicación ejecutaremos el wizard para cargar los datos que con antelación hemos creando en nuestro Asterisk con base en el post anterior.

quemetricswizard1

En esta parte especificamos la forma en que la aplicación importara los parámetros de nuestra configuración existente a partir de los archivos.

quemetricswizard2

Si no existe problema en la importación avanzamos.

quemetricswizard3

Nos muestra los datos importados, el código del agente, su contraseña  y el nombre asociado.

quemetricswizard4

Nos muestra la única cola que tenemos configurada en nuestro Asterisk y a la que están asociados todos nuestros agentes.

quemetricswizard5

Un listado con toda la configuración antes de finalizar la importación.

quemetricswizard6

Hemos finalizado la importación tenemos agregada ahora una cola y nuestros cuatro agentes.

quemetricswizard7

De esta manera tenemos ya la posibilidad de realizar reportes y tener monitoreo en tiempo real a nuestros agentes.

quemetricswizard8

Agentes y Colas en Asterisk, un sencillo ejemplo

Bueno después de la instalación vamos a probar un poquito la situación. Crearemos una cola, cuatro agentes, y unos diez usuarios con sus extensiones para experimentar.

Creamos una cola bastante sencilla con estrategia aleatoria (que mas justicia que la propia suerte), y a los agentes miembros de esta.

gabriel@trantor:~$ sudo vim /etc/asterisk/queues.conf
 
[Telecontacto]
musicclass = default
strategy = random
timeout = 15
retry = 5
wrapuptime = 0
maxlen = 0
announce-frequency = 0
announce-holdtime = no
member => Agent/1001
member => Agent/1002
member => Agent/1003
member => Agent/1004

Respectivamente ponemos a los agentes.

gabriel@trantor:~$ sudo vim /etc/asterisk/agents.conf
 
agent => 1001,4321,Telecontacto Uno
agent => 1002,4321,Telecontacto Dos
agent => 1003,4321,Telecontacto Tres
agent => 1004,4321,Telecontacto Cuatro

Creamos diez usuarios SIP, a partir de una sencilla plantilla.

gabriel@trantor:~$ sudo vim /etc/asterisk/sip.conf
 
[telecontacto](!)
type=friend
host=dynamic
disallow=all
allow=alaw
secret=tele00
qualify=yes
language=es
callgroup=1
pickupgroup=1
 
[8000](telecontacto)
[8011](telecontacto)
[8022](telecontacto)
[8033](telecontacto)
[8044](telecontacto)
[8055](telecontacto)
[8066](telecontacto)
[8077](telecontacto)
[8088](telecontacto)
[8099](telecontacto)

Bueno y ahora algo de dialplan, de manera sencilla tenemos una extensión que al marcarla entrara a la cola, simulando una serie de llamadas entrantes. Marcaremos desde nuestro teléfono o softphone #70 para llamar la aplicación AgentCallbackLogin, la cual nos pide el numero de agente, la contraseña y la extensión a la cual va a estar asociada el agente. Para “desloguear” al agente podemos volver a marcar #70 solo que omitimos poner la extensión. De igual manera un modo mas automático es marcar #71 seguido del numero del agente.

gabriel@trantor:~$ sudo vim /etc/asterisk/extensions.conf
 
exten => 7000,1,Goto(telecontacto,s,1)
 
;Agent Login
exten=> #70,1,AgentCallbackLogin()
exten=> #60,1,AgentLogin(|s)
 
;Agent Logout
exten => _#71XXXX,1,Answer()
exten => _#71XXXX,n,System(asterisk -rx "agent logoff Agent/${EXTEN:3}")
 
;Extensiones principales
exten => _80XX,1,Dial(SIP/${EXTEN})
 
[telecontacto]
exten => s,1,Answer
exten => s,n,Ringing
exten => s,n,SetMusicOnHold(default)
exten => s,n,Queue(Telecontacto)
exten => s,n,Hangup

Registramos a tres agentes, mas un cuarto usuario que llamara y entrara a la cola de llamadas. Vemos aquí la ejecución al registrar un usuario y “loguearse” con su agente.

*CLI>     -- Registered SIP '8011' at 192.9.200.161 port 5065
[Oct  9 22:37:56] NOTICE[22151]: chan_sip.c:13107 handle_response_peerpoke: Peer '8011' is now Reachable. (3ms / 2000ms)
    -- Executing [#70@default:1] AgentCallbackLogin("SIP/8011-b6701a90", "") in new stack
    -- <sip/8011-b6701a90> Playing 'agent-user' (language 'es')
    -- <sip/8011-b6701a90> Playing 'agent-pass' (language 'es')
    -- <sip/8011-b6701a90> Playing 'agent-newlocation' (language 'es')
  == Setting global variable 'AGENTBYCALLERID_8011' to '1001'
    -- <sip/8011-b6701a90> Playing 'agent-loginok' (language 'es')
  == Callback Agent '1001' logged in on 8011
    -- <sip/8011-b6701a90> Playing 'vm-goodbye' (language 'es')
  == Spawn extension (default, #70, 1) exited non-zero on 'SIP/8011-b6701a90'

Después de registrar a los agentes, podemos observar ahora los agentes en linea asociados a su respectiva extensión.

*CLI> agent show online
1001         (Telecontacto Uno) available at '8011' (musiconhold is 'default')
1002         (Telecontacto Dos) available at '8022' (musiconhold is 'default')
1003         (Telecontacto Tres) available at '8033' (musiconhold is 'default')
3 agents online

El cuarto usuario marca para entrar a la cola y esta es la ejecución que sigue. La llamada es asignada al agente 1001, asignado en la extensión 8011.

*CLI>     -- Executing [7000@default:1] Goto("SIP/8000-b6706260", "telecontacto|s|1") in new stack
    -- Goto (telecontacto,s,1)
    -- Executing [s@telecontacto:1] Answer("SIP/8000-b6706260", "") in new stack
    -- Executing [s@telecontacto:2] Ringing("SIP/8000-b6706260", "") in new stack
    -- Executing [s@telecontacto:3] SetMusicOnHold("SIP/8000-b6706260", "default") in new stack
    -- Executing [s@telecontacto:4] Queue("SIP/8000-b6706260", "Telecontacto") in new stack
    -- Started music on hold, class 'default', on SIP/8000-b6706260
    -- outgoing agentcall, to agent '1001', on 'Local/8011@default-b805,1'
    -- Executing [8011@default:1] Dial("Local/8011@default-b805,2", "SIP/8011") in new stack
    -- Called 8011
    -- SIP/8011-09bc1e48 is ringing
    -- Agent/1001 is ringing
    -- SIP/8011-09bc1e48 answered Local/8011@default-b805,2
    -- Agent/1001 answered SIP/8000-b6706260
    -- Stopped music on hold on SIP/8000-b6706260
  == Spawn extension (default, 8011, 1) exited non-zero on 'Local/8011@default-b805,2'
  == Spawn extension (telecontacto, s, 4) exited non-zero on 'SIP/8000-b6706260'

Vemos a los agentes cuando uno de ellos esta trabajando.

*CLI> agent show online
1001         (Telecontacto Uno) available at '8011' (musiconhold is 'default')
1002         (Telecontacto Dos) logged in on SIP/8022-09bc1e48 talking to SIP/8000-b6706260 (musiconhold is 'default')
1003         (Telecontacto Tres) available at '8033' (musiconhold is 'default')
3 agents online

Ya que tenemos la base vamos a ver como nos va con las estadísticas en la aplicación Queuemetrics, por el momento es todo.

Instalando QueueMetrics – 1

Vamos a instalar una famosa aplicación para manejar las estadísticas de un call center trabajando con Asterisk.
Necesitamos un contenedor de servlets (Tomcat), y todo lo que conlleva. Necesitamos el kit de desarrollo y el entorno de ejecución de Java.

Nos dirigimos a la zona de descargas de SUN, para descargar tanto el JDK como el JRE. Descargamos los archivos mencionados.
http://java.sun.com/javase/downloads/index.jsp

Java SE Development Kit (JDK)
JDK 6 Update 16

jdk-6u16-linux-i586.bin

Java SE Runtime Environment (JRE)
JRE 6 Update 16

jre-6u16-linux-i586.bin

Creamos un directorio llamado java dentro de usr, y copiamos los archivos descargados a esta ubicación.

trantor:/home/gabriel/Descargas# mkdir /usr/java
gabriel@trantor:~/Descargas$ ls *.bin
jdk-6u16-linux-i586.bin jre-6u16-linux-i586.bin
gabriel@trantor:~/Descargas$ sudo cp *.bin /usr/java/

Entramos al directorio y damos permisos de ejecución a los archivos para instalarlos.

gabriel@trantor:~$ cd /usr/java/
gabriel@trantor:/usr/java$ sudo chmod +x jdk-6u16-linux-i586.bin jre-6u16-linux-i586.bin
gabriel@trantor:/usr/java$ sudo ./jdk-6u16-linux-i586.bin
gabriel@trantor:/usr/java$ sudo ./jre-6u16-linux-i586.bin

Con la instalación obtenemos los directorios correspondientes a cada entorno de ejecución.
gabriel@trantor:/usr/java$ ls
jdk1.6.0_16 jdk-6u16-linux-i586.bin jre1.6.0_16 jre-6u16-linux-i586.bin

Descargamos la ultima versión de Tomcat desde la siguiente dirección.

http://mirror.candidhosting.com/pub/apache/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz

Ingresamos al directorio donde instalaremos a Tomcat, y lo descomprimimos en este caso hago referencia a la carpeta donde realizo las descargas de archivos.

gabriel@trantor:~$ cd /usr/local/
gabriel@trantor:/usr/local$ sudo tar xvfz /home/gabriel/Descargas/apache-tomcat-6.0.20.tar.gz

Creamos un enlace simbólico hacia el directorio recién descomprimido, de tal manera que nos quede la referencia como /usr/local/tomcat.

gabriel@trantor:/usr/local$ sudo ln -s apache-tomcat-6.0.20 tomcat
gabriel@trantor:/usr/local$ ls -l
lrwxrwxrwx 1 root staff 20 oct 7 14:17 tomcat -> apache-tomcat-6.0.20

Necesitamos declarar las siguientes tres variables de entorno para el propósito de la instalación.

export CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME=/usr/java/jdk1.6.0_16/
export JRE_HOME=/usr/java/jre1.6.0_16/

Colocamos las anteriores lineas al final de los siguientes dos archivos.

trantor:~# vim /etc/bash.bashrc
trantor:~# vim /etc/profile

Creamos otro enlace simbólico para el ejecutable de tomcat.
trantor:~# ln -s /usr/local/tomcat/bin/catalina.sh /etc/init.d/tomcat

Iniciamos tomcat.
trantor:/home/gabriel# /etc/init.d/tomcat start

Verificamos en nuestro navegador y debemos ver al simpático felino símbolo de tomcat.

http://localhost:8080/

tomcat1

Detenemos de momento el servicio.
trantor:/home/gabriel# /etc/init.d/tomcat stop

Descargamos la ultima versión de QueueMetrics.

http://queuemetrics.com/download/QueueMetrics-1.5.4-trial.tar.gz

Ingresamos al directorio de las aplicaciones y descomprimimos desde el directorio donde descargamos QueueMetrics, y cambiamos el nombre del directorio.

$ cd /usr/local/tomcat/webapps/
$ sudo tar xvfz /home/gabriel/Descargas/QueueMetrics-1.5.4-trial.tar.gz
$ sudo mv queuemetrics-1.5.4 queuemetrics

En este momento podemos probar si la aplicación se refleja en nuestro navegador web, obteniendo una imagen como la siguiente, ya que aun no creamos ni la base de datos ni el conector propio para esta.

http://localhost:8080/queuemetrics/

tomcatqueuemetrics1

Ingresamos a nuestro motor de base de datos para crear la base misma así como el usuario asociado a esta.

$ mysql -u root -p
mysql> CREATE DATABASE queuemetrics;
mysql> GRANT ALL PRIVILEGES ON queuemetrics.* TO ‘queuemetrics’@’localhost’ IDENTIFIED BY ‘javadude’;
mysql> quit

Instalamos las tablas correspondientes a nuestra base de datos a partir del script de ejemplo.

$ cd /usr/local/tomcat/webapps/queuemetrics/WEB-INF/README/
$ mysql –user=queuemetrics –password=javadude queuemetrics < queuemetrics_sample.sql

Necesitamos la aplicación que haga posible la conexión entre MySQL y Java, por lo cual descargamos el conector para nuestra aplicación de la siguiente manera.

$ cd /usr/local/tomcat/webapps/queuemetrics/WEB-INF/lib/
$ sudo wget http://mirrors.uol.com.br/pub/mysql/Downloads/Connector-J/mysql-connector-java-5.0.5.tar.gz
$ sudo tar -xvzf mysql-connector-java-5.0.0.tar.gz
$ sudo cp mysql-connector-java-5.0.5/mysql-connector-java-5.0.5-bin.jar .
$ sudo rm mysql-connector-java-5.0.5.tar.gz

Iniciamos tomcat de nuevo.
trantor:/home/gabriel# /etc/init.d/tomcat start

Ingresamos a la pagina para iniciar la instalación final.

http://localhost:8080/queuemetrics/

tomcatqueuemetrics2

tomcatqueuemetrics3

El usuario por defecto es demoadmin con la contraseña demo.

tomcatqueuemetrics4

Aquí tenemos el panel de control de la aplicación.

tomcatqueuemetrics5

Por el momento es todo.

Miniconexión entre Kamailio y Asterisk

Tomando como base el post anterior vamos a realizar un pequeño enlace para que nuestros usuarios en Kamailio puedan marcar a una extensión de nuestro Asterisk, ya sea un usuario en especifico o tomar el numero de una troncal.

Antes que nada debemos cambiar el puerto por el que escucha Asterisk (archivo sip.conf), ya que Kamailio ya se encuentra usándolo.

bindport=5070 ; UDP Port to bind to (SIP standard port is 5060)

También ponemos en no, las llamadas invitadas.

allowguest=no ; Allow or reject guest calls (default is yes)

Tenemos creados mediante una plantilla los siguientes usuarios en nuestro Asterisk, del 5001 al 5005.

[linphone](!)
type=friend
host=dynamic
disallow=all
allow=alaw
allow=gsm
secret=a1234
qualify=yes
language=es
callgroup=1
pickupgroup=1

[5001](linphone)
[5002](linphone)
[5003](linphone)
[5004](linphone)
[5005](linphone)

Y por ultimo creamos lo siguiente para permitir llamadas sin autenticación de la IP indicada en el host.

[kamailio]
type=friend
context=default
insecure=port,invite
host=192.9.215.24

En nuestro dialplan colocamos una linea sencilla como esta:

exten => _500X,1,Dial(SIP/${EXTEN})

Ahora lo que necesitamos es agregar unas cuantas lineas a nuestro archivo de configuración kamailio.cfg.
La siguiente condición la colocamos después de la sentencia consume_credentials(); en route[3].

if(uri=~”^sip:[5][0-9]{3}@.*”) {
route(4);
}

Y al final del archivo colocamos una nueva ruta, la cual redirigirá las peticiones a la IP y puerto donde esta escuchando Asterisk.

route[4]
{
rewritehostport(“192.9.215.24:5070”);
t_relay();
exit;
}

De esta manera al marcar un cinco seguido de tres números Kamailio lo desviara hacia Asterisk, y ya el se encargara de llevarla a su destino de acuerdo a su dialplan establecido.

Instalando Kamailio

En Kamailio tenemos un gran software, es un SIP proxy, sin embargo es mas complejo de configurar que Asterisk por ejemplo (cabe destacar que tienen diferencias importantes).
A continuación presentaremos de manera rápida como instalar Kamailio 1.5.2 con autenticación MySQL para nuestros usuarios, crear un archivo de configuración base y un pequeño trozo de código para comunicarse con nuestro Asterisk.

Antes que nada necesitamos los siguientes paquetes y dependencias:

aptitude install build-essential gcc bison flex make openssl libmysqlclient15-dev libradiusclient-ng2
libradiusclient-ng-dev mysql-server

Descargamos, descomprimimos y entramos a la ultima versión que en este caso es la 1.5.2.

wget http://www.kamailio.org/pub/kamailio/1.5.2/src/kamailio-1.5.2-notls_src.tar.gz
tar xfz kamailio-1.5.2-notls_src.tar.gz
cd kamailio-1.5.2-notls_src

Necesitamos realizar una modificación en nuestro archivo Makefile para habilitar el modulo de MySQL, en concreto debemos eliminar una parte de la linea 57 (db_mysql).

# if not set on the cmd. line or the env, exclude this modules:
exclude_modules?= jabber cpl-c db_postgres osp db_unixodbc 
        db_oracle xmpp mi_xmlrpc perl snmpstats perlvdb ldap 
        carrierroute h350 db_berkeley seas utils purple
 
ifeq ($(MODS_MYSQL),)
        exclude_modules+= db_mysql
endif

Quedando de la siguiente manera:

ifeq ($(MODS_MYSQL),)
        exclude_modules+=
endif

Con esto hacemos la indicación de que no queremos que se excluya el modulo de MySQL a la hora de compilar e instalar.

Compilamos todo e instalamos.

make all
make install

La instalación se ira (a menos que indiquemos lo contrario) al directorio “/usr/local/”.

Ahora modificaremos los parámetros para instalar la base de datos para kamailio, se da por entendido que contamos con servidor MySQL ya configurado, y que solo necesitas la contraseña de root.

Editamos el archivo kamctlrc que se encuentra en el directorio “/usr/local/etc/kamailio”, necesitamos ajustar las lineas que se encuentran descomentadas, como el dominio, el tipo de base de datos a usar (en nuestro caso MySQL), y los nombres y contraseñas de los usuarios. De manera predeterminada el archivo viene comentado y la base de datos y los usuarios vienen con openSER, aunque lo podemos ajustar a nuestras preferencias. En mi caso la primera parte del archivo esta de la siguiente manera.

## your SIP domain
 SIP_DOMAIN=localhost
 
## chrooted directory
# $CHROOT_DIR="/path/to/chrooted/directory"
 
## database type: MYSQL, PGSQL, ORACLE, DB_BERKELEY, or DBTEXT, by default none is loaded
# If you want to setup a database with kamdbctl, you must at least specify
# this parameter.
 DBENGINE=MYSQL
 
## database host
 DBHOST=localhost
 
## database name (for ORACLE this is TNS name)
 DBNAME=kamailio
 
# database path used by dbtext or db_berkeley
# DB_PATH="/usr/local/etc/kamailio/dbtext"
 
## database read/write user
 DBRWUSER=kamailio
 
## password for database read/write user
 DBRWPW="kamailiorw"
 
## database read only user
 DBROUSER=kamailioro
 
## password for database read only user
 DBROPW=kamailioro
 
## database super user (for ORACLE this is 'scheme-creator' user)
 DBROOTUSER="root"
 
# user name column
# USERCOL="username"

Crearemos la base de datos y sus tablas con el script kamdbctl que se encuentra en la carpeta scripts de nuestra carpeta principal de instalación.

gabriel@trantor:~/kamailio-1.5.2-notls/scripts$ ./kamdbctl create kamailio
MySQL password for root:
INFO: test server charset
INFO: creating database kamailio ...
INFO: Core Kamailio tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into kamailio ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute userblacklist htable purple? (y/n): y
INFO: creating extra tables into kamailio ...
INFO: Extra tables succesfully created.

Hasta ahora la instalación esta finalizada, por lo que el siguiente paso es configurar el archivo principal de configuración de Kamailio, “kamailio.cfg” que se encuentra en el directorio “/usr/local/etc/kamailio”. De echo ya existe tal archivo uno de ejemplo que es perfectamente funcional para iniciar el servicio. Sin embargo pondremos lo siguiente:

####### Global Parameters #########
debug=4
log_stderror=yes
fork=yes
children=4
port=5060
listen=udp:192.9.215.24:5060
 
####### Modules Section ########
#set module path
mpath="/usr/local/lib/kamailio/modules/"
 
loadmodule "db_mysql.so"
loadmodule "mi_fifo.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "uri_db.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "acc.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
 
# ----------------- setting module-specific parameters ---------------
 
# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
 
# ----- rr params -----
modparam("rr", "enable_full_lr", 1)
 
# ----- uri_db params -----
/* by default we disable the DB support in the module as we do not need it in this configuration */
 
modparam("auth_db|uri_db|usrloc", "db_url", "mysql://kamailio:kamailiorw@localhost/kamailio")
 
# ----- usrloc params -----
/* uncomment the following lines if you want to enable DB persistency for location entries */
modparam("usrloc", "db_mode",   2)
 
# ----- auth_db params -----
/* uncomment the following lines if you want to enable the DB based authentication */
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")
 
####### Routing Logic ########
 
# main request routing logic
 
route{
 
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}
 
	if (msg:len > max_len) {
  		sl_send_reply("513", "Message Overflow");
  		exit;
	}
# -----------------------------------------------------------------
# Record Route Section
# -----------------------------------------------------------------
	if (method!="REGISTER") {
		record_route();
	};
# -----------------------------------------------------------------
# Loose Route Section
# -----------------------------------------------------------------
	if (loose_route()) {
		route(1);
		exit;
	};
# -----------------------------------------------------------------
# Call Type Processing Section
# -----------------------------------------------------------------
	if (uri!=myself) {
		route(1);
		exit;
	};
 
	if (method=="ACK") {
		route(1);
		exit;
  	};
 
	if (method=="INVITE") {
		route(3);
		exit;
	} else if (method=="REGISTER") {
		route(2);
		exit;
  	};
 
	lookup("aliases");
 
	if (uri!=myself) {
		route(1);
		exit;
	};
 
	if (!lookup("location")) {
		sl_send_reply("404", "User Not Found");
		exit;
	};
 
	route(1);
}
 
route[1] {
# -----------------------------------------------------------------
# Default Message Handler
# -----------------------------------------------------------------
	if (!t_relay()) {
		sl_reply_error();
	};
}
 
route[2] {
# -----------------------------------------------------------------
# REGISTER Message Handler
# ----------------------------------------------------------------
	sl_send_reply("100", "Trying");
	if (!www_authorize("","subscriber")) {
		www_challenge("","0");
		exit;
	};
 
	if (!check_to()) {
		sl_send_reply("401", "Unauthorized");
		exit;
	};
 
	consume_credentials();
	if (!save("location")) {
		sl_reply_error();
	};
}
 
route[3] {
# -----------------------------------------------------------------
# INVITE Message Handler
# -----------------------------------------------------------------
 
	if (!proxy_authorize("","subscriber")) {
		proxy_challenge("","0");
		exit;
	} else if (!check_from()) {
		sl_send_reply("403", "Use From=ID");
		exit;
  	};
 
	consume_credentials();
	lookup("aliases");
 
	if (uri!=myself) {
		route(1);
		exit;
	};
 
	if (!lookup("location")) {
		sl_send_reply("404", "User Not Found");
		exit;
	};
 
	route(1);
}

Iniciaremos Kamailio en segundo plano, esto se cambia mediante la opción fork=yes|no, y donde dice la IP sustitúyela por una valida para tu uso. Iniciamos Kamailio.

gabriel@trantor:~$ sudo kamctl start
 
INFO: Starting Kamailio :
INFO: started (pid: 15627)

Agregamos un par de usuarios.

gabriel@trantor:~$ sudo kamctl add 1000 1234
new user '1000' added
gabriel@trantor:~$ sudo kamctl add 1001 1234
new user '1001' added

Registramos estos usuarios con un par de softphones (Twinkle y Linphone) para autenticarnos en el sistema y realizar una llamada de prueba.

kamailiotw1

Softphone Twinkle

kamailiotw4

Softphone Linphonec

kamailiotw3

Usuario 1000 llamando a 1001