Asterisk tesis.pdf

530
Departamento de Lenguajes y Sistemas Informáticos Lengoaia eta Sistema Informatikoak Saila Estudio y Montaje a medida de Centralita Telefónica VoIP Asterisk Autor: David Escañuela Alonso Directores: Pablo González Nalda y Mikel García Cantabrana (Yet Informática S.L.) Proyecto Fin de Carrera, Enero 2010

Transcript of Asterisk tesis.pdf

Departamento de Lenguajes y

Sistemas Informáticos

Lengoaia eta Sistema

Informatikoak Saila

Estudio y Montaje a medida de Centralita Telefónica VoIP Asterisk

Autor: David Escañuela Alonso Directores: Pablo González Nalda y Mikel García Cantabrana (Yet Informática S.L.)

Proyecto Fin de Carrera, Enero 2010

i

Gracias a mi familia que me ha estado apollando continuamente y que ha aguantado

mi constante mal humor.

Gracias a mis amigos por preocuparse cada poco por el avance del proyecto.

Gracias a mis dos directores de proyecto, por una parte a Pablo por prestarme su

atención y ayuda cuando lo he requerido y por otra parte a Mikel y a la empresa Yet

Informática S.L. y es que he aprendido a valerme por mi mismo, ha sido una

experiencia muy positiva.

Gracias también al foro Asterisk-ES, donde escriben los autenticos cracks de este

mundo en España, los cuales contestan a todas tus dudas desde la más básica a la más

técnica.Y más personalmente gracias a Nicolás Gudiño por atenderme en todo

momento y a Jean Chassoul , Ivan López y Angel Elena por la ayuda efectuada.

Agradecimientos

ii

Resumen

En este trabajo, por una parte, se realiza un estudio sobre las centralitas telefónicas Asterisk, así como, su ventaja frente a cualquier centralita por su flexibilidad, potencia y protección de la inversión. Mientras que por otra parte, se trata la implantación de estas centralitas en empresa con el diseño, montaje y configuración a medida para la empresa Yet Informática S.L.

Resumen y Organización del Proyecto

iii

Organización La documentación del proyecto se divide en dos partes no establecidas. Una primera parte la forman los antecedentes, en los que se da información sobre la empresa en la que se sitúa el proyecto, así como, la necesidad de realización de dicho proyecto, los objetivos, a partir de los que se decide qué problema se quiere solucionar y cómo hacerlo y la viabilidad del proyecto, que refleja las panificaciones inicial y real del proyecto y el presupuesto del mismo. La segunda parte está constituida por la memoria del proyecto, la bibliografía, los anexos, el glosario, la conclusión y líneas futuras. La memoria del proyecto está dividida en 4 capítulos:

� Introducción a la VoIP: Conceptos básicos de la telefonía y la VoIP. � Asterisk, el futuro de la telefonía: Adentramiento en el mundo Asterisk. � Prácticas realizadas: Pruebas hechas durante las prácticas. � Centralita Asterisk para Yet Informática S.L.: Diseño, montaje, configuración e

implantación de centralita Asterisk.

Como ayuda se incluye un glosario en el que se aclaran los significados de las siglas. Los anexos permitirán conocer más sobre algunos temas específicos, así como, disponer de algunos manuales de instalación. Por último, se comparten los resultados generales que resuelven los objetivos, se elaboran las conclusiones y se plantea el trabajo futuro.

iv

AGRADECIMIENTOS ................................................................................................... I

RESUMEN Y ORGANIZACIÓN DEL PROYECTO ............................................................. II

RESUMEN ...................................................................................................................................... II

ORGANIZACIÓN ............................................................................................................................. III

ÍNDICE DE CONTENIDOS .......................................................................................... IV

ÍNDICE DE FIGURAS ................................................................................................ XII

PLANIFICACIÓN DEL PROYECTO ........................................................................................................ XII

CAPITULO 1 ................................................................................................................................ XIV

CAPITULO 2 ................................................................................................................................. XV

CAPITULO 3 ................................................................................................................................ XVI

CAPITULO 4 ................................................................................................................................ XVI

ANEXOS ...................................................................................................................................... XX

Índice de Contenidos

v

ÍNDICE DE TABLAS ................................................................................................ XXII

PLANIFICACIÓN DEL PROYECTO ...................................................................................................... XXII

CAPITULO 1 ............................................................................................................................... XXII

CAPITULO 2 ............................................................................................................................... XXII

CAPITULO 3 .............................................................................................................................. XXIII

CAPITULO 4 .............................................................................................................................. XXIII

ANEXOS ................................................................................................................................... XXIII

ANTECEDENTES ........................................................................................................ 1

EMPRESA EN LA QUE SE SITÚA EL PROYECTO ....................................................................................... 1

CÓMO SURGE LA NECESIDAD DEL PROYECTO A REALIZAR ....................................................................... 2

PLANIFICACIÓN DEL PROYECTO ................................................................................ 3

OBJETIVOS DEL PROYECTO ............................................................................................................... 3

VIABILIDAD DEL PROYECTO .............................................................................................................. 4

Planificación Inicial Temporal ................................................................................................ 4

Planificación Real Temporal .................................................................................................. 4

Desvio Temporal.................................................................................................................... 6

Planificación real del proyecto y herramientas a utilizar en su elaboración ........................ 6

Estructura de Descomposición del Trabajo ....................................................................... 6

Fases, Tareas y Entregables ............................................................................................... 9

Recursos Humanos y Materiales Amortizables ................................................................... 26

Agenda del proyecto ........................................................................................................... 29

Agenda de recursos: ........................................................................................................ 29

Diagrama de GANTT: ....................................................................................................... 48

Estimación de Costes del Proyecto: .................................................................................... 51

Recursos Humanos ó de Trabajo: .................................................................................... 51

Recursos Materiales Amortizables: ............................................................................... 51

Presupuesto .................................................................................................................... 54

INTRODUCCIÓN A VOIP .......................................................................................... 56

¿ QUÉ ES VOIP (VOICE OVER INTERNET PROTOCOL)? ........................................................................ 56

¿POR QUÉ DEBERÍAMOS PASARNOS A VOIP Y NO SEGUIR USANDO SERVICIOS GRATUITOS COMO SKYPE? .... 57

HISTORIA DE VOIP ....................................................................................................................... 58

CARACTERÍSTICAS PRINCIPALES ...................................................................................................... 59

VENTAJAS DE VOIP ...................................................................................................................... 59

Funcionales .......................................................................................................................... 59

De Gestión ........................................................................................................................... 59

Económicas .......................................................................................................................... 60

PROBLEMAS ................................................................................................................................ 60

ELEMENTOS FUNDAMENTALES DE UNA RED VOIP .............................................................................. 60

¿CÓMO SE TRANSMITE VOIP POR LA RED? ....................................................................................... 61

CONCEPTOS PRINCIPALES DE VOIP .................................................................................................. 62

PBX ...................................................................................................................................... 62

ASTERISK (PBX avanzada) .................................................................................................... 63

PSTN-RTB ............................................................................................................................. 63

Señalización en telefonía tradicional .................................................................................. 63

Señalización analógica ..................................................................................................... 63

Señalización digital .......................................................................................................... 65

vi

Señalización entre centrales telefónicas ......................................................................... 66

Señalización en telefonía IP................................................................................................. 66

Protocolo H.323 .............................................................................................................. 66

Protocolo MGCP (Media Gateway Control Protocol)...................................................... 67

Protocolo SIP (Session Initiation Protocol) ...................................................................... 68

Servidores Proxy SIP ........................................................................................................ 70

Protocolos en tiempo real y el NAT ................................................................................. 72

SIP vs NAT ........................................................................................................................ 72

Protocolo IAX (Inter-Asterisk Exchange) ......................................................................... 73

EQUIPAMIENTO PARA VOIP............................................................................................................ 75

Teléfonos IP ......................................................................................................................... 75

SoftPhones (Telefonía con Software) .................................................................................. 78

X-Lite................................................................................................................................ 79

Zoiper .............................................................................................................................. 80

Ekiga ................................................................................................................................ 80

Otros SoftPhones ............................................................................................................ 81

Adaptadores IP .................................................................................................................... 82

Gateways VoIP ..................................................................................................................... 83

PARÁMETROS DE VOIP ................................................................................................................. 84

Calidad de Servicio .............................................................................................................. 84

Codecs ................................................................................................................................. 84

Latencia ............................................................................................................................... 85

Jitter (Fluctuaciones de velocidad) ...................................................................................... 85

RETOS AL IMPLEMENTAR VOIP ....................................................................................................... 86

RECOMENDACIONES ..................................................................................................................... 86

ASTERISK, EL FUTURO DE LA TELEFONÍA ................................................................. 87

¿QUÉ ES ASTERISK? ..................................................................................................................... 87

¿QUÉ NO ES ASTERISK? ............................................................................................................... 89

¿CUÁL ES EL PAPEL DE DIGIUM? ..................................................................................................... 89

¿CUÁNDO USAR ASTERISK? ........................................................................................................... 90

¿POR QUÉ ASTERISK? ................................................................................................................... 90

VENTAJAS COMPETITIVAS .............................................................................................................. 92

DESVENTAJAS DE LAS CENTRALITAS ASTERISK .................................................................................... 92

HISTORIA DE ASTERISK .................................................................................................................. 93

ESTRUCTURA DE DIRECTORIOS DE ASTERISK: ................................................................................... 103

FUNCIONALIDAD DE ASTERISK ...................................................................................................... 103

Funciones básicas .............................................................................................................. 103

Funciones de llamada ........................................................................................................ 103

Funciones avanzadas ......................................................................................................... 105

Modificación de funciones ................................................................................................ 106

Funcionalidad en servidores SIP ........................................................................................ 106

ARQUITECTURA DE ASTERISK ....................................................................................................... 107

Esquema ............................................................................................................................ 107

Partes de Asterisk ............................................................................................................. 107

Arquitectura de Asterisk ................................................................................................... 108

Descripción de las APIs .................................................................................................. 108

CONCEPTO DE CANAL ................................................................................................................. 109

DIALPLAN DE ASTERISK ............................................................................................................... 110

vii

La Sintaxis del Dialplan ...................................................................................................... 110

Contextos ...................................................................................................................... 110

Extensiones ................................................................................................................... 112

Prioridades .................................................................................................................... 113

Aplicaciones ................................................................................................................... 114

Uso de variables ................................................................................................................ 115

Tipos de variables ......................................................................................................... 115

Coincidencia de patrones .................................................................................................. 116

Sintaxis .......................................................................................................................... 116

Usando la variable de canal $ (EXTEN) .......................................................................... 117

Manipulación de expresiones y operadores ..................................................................... 118

Expresiones básicas ....................................................................................................... 118

Operadores .................................................................................................................... 118

Funciones del Dialplan ...................................................................................................... 119

Configuración para canales de VoIP: SIP e IAX2 ................................................................ 119

Buzones de voz (Voicemail) ............................................................................................... 121

Creación de mailbox ...................................................................................................... 121

Añadir el voicemail al Dialplan ...................................................................................... 122

Acceso al voicemail ....................................................................................................... 122

Marcación por nombre de directorio ............................................................................ 122

Audio en Asterisk .............................................................................................................. 123

Reproducción ................................................................................................................ 123

Música en Espera .......................................................................................................... 123

Aplicación Festival ......................................................................................................... 123

Codecs y carga de CPU .................................................................................................. 125

Grabación ...................................................................................................................... 127

Macros ............................................................................................................................... 128

Definición de macros ..................................................................................................... 129

Llamadas a macros ........................................................................................................ 129

Utilización de argumentos en macros ......................................................................... 129

Uso de la base de datos de Asterisk (AstDB) ..................................................................... 130

Almacenamiento de datos en AstDB ............................................................................. 130

Recuperación de datos de AstDB .................................................................................. 130

Borrado de datos de AstDB ........................................................................................... 131

Transferencias de llamadas ............................................................................................... 131

CallParking ......................................................................................................................... 131

CallPickup .......................................................................................................................... 133

Manejo de Colas ................................................................................................................ 134

Registro de llamadas(CDR) ................................................................................................ 137

Sala de conferencias .......................................................................................................... 138

IVR (Interactive Voice Response) ...................................................................................... 139

Discado automático (Auto-dial out) .................................................................................. 142

Sistema de logs .................................................................................................................. 143

ENUM y Asterisk ................................................................................................................ 144

DUNDI ................................................................................................................................ 146

Aspectos avanzados de Asterisk: ...................................................................................... 150

¿Qué es AGI? ................................................................................................................. 150

¿Qué es AMI? ................................................................................................................ 151

¿Qué es AJAM? .............................................................................................................. 152

viii

¿Qué es AEL2? ............................................................................................................... 153

¿Qué es ARA? ................................................................................................................ 154

ADMINISTRACIÓN DE ASTERISK .................................................................................................... 155

Interfaces web para Asterisk: ............................................................................................ 155

Asterisk GUI: .................................................................................................................. 155

FreePBX: ........................................................................................................................ 156

Línea de comandos de Asterisk: CLI .................................................................................. 161

VERSIONES ENTERPRISE DE ASTERISK: ........................................................................................... 164

Asterisk Appliance ............................................................................................................. 164

Asterisk Business Edition ™ ............................................................................................... 165

DISTRIBUCIONES LINUX CON ASTERISK:.......................................................................................... 168

AsteriskNOW ..................................................................................................................... 169

TrixBox ............................................................................................................................... 171

Elastix ................................................................................................................................ 176

CASOS DE USO DE UNA CENTRALITA ASTERISK: ............................................................................... 180

Centralita nueva con conexiones y extensiones de varios tipos. ...................................... 181

Pasarela para dotar a una centralita tradicional de servicios nuevos............................... 181

Pasarela para dotar a una centralita tradicional de nuevas extensiones. ........................ 182

Varias Oficinas con un Asterisk Centralizado. ................................................................... 182

Varias Oficinas con Sistemas Asterisk interconectados. ................................................... 183

AMPLIACIÓN DEL SISTEMA DE TELEFONÍA DE UNA EMPRESA............................................................... 184

SOLUCIONES DE ASTERISK PARA SISTEMAS DE TELEFONÍA ENTRE SEDES REMOTAS .................................. 185

Sistema Centralizado ......................................................................................................... 185

Sistema Distribuido ........................................................................................................... 186

LA REVOLUCIÓN ASTERISK ........................................................................................................... 186

EJEMPLOS DE USO DE ASTERISK: ................................................................................................... 187

Ejemplo 1: Centros médicos – Llamada recordatoria ....................................................... 187

Ejemplo 2: Centros de telemarketing – Integración con sistemas CRM ........................... 188

Ejemplo 3: Agencias de viajes (Self service) ...................................................................... 188

LA COMPLEJIDAD ASTERISK .......................................................................................................... 188

¿Y EL FUTURO? ......................................................................................................................... 189

CONCLUSIONES ......................................................................................................................... 189

PRUEBAS REALIZADAS ............................................................................................. 190

INICIACIÓN EN LINUX .................................................................................................................. 190

KUBUNTU & ASTERISK ................................................................................................................ 192

ELECCIÓN DEL SERVIDOR ADECUADO PARA ASTERISK ........................................................................ 193

¿Qué hay que tener en cuenta en la elección del servidor Asterisk? ............................... 193

¿Cuál es la mejor distribución para instalar Asterisk? ...................................................... 193

PUESTA A PUNTO DEL SERVIDOR ANTES DE LA INSTALACIÓN DE ASTERISK: ............................................ 194

Servidor HTTP Apache ....................................................................................................... 194

Servidor DHCP (DHCPD) .................................................................................................... 194

Servidor TFTP (TFTPD) ...................................................................................................... 197

Servidor MySQL (MySQLD) ................................................................................................ 198

phpMyAdmin ..................................................................................................................... 198

Servidor SNMP (SNMPD) ................................................................................................... 199

Acceso al Servidor: PUTTY ................................................................................................. 201

Acceso al Servidor: WinSCP .............................................................................................. 202

INSTALACIÓN DE ASTERISK: .......................................................................................................... 203

ix

Asterisk 1.4.xx (de 1.4.0 a 1.4.21) ..................................................................................... 203

Asterisk 1.4xx (de 1.4.22 a 1.4.27) y 1.6.x ......................................................................... 206

ELECCIÓN DE LA VERSION ASTERISK: .............................................................................................. 208

Diferencia entre los Asterisk 1.4 (hasta 1.4.21) y los Asterisk 1.4.22 (y superiores) y 1.6 en

telefonía analógica: De Zaptel a DAHDI ............................................................................ 208

Configuración DAHDI ......................................................................................................... 209

Pruebas de llamada al canal DAHDI en Asterisk 1.4.26.1 ................................................. 213

Pruebas básicas realizadas en Asterisk 1.4.21 .................................................................. 214

Pruebas SoftPhones ...................................................................................................... 214

Pruebas teléfonos IP (SipuraSPA) .................................................................................. 218

Pruebas de funcionamiento de buzones de voz ........................................................... 220

Pruebas utilización de las aplicaciones Goto() y GotoIf() y de variables de canal ........ 222

Pruebas de funcionamiento colas y registro de miembros........................................... 225

OTRAS PRUEBAS: ....................................................................................................................... 229

Pruebas de uso de conferencias en Asterisk 1.4.26.2: ...................................................... 229

Pruebas Proveedor VoIP: Gizmo5 ..................................................................................... 234

Pruebas Trunk IAX entre dos servidores Asterisk ............................................................. 236

¿Qué es un Trunk?......................................................................................................... 236

Trunk IAX Local entre dos servidores Asterisk .............................................................. 236

Trunk IAX entre dos servidores Asterisk ....................................................................... 239

Pruebas extensión remota ............................................................................................ 239

Prueba con Adaptador Telefónico Analógico SPA 3000 .................................................... 241

CENTRALITA ASTERISK PARA YET INFORMÁTICA Y PRUEBAS REALIZADAS....................... 245

DESCRIPCIÓN DE LA CENTRALITA NUEVA: ASTERISK .......................................................................... 245

Esquema Conceptual del Demo realizado antes de la implantación ................................ 246

Explicación del Plan de llamadas de la Centralita (Dialplan) ............................................. 247

Llamadas entrantes ....................................................................................................... 247

Accesos Directos a usuarios de la Empresa ................................................................... 252

Gestión de Buzones de Voz ........................................................................................... 253

Gestión de las Colas de la aplicación ............................................................................. 253

Funcionamiento de la Funcionalidad CallBack .............................................................. 255

Uso de Conferencias en la aplicación ............................................................................ 256

Última llamada recibida ................................................................................................ 256

Última llamada realizada ............................................................................................... 257

Funcionamiento de la Funcionalidad DISA .................................................................... 258

Funcionamiento del desvío de las llamadas de usuarios internos a otro teléfono ...... 259

Pruebas generales ............................................................................................................. 260

Prueba 1) Llama a la centralita en un horario no laborable un usuario VIP. ................ 260

Prueba 2) Llama a la centralita en un horario no laborable un usuario no VIP. ........... 262

Prueba 3) Llama a la centralita en un horario laboral un usuario VIP. ........................ 263

Prueba 4) Llama a la centralita en un horario laboral un usuario no VIP. ................... 266

Prueba 5) Comportamiento en el menú ....................................................................... 268

Configuración de ficheros más utilizados.......................................................................... 269

Tabla de descripción de ficheros de configuración ....................................................... 269

Fichero de configuración: EXTENSIONS.CONF, SIP.CONF, IAX.CONF ............................ 270

Fichero de configuración: FEATURES.CONF .................................................................. 270

Fichero de configuración: MANAGER.CONF ................................................................. 271

Fichero de configuración: MEETME.CONF .................................................................... 271

x

Fichero de configuración: QUEUES.CONF ..................................................................... 271

Fichero de configuración: VOICEMAIL.CONF ................................................................ 272

Bases de datos empleadas ................................................................................................ 273

Tabla de descripción de las bases de datos utilizadas .................................................. 273

Conocimiento de las tablas de cada base de datos mostrando parte de su contenido 274

Explicación teórica y práctica de funcionalidades extra: .................................................. 280

Agenda de Contactos: YetBook ..................................................................................... 280

Integración con Google Calendar .................................................................................. 297

Chan_Sebi ...................................................................................................................... 303

Flash Operator Panel 2 (FOP 2) ..................................................................................... 309

Asternic Call Center Stats .............................................................................................. 331

Asternic CDR Reports .................................................................................................... 340

Verbio ............................................................................................................................ 348

Skype ............................................................................................................................. 372

Skype para Asterisk (SfA) ............................................................................................... 373

Nagios ............................................................................................................................ 385

Actualización de firmware del Teléfono Cisco 7941 de SCCP a SIP ................................... 393

Actualización de firmware del Teléfono Cisco 7905 de SCCP a SIP ................................... 398

DESCRIPCIÓN BREVE DE LA CENTRALITA ACTUAL: CISCO Y MEJORAS REALIZADAS EN LA NUEVA. ................ 401

Esquema Conceptual de la centralita actual: Cisco ........................................................... 401

Mejoras de la nueva centralita Asterisk ............................................................................ 402

Agenda de clientes ........................................................................................................ 402

Usuarios o extensiones remotas ................................................................................... 402

Gestión de horarios y festivos con calendarios ............................................................. 402

Conferencias .................................................................................................................. 402

Sistema de Colas............................................................................................................ 402

Grabaciones por defecto ............................................................................................... 402

Reporting de llamadas y estadísticas de Colas .............................................................. 402

Implantación en la empresa .............................................................................................. 403

Esquema Conceptual de la centralita para Yet Informática S.L. ................................... 403

Tipo de Implantación y Análisis de Riesgos ................................................................... 404

Hardware y Software necesario para la implantación de la centralita ......................... 404

LÍNEAS FUTURAS Y CONCLUSIÓN .................................................................................................. 405

ANEXOS ............................................................................................................... 407

ANEXO A: SECURITY.TXT ........................................................................................................... 407

ANEXO B: APLICACIONES DE ASTERISK ......................................................................................... 409

ANEXO C: FUNCIONES DE ASTERISK ............................................................................................. 423

ANEXO D: FICHEROS DE CONFIGURACIÓN DE ASTERISK .................................................................. 428

ANEXO E: INSTALACIÓN DE CENTOS 5 ......................................................................................... 459

ANEXO E: GUÍA DE GOOGLE CALENDAR ....................................................................................... 466

ANEXO F: MANUAL DE USUARIO DE FOP 2 .................................................................................. 472

ANEXO G: CÓDIGO DE LAS PRUEBAS DE ENVIO DE SMS .................................................................. 479

sms_send.php ................................................................................................................... 479

enviaSMS.sh ...................................................................................................................... 481

EnviaSMS.java ................................................................................................................... 481

ANEXO H: DIALPLAN DE LA APLICACIÓN (EXTENSIONS.CONF, SIP.CONF, IAX.CONF) .............................. 482

extensions.conf ................................................................................................................. 482

sip.conf .............................................................................................................................. 497

xi

iax.conf .............................................................................................................................. 501

GLOSARIO .............................................................................................................. 502

BIBLIOGRAFÍA ........................................................................................................ 502

xii

Planificación del Proyecto

• PlanFig1

• PlanFig2

• PlanFig3

• PlanFig4

• PlanFig5

• PlanFig6

• PlanFig7

• PlanFig8

• PlanFig9

• PlanFig10

• PlanFig11

Índice de Figuras

xiii

• PlanFig12

• PlanFig13

• PlanFig14

• PlanFig15

• PlanFig16

• PlanFig17

• PlanFig18

• PlanFig19

• PlanFig20

• PlanFig21

• PlanFig22

• PlanFig23

• PlanFig24

• PlanFig25

• PlanFig26

• PlanFig27

• PlanFig28

• PlanFig29

• PlanFig30

• PlanFig31

• PlanFig32

• PlanFig33

• PlanFig34

• PlanFig35

• PlanFig36

• PlanFig37

• PlanFig38

• PlanFig39

• PlanFig40

• PlanFig41

• PlanFig42

• PlanFig43

• PlanFig44

• PlanFig45

• PlanFig46

• PlanFig47

• PlanFig48

• PlanFig49

• PlanFig50

• PlanFig51

• PlanFig52

• PlanFig53

• PlanFig54

xiv

• PlanFig55

• PlanFig56

• PlanFig57

• PlanFig58

• PlanFig59

• PlanFig60

• PlanFig61

Capitulo 1

• Cap1Fig1

• Cap1Fig2

• Cap1Fig3

• Cap1Fig4

• Cap1Fig5

• Cap1Fig6

• Cap1Fig7

• Cap1Fig8

• Cap1Fig9

• Cap1Fig10

• Cap1Fig11

• Cap1Fig12

• Cap1Fig13

• Cap1Fig14

• Cap1Fig15

• Cap1Fig16

• Cap1Fig17

• Cap1Fig18

• Cap1Fig19

• Cap1Fig20

• Cap1Fig21

• Cap1Fig22

• Cap1Fig23

• Cap1Fig24

• Cap1Fig25

• Cap1Fig26

• Cap1Fig27

• Cap1Fig28

• Cap1Fig29

• Cap1Fig30

• Cap1Fig31

• Cap1Fig32

• Cap1Fig33

xv

• Cap1Fig34

• Cap1Fig35

• Cap1Fig36

• Cap1Fig37

• Cap1Fig38

• Cap1Fig39

• Cap1Fig40

• Cap1Fig41

• Cap1Fig42

• Cap1Fig43

• Cap1Fig44

Capitulo 2

• Cap2Fig1

• Cap2Fig2

• Cap2Fig3

• Cap2Fig4

• Cap2Fig5

• Cap2Fig6

• Cap2Fig7

• Cap2Fig8

• Cap2Fig9

• Cap2Fig10

• Cap2Fig11

• Cap2Fig12

• Cap2Fig13

• Cap2Fig14

• Cap2Fig15

• Cap2Fig16

• Cap2Fig17

• Cap2Fig18

• Cap2Fig19

• Cap2Fig20

• Cap2Fig21

• Cap2Fig22

• Cap2Fig23

• Cap2Fig24

• Cap2Fig25

• Cap2Fig26

• Cap2Fig27

• Cap2Fig28

• Cap2Fig29

xvi

• Cap2Fig30

• Cap2Fig31

• Cap2Fig32

• Cap2Fig33

• Cap2Fig34

• Cap2Fig35

Capitulo 3

• Cap3Fig1

• Cap3Fig2

• Cap3Fig3

• Cap3Fig4

• Cap3Fig5

• Cap3Fig6

• Cap3Fig7

• Cap3Fig8

• Cap3Fig9

• Cap3Fig10

• Cap3Fig11

• Cap3Fig12

• Cap3Fig13

• Cap3Fig14

• Cap3Fig15

• Cap3Fig16

• Cap3Fig17

• Cap3Fig18

• Cap3Fig19

• Cap3Fig20

• Cap3Fig21

• Cap3Fig22

• Cap3Fig23

• Cap3Fig24

• Cap3Fig25

• Cap3Fig26

• Cap3Fig27

• Cap3Fig28

• Cap3Fig29

Capitulo 4

xvii

• Cap4Fig1

• Cap4Fig2

• Cap4Fig3

• Cap4Fig4

• Cap4Fig5

• Cap4Fig6

• Cap4Fig7

• Cap4Fig8

• Cap4Fig9

• Cap4Fig10

• Cap4Fig11

• Cap4Fig12

• Cap4Fig13

• Cap4Fig14

• Cap4Fig15

• Cap4Fig16

• Cap4Fig17

• Cap4Fig18

• Cap4Fig19

• Cap4Fig20

• Cap4Fig21

• Cap4Fig22

• Cap4Fig23

• Cap4Fig24

• Cap4Fig25

• Cap4Fig26

• Cap4Fig27

• Cap4Fig28

• Cap4Fig29

• Cap4Fig30

• Cap4Fig31

• Cap4Fig32

• Cap4Fig33

• Cap4Fig34

• Cap4Fig35

• Cap4Fig36

• Cap4Fig37

• Cap4Fig38

• Cap4Fig39

• Cap4Fig40

• Cap4Fig41

• Cap4Fig42

• Cap4Fig43

xviii

• Cap4Fig44

• Cap4Fig45

• Cap4Fig46

• Cap4Fig47

• Cap4Fig48

• Cap4Fig49

• Cap4Fig50

• Cap4Fig51

• Cap4Fig52

• Cap4Fig53

• Cap4Fig54

• Cap4Fig55

• Cap4Fig56

• Cap4Fig57

• Cap4Fig58

• Cap4Fig59

• Cap4Fig60

• Cap4Fig61

• Cap4Fig62

• Cap4Fig63

• Cap4Fig64

• Cap4Fig65

• Cap4Fig66

• Cap4Fig67

• Cap4Fig68

• Cap4Fig69

• Cap4Fig70

• Cap4Fig71

• Cap4Fig72

• Cap4Fig73

• Cap4Fig74

• Cap4Fig75

• Cap4Fig76

• Cap4Fig77

• Cap4Fig78

• Cap4Fig79

• Cap4Fig80

• Cap4Fig81

• Cap4Fig82

• Cap4Fig83

• Cap4Fig84

• Cap4Fig85

• Cap4Fig86

xix

• Cap4Fig87

• Cap4Fig88

• Cap4Fig89

• Cap4Fig90

• Cap4Fig91

• Cap4Fig92

• Cap4Fig93

• Cap4Fig94

• Cap4Fig95

• Cap4Fig96

• Cap4Fig97

• Cap4Fig98

• Cap4Fig99

• Cap4Fig100

• Cap4Fig101

• Cap4Fig102

• Cap4Fig103

• Cap4Fig104

• Cap4Fig105

• Cap4Fig106

• Cap4Fig107

• Cap4Fig108

• Cap4Fig109

• Cap4Fig110

• Cap4Fig111

• Cap4Fig112

• Cap4Fig113

• Cap4Fig114

• Cap4Fig115

• Cap4Fig116

• Cap4Fig117

• Cap4Fig118

• Cap4Fig119

• Cap4Fig120

• Cap4Fig121

• Cap4Fig122

• Cap4Fig123

• Cap4Fig124

• Cap4Fig125

• Cap4Fig126

• Cap4Fig127

• Cap4Fig128

• Cap4Fig129

xx

• Cap4Fig130

• Cap4Fig131

• Cap4Fig132

• Cap4Fig133

• Cap4Fig134

• Cap4Fig135

• Cap4Fig136

• Cap4Fig137

• Cap4Fig138

Anexos

• AnexoFig1

• AnexoFig2

• AnexoFig3

• AnexoFig4

• AnexoFig5

• AnexoFig6

• AnexoFig7

• AnexoFig8

• AnexoFig9

• AnexoFig10

• AnexoFig11

• AnexoFig12

• AnexoFig13

• AnexoFig14

• AnexoFig15

• AnexoFig16

• AnexoFig17

• AnexoFig18

• AnexoFig19

• AnexoFig20

• AnexoFig21

• AnexoFig22

• AnexoFig23

• AnexoFig24

• AnexoFig25

• AnexoFig26

• AnexoFig27

• AnexoFig28

• AnexoFig29

• AnexoFig30

• AnexoFig31

xxi

• AnexoFig32

• AnexoFig33

• AnexoFig34

• AnexoFig35

• AnexoFig36

• AnexoFig37

• AnexoFig38

• AnexoFig39

• AnexoFig40

xxii

Planificación del Proyecto

• PlanTabla1

• PlanTabla2

• PlanTabla3

• PlanTabla4

• PlanTabla5

• PlanTabla6

• PlanTabla7

• PlanTabla8

Capitulo 1 Capitulo 2

Índice de Tablas

xxiii

• Cap2Tabla1

• Cap2Tabla2

• Cap2Tabla3

Capitulo 3

Capitulo 4

• Cap4Tabla1

• Cap4Tabla2

• Cap4Tabla3

• Cap4Tabla4

• Cap4Tabla5

• Cap4Tabla6

• Cap4Tabla7

• Cap4Tabla8

• Cap4Tabla9

• Cap4Tabla10

• Cap4Tabla11

• Cap4Tabla12

• Cap4Tabla13

• Cap4Tabla14

• Cap4Tabla15

• Cap4Tabla16

• Cap4Tabla17

• Cap4Tabla18

• Cap4Tabla19

• Cap4Tabla20

• Cap4Tabla21

• Cap4Tabla22

Anexos

• AnexoTabla1

• AnexoTabla2

1

Empresa en la que se sitúa el proyecto Yet Informática S.L. es lider en sistemas de información de alta tecnología para los sectores de calzado, textil y deportes de España. Su experiencia en la informatización de más de 2000 tiendas les avala, así como la permanencia en este mercado concreto en los últimos 18 años. Yet Informática, nació en 1984, tras un análisis del mercado informático. En aquellos tiempos este se dividía fundamentalmente en dos áreas: la programación a medida y los programas estándares de uso generalista, existiendo una tendencia incipiente hacia los programas verticales. Para conocer más sobre Yet: www.yet.es.

Antecedentes

2

Cómo surge la necesidad del proyecto a realizar La actual centralita telefónica se ha quedado corta en funcionalidades y la mejora de esta supone la compra de una serie de licencias y cierto Hw, en caso de un aumento de personal en la empresa sería necesario abonar otras cantidades. Como una posible solución surge el montaje de una centralita no propietaria como es Asterisk evitando por una parte la compra de licencias , pudiendo aprovechar los teléfonos Cisco haciendo una conversión del protocolo de estos, SCCP, al protocolo SIP. Por otra parte la centralita actual tiene algunas restricciones en cuanto a funcionalidades que serían interesantes para la empresa y que serán solucionadas con esta nueva central.

3

Objetivos del Proyecto El objetivo principal es adquirir los conocimientos necesarios sobre VoIP, telefonía, redes, Linux y sobre todo Asterisk para el montaje adecuado de estas centralitas pasando poco a poco de una configuración básica a una configuración casi a medida para la elaboración de la centralita de la empresa. Una vez obtenidos estos conocimientos la centralita nueva debe mejorar la actual y ofrecer otras funcionalidades extras que la hagan aun más completa.

También es objetivo que esta memoria sea lo más intuitiva posible de forma que si no se conoce nada sobre Asterisk se pueda llegar a entender gran parte tanto de la configuración del Dialplan como del funcionamiento de estas centralitas y de este mundo en general.

Planificación del Proyecto

4

Viabilidad del Proyecto

Planificación Inicial Temporal

Resumiendo esta tabla, cuando se realizó la planificación inicial, la idea era realizar la formación necesaria en los meses de Julio y Agosto, sin contar las semanas de vacaciones (del 4 al 16 de Agosto) y durante los dos siguientes meses montar la centralita para la empresa Yet Informática.

Planificación Real Temporal

5

6

Como se puede ver en la imágenes anteriores la planificación real comienza con una tarea repetitiva en la que cada semana se hará un “planing” del trabajo a realizar durante esta.

A continuación se pueden definir tres partes en la planificación: el estudio de las tecnologías y pruebas iniciales, el montaje de la centralita para Yet Informática S.L. y la elaboración de la documentación.

Desvio Temporal

El desvío temporal es de 2 meses y 20 días, el estudio de las tecnologías fue uno de los culpables en este contratiempo, también la integración de la centralita con Verbio y Nagios supuso un tiempo no planificado y por último la elaboración de la agenda de contactos Yetbook, que surgió al final del proyecto.

Planificación real del proyecto y herramientas a utilizar en su elaboración

Estructura de Descomposición del Trabajo

7

8

9

Fases, Tareas y Entregables

A continuación se indican y describen los diferentes documentos generados y utilizados para el proyecto que constituyen los entregables.

� Entrega de la primera parte de la memoria : Introducción a la VoIP: Documento de introducción a la VoIP a través de la explicación y definición de conceptos fundamentales para su comprensión. Es la tarea nº 11.

� Entrega de la segunda y tercera parte de la memoria : Asterisk, el futuro de la

telefonía y Prácticas: Documento que permite un adentramiento en el mundo de Asterisk en el que se describen conceptos general y específicos ,así como, su instalación y configuración y pruebas realizadas. Es la tarea nº 28.

� Entrega documento final del Proyecto: Entrega de toda la documentación

elaborada junto con el la presentación. Es la tarea nº 46. Tras ver la Planificación Real Temporal se generará una ficha para cada tarea identificada, donde se anotará su número, nombre, una breve descripción y el esfuerzo estimado:

Número: 1

Descripción: Tarea repetitiva que se lleva a cabo los viernes de cada semana con el objetivo de planificar la siguiente y hacer balance de lo avanzado en esta.

Duración: 26 h

Nombre: Análisis del trabajo a realizar

Especificación de la tarea

10

Número: 2

Descripción: Periodo de estudio e iniciación en el sistema operativo Linux, en concreto primero en Kubuntu, despues en CentOs con KDE y finalmente CentOs server.

Duración: 240 h

Nombre: Iniciación en Linux

Especificación de la tarea

Número: 3

Descripción: Estudio y comprensión de conceptos relacionados con la telefonía y más concretamente con la VoIP explicados en el Capitulo 1 de la Memoria.

Duración: 240 h

Nombre: Estudio y aprendizaje sobre telefonía y VoIP

Especificación de la tarea

Número: 4

Descripción: Adentramiento en el mundo Asterisk, estudio de conceptos y configuraciones básicas y avanzadas. Recopilado en el Capítulo 2 de la Memoria.

Duración: 240 h

Nombre: Estudio y aprendizaje sobre el mundo Asterisk

Especificación de la tarea

11

Número: 7

Descripción: Primeras configuraciones de Softphones X-Lite y Zoiper y telefonos IP Sipura SPA 841.

Duración: 20 h

Nombre: Pruebas con SoftPhones y Telefonos IP

Especificación de la tarea

Número: 6

Descripción: Montaje de las primeras centralitas Asterisk en Kubuntu y CentOs 5.4. con KDE.

Duración: 80 h

Nombre: Pruebas de montaje de centralitas Asterisk

Especificación de la tarea

Número: 5

Descripción: Documentación del Capitulo 1 de la Memoria.

Duración: 160 h

Nombre: Elaboración de la memoria I: Introducción a la VoIP

Especificación de la tarea

12

Número: 9

Descripción: Instalación de Elastix y pruebas con Softphones y de detercción de Hw.

Duración: 10 h

Nombre: Pruebas de funcionamiento de Elastix

Especificación de la tarea

Número: 8

Descripción: Documentación del capítulo 2 de la memoria

Duración: 160 h

Nombre: Montaje de centralita de pruebas I

Especificación de la tarea

Número: 10.1

Descripción: Pruebas exhaustivas de los ficheros de configuración queues.conf, features.conf ,meetme.conf, voicemail.conf, manager.conf, sip.conf, iax.conf y extensions.conf.

Duración: 160 h

Nombre: Pruebas de configuración de funcionalidades

Especificación de la tarea

13

Número: 10.2

Descripción: Instalación, configuración y pruebas de funcionamiento de FOP 2.

Duración: 30 h

Nombre: Pruebas de integración con FOP 2

Especificación de la tarea

Número: 10.3

Descripción: Instalación, configuración y pruebas de funcionamiento de Asternic Call Center Stats.

Duración: 10 h

Nombre: Pruebas de integración con Call Center Stats

Especificación de la tarea

Número: 10.4

Descripción: Instalación, configuración , pruebas de funcionamiento y elaboración de documentación de Asternic CDR Reports.

Duración: 10 h

Nombre: Pruebas de integración con CDR Reports

Especificación de la tarea

14

Número: 12

Descripción: Montaje de centralita Asterisk en CentOs 5.4. con tarjeta de telefonía RDSI BRI de 4 puertos con 2 de ellos en uso : 1 módulo FXO y 1 módulo FXS.

Duración: 15 h

Nombre: Montaje de centralita de pruebas II con RDSI BRI

Especificación de la tarea

Número: 13

Descripción: Instalación y configuración de DAHDI y pruebas de detección de Hardware y de funcionamiento de la tarjeta.

Duración: 5 h

Nombre: Pruebas RDSI BRI

Especificación de la tarea

Número: 14

Descripción: Programación y Pruebas de programa en Python de interactuación con Google Calendar para la comprobación de la existencia de eventos en el instante de tiempo que se ejecuta.

Duración: 30 h

Nombre: Programación y Pruebas Google Calendar I: Interactuación con los calendarios

Especificación de la tarea

15

Número: 15

Descripción: Programación y modificación de programa en Java de creación de eventos en un calendario de Google Calendar y posterior envío de aviso de SMS.

Duración: 30 h

Nombre: Programación y Pruebas Google Calendar II: Envio de SMS

Especificación de la tarea

Número: 16

Descripción: Documentación del Capitulo 3 de la Memoria.

Duración: 60 h

Nombre: Elaboración de la memoria III: Prácticas realizadas

Especificación de la tarea

Número: 17

Descripción: Documentación y recopilación de planificaciones para la realización de la viabilidad del proyecto.

Duración: 120 h

Nombre: Elaboración de la memoria IV: Viabilidad del proyecto

Especificación de la tarea

16

Número: 18

Descripción: Elaboración del Esquema Conceptual de la centralita. Diseño de la centralita.

Duración: 20 h

Nombre: Montaje centralita Yet Informática

Especificación de la tarea

Número: 19

Descripción: Análisis de “pros” y “contras” ,así como, mejoras a realizar y requerimientos.

Duración: 15 h

Nombre: Análisis de requerimientos y requisitos

Especificación de la tarea

Número: 20

Descripción: Elaboración minuciosa del Plan de llamadas de la centralita.

Duración: 30 h

Nombre: Diseño del Dialplan

Especificación de la tarea

17

Número: 21

Descripción: Instalación, configuracíón y pruebas de servicios necesarios antes de la instalación de Asterisk.

Duración: 16 h

Nombre: Puesta a punto del servidor

Especificación de la tarea

Número: 22

Descripción: Elección, descarga e instalación correcta de la versión de Asterisk elegida: Asterisk 1.4.26.2.

Duración: 5 h

Nombre: Instalación de Asterisk

Especificación de la tarea

Número: 23

Descripción: Configuración de los ficheros de Asterisk para conseguir el funcionamiento deseado y por tanto óptimo de la centralita.

Duración: 30 h

Nombre: Programación de ficheros de configuración y Dialplan

Especificación de la tarea

18

Número: 24

Descripción: Implantación de los ficheros de configuración solucionando los posibles errores.

Duración: 3 h

Nombre: Integración de ficheros de configuración

Especificación de la tarea

Número: 25

Descripción: Pruebas post-implantación para alcanzar un funcionamiento correcto.

Duración: 5 h

Nombre: Pruebas I

Especificación de la tarea

Número: 26

Descripción: Poner solución a los posibles errores de configuración cometidos.

Duración: 16 h

Nombre: Solución de errores I

Especificación de la tarea

19

Número: 27

Descripción: Documentación del Capitulo 4 de la Memoria.

Duración: 60 h

Nombre: Elaboracion de la memoria V: Aplicación

Especificación de la tarea

Número: 29

Descripción: Análisis de funcionalidades avanzadas a añadir.

Duración: 30 h

Nombre: Tratamiento de funcionalidades extra

Especificación de la tarea

Número: 30

Descripción: Configuración de Callback y DISA.

Duración: 16 h

Nombre: Programación Callback y DISA

Especificación de la tarea

20

Número: 31

Descripción: Realización de Pruebas sobre el funcionamiento de Callback y DISA.

Duración: 30 h

Nombre: Pruebas II

Especificación de la tarea

Número: 32.1

Descripción: Análisis sobre los resultados que queremos conseguir y cómo conseguirlos.

Duración: 10 h

Nombre: Análisis de requisitos

Especificación de la tarea

Número: 32.2

Descripción: Programación del css y javascript de la agenda.

Duración: 20 h

Nombre: Diseño interfaz gráfica

Especificación de la tarea

21

Número: 32.3

Descripción: Programación HTML ,Java y conexión con la base de datos MySQL.

Duración: 150 h

Nombre: Programación Web

Especificación de la tarea

Número: 32.4

Descripción: Tests de funcionamiento de la agenda.

Duración: 20 h

Nombre: Pruebas de funcionamiento

Especificación de la tarea

Número: 33

Descripción: Documentación del Capitulo 5 de la Memoria.

Duración: 35 h

Nombre: Elaboración de la memoria VI: Pruebas de la Aplicación

Especificación de la tarea

22

Número: 34

Descripción: Descarga e instalación de paquetes Verbio y Estudio de su funcionamiento.

Duración: 30 h

Nombre: Instalación y Estudio de Verbio

Especificación de la tarea

Número: 35

Descripción: Análisis y programación de Verbio para su uso en la centralita Asterisk.

Duración: 20 h

Nombre: Integración Verbio-Asterisk

Especificación de la tarea

Número: 36

Descripción: Pruebas de ejemplos y programación realizada con Verbio.

Duración: 15 h

Nombre: Pruebas III

Especificación de la tarea

23

Número: 37

Descripción: Instalación del servicio SNMP y Nagios ,así como, compresión del funcionamiento de ambos.

Duración: 25 h

Nombre: Instalación y Estudio de Nagios y servicio SNMP

Especificación de la tarea

Número: 38

Descripción: Instalación del módulo de Nagios para enlazar con Asterisk y de los plugins necesarios.

Duración: 20 h

Nombre: Integración Asterisk-Nagios

Especificación de la tarea

Número: 39

Descripción: Pruebas con Nagios sobre la monitorización de Asterisk.

Duración: 15 h

Nombre: Pruebas IV

Especificación de la tarea

24

Número: 40

Descripción: Pruebas con Adaptador Analógico de telefonía y con modem Huawei (chan_sebi).

Duración: 15 h

Nombre: Pruebas ATA (SPA 3000) y Chan_Sebi

Especificación de la tarea

Número: 41

Descripción: Pruebas de conexión de 2 servidores Asterisk y de extensión remota.

Duración: 20 h

Nombre: Pruebas TRUNK IAX 2 y usuario remoto

Especificación de la tarea

Número: 42

Descripción: Pruebas de enlace entre Asterisk y Skype a través del chan_skype.

Duración: 15 h

Nombre: Integración y pruebas con Skype

Especificación de la tarea

25

Número: 43

Descripción: Conversión de protocolo de los teléfonos CISCO, para su aprovechamiento en la nueva central.

Duración: 40 h

Nombre: Conversión telefonos IP (de SCCP a SIP), configuración y pruebas.

Especificación de la tarea

Número: 44

Descripción: Finalización de la memoria con la documentación de la bibliografía, anexos, glosario, conclusión y líneas futuras.

Duración: 20 h

Nombre: Elaboración de la memoria VII: Finalización

Especificación de la tarea

Número: 45

Descripción: Tratamiento y elaboración de la presentación del proyecto.

Duración: 30 h

Nombre: Elaboración de la Presentación

Especificación de la tarea

26

Recursos Humanos y Materiales Amortizables

Para la realización del proyecto de fin de carrera el único recurso humano será el autor

de dicho proyecto, es decir, yo, David Escañuela Alonso (David).

Como recursos materiales amortizables se dispone:

Recurso Descripción Precio Unidades

Ordenadores

HP PROLIANT ML110 G5

(Servidor)

Las características

técnicas del PC son las

siguientes: Intel® Xeon®

3065 Dual Core a 2,33

GHz, 1GB de memoria

RAM, 250GB de disco

duro.

300,00 €

1

HP Compaq

(Ordenador)

Las características

técnicas del PC son las

siguientes: Intel Pentium

4CPU 280GHz, 504MB

de RAM.

600,00 €

1

Amilo Notebook Pi3540

(Portatil1)

(Portatil2)

Las características

técnicas del PC son las

siguientes: Intel Core 2

Duo P8600,320GB de

disco y 4GB de RAM

500,00 €

2

27

Teléfonos

Sipura SPA 841

(Sipura1)

(Sipura2)

(Sipura3)

Teléfono IP (SIP) 149,97 € 3

ALLNET ALL7960

(ALLNET)

Teléfono IP (SIP e IAX) 61,89 € 1

Inalámbrico Alcatel

Versatis 620 Duo

(Telefono1)

(Telefono2)

Telefono Analógico

49,00 € 2

Cisco 7941 Teléfono IP (SCCP)

163,85 € 1

Otros

TDM400P

(Tarjeta)

Tarjeta de Telefonía 135,00 € 1

SPA 3000

(ATA)

Adaptador de Telefonía Analógico(1FXS y 1FXO)

44,53 € 1

Modem Huawei K3520

HSDPA DL 7.2 MBPS,

incorporación de Micro SD.

54,90 € 1

Switch

(Switch1)

(Switch2)

Procure Switch 14000-8G J9077A (22 puertos

10/100/1000 y 2 puertos de doble personalidad)

54,69 € 2

28

Router

(Router1)(Router2)

Router ADSL 150,00 € 2

Por otra parte el Software utilizado será el siguiente:

Recurso Descripción Precio Unidades

Microsoft Office

Profesional 2007

Paquete con Visio

y Proyect 2007 300,00€

1

Netbeans 6.7.1

Commpilador de

Lenguajes de

Programación

00,00 €

1

Putty

Cliente SSH para

acceso al Servidor

00,00€

1

WinSCP

Cliente SFTP para

acceso al Servidor

00,00€

1

MySQL 5.0.27

Gestor de Bases

de Datos

00,00 €

1

Skype

Softphone

00,00 €

2

Licencia chan_skype

Canal de conexion

con Asterisk 45,92 €

1

Firefox 3.5

Navegador Web

00,00 €

1

Zoiper

Softphone

00,00 €

2

29

Agenda del proyecto

Agenda de recursos:

Recurso Tareas asociadas Trabajo

(horas) Costo (€)

David

2.522 983,58

Análisis del trabajo a realizar

26 10,14

Iniciación en Linux

240 93,60

Estudio y aprendizaje sobre

telefonía y VoIP

240 94,60

Estudio y aprendizaje sobre

el mundo Asterisk

240 93,60

Elaboración de la memoria I:

Introducción a la VoIP

160 62,40

Pruebas de montaje de

centralitas Asterisk

80 31,20

Pruebas con SoftPhones y

Telefonos IP

20 7,80

Elaboración de la memoria II:

Asterisk, el futuro de la telefonía

160 62,40

Pruebas de funcionamiento de

Elastix

5 1,95

Pruebas de configuración

de funcionalidades

30 11,70

30

Pruebas de integración con FOP

15 5,85

Pruebas de integración

con Call Center Stats

10 3,9

Pruebas de integración con CDR

Reports

10 3,9

Montaje de centralita de

pruebas II con TDM400P

15 5,85

Pruebas TDM400P

5 1,95

Programación y Pruebas Google

Calendar I: Interactuación con los

calendarios

30 11,70

Programación y Pruebas Google

Calendar II: Envio de SMS

30 11,70

Elaboración de la memoria III:

Prácticas realizadas

60 23,40

Elaboración de la memoria IV:

Viabilidad del proyecto

120 46,80

Montaje centralita Yet

Informática

20 7,80

Análisis de requerimientos y

requisitos

15 5,85

Diseño del Dialplan

30 11,70

Puesta a punto del servidor

16 6,24

31

Instalación de Asterisk

5 1,95

Programación de ficheros de

configuración y Dialplan

30 11,70

Integración de ficheros de

configuración

3 1,17

Pruebas I

5 1,95

Solución de errores I

16 6,24

Elaboracion de la memoria V:

Aplicacíon

60 23,40

Tratamiento de

funcionalidades extra

30 11,70

Programación Callback y DISA

16 6,24

Pruebas II

30 11,70

Análisis de requisitos (Agenda)

10 3,90

Diseño interfaz gráfica (Agenda)

20 7,80

Programación Web (Agenda)

150 58,50

Pruebas de funcionamiento

(Agenda)

20 7,80

Elaboración de la memoria VI:

Pruebas de la Aplicación

35 13,65

32

Instalación y Estudio de Verbio

30 11,70

Integración Verbio-Asterisk

20 7,80

Pruebas III

15 5,85

Instalación y Estudio de Nagios

y servicio SNMP

25 9,75

Integración Asterisk-Nagios

20 7,80

Pruebas IV

15 5,85

Pruebas ATA (SPA 3000) Y

Chan_Sebi

15 5,85

Pruebas TRUNK IAX 2 y usuario

remoto

20 7,80

Integración y pruebas con Skype

15 5,85

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

40 15,60

Elaboración de la memoria VII:

Finalización

20 7,80

Elaboración de la Presentación

30 11,70

Servidor

26 32,50

Pruebas con SoftPhones y

Telefonos IP

1 1,25

33

Pruebas de funcionamiento de

Elastix

1 1,25

Pruebas de configuración

de funcionalidades

1 1,25

Pruebas de integración con FOP

1 1,25

Pruebas de integración

con Call Center Stats

1 1,25

Pruebas de integración con CDR

Reports

1 1,25

Montaje de centralita de

pruebas II con TDM400P

1 1,25

Pruebas TDM400P

1 1,25

Montaje centralita Yet

Informática

1 1,25

Puesta a punto del servidor

1 1,25

Instalación de Asterisk

1 1,25

Programación de ficheros de

configuración y Dialplan

1 1,25

Integración de ficheros de

configuración

1 1,25

Pruebas I

1 1,25

34

Solución de errores I

1 1,25

Tratamiento de

funcionalidades extra

1 1,25

Programación Callback y DISA

1 1,25

Pruebas II

1 1,25

Integración Verbio-Asterisk

1 1,25

Pruebas III

1 1,25

Integración Asterisk-Nagios

1 1,25

Pruebas IV

1 1,25

Pruebas ATA (SPA 3000) Y

Chan_Sebi

1 1,25

Pruebas TRUNK IAX 2 y usuario

remoto

1 1,25

Integración y pruebas con Skype

1 1,25

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

1 1,25

Ordenador

27 33,75

Pruebas de montaje de

centralitas Asterisk

1 1,25

35

Pruebas con SoftPhones y

Telefonos IP

1 1,25

Pruebas de funcionamiento de

Elastix

1 1,25

Pruebas de configuración

de funcionalidades

1 1,25

Pruebas de integración con FOP

1 1,25

Pruebas de integración

con Call Center Stats

1 1,25

Pruebas de integración con CDR

Reports

1 1,25

Montaje de centralita de

pruebas II con TDM400P

1 1,25

Pruebas TDM400P

1 1,25

Montaje centralita Yet

Informática

1 1,25

Puesta a punto del servidor

1 1,25

Instalación de Asterisk

1 1,25

Programación de ficheros de

configuración y Dialplan

1 1,25

Integración de ficheros de

configuración

1 1,25

36

Pruebas I

1 1,25

Solución de errores I

1 1,25

Tratamiento de

funcionalidades extra

1 1,25

Programación Callback y DISA

1 1,25

Pruebas II

1 1,25

Integración Verbio-Asterisk

1 1,25

Pruebas III

1 1,25

Integración Asterisk-Nagios

1 1,25

Pruebas IV

1 1,25

Pruebas ATA (SPA 3000) Y

Chan_Sebi

1 1,25

Pruebas TRUNK IAX 2 y usuario

remoto

1 1,25

Integración y pruebas con Skype

1 1,25

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

1 1,25

Portatil1

17 21,25

37

Iniciación en Linux

1 1,25

Estudio y aprendizaje sobre telefonía y VoIP

1 1,25

Estudio y aprendizaje sobre el mundo Asterisk

1 1,25

Elaboración de la memoria I: Introducción a la VoIP

1 1,25

Elaboración de la memoria II: Asterisk, el futuro de la telefonía

1 1,25

Programación y Pruebas Google Calendar I: Interactuación con los

calendarios

1 1,25

Programación y Pruebas Google Calendar II: Envio de SMS

1 1,25

Elaboración de la memoria III: Prácticas realizadas

1 1,25

Elaboración de la memoria IV: Viabilidad del proyecto

1 1,25

Análisis de requerimientos y requisitos

1 1,25

38

Diseño del Dialplan

1 1,25

Elaboracion de la memoria V: Aplicacíon

1 1,25

Elaboración de la memoria VI:

Pruebas de la Aplicación

1 1,25

Instalación y Estudio de Verbio

1 1,25

Instalación y Estudio de Nagios y servicio SNMP

1 1,25

Elaboración de la Presentación

1 1,25

Elaboración de la memoria VII: Finalización

1 1,25

Portatil2

6 7,5

Análisis de requisitos

1 1,25

Diseño interfaz gráfica

1 1,25

Programación Web

1 1,25

Pruebas de funcionamiento

1 1,25

Pruebas ATA (SPA 3000)

y Chan_Sebi

1 1,25

39

Pruebas TRUNK IAX 2

y usuario remoto

1 1,25

Sipura1

20 5,00

Pruebas con SoftPhones y Telefonos IP

1 0,25

Pruebas de funcionamiento de Elastix

1 0,25

Pruebas de configuración

de funcionalidades

1 0,25

Pruebas de integración con FOP

1 0,25

Pruebas de integración con Call Center Stats

1 0,25

Pruebas de integración con CDR Reports

1 0,25

Montaje de centralita de pruebas II con TDM400P

1 0,25

Pruebas TDM400P

1 0,25

Programación y Pruebas Google Calendar I: Interactuación con los

calendarios

1 0,25

40

Programación y Pruebas Google Calendar II: Envio de SMS

1 0,25

Pruebas I

1 0,25

Solución de errores I

1 0,25

Tratamiento de funcionalidades

extra

1 0,25

Programación Callback y DISA

1 0,25

Pruebas II

1 0,25

Pruebas III

1 0,25

Pruebas ATA (SPA 3000) Y Chan_Sebi

1 0,25

Pruebas TRUNK IAX 2 y usuario remoto

1 0,25

Integración y pruebas con Skype

1 0,25

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

1 0,25

Sipura2

5 1,25

41

Pruebas con SoftPhones

y Telefonos IP

1 0,25

Pruebas I

1 0,25

Solución de errores I

1 0,25

Tratamiento de

funcionalidades extra

1 0,25

Pruebas TRUNK IAX 2

y usuario remoto

1 0,25

Sipura3

3 0,75

Pruebas con SoftPhones

y Telefonos IP

1 0,25

Pruebas I

1 0,25

Solución de errores I

1 0,25

ALLNET

3 0,75

Pruebas con SoftPhones

y Telefonos IP

1 0,25

Pruebas I

1 0,25

Solución de errores I

1 0,25

Telefono1

2 0,50

42

Montaje de centralita de pruebas II con TDM400P

1 0,25

Pruebas TDM400P

1 0,25

Telefono2

1 0,25

Pruebas ATA (SPA 3000)

y Chan_Sebi

1 0,25

ATA

1 0,25

Pruebas ATA (SPA 3000)

Y Chan_Sebi

1 0,25

Tarjeta

2 1,00

Montaje de centralita de pruebas II con TDM400P

1 0,50

Pruebas TDM400P

1 0,50

sebi

1 0,15

Pruebas ATA (SPA 3000)

y Chan_Sebi

1 0,15

Switch1

28 7,00

Pruebas con SoftPhones

y Telefonos IP

1 0,25

43

Pruebas de funcionamiento

de Elastix

1 0,25

Pruebas de configuración

de funcionalidades

1 0,25

Pruebas de integración con FOP

1 0,25

Pruebas de integración

con Call Center Stats

1 0,25

Pruebas de integración

con CDR Reports

1 0,25

Montaje de centralita

de pruebas II con TDM400P

1 0,25

Pruebas TDM400P

1 0,25

Programación y Pruebas Google

Calendar I: Interactuación con los calendarios

1 0,25

Programación y Pruebas Google

Calendar II: Envio de SMS

1 0,25

Montaje centralita Yet

Informática

1 0,25

Puesta a punto del servidor

1 0,25

Instalación de Asterisk

1 0,25

Programación de ficheros de

configuración y Dialplan

1 0,25

44

Integración de ficheros

de configuración

1 0,25

Pruebas I

1 0,25

Solución de errores I

1 0,25

Tratamiento de

funcionalidades extra

1 0,25

Programación Callback y DISA

1 0,25

Pruebas II

1 0,25

Integración Verbio-Asterisk

1 0,25

Pruebas III

1 0,25

Integración Asterisk-Nagios

1 0,25

Pruebas IV

1 0,25

Pruebas ATA (SPA 3000)

Y Chan_Sebi

1 0,25

Pruebas TRUNK IAX 2 y usuario

remoto

1 0,25

Integración y pruebas con Skype

1 0,25

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

1 0,25

45

Pruebas con SoftPhones y

Telefonos IP

1 0,25

Switch2

2 0,50

Pruebas ATA (SPA 3000)

y Chan_Sebi

1 0,25

Pruebas TRUNK IAX 2

y usuario remoto

1 0,25

Router1

36 9,00

Pruebas de montaje

de centralitas Asterisk

1 0,25

Estudio y aprendizaje

sobre el mundo Asterisk

1 0,25

Estudio y aprendizaje sobre telefonía y VoIP

1 0,25

Pruebas con SoftPhones

y Telefonos IP

1 0,25

Pruebas de funcionamiento

de Elastix

1 0,25

Pruebas de configuración

de funcionalidades

1 0,25

Pruebas de integración con FOP

1 0,25

Pruebas de integración

con Call Center Stats

1 0,25

46

Pruebas de integración

con CDR Reports

1 0,25

Montaje de centralita de pruebas II con TDM400P

1 0,25

Pruebas TDM400P

1 0,25

Programación y Pruebas Google

Calendar I: Interactuación con los calendarios

1 0,25

Programación y Pruebas Google

Calendar II: Envio de SMS

1 0,25

Montaje centralita Yet

Informática

1 0,25

Análisis de requerimientos

y requisitos

1 0,25

Puesta a punto del servidor

1 0,25

Instalación de Asterisk

1 0,25

Programación de ficheros de

configuración y Dialplan

1 0,25

Integración de ficheros

de configuración

1 0,25

Pruebas I

1 0,25

Solución de errores I

1 0,25

47

Elaboración de la memoria V:

Aplicación

1 0,25

Tratamiento de

funcionalidades extra

1 0,25

Programación Callback y DISA

1 0,25

Pruebas II

1 0,25

Elaboración de la memoria VI:

Pruebas de la Aplicación

1 0,25

Instalación y Estudio de Verbio

1 0,25

Integración Verbio-Asterisk

1 0,25

Pruebas III

1 0,25

Instalación y Estudio de Nagios

y servicio SNMP

1 0,25

Integración Asterisk-Nagios

1 0,25

Pruebas IV

1 0,25

Pruebas ATA (SPA 3000)

Y Chan_Sebi

1 0,25

Pruebas TRUNK IAX 2

y usuario remoto

1 0,25

Integración y pruebas con Skype

1 0,25

48

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

1 0,25

Router2

7 1,75

Iniciación en Linux

1 0,25

Análisis de requisitos

1 0,25

Diseño interfaz gráfica

1 0,25

Programación Web

1 0,25

Pruebas de funcionamiento

1 0,25

Pruebas ATA (SPA 3000)

Y Chan_Sebi

1 0,25

Pruebas TRUNK IAX 2

y usuario remoto

1 0,25

CISCO

1 0,50

Conversión telefonos IP (de SCCP

a SIP), configuración y pruebas

7 1,75

Diagrama de GANTT:

Este diagrama nos indica cómo será el proceso de elaboración del proyecto, indicando cuándo empezarán y acabarán las tareas.

Y es que la duración total del proyecto es algo que nos interesa optimizar, y es este diagrama la herramienta perfecta para ello.

49

50

51

Estimación de Costes del Proyecto:

Recursos Humanos ó de Trabajo:

David = 72,00 €/mes

Recursos Materiales Amortizables:

Nombre del Recurso Costo por unidad (€)

a)Hardware

Servidor 300,00

Ordenador 600,00

Portatil1 500,00

Portatil2 500,00

Sipura1 149,97

Sipura2 149,97

Sipura3 149,97

ALLNET 61,89

Telefono1 49,00

Telefono2 49,00

ATA 44,53

Tarjeta 135,00

Sebi (Huawei) 54,90

Switch1 54,69

Switch2 54,69

Router1 150,00

Router2 150,00

Cisco 163,85

3317,46

b)Software

Microsoft Office Profesional 2007 300,00

Netbeans 6.7.1 00,00

Putty 00,00

52

WinSCP 00,00

MySQL 5.0.27 00,00

Skype 00,00

Licencia Chan_Skype 45,92

Firefox 3.5 00,00

Zoiper 00,00

345,92

Cálculo del costo de los Recursos Humanos y Recursos Materiales Amortizables:

Concepto Unidades (horas) Precio (€/h) Importe (€)

Recursos Humanos

David 2.522 0,39 983,58

Recursos Materiales Amortizables (Hw)

Servidor 26 1,25 32,50

Ordenador 27 1,25 33,75

Portatil1 17 1,25 21,25

Portatil2 6 1,25 7,50

Sipura1 20 0,25 5,00

Sipura2 5 0,25 1,25

Sipura3 3 0,25 0,75

ALLNET 3 0,25 0,75

Telefono1 2 0,25 0,50

Telefono2 1 0,25 0,25

ATA 1 0,25 0,25

Tarjeta 2 0,50 1,00

sebi 1 0,15 0,15

Switch1 28 0,25 7,00

Switch2 2 0,25 0,50

Router1 36 0,25 9,00

53

Router2 7 0,25 1,75

CISCO 1 0,50 0,50

123,65

Cálculo de la Amortización de los Recursos Amortizables:

Concepto Coste

Unitario (€)

Tiempo de

Amortización (horas)

Coste Unitario de

Amortización (€/h)

Tiempo de Uso (horas)

Importe (€)

Servidor 300,00 4800 0,0625 26 1,63

Ordenador 600,00 4800 0,1250 27 3,38

Portatil1 500,00 4800 0,1042 17 1,77

Portatil2 500,00 4800 0,1042 6 0,63

Sipura1 149,97 4800 0,0312 20 0,62

Sipura2 149,97 4800 0,0312 5 0,16

Sipura3 149,97 4800 0,0312 3 0,09

ALLNET 61,89 4800 0,0129 3 0,03

Telefono1 49,00 4800 0,0102 2 0,02

Telefono2 49,00 4800 0,0102 1 0,01

ATA 44,53 4800 0,009 1 0,01

Tarjeta 135,00 4800 0,0281 2 0,06

sebi 54,90 4800 0,011 1 0,01

Switch1 54,69 4800 0,011 28 0,31

Switch2 54,69 4800 0,011 2 0,02

Router1 150,00 4800 0,031 36 1,15

Router2 150,00 4800 0,031 7 0,22

CISCO 163,85 4800 0,034 1 0,03

SUBTOTAL 10,15 €

Microsoft Office

Profesional 2007

300,00 4800 0,0625 525 32,81

Netbeans 6.7.1

Gratuito 4800 - - 0,00

54

Putty Gratuito 4800 - - 0,00

WinSCP Gratuito 4800 - - 0,00

MySQL 5.0.27

Gratuito 4800 - - 0,00

Skype Gratuito 4800 - 15 0,00

Licencia chan_skype

45,92 4800 0,0096 15 0,14

Firefox 3.5 Gratuito 4800 - - 0,00

Zoiper Gratuito 4800 - - 0,00

SUBTOTAL 32,95 €

TOTAL 43,10 €

Presupuesto

Concepto Importe (€)

Recursos Humanos o de Trabajo 1.107,23

Recursos Materiales Amortizables 123,65

Materiales Hardware y Software Amortizables 43,10

1.273,98

10% Costos Generales 127,40

15% Beneficio 191,10

SUBTOTAL 1.592,48

16%IVA 254,80

PRESUPUESTO 1.847,28 €

Por tanto, el presupuesto asciende a veintisiete mil seiscientos ochenta y siete con cincuenta y nueve.

Estimando que los datos aportados en el siguiente presupuesto son suficientes, se somete al proyecto a su aprobación por los organismos oficiales correspondientes.

Firma: David Escañuela Alonso

55

56

¿ Qué es VoIP (Voice Over Internet Protocol)?

Una definición general de Voz sobre IP (también conocida como telefonía IP) es la posibilidad de transportar conversaciones telefónicas en paquetes IP. Cuando hablamos de “VoIP”, nos referimos a “la telefonía en Internet” en el sentido más amplio de la expresión. El término VoIP no se refiere a ninguno de los mecanismos concretos que existen para llevar las señales de voz de un sitio a otro en la red. Existen docenas de tecnologías que permiten hablar por la red.

Las alternativas tecnológicas de VoIP se pueden dividir de una manera sencilla en dos grandes grupos:

Introducción a VoIP

1

Capítulo

57

• Tecnologías cerradas/propietarias dónde nos encontramos con el conocido Skype o el ya legendario Cisco Skinny (SCCP).

• Sistemas abiertos dónde nos encontramos con los estándares abiertos basados en SIP, H.323 o IAX.

Este sistema permite convivir con los sistemas tradicionales de comunicación. Las líneas telefónicas PSTN entrantes, pueden ser convertidas a VoIP, a través de una pasarela (Gateway) que permite recibir y hacer llamadas en la red telefónica normal.

¿Por qué deberíamos pasarnos a VoIP y no seguir usando servicios gratuitos como Skype?

La respuesta es simple: por sostenibilidad, oportunidad, apropiamiento y flexibilidad. Los servicios gratuitos te pueden solucionar una necesidad a corto plazo pero nunca garantizar tu independencia o el control de tu propio proceso de aprendizaje y desarrollo. No se trata de una cuestión puramente técnica. El problema no es decidir cuál es la mejor de las tecnologías sino cuál es la que permite que las comunidades sean dueñas de su propio desarrollo y que puedan adaptarse a sus propias necesidades. Es muy difícil imaginar un desarrollo sostenible sin transferencia de conocimiento y reapropiamiento tecnológico. Una solución basada en estándares abiertos y código libre no es sólo una buena solución desde un punto de vista puramente técnico sino que además permite la posibilidad de adaptación para mejorarse a la realidad local. Para ser conscientes de la importancia de los estándares abiertos quizás sea bueno empezar presentando una definición de “estándar.” Un estándar es un conjunto de reglas, condiciones o requerimientos que describen materiales, productos, sistemas, servicios o prácticas. En telefonía, los estándares garantizan que todas las centrales de telefonía sean capaces de operar entre sí. Sin ese conjunto de reglas comunes un sistema de telefonía de una región sería incapaz de intercambiar llamadas con otro que esté, tan sólo, unos kilómetros más allá. Aunque muchos de los estándares de telefonía son públicos, los sistemas siempre han estado bajo el control de un grupo muy limitado de fabricantes. Los grandes fabricantes de sistemas de telefonía son los únicos capaces de negociar contratos a nivel regional o incluso nacional. Ésta es la razón que puede explicar porqué es muy común encontrar siempre el mismo tipo de equipos a lo largo de un mismo país. Los equipos de telefonía tradicionales, además, tienen la particularidad de haber sido diseñados para realizar un conjunto de tareas muy concretas. Normalmente, son

58

equipos informáticos con aplicaciones muy específicas. Aunque las reglas que gobiernan la telefonía (los estándares) son relativamente abiertas, no es el caso de los equipos informáticos que los implementan. Al contrario de los estándares, el funcionamiento interno siempre se mantiene en secreto.

Historia de VoIP

1995 – Inicio de la Voz sobre IP

o La VoIP empieza con pequeñas aplicaciones gratuitas y de código abierto a raíz de la posibilidad de enviar pequeños fragmentos de voz codificados.

1997 – Aparecen los primeros PBX software

o El protocolo H.323 se hace el “dueño y señor” de la VoIP ofreciendo voz y video aunque con mala calidad debido al ancho de banda: limitado y poco económico.

1999 – La revolución de la banda ancha

o Netmeeting y CUSeeMe se afianzan como aplicaciones de voz y video más utilizadas hasta el momento.

o Aparece el protocolo SIP evolución del arcaico H.323.

o Comienzo de Asterisk de la mano de Mark Spencer. 2001 – La revolución llega a la Voz sobre IP

o Asterisk comienza como un software abierto y con un gran número de seguidores.

o Las empresas aun no se fían de este software ni de GNU/Linux y continúan utilizando software y hardware propietario.

2003 – Lanzamiento de Skype

o El primer producto VoIP gratis de calidad se ha convertido en objeto de culto de usuarios residenciales.

2005 – Asterisk se afianza como símbolo de VoIP

o Asterisk gana más y más adeptos.

o La empresa de Mark Spencer, Linux Support Services, se convierte en Digium especializada en la venta de hardware para Asterisk.

59

o No tardan en aparecer otros fabricantes que crean hardware

exclusivamente compatible con Asterisk (Junghanns, Beronet).

Características Principales

- Se utiliza una única red. Si dos empresas están unidas a través de Internet. ¿Por qué no aprovecharlo?

- Se administra una única red.

- Estándares abiertos e internacionales. Inter-operabilidad, Bajada de precios en proveedores y fabricantes de hardware VoIP.

- Calidad: Es posible conseguir la misma calidad, de hecho hoy por hoy, el 40% de las llamadas de las grandes operadoras se encaminan por VoIP.

- Fiabilidad: En LAN, se puede lograr una gran fiabilidad. En Internet también, pero existen quizás demasiados factores. (QoS, NAT).

- Coste: Instalación sobre red existente, precios de llamadas.

Ventajas de VoIP

Funcionales

o Provee movilidad a nuestros empleados. Permite a los usuarios conectar su teléfono en cualquier parte en la oficina. Los usuarios simplemente cogen su teléfono y lo conectan al puerto Ethernet más cercano y mantienen su número existente.

o Permite comunicación unificada integrando otros servicios disponibles en Internet como son video, mensajes instantáneos, etc.

o Escalable. Podemos trasmitir más de una llamada sobre la misma línea

telefónica. La transmisión de VoIP hace más fácil aumentar las líneas telefónicas cuando se incorporan nuevos empleados.

De Gestión

o Mucho más fácil de instalar y configurar que una central telefónica propietaria.

o Nos facilita la administración por Web de forma fácil e intuitiva, frente a

otros sistemas como por ejemplo centralita Siemens Hipath que necesitan de un software específico y nada intuitivo para ser

60

configurado.

o Mejor reporte.

Económicas

o Tenemos voz y datos en una misma infraestructura. No hay necesidad de cableado telefónico separado.

o Reducción significativa de costes al aprovechar Internet.

o Proporciona servicios que normalmente son muy difíciles y costosos de

implementar usando la red tradicional de voz PSTN. Funcionalidades que normalmente son facturadas con cargo extra por las compañías telefónicas, como identificación de llamada, transferencia de llamadas, remarcado automático, conferencias,…, son fáciles de implementar y sin coste alguno.

o El estándar SIP elimina teléfonos propietarios y costosos.

o Llamadas entre sedes gratuitas.

Problemas

⊗ NAT: El cáncer de la VoIP. Distintos tipos, no es fácilmente manejable.

⊗ QoS: Necesidad de ofrecer calidad de servicio, al ser la voz crítica en tiempo real.

⊗ Latencia: Tiempo que tarda la voz en llegar al destino.

⊗ Jitter: Variación de la latencia.

Elementos fundamentales de una red VoIP

• Terminales: teléfonos IP que pueden ser hardware o software.

• GateKeeper: controlador y gestionador de toda la comunicación de VoIP.

• Gateway: dispositivo que hace de enlace con la telefonía fija tradicional. Actúa de forma transparente al usuario.

61

¿Cómo se transmite VoIP por la red? Los paquetes de VoIP se transmiten sobre la red basada en IP aprovechando el modelo TCP/IP. Consta de 5 capas:

Protocolos NTP, RTP, RTCP aseguran la entrega y calidad de los paquetes VoIP. El protocolo UDP, transporta los paquetes VoIP desde inicio a fin. Se añade la dirección IP al paquete. Cada dispositivo de VoIP (teléfono o PC), tiene una única dirección IP que enruta la entrega de paquetes VoIP para y desde el llamante al receptor durante toda la llamada. Se añade la @ MAC al paquete. En esta capa se convierten todos los paquetes a señales eléctricas u ópticas, para ser transportados sobre la red interna o externa.

Los protocolos específicos que se utilizan en cada capa son:

Aplicación:

En esta capa los paquetes de VoIP utilizan 3 protocolos:

� NTP (Network Time Protocol): ayuda a asegurar que las señales son transmitidas y recibidas en el margen de tiempo necesario para asegurar la calidad de recepción.

� RTP (Real Time transports Protocol): proporciona funciones de transporte de red de fin a fin, para señales de voz digitales, encapsuladas en el paquete VoIP.

� RTCP(Real Time transports Control Protocol): monitoriza la

entrega de la señal de voz y proporciona funciones mínimas de control para asegurar la entrega de los paquetes.

62

Transporte:

La mayoría de los datos de una red usan el protocolo TCP en la capa de transporte, mientras que en VoIP se utiliza el UDP. El TCP es más lento que el UDP. Utiliza más tiempo en la entrega de paquetes en el destino para asegurar que llegan correctamente. Pero al tratarse de un sistema que funciona en tiempo real es más importante la velocidad de entrega de paquetes, que no la seguridad en que llegan todos los paquetes. Por eso se usa el UDP.

Conceptos principales de VoIP Entender cada uno los conceptos nos va a ser muy útil cuando configuremos cualquier tipo de programa relacionado con telefonía IP.

PBX

PBX viene del término inglés Private (Automatic) Branch Exchange. En palabras simples, el uso más común de una PBX es compartir de una a varias líneas telefónicas con un grupo de usuarios. Una PBX se sitúa entre las líneas telefónicas y los teléfonos (terminales de voz). La PBX tiene la propiedad de ser capaz de redirigir las llamadas entrantes a uno o varios teléfonos. De una manera similar, una PBX permite a un teléfono escoger una de las líneas telefónicas para realizar una llamada telefónica al exterior. De la misma forma que un enrutador (router) en Internet es responsable de dirigir los paquetes de un origen a su destino, una PBX es responsable de dirigir “llamadas telefónicas”. La palabra “private” en la sigla PBX significa que el dueño del sistema tiene todo el control y decide como compartir las líneas exteriores con los usuarios. Una PBX no sólo permite compartir un conjunto de líneas con un grupo de usuarios sino que también ofrece la posibilidad de crear servicios de valor añadido como transferencia de llamadas, llamadas a tres ,es decir, tener la posibilidad de tener a más de dos personas hablando simultáneamente en la misma conversación, pasarela de voz a correo permitiendo grabar un mensaje de voz en un adjunto de correo electrónico como si fuera un contestador automático grabando el mensaje en un fichero de audio y se enviándolo a una cuenta de correo o servicios basados en una respuesta de voz interactiva (IVR), etc. Una PBX puede ser de gran utilidad en múltiples escenarios. Piensa en las regiones donde el acceso a la red telefónica implica caminar varias horas (sino días) a una cabina o Telecentro. Además, una situación muy común es que sólo exista una línea telefónica por edificio o por población. Una PBX (tu centralita) permitirá compartir esa línea e incluso extender

63

la red telefónica a lugares remotos.

ASTERISK (PBX avanzada) (para saber más pulsa aqui )

PSTN-RTB

PSTN es la Red Pública Telefónica Conmutada (Public Switched Telephone Network), “la red de redes telefónicas” o más conocida como “la red telefónica.” En castellano la PSTN es conocida como la red pública conmutada (RTC) o red telefónica básica (RTB). De la misma forma que Internet es la red global IP, la RTB es la combinación de todas las redes conmutadas de teléfono. Una diferencia muy importante entre la RTB e Internet es la noción de “flujo de información”. En telefonía los flujos de información son cada una de las llamadas o conversaciones mientras que en Internet es cada uno de los paquetes de datos. Desde el punto de vista conceptual la RTB e Internet son muy diferentes y representan dos mundos y filosofías casi antagónicas. Si una conversación se efectúa en una RTB se tiene que reservar un canal (circuito) dedicado de 64 Kbps, pero en Internet la misma conversación puede coexistir con otros servicios de manera simultánea. Aunque esta diferencia pueda parecer irrelevante a primera vista, tiene grandes implicaciones de cara a la implementación de las tecnologías de la información tanto en regiones desarrolladas como en desarrollo. En el modelo tradicional, un “cable de cobre” proporciona acceso a la RTB y ofrece un sólo tipo de servicio: un canal analógico. Si ese mismo cable se usa para conectarse a una red conmutada de paquetes como Internet, se puede implementar cualquier tipo de servicio basado en el protocolo IP. La RTB ha estado históricamente gobernada por estándares creados por la ITU (International Telecommunication Union), mientras que Internet es gobernada por los estándares del IETF (Internet Engineering Task Force). Ambas redes, la RTB e Internet usan direcciones para encaminar sus flujos de información. En la primera se usan números telefónicos para conmutar llamadas en las centrales telefónicas, en Internet se usan direcciones IP para conmutar paquetes entre los enrutadores (routers).

Señalización en telefonía tradicional

Señalización analógica

Las centrales telefónicas son los “routers” de la RTB. Un Foreign Exchange Office (FXO) es cualquier dispositivo que, desde el punto de vista de la central telefónica, actúa como un teléfono tradicional. Un FXO debe ser capaz de aceptar señales de llamada o ring, ponerse en estado de colgado o descolgado, y enviar y recibir señales de voz. Asume que un FXO es como un “teléfono” o cualquier otro dispositivo que “suena” (como una máquina de fax o un módem).

64

Un Foreign Exchange Station (FXS) es lo que está situado al otro lado de una línea telefónica tradicional (la estación). Un FXS envía el tono de marcado, la señal de llamada que hace sonar los teléfonos y los alimenta. En líneas analógicas, un FXS alimenta al FXO. El FXS utiliza alrededor de 48 voltios DC para alimentar al teléfono durante la conversación y hasta 80 voltios AC (20 Hz) cuando genera el tono de llamada (ring). Para operar con líneas analógicas, se necesitan tarjetas con interfaces FXO. Por ejemplo: Digium TDM01B Para operar con teléfonos analógicos o centralitas clásicas, se requieren interfaces FXS. Por ejemplo: Digium TDM10B Una PBX que integra periféricos FXO y FXS puede conectarse a la RTB e incorporar teléfonos analógicos. Las líneas telefónicas que vienen del operador se tienen que conectar a una interfaz FXO. Los teléfonos se deben conectar a las interfaces FXS de la centralita. En resumen, dos reglas fáciles que hay que recordar son:

1. Un FXS necesita estar conectado a un FXO (como una línea telefónica necesita estar conectada a un teléfono) o viceversa.

2. Un FXS suministra energía (elemento activo) a un teléfono FXO (elemento pasivo).

Ejemplos de conexiones:

65

Cada vez que usas una línea telefónica se intercambian un conjunto de “señales”. Las señales sirven para ofrecer información del estado de la llamada al usuario. Algunas de esas señales son el tono de marcado o el tono de línea ocupada. Estas señales se transmiten entre el FXS y el FXO haciendo uso de un protocolo conocido como “señalización”.

Por desgracia, existen muchas maneras de generar este tipo de señales. Cada uno de los mecanismos es conocido como “método de señalización”. Los métodos de señalización son diferentes de un lugar a otro, así que debes conocer de antemano el método de señalización que se usa en tus líneas telefónicas. Dos de los métodos de señalización más conocidos son el “loop start” y el “ground start”. Si desconoces el método de señalización que debes usar puedes empezar probando con “loop start”. Una consecuencia de configurar tu PBX con un método de señalización equivocado es que la línea telefónica se cuelga de manera inesperada.

Señalización digital

La Red Digital de Servicios Integrados (RDSI) utiliza, en principio, dos tipos de capacidades de acceso.

o Acceso Básico (2 canales de voz + 1 de señalización)

Por ejemplo: Digium B410P

o Acceso Primario (30 canales de voz + 1 de señalización)

Por ejemplo: Digium TE110P

Además del tipo de señalización, las interfaces RDSI pueden funcionar en modo NT (Network Termination) o TE (Terminal Equipment).

o Modo TE: En este modo, la centralita se puede conectar con interfaces RDSI (BRI o PRI) o con Centrales Digitales Tradicionales que tengan conexión RDSI de forma esclava.

o Modo NT: En este modo la centralita telefónica puede conectarse con Centrales Digitales Tradicionales que tengan conexión RDSI de forma Maestro o con extensiones Digitales.

66

Señalización entre centrales telefónicas

SS7 es un grupo de estándares desarrollados originalmente por la AT&T y la UIT que, entre otras cosas, se encargan de la gestión del establecimiento de llamadas y su encaminamiento entre centrales telefónicas en la RTB. Una cosa muy importante que debes entender es que en la red telefónica tradicional, la voz y las señales auxiliares (señalización) están claramente separadas. Esto significa que existe un “circuito” dedicado a voz y otro circuito independiente para el intercambio de las señales encargadas del establecimiento de las llamadas. Esta información “adicional” necesaria en cada llamada se intercambia usando un protocolo conocido como SS7. El hecho de que la voz y la señalización están separadas significa que los flujos de información pueden tomar caminos físicos totalmente diferentes. Imagínate que las “conversaciones” pueden viajar por un cable mientras que los números de teléfono de los comunicantes se envían por otro. Este concepto es importante para entender la siguiente sección: señalización en telefonía IP.

Señalización en telefonía IP

Por herencia histórica, la señalización en voz sobre IP sigue unos principios muy parecidos a la señalización en RTB. Las señales y las conversaciones están claramente diferenciadas.

Protocolo H.323

Primer estándar VoIP, basado en protocolos de la RDSI, desarrollado en 1996 por la UIT como un medio para transmitir voz, video, datos, fax y las comunicaciones a través de una red basada en IP al tiempo que se mantiene la conectividad con la PSTN. Facilita la introducción de Telefonía IP en las redes existentes de RDSI basadas en sistemas PBX. Tomó fama porque era el más usado por los grandes operadores en sus redes troncales. Se usa en el famoso programa Netmeeting. Ha sido sustituido por el protocolo SIP, no obstante, todavía hay muchos operadores IP que no han portado SIP, muchos sistemas instalados que solo entienden este protocolo y también está presente en algunas aplicaciones de Videoconferencia.

Los roles que nos interesan de este protocolo son los siguientes:

• Gatekeeper: Es núcleo de una zona H.323, es utilizado para conocer los diferentes usuarios y servicios de una red H.323.

GNUGk: Gatekeeper de código abierto.

• EndPoint : Son los usuarios finales que hacen uso de los servicios proporcionados dentro de la zona H.323.

67

Conexión de Asterisk con un Operador IP (Sistema de Voz Ip) a través del protocolo H.323

Protocolo MGCP (Media Gateway Control Protocol)

Este Protocolo es un protocolo muy simple con mucha facilidad para ampliarse y en el que la centralita Asterisk se desenvuelve de forma muy óptima.

Este Protocolo se basa en dos entidades bien diferenciadas, los Agentes de Llamadas y las pasarelas. En Asterisk la estructura estaría formada por Terminales IP MGCP que actúan como pasarelas y él actúa como Agente de Llamada. Así entonces, el Asterisk siempre tiene el estado en el que se encuentran las pasarelas.

68

Protocolo SIP (Session Initiation Protocol)

El protocolo de señalización de inicio de sesión, del inglés Session Initiation Protocol (SIP), es una especificación para Internet para ofrecer una funcionalidad similar al SS7 pero en una red IP. Fue desarrollado por el IETF. Se trata de un protocolo de señalización para crear, modificar y terminar sesiones con uno o más participantes. Estas sesiones incluyen llamadas telefónicas por Internet, distribución de datos multimedia, y conferencias multimedia.

Tiene una sintaxis muy similar al HTTP. Dentro de los Protocolos de Comunicaciones de Voz IP, SIP se posiciona como el más aventajado y conocido que está desbancando a H.323 gracias a su simplicidad .Ha incrementado su popularidad cuando las tecnologías de VoIP se han hecho más presentes en el ”bucle local.”(enlace físico que conecta al cliente con la terminación de la red de telefonía del proveedor de servicios de telecomunicaciones).

Ventajas:

� La gran mayoría de teléfonos IP soportan este protocolo.

Inconvenientes:

⊗ Tiene problemas con el NAT. Los datos y señalización viajan de forma separada y suele necesitar un servidor STUN para resolver este problema.

⊗ Son necesarios muchos puertos. Necesita el puerto 5060 para señalización y 2 puertos RTP para cada conexión de audio. Es necesario abrir muchos puertos en el Firewall.

Asterisk puede tener dos roles diferentes e importantes dentro de las comunicaciones a través de este Protocolo SIP.

• Agente de Usuario: Como agente de Usuario, el Asterisk puede conectarse a Operadores IP que soporten protocolo SIP, así como a otros Asterisk.

• Servidor: Como Servidor, el Asterisk puede recibir peticiones de Registro de Agentes de Usuario, pudiendo ser estos clientes, clientes Hardware (teléfonos IP), clientes Software (SofPhone), otros Asterisk o cualquier Agente de Usuario SIP.

69

Ejemplo de los 2 roles que puede tomar Asterisk usando este protocolo.

Capacidades de SIP:

o Localización del usuario

o Disponibilidad del usuario: determinación de la voluntad del receptor de la llamada de participar en las comunicaciones.

o Capacidad del usuario: determinación del medio y de sus parámetros.

o Gestión de la sesión: transferencia, terminación de sesiones, modificación de

los parámetros de la sesión desde el propio “User Agent”. En el protocolo SIP el usuario es el “dueño” de su sesión. Movilidad:

� SIP permite implementar dos tipos de movilidad diferentes:

70

o La movilidad personal, el usuario puede ser alcanzado en un dispositivo

cualquiera, registrándose en el SIP Registrar Server.

o La movilidad propia al protocolo IP (VPN).

� El registro permite mantener las localizaciones actuales del usuario de manera dinámica.

En la imagen de abajo se muestra un ejemplo de funcionamiento del protocolo SIP. Este protocolo se encarga únicamente de la señalización y delega en otros protocolos como RTP (Real-time Transport Protocol) la transmisión de datos, que en este caso pueden ser tanto audio como vídeo.

Servidores Proxy SIP

Aunque dos dispositivos SIP (teléfonos IP) pueden comunicarse directamente, SIP normalmente hace uso de algunos elementos adicionales llamados “proxies” para facilitar el establecimiento de las llamadas. Un “proxy” opera como un representante (apoderado) que se encarga de negociar entre dos partes. Con la ayuda de un “proxy” puedes mover físicamente tu número de teléfono en Internet. Los números no están asociados a un sitio concreto sino que se pueden mover siempre y cuando notifiquemos al “proxy” de nuestra ubicación. Como el “proxy” funciona como un

71

intermediario es capaz de indicar a las partes dónde se encuentran los teléfonos. Este servidor intermedio en SIP aprende la posición de sus usuarios durante un proceso que se conoce como “registro”. El proceso de registro entre clientes y el servidor “proxy”. La señalización (SIP) y las conversaciones de voz (RTP) viajan por caminos diferentes. Hay dos tipos de Servidores Proxy:

o Inbound Proxy: permite independizar al usuario del dispositivo que utiliza y de su localización.

o Outbound Proxy: Simplifica la administración de los usuarios de un dominio, aplica políticas, tarifica, etc. Un mismo servidor puede funcionar como proxy entrante y saliente de un dominio.

72

Protocolos en tiempo real y el NAT

En Internet, las conversaciones que usan señalización de tipo SIP resultan en flujo constante de paquetes de pequeño tamaño entre los comunicantes. Estos paquetes de voz hacen uso de otro protocolo llamado RTP. El protocolo de transporte de tiempo real o Realtime Transport Protocol (RTP) es el encargado de llevar las conversaciones (la voz) de un lado a otro. En el RTP se define un mecanismo estándar para enviar audio y vídeo en Internet. De la misma forma que en una conversación existen dos flujos de voz, en una conversación en una red IP tenemos dos flujos de paquetes RTP. Los Network Address Translators (NATs) son los grandes enemigos del RTP. Una red con un NAT consiste en varios ordenadores compartiendo, con el mundo exterior, una sóla dirección IP pública. Las máquinas situadas dentro de la red NAT usan direcciones “privadas”. Aunque el NAT permite conectar más fácilmente ordenadores a la red, lo hace al precio de no permitir una conexión puramente bidireccional. El efecto de un NAT en voz sobre IP es que no se pueden recibir conexiones iniciadas desde el exterior. Existen varios problemas relacionados con NAT y VoIP. El más común de los problemas es conocido como “audio en una sola dirección” (oneway audio). Como comenté, una conversación está compuesta por dos flujos de paquetes RTP distintos. En presencia de un NAT, sólo el flujo de dentro a fuera no es bloqueado; el flujo de fuera a dentro no tiene la misma suerte y puede atravesar el NAT. La consecuencia: el que inicia la llamada desde dentro del NAT no puede escuchar a la otra parte. Si los dos comunicantes se encuentran dentro de NATs las cosas se complican aún más, hasta el punto de que ningún flujo de audio llega a su destino final. Por desgracia, las direcciones IP privadas y los NAT están especialmente presentes en todos los lugares de las regiones en desarrollo. Configurar una red con señalización SIP y NATs no es trivial.

SIP vs NAT

El verdadero enemigo del SIP es el NAT.

El “supuesto” agotamiento de los rangos de direcciones IP utilizables en Internet ha obligado a utilizar direcciones IP privadas dentro de las redes de las empresas y usuarios domésticos. Un equipo IP para ser alcanzado en Internet debe utilizar una IP pública para sus comunicaciones. Es necesario por tanto “enmascarar “la red interna en una o varias IP’s públicas (Source NAT).

73

El proceso de NAT no es nada sencillo: varios tipos de NAT suponen varios tipos de soluciones e infinidad de problemas. No son problemas fáciles de solucionar.

Protocolo IAX (Inter-Asterisk Exchange)

Es un protocolo de señalización que fue creado por Mark Spencer, para paliar una serie de inconvenientes y problemas del SIP. Lo diseñó para la comunicación entre Asterisk remotos, y actualmente es empleado también entre servidor y cliente VoIP. Se ha revelado como un protocolo robusto, potente y flexible. Numerosos fabricantes de hardware lo implementan en sus equipos.

Ventajas:

� Consume mucho menos ancho banda por llamada que el SIP. Los mensajes IAX son codificados de forma binaria mientras que los del SIP son mensajes de texto.

Esta forma de enviar tanto las conversaciones como la señalización

74

por el mismo canal se conoce como inband, mientras que el método que usa SIP, el outofband, enviar la señalización dentro del canal de voz obligando a separar los paquetes de voz de los paquetes de señalización.

� Reduce al máximo la cabecera de los mensajes agrupando los paquetes de distintas conversaciones, que van en una misma dirección en la red, en uno sólo consiguiendo que el exceso de información introducido por las cabeceras se reduzca en cada una de las conversaciones. Este mecanismo es conocido como “trunking” reduciendo el ancho de banda aun más en llamadas simultaneas.

� No hay problema de NAT ya que datos y la señalización viajan

conjuntamente.

� Sólo necesitamos el puerto, el 4569, para mandar la información de señalización y los datos de todas sus llamadas.

Inconvenientes:

⊗ No está estandarizado y por tanto no está muy extendido en dispositivos Hardware.

IAX2 (por ser la versión 2) está fuertemente influido por el modelo comunitario de desarrollo abierto y tiene la ventaja de haber aprendido de los errores de sus predecesores resolviendo muchos de los problemas y limitaciones de H.323 y SIP.

Aunque IAX2 no es un estándar en el sentido más oficial de la palabra, no sólo tiene el gran reconocimiento de la comunidad sino todos los prerrequisitos para convertirse en el remplazo de SIP.

El diseño de IAX2 es más adecuado para regiones en desarrollo por tres razones:

1. Reduce el uso de ancho de banda por llamada. 2. Está diseñado para operar en presencia de NATs (soporte nativo) y es más fácil

de usar detrás de los cortafuegos. 3. Reduce aún más el ancho de banda cuando se realizan varias llamadas

simultáneas (como resultado del “trunking”). En las comunicaciones basadas en IAX, el Asterisk puede operar de dos formas

75

diferentes:

• Servidor: Como Servidor, Asterisk admite registros de clientes IAX, pudiendo ser estos clientes Hardware, Software u otros Asterisk.

• Cliente: Como Cliente, Asterisk puede registrarse en otros Asterisk o en Operadores IP que utilicen este protocolo.

Ejemplo de los 2 roles que puede tomar Asterisk usando este protocolo.

Equipamiento para VoIP

Teléfonos IP

Un teléfono de VoIP o teléfono IP es un aparato telefónico con la misma apariencia física que los teléfonos tradicionales especialmente diseñado para conectarse a una red de telefonía IP. Características Principales:

76

• Normalmente soportan un único protocolo de VoIP (SIP, IAX2, H323).Aunque pueden soportar varios.

• Soportan una serie de codecs, el famoso G.729 casi siempre está entre ellos.

• Se conectan directamente a la Red IP:

• Se configuran desde los menús del propio teléfono o por interfaz web:

Características Avanzadas :

• Dual Lan: Algunos teléfonos disponen de dos conectores RJ45 e implementan funciones de switch, de esta forma no es necesario tirar cableado nuevo para los nuevos dispositivos IP.

77

• Manos Libres

• Conector auriculares/micrófono

• Display LCD: Caller ID / Agenda

• “Autoprovisioning”: Autoconfiguración automática de los parámetros de configuración desde un servidor remoto.

Hay todo tipo de terminales normales o inalámbricos en gamas baja, media y alta. Algunos ejemplos: Gama Alta:

Gama Media:

Gama Baja:

78

WiFi:

SoftPhones (Telefonía con Software)

Una alternativa al uso de equipos dedicados (físicos) de VoIP es el uso de programas para emularlos. Estos programas se conocen como “SoftPhones” y funcionan en cualquier ordenador personal. El único requerimiento es tener una tarjeta de sonido en funcionamiento y estar seguro de que el cortafuegos instalado en tu máquina no está bloqueando la aplicación. Si quieres reducir el ancho de banda usado por tus conversaciones elige un “SoftPhone” que tenga soporte para el protocolo IAX2 y activa un códec de alta compresión. El audio es capturado desde:

- Micrófono Incorporado.

- Entrada de línea (Micrófono Externo).

- Dispositivos de entrada de audio USB.

- Dispositivos Bluetooth.

Características Principales:

• Integración con el entorno (Escritorio).

- Icono en systray, dock ...

- Aviso visual de llamadas entrantes.

• Integración con plataformas de acceso y validación de usuarios (LDAP).

• Importación / Exportación de datos: libretas de contactos en XML.

• Soporte de varias conversaciones simultáneamente y en algunos casos de varias líneas.

Tipos de SoftPhones:

o Propietarios :

– Protocolos estándar: SIP, H323, IAX/IAX2 – Protocolos propios abiertos. – Protocolos propios cerrados.

79

• Por ejemplo : Skype

o Libres :

– Protocolos estándar. – Protocolos propios abiertos.

• Por ejemplo : Zoiper Algunos de los SoftPhones más utilizados son:

� X-Lite

- Basado en el protocolo SIP

- Soporte STUN

- Soporta g711a/u, gsm, ilbc, speex

- Disponible para Windows, GNU/Linux y MacOSX

- Puede descargarlo desde http://www.xten.com/.

Configuración:

Cuando se descarga el teléfono no se preocupe por el mensaje de error que aparece en la parte superior de la pantalla.� “Login failed! Contact Network Admin.”

Simplemente haga clic en el botón de Menú (a la izquierda del botón CLEAR).

En Enabled debe poner YES, de lo contrario no funcionará incluso si su registro de usuario es correcto. En Display Name puede ser lo que quieras que se muestre.

En Username, Authorization y Password debe ponerse lo mismo que en sip.conf. En Domain/Realm, SIP Proxy y Out Bound Proxy tiene que poner la dirección IP de su servidor de Asterisk.

80

Las demás características para crear un usuario SIP en el teléfono no es necesario modificarlas.

X-Lite no puede utilizar la detección de silencio cuando se utiliza con el servidor de Asterisk. Por esto es necesario que modifique las características de silencio. Podemos encontrar esta opción en: Menú>Advanced System settings>Audio

Settings>Silence Settings>Transmit Silence . De esta manera estamos seguros de que X-Lite enviara marcos de audio siempre, incluso después de que detecte un silencio.

� Zoiper

- Basado en los protocolos SIP e IAX2

- Soporte STUN

- Soporta g711a/u, gsm, ilbc, speex, g729 (version BIZ)

- Disponible para Windows, GNU/Linux y MacOSX

Configuración:

En Domain debe poner la dirección IP del servidor Asterisk. En Username, Password y en Caller ID Name se deben poner los datos de configuración del archivo sip.conf.

� Ekiga

- Basado en los protocolos SIP y H.323.

- Soporta g711a/u, gsm, speex, g726.

- Disponible para GNU/Linux.

- Podemos descargarlo en : www.ekiga.org .

Configuración:

Para añadir una cuenta SIP, simplemente haga clic en el botón Añadir una cuenta SIP.

Otros SoftPhones :

� Cubix

- Basado en los protocolos SIP e IAX2.

- Soporte STUN.

- Soporta los codecs g711a/u, gsm, ilbc, speex,g729.

- Disponible para Windows.

- Se puede descargar en: http://www.virbiage.com/cubix.php.

� Diax

- Basado en el protocolo IAX2.

- Soporta los codecs g711a/u, gsm, ilbc, speex.

- Disponible para Windows.

- Puede ser descargado en: info.org/wiki-DIAX.

� Kiax

- Basado en el protocolo IAX2.

- Soporta los codecs g711u, gsm, speex.

- Disponible para Windows, Linux, *BSD.

- Para descargar el teléfono http://sourceforge.net/projects/kiax

Para añadir una cuenta SIP, simplemente haga clic en el botón Añadir una cuenta SIP.

- Nombre: Nombre de la cuenta SIP.-Servidor de Registro: Dirección IP del servidor Asterisk. -Usuario: Extensión del usuario.-Usuario para autenticación: extensión@IP del servidor Asterisk-Contraseña: Introducir su clave.-Tiempo de expiración: espera después del que el registro debe estar actualizado. Por defecto es 3600.

los protocolos SIP e IAX2.

Soporta los codecs g711a/u, gsm, ilbc,

Disponible para Windows.

Se puede descargar en: http://www.virbiage.com/cubix.php.

Basado en el protocolo IAX2.

Soporta los codecs g711a/u, gsm, ilbc,

Disponible para Windows.

Puede ser descargado en: http://www.voip-DIAX.

Basado en el protocolo IAX2.

Soporta los codecs g711u, gsm, speex.

Disponible para Windows, Linux, *BSD.

Para descargar el teléfono : http://sourceforge.net/projects/kiax

81

Nombre de la cuenta SIP. Dirección IP del

Extensión del usuario. Usuario para autenticación:

del servidor Asterisk Introducir su clave.

Tiempo de expiración: El tiempo de espera después del que el registro debe estar actualizado. Por defecto es

82

Adaptadores IP

Los adaptadores IP son dispositivos (hardware) que permiten conectar un telefóno analógico a la red IP utilizando protocolos de VoIP.

Tipos de Adaptadores :

� ATA (Analog Telephone Adapter) es un adaptador FXS, tiene un puerto RJ11 (phone jack) y un RJ45 (Ethernet jack).

Por un lado “habla” analógico con el teléfono y por otro lado “habla” digital con la red IP. Características de ATA:

• Soportan SIP o IAX2 normalmente, varios codecs (entre ellos, casi siempre el G.729).

• Tienen uno o dos interfaces FXS para conectar 2 teléfonos analógicos.

• Cada teléfono puede ser registrado a un proxy VoIP distinto.

• Soportan caller ID, tonos de llamada distintivos, llamada en espera ...

• Económicos y de tamaño reducido.

• Pueden conectarse a cualquier tipo de aparato telefónico a la red IP, por ejemplo, se pueden conectar una cabina telefónica (de monedas o tarjeta), un fax o un teléfono inalámbrico (DECT).

� FXS to USB: permite conectar un teléfono normal a un PC, enviando y recibiendo el audio. Requieren un SoftPhone instalado para VoIP.

� FXO to USB: Casi siempre relacionados con Skype, permiten reenviar las llamadas recibidas por Skype por una línea normal.

Ejemplo de Adaptadores IP Linksys PAP2:

o 2 FXS, 1 LAN. Configuración vía Web. o Prestaciones avanzadas: dialplan, llamada en espera,

parámetros SIP avanzados, autoprovisioning o Coste muy económico. o Integración sencilla con los proveedores de VoIP.

83

Gateways VoIP

Dispositivos que permiten interconectar la telefonía tradicional con la VoIP. Se integran con la red telefónica pública con interfaces analógicos o enlaces digitales. Los adaptadores también pueden ser considerados como gateways, a pequeña escala. Generalmente, los adaptadores que realizan funciones de routing/NAT IP, son considerados gateways. Características Principales:

• Generalmente funcionan en dos sentidos: las llamadas recibidas por IP se envían a PSTN/FXS o las llamadas recibidas por interfaces FXS se envían por IP.

• Soportan generalmente SIP o H.323, así como numerosos codecs (G.711, G.729 casi siempre).

• Pueden ser utilizados de forma integrada con las centralitas tradicionales: transformando la llamada analógica de la centralita en llamada por IP, de forma totalmente transparente.

Gateways: FXS -> VoIP Disponen de 1 o más interfaces FXS para conectar teléfonos o líneas de enlace de centralitas. Gateways: FXO -> VoIP Interfaz FXO para conectar una línea de operador. Tres funciones principalmente: – Discriminar en salida: llamar por IP o PSTN. – Utilizar la línea como backup, es decir, en caso de fallo de Internet o del proveedor VoIP, las llamadas pueden ser encaminadas por PSTN tradicional.

84

– Recibir llamadas por PSTN y encaminarlas por VoIP.

Parámetros de VoIP

Calidad de Servicio

La calidad de servicio o Quality of Service (QoS) es la capacidad de la red para ofrecer mejoras en el servicio de cierto tipo de tráfico de red. Para ofrecer una buena calidad en la conversación, el ancho de banda que necesitan los dos flujos de tráfico se debe garantizar con independencia del estado del resto de las conexiones (incluso si la conexión a Internet está altamente ocupada). En el diseño de una red de voz IP debes intentar optimizar el ancho de banda, controlar las fluctuaciones de la red (jitter), y minimizar la latencia.

Codecs

Para poder transmitir la voz sobre una red IP, necesitamos codificarla y para ello, empleamos algoritmos de compresión/descompresión de audio, llamados codecs. Según el códec que utilicemos ocupará más o menos ancho de banda y esto influirá mucho en la calidad de los datos transmitidos. Existen muchas formas de digitalizar audio y cada una de esas formas resulta en un tipo de códec. En general puedes asumir que a mayor compresión vas a obtener mayor distorsión (peor calidad). Un códec se considera mejor que otro cuando es capaz de ofrecer mejor calidad de voz usando la misma cantidad de ancho de banda.

Los codecs más habitualmente empleados son:

85

Latencia

Latencia es sinónimo de retraso, y mide el tiempo que tarda un paquete en viajar de un punto a otro. Para mejorar la calidad de las conversaciones de voz sobre IP es necesario reducir los retrasos al máximo, dando la máxima prioridad al tráfico de voz. Dar más prioridad a los paquetes de voz significa que se les deja “saltarse la cola” de salida y así ocupar una mejor posición que el resto de los paquetes que están esperando para ser transmitidos.

Jitter (Fluctuaciones de velocidad)

En VoIP, el jitter es la variación del tiempo entre la llegada de distintos paquetes. Estas variaciones son debidas a la congestión de la red, la falta de sincronización o los cambios de enrutamiento del tráfico. En redes con grandes cambios de velocidad se puede usar un “jitter buffer” para mejorar la calidad de la conversación. Un buffer es un espacio intermedio donde se almacenan los paquetes hasta su procesamiento. La idea básica del “jitter buffer” es retrasar deliberadamente la reproducción del sonido para garantizar que los paquetes más “lentos” hayan llegado. Los paquetes se almacenan en el buffer, se reordenan si es necesario y se reproducen a una velocidad constante. La calidad de voz mejora al precio de incrementar la latencia total. Existen dos tipos de jitter buffers:

o Un buffer estático está implementado como parte del equipo y configurado de manera fija por el fabricante.

o El dinámico se configura usando un programa y lo puede cambiar el usuario.

86

Retos al implementar VoIP

• Técnicos: Evitar el impacto negativo de los NAT.

• Infraestructura de soporte:

o Redes inalámbricas con gran latencia y jitter. o Redes en general que no han sido diseñadas para priorizar servicios

de tiempo real.

• Energía: No existen fuentes fiables de energía.

• Marco regulatorio:

o Servicio ilegal. o Necesidad de licencias.

Recomendaciones

• Técnicas: Usar IAX2.

• Infraestructura de soporte:

o Redes inalámbricas: Uso de la banda UNI 5.4 Ghz (IEEE 802.11a). Uso de protocolos con TDMA en zonas urbanas (WiMAX).

o Incorporar QoS.

• Energía: Equipos de bajo consumo, energía solar.

• Marco regulatorio: Lobby, Modelos de negocio.

87

¿Qué es Asterisk?

Asterisk es una centralita digital diseñada en Software libre que integra las funcionalidades de telefonía clásica con nuevas capacidades derivadas de su flexible y potente arquitectura. Su nombre viene del símbolo asterisco (*) en inglés. Asterisk se creó, originariamente, para funcionar sobre el sistema operativo GNU/Linux. Y actualmente puede funcionar en toda una variedad de sistemas como OpenBSD, FreeBSD, MacOSX, Windows, Solaris,…, pero Linux sigue siendo el que más soporte presenta.

Asterisk, el futuro de la telefonía

2

Capítulo

88

Asterisk permite conectividad en tiempo real entre las redes PSTN y redes VoIP. Para poder utilizar teléfonos convencionales en un servidor Linux o para conectar la central a una línea de teléfono analógica se suele necesitar Hardware especial, como adaptadores analógicos de telefonía (ATA´s) o tarjetas de telefonía. Como se ha comentado es una PBX híbrida (TDM y VoIP). Por una parte apoya una amplia gama de protocolos TMD para el manejo y transmisión de interfaces de telefonía tradicional. Por otra parte soporta y traduce distintos protocolos de señalización de VoIP como SIP, IAX2, MGCP o H.323. Al mezclar telefonía tradicional y servicios de VoIP, Asterisk permite construir arquitecturas de telefonía avanzadas y soluciones CTI (Computer Telephony Integration), y facilita la migración gradual de los sistemas existentes en las empresas a las nuevas tecnologías. Asterisk cuenta con un esquema de doble licencia, la licencia de Software libre GNU (GNU General Public License, GPL) y otra licencia propietaria para permitir código propietario como el del códec G.729. Gracias a la licencia GPL cuenta con una gran comunidad de programadores que han contribuido a añadirle multitud de características. Esto nos permite:

• Ejecutar el programa con cualquier propósito.

• Modificar el programa, accediendo al código fuente.

• Redistribuir copias.

• Mejorar el programa y publicar estas mejoras (junto al código fuente).

89

Los añadidos de terceros al código de Asterisk implican la cesión de los derechos comerciales a Digium pero se conserva el copyright del desarrollador. La potencia de esta PBX aumenta al ser posible desarrollar nuevas funcionalidades con lenguajes estándar de programación y utilidades propias de Asterisk.

¿Qué NO es Asterisk? Asterisk no es un proxy SIP. Aunque posea funcionalidades de estos, carece de la mayor parte de la implementación SIP necesaria. Asterisk no es una solución de “MultiVideoConferencia”. Al menos a corto plazo, no se espera transcoding de video en tiempo real. Asterisk no es un servidor de faxes. Puede interactuar con productos de terceros para enviar y recibir faxes, pero no incluye esa funcionalidad de serie.

¿Cuál es el papel de Digium? Digium es la creadora y desarrolladora primaria de Asterisk, el primer PBX de código abierto de la industria. Usado en conjunto con las placas de telefonía PCI, ellas ofrecen un manejo estratégico con excelente relación costo/beneficio para el transporte de voz y datos sobre arquitecturas TDM, conmutadas y redes Ethernet. Digium es hoy el principal patrocinador de Asterisk y uno de los líderes de la industria de PBX en código abierto, siendo Mark Spencer el creador y principal soporte de Asterisk, él es hoy admirado por el gran trabajo que realizó y por la responsabilidad que supo acarrear.

90

¿Cuándo usar Asterisk? Asterisk se encuentra avalado por los principales proveedores de VoIP, que lo utilizan para la interconexión de sus redes con las redes de telefonía tradicional, encaminando tal cantidad de tráfico que sólo un sistema tan estable, seguro y eficaz como éste puede soportar. Y como solución para empresas, desde Pymes a grandes corporaciones, va ampliando su mercado impulsado por el auge del Software libre, la reducción de costes que supone y las posibilidades de adaptación a las necesidades empresariales. Por tanto, Asterisk es recomendable para las comunicaciones de voz en cualquier organización donde se requieran desde las necesidades más básicas a las más altas prestaciones y funcionalidades. Pero sobre todo en aquellos entornos con expectativas de crecimiento y deseos de integrar las nuevas tecnologías (como la VoIP) en su modelo de negocio.

¿Por qué Asterisk?

Utilizando Asterisk en su entorno es posible olvidar las limitaciones tradicionales de las centralitas telefónicas: no más problemas de alcanzar el máximo de extensiones posibles, dejar de pagar cantidades exorbitantes por módulos propietarios para ampliar la capacidad de la centralita.

Algunos de los motivos de la elección de Asterisk son:

- Personalización de su sistema: Asterisk permite diseñar su sistema de telefonía a su medida, en vez de tener que adecuar su empresa a la telefonía. Podrá implementar una solución que responda a las necesidades de su negocio, mejorando sus tiempos de respuesta y optimizando sus recursos.

- Puede crecer sin límite: un sistema Asterisk puede crecer con usted, con su negocio. Desde un entorno pequeño es posible aumentar la capacidad y posibilidades sin límite. Se acabó el cambiar de centralita cada pocos años.

- Interconexión de sedes: Asterisk permite enlazar con costes muy ajustados sedes remotas e incluso ubicar terminales telefónicos remotos. Puede usar su conexión a internet como puerta de enlace entre sedes, reduciendo sus costes de telefonía interna de forma espectacular.

- Ahorro de costes: Un único cableado para toda su empresa evitando tener cableados separados para voz y datos. Una única red de datos puede gestionar sus teléfonos y sus ordenadores. Simplificar infraestructuras es un modo inteligente de reducir costes.

91

- Reduzca su factura telefónica: El uso de proveedores de VoIP para permitir el envío o la recepción de llamadas a través de Internet puede significar un ahorro en su factura telefónica superior al 40 %.

Las soluciones de telecomunicaciones basadas en Asterisk son económicas, robustas, flexibles y protegen la inversión.

• Económico:

Asterisk es más económico principalmente por dos motivos, por qué utiliza equipos estándar y está basado en código abierto.

Los servidores y los teléfonos usados son estándar, los producen multitud de fabricantes, que compiten entre ellos en prestaciones y precio.

En el caso de una centralita IP propietaria, la empresa está obligada a adquirir un Hardware concreto a un precio establecido a un solo fabricante. Los teléfonos estándar no funcionan o lo hacen parcialmente, y únicamente se pueden comprar al fabricante de la centralita. Un ejemplo son las centralitas Cisco. Asterisk es de código abierto, por lo que se obtienen gratuitamente el código fuente y todas las futuras actualizaciones. Todas las prestaciones que en otra centralita son de pago, en Asterisk vienen incorporadas, sólo hay que configurarlas y ponerlas en producción. A Asterisk puede conectar cuantos teléfonos quiera mientras el servidor tenga potencia para gestionarlos, no pagará ninguna licencia por cada extensión, ni por cada buzón de voz asociado a la extensión, etc.

• Robusto:

Asterisk se ejecuta sobre servidores Linux, sistema operativo de gran robustez y estabilidad.

• Flexible:

Asterisk se configura y adapta a la medida de cada organización como ninguna otra centralita del mercado como se ha comentado.

92

Debido a su sistema de configuración a bajo nivel, la centralita prácticamente se programa a medida para cada cliente, permitiendo adaptarla para cubrir prácticamente todas las necesidades de su empresa, hasta el mínimo detalle. Gran capacidad de integración con el resto de sistemas y de aplicaciones de su organización, sobre el núcleo de conmutación de Asterisk, se pueden conectar diferentes interfaces de programación que pueden desarrollar aplicaciones a medida, integrarlo con sus sistemas, bases de datos, o integrar aplicaciones comerciales como Call Centers.

• Protege la inversión: La elección de una centralita IP basada en Asterisk tiene una ventaja importante más, protege la inversión. La inversión en Software y equipos que se realiza por parte de la empresa no depende de la continuidad que un fabricante quiera dar al producto que ha comprado. Utilizando Asterisk la empresa puede aprovechar de nuevo los servidores.

Ventajas Competitivas:

• Posibilidad de uso de sintetizadores de voz y técnicas de reconocimiento del

lenguaje.

• Integración de servidor fax con centralita y correo electrónico.

• Integración de buzón de voz con centralita y correo electrónico.

• Información pormenorizada del volumen de llamadas mediante web.

• Posibilidad de contratar servicios con uno o varios operadores diferentes.

• Integración de varias empresas en una sola centralita.

• Control de calidad mediante grabación total o parcial de llamadas.

Desventajas de las centralitas Asterisk:

• Desconocimiento y desconfianza en la telefonía VoIP (miedo a cambios).

• Si no hay Internet no permite realizar comunicaciones.

• Si no hay corriente eléctrica no funciona.

• Uso obligatorio de teléfonos especiales (teléfonos IP) o adaptadores/tarjetas de

telefonía para usar los teléfonos analógicos.

• Posibles fallos de programación e implementación por errores humanos.

• Riesgos de seguridad aun desconocidos del SO.

• Integración de Asterisk en la empresa :

Asterisk no es un sistema fácil de configurar y poner en producción debido precisamente a su enorme flexibilidad y potencia. Cuando hay miles de maneras de conseguir el mismo resultado, el proceso requiere un esfuerzo extra. Por eso es tan importante la figura del integrador.

93

Historia de Asterisk

Mark Spencer empezó en el mundo Linux con Slackware en 1994 (kernel versión 1.09). Uno de los pocos en Auburn, Alabama por aquellos tiempos que conocía cualquier cosa sobre Linux. Después de una temporada con Adtran (un proveedor global de equipos de telecomunicaciones) creó su propia compañía "Linux Support Services" con el objetivo de dar soporte a usuarios de Linux. Para ello necesitaba una centralita telefónica, pero ante la imposibilidad de adquirirla dados sus elevados precios, decidió construir una con un PC bajo Linux, utilizando el lenguaje C. Este fue el principio del fenómeno mundialmente conocido como Asterisk®, la centralita telefónica construida por Mark, después de su experiencia desarrollando GAIM (ahora llamado Pidgin) entre otros proyectos de software libre.

Mark Spencer en el 2006 O'Reilly Emerging Telephony Conference.

Después de explicarles sus necesidades de capital a sus amigos en Adtran ellos se

ofrecieron a invertir en su compañía. Se dio cuenta que se tenía más interés en

Asterisk que en sus servicios generales de consultoría Linux. Entonces se reunió con

Jim Dixon que estaba construyendo Hardware Open Source.

Su primer proyecto fue construir una tarjeta T1 Open Source. Estos ingresos les mantenían a flote pero no recibían contribuciones de nadie y el resto tan solo cogía sus diseños y manufacturaban tarjetas que competían con las suyas. Posteriormente "Linux Support Services" se convertiría en el año 2002 en "Digium", redirigiendo sus objetivos al desarrollo y soporte de Asterisk. El dinero era escaso en Digium hasta que un día un vendedor de DeltaCom (una competitiva compañía de comercio local) con la intención de venderles una T1, tras

94

entender lo que Mark y Jim habían hecho se ofreció a ayudarles. A partir de este punto empezaron a ver un incremento en las ventas, y acabaron el año con beneficios.

Después de grandes ingresos durante largo tiempo Mark fue capaz de hacer crecer el negoció sin recabar mucho en los beneficios. Cuando Mark empezó con Asterisk hizo una cosa muy inteligente. Cada desarrollador que contribuía en el código debería firmar un acuerdo para que el Copyright se asignara a Asterisk y el compromiso de que no hubiera encumbramientos gracias a dicho código. Esto le permitió sentirse confortable con su proyecto que era completamente Open Source y le permitía a su compañía re licenciar el código a vendedores como 3COM y NTT. Digium también ha hecho las cosas bien al mantener la versión de la comunidad con la funcionalidad completa y no crear una escisión entre ellos y los que les apoyan. La primera release fue Asterisk 0.1 (Diciembre de 1999), y el tarball ocupaba tan sólo 124.3KB, que una vez descomprimido venían a ser unos 506 KB en 96 archivos. Para correr Asterisk necesitábamos básicamente Linux y libaudiofile:

Esta primera release fue liberada en 1999 bajo licencia GPL2 pero tenía clausulas adicionales que indicaban que en todos los productos derivados debía constar el nombre de Linux Support Services, LLC o Adtran Inc., también advertían sobre códecs cubiertos por patentes de Software, y la más curiosa es que si emprendíamos acciones legales por infringir patentes en referencia a algún Software Open Source nuestro derecho a usar o distribuir el Software se terminaba de inmediato.

95

De todos modos estas clausulas duraron bien poco, ya que en los primeros cambios que se hicieron para la release 0.1.1 aparte de arreglar numerosos bugs se revisó la licencia que pasó a ser GPL pura.

Asterisk está formado por varios paquetes:

• Asterisk: Ficheros base del proyecto.

• Zaptel: Soporte para hardware. Drivers de tarjetas. En versiones altas de Asterisk este paquete se sustituye por Dahdi_Linux y Dahdi_Tools.

• Addons: Complementos y añadidos del paquete Asterisk. Opcional.

• Libpri: Soporte para conexiones digitales. Opcional.

• Sounds: Aporta sonidos y frases en diferentes idiomas. Zaptel, inicialmente llamado Zapata se basó en el Zapata Telephony Project, el driver Open Source de Zapata Telephony (anteriormente llamada BSD Telephony Of Mexico). La primera release fue Zapata 0.1.1 (Noviembre 2001), que venía a ser muy parecido al original liberado por Zapata Telephony en Octubre del año 2000. De hecho no se introdujeron cambios importantes hasta la release 0.1.6 (Marzo 2002), donde se movieron las estructuras de red para usar malloc ( ) cuando fuera necesario, se le añadió soporte HDLC PPP, junto con algunos arreglos multicanal en Torisa y Zaptel:

96

En la primera release, Libpri 0.1 Mark nos relataba que libpri era la implementación en C de la especificación para primarios RDSI basado en la especificación de Bellcore (12 de Mayo de 2001), por aquel entonces Asterisk pasó a ofrecer soporte para conexiones digitales:

Las funcionalidades y añadidos que no podían ser incluidas en el núcleo se fueron incorporando al paquete Addons, y también se pasó a ofrecer paquetes de sonidos. El lanzamiento de Asterisk 1.0 (Setiembre 2004) fue anunciado por Mark durante la Astricon. El tarball de Asterisk 1.0.0 pesaba unos 9 MB, y ya varias compañías daban soporte al desarrollo de Asterisk: Pilosoft, Inc. (soporte al desarrollo ADSI), GFS (soporte al desarrollo ALSA), Telesthetic (soporte al desarrollo SIP), Paul Bagyenda, Digital Solutions (desarrollo inicial del driver Voicetronix), entre otros muchos desarrolladores que contribuían como Christos Ricudis que realizó importantes aportes al código de Asterisk. Con un Changelog mucho más amplio ya, puesto que desde la release inicial se habían resuelto unos 340 bugs, se disponía de canales IAX2, SIP, PRI, Zap, OSS, backends para CDR, mejoras en el soporte para FreeBSD/OpenBSD/MacOS X, mejoras en H.323, se añadieron los codecs iLBC, G.726, G.729, LPC10, ADPCM, speech, u-law, formato GSM WAV, formato de fichero PCM, también MP3 aunque luego se quitó, soporte para ISDN Linux e incluso soporte para vídeo en el canal SIP e IAX2. También se disponía de DISA (hacer llamadas desde el exterior a través de la centralita), voicemail, transferencias, autenticación de propósito general, macros, conferencias MeetMe, AGI, grabaciones, call parking, soporte para múltiples idiomas, se eliminó la dependencia con libaudiofile, entre otras muchas mejoras como el control del eco. Asterisk 1.0.0 ya tenía soporte para diferente hardware Zaptel entre otros:

97

98

Paralelamente a Asterisk fue lanzado Zaptel 1.0.0 (Setiembre 2004), tenía soporte para udev (kernel Linux 2.6), zttool tenía como dependencia a libnewt, parte del software también necesitaba la librería Zapata. Por aquel entonces existían problemas con la directiva PROSLIC_POWERSAVE, donde el audio se cortaba después de cuatro segundos:

99

Libpri 1.0.0 (Septiembre 2004) traía algunas mejoras para Q.931 entre otros:

Un año más tarde (Noviembre 2005) se anunciaba el lanzamiento de la versión 1.0.10 de Asterisk y Zaptel. Libpri, Asterisk-addons, y Asterisk-sounds ya no presentaban cambios, lo cual ya dejaba entrever la discontinuidad de la rama 1.0 en favor de 1.2. Y efectivamente así fue, solo Asterisk llegó a la release 1.0.12 dejando paso a Asterisk 1.2.0 (Noviembre 2005). La nueva rama de Asterisk fue presentada durante la conferencia IP.4.IT en Las Vegas, Nevada. Asterisk 1.2 introducía sobre 3,000 funcionalidades y mejoras sobre el rendimiento global y eficiencia en el uso de la memoria. Entre las principales novedades teníamos:

• Mejora de las funcionalidades de voicemail.

• Añadido protocolo DUNDi (Distributed Universal Number Discovery).

• Configuración de Asterisk más sencilla.

• Creación de un motor de almacenamiento de configuración en tiempo real sobre una base de datos.

• Un Asterisk Dialplan más potente.

• Introducción de Asterisk Extension Logic, un nuevo método flexible para configurar el Dialplan.

100

• Nueva interfaz para flujos de llamada IVR dinámicos.

• Acceso configurable a funcionalidades de llamada generales.

• Mejoras en el protocolo SIP.

• Nuevas funcionalidades para el protocolo IAX (Inter-Asterisk eXchange).

• Uso de ficheros de sonido para la música en espera nativa.

• Soporte CDR customizable.

• Mejoras en el soporte PRI. En Agosto de 2007, la rama 1.2 pasó al estado de “mantenimiento de seguridad”, y sólo se corregían bugs relativos a la seguridad. El 25 de Diciembre de 2006 apareció Asterisk 1.4 que ya contaba con:

Líneas de código fuente 250.463

Esfuerzo estimado de desarrollo (persona/año - persona/mes) 66,03 -792,30

Estimación de tiempo (años) 2,63

Estimación de número de desarrolladores en paralelo 25,08

Coste total estimado 8.919.128 $

Lenguajes de programación en Asterisk 1.4.0:

Las mejoras específicas que aparecian en Asterisk 1.4 eran:

• Generic Jitter Buffer: Mejora la calidad de una llamada durante un aumento de trafico de red. En todos los protocolos no sólo en IAX2 como en la 1.2.

• Asterisk Extension Language Version 2 (AEL2): Simplifica la programación y la configuración del plan de marcado (Dialplan).

• Soporte de T.38: Permite Faxes codificados con T.38 (FOIP).

• Jabber/Jingle/GoogleTalk: Soporte de clientes Jabber a través del protocolo Jingle (GoogleTalk).

• Mejora el soporte de idiomas: Ofrece nuevas características en Ingles, Español y Francés. Incluso nuevos sonidos y estructuras gramaticales.

Lenguaje Líneas de código Porcentaje

ANSI C 232.514 92,83%

sh 7.550 3,01%

cpp 5.815 2,32%

perl 2.259 0,90%

yacc 1.508 0,60%

asm 642 0,26%

tcl 113 0,05%

PHP 62 0,02%

101

• Mensajería unificada: Integra el buzón de voz, el correo electrónico y el fax en un único buzón donde los usuarios pueden enviar, recibir y manejar todos sus mensajes utilizando cualquier dispositivo compatible.

• Gestión en tiempo real del audio: Permite seleccionar y programar interrupciones en las llamadas para controlar el volumen y el ‘mute’ en tiempo real.

• Mejorado el soporte DTMF: Permite distinguir tonos de diferente longitud para nuevas opciones especiales.

• Codecs de video H.264 (Video llamadas 3G): Podremos realizar videoconferencias con la ultima tecnología de video compatible con la red móvil 3G.

• Soporte Radius en CDR: Para poder almacenar el registro de llamadas utilizando un servidor Radius.

• Interfaz web: Para que una oficina o un único usuario pueda configurar el servidor fácilmente.

• Monitorización de llamadas: Permite escuchar conversaciones de manera silenciosa, necesario para todo buen Call-Center o proveedor de VoIP.

• Mejora en el uso de la memoria: Hace un mejor uso de la mejoría ahorrando y potenciándola en aquellos casos en que sea necesario.

• Mejora en las transferencias: Los clientes SIP e IAX podrán hacer transferencias sin limitaciones e incluso transferir llamadas aparcadas (parked).

• Mejora en el protocolo IAX2: Mejora en las capacidades de este protocolo para transmitir audio y video permitiendo comunicación directa sin tener que pasar por el servidor, aunque manteniendo el control de llamadas.

• Programación automática de Eventos: Permite programar eventos y escucharlos durante una conversación reproduciendo archivos gsm o wav.

• Locales de fecha: Permite cambiar el formato de fecha y adecuarlo al formato deseado (no únicamente el formato ingles EEUU).

• Soporte de SCCP de Cisco: Permite utilizar los terminales de Cisco y así poder reutilizar dispositivos.

• Monitorización SNMP: Permite controlar, gracias a un cliente SNMP (mrtg, rrdtool, etc…), los datos de utilización, registros, llamadas, etc.

• Transparencia de protocolos: Soporta pasar codecs desconocidos en modo passthrougt (canreinvite=yes).

• Reconocimiento de voz: Utilizando un motor comercial podremos crear IVR utilizando la voz para introducir la opción elegida.

• Reproductor de texto a voz (TextToSpeech): Utilizando un motor comercial podremos crear locuciones dinámicamente con comandos especiales.

• Nueva estructura de compilación (make menuselect).

• Nuevas variables disponibles (como DIALSTATUS).

En octubre de 2008 aparece la primera release de Asterisk 1.6 ,bastante esperada y pese a que Asterisk 1.4 traía notables ventajas con respecto a la versión 1.2, en Asterisk 1.6 siguen apareciendo nuevas ventajas que harán las delicias de los usuarios, como por ejemplo:

102

• Realtime LDAP: Si bien Asterisk 1.4 tenía herramientas y parches para dotar a esta aplicación de soporte LDAP para gestionar los usuarios y contraseñas, parece ser que en Asterisk 1.6 vendrá de serie el soporte para Realtime en LDAP. Este es un sistema de directorios que nos permitirá mantener perfectamente clasificado y ordenado cualquier tipo de datos correspondientes a personas, recursos, empresas, etc., es un directorio especialmente creado para este tipo de información y son muchos los sistemas operativos y sus aplicaciones los que suelen utilizar este tipo de servicio de forma transparente para el usuario. Actualmente están corrigiendo muchos bugs en el soporte LDAP en Asterisk relativos a este sistema para poder dotar a Asterisk 1.6 de un control integro de usuarios mediante LDAP.

• SIP bajo TCP: Este es otro de los añadidos que traerá Asterisk 1.6 tras 3 años de pruebas (el bug comenzó en 2005) y es sin duda una de las mejoras que, de funcionar correctamente, podría convertirse en la ‘STAR FEATURES‘de Asterisk 1.6.

• SIP bajo TLS: Otro de los grandes avances en cuanto a seguridad en el protocolo SIP.

• DAHDI en vez de Zaptel.

• Mejorado el soporte NAT en el protocolo SIP.

• Chan_Mobile (Bluetooth y móviles).

Cierto es que llevamos varios años esperando que estos añadidos se conviertan de una vez por todas en funcionalidades estables, no obstante cabe recordar a todos que Asterisk pese a los esfuerzos de muchas empresas que dedican tiempo y recursos en desarrollar y corregir cada una de las partes que lo forman y pese a que hay muchísimo dinero moviéndose en torno a él tanto a nivel de Hardware, instalaciones, soluciones personalizadas, etc, también hay que entender que, hay un volumen altísimo de usuarios en comparación con el de desarrolladores por lo que se hace muy difícil coordinar todos estos esfuerzos para conseguir que todos los usuarios estén contentos.

En la actualidad Digium se centra en el desarrollo y mejora de la versión 1.6 mientras que la versión estable para producción, la versión 1.4, sólo recibe atenciones de soporte para las versiones comerciales.

Por otra parte las versiones 1.4.2X, las últimas que sacó Digium con la funcionalidad DAHDI ya implantada en vez de Zaptel, han resultado ser bastante decepcionantes en cuando a estabilidad.

103

En la actualidad a pesar que Digium trabaja para estabilizar Asterisk 1.6 ,para producción la versión 1.4 es la más estable y recomendable.

Estructura de directorios de Asterisk:

• /etc/asterisk: Contiene los ficheros de configuración. Si al compilar ejecutamos “make samples”, tendremos ejemplos en este directorio.

• /usr/lib/asterisk/modules: Contiene los módulos de Asterisk que hemos compilado.

• /var/lib/asterisk: Contiene diferentes “librerías” de Asterisk.

• /var/lib/asterisk/agi-bin: Directorio para contener los AGI.

• /var/spool/asterisk: Directorio para archivos que genera Asterisk (voicemail, etc.)

• /var/log/asterisk: Aquí se guardan los log de Asterisk.

Funcionalidad de Asterisk

El sistema Asterisk incorpora muchísimas funcionalidades avanzadas que tendrían un elevado coste en sistemas tradicionales propietarios.

Funciones básicas:

• Conexión con líneas de telefonía tradicional, mediante interfaces tipo analógico (FXO) para líneas de teléfono fijo o bien móvil y RDSI (BRI o PRI).

• Soporte de extensiones analógicas, bien para terminales telefónicos analógicos, terminales DECT o bien equipos de fax.

• Soporte de líneas (trunks) IP: SIP, H323 o IAX.

• Soporte de extensiones IP: SIP, SCCP, MGCP, H323 o IAX.

Funciones de llamada:

• Reglas de salida (OutBound Rules): definen las rutas que tomará una llamada saliente.

• DiD (Direct In Dial): son reglas que definen dónde irá una llamada de un determinado número telefónico.

104

• Transferencia (a cualquiera) y Transferencia atendida (a alguien determinado).

• Música en espera y en transferencia (ficheros MP3 actualizables por el usuario).

• Desvío de llamadas si está ocupado (Busy) o no contesta (No Answer).

• Llamada en espera (Hold).

• Identificador de llamante (CallerID).

• Bloqueo de llamante según identificador (CallerID).

• Opción No molestar (Do Not Disturb / DND).

• Retro llamada (Callback): llamada automática cuando esté disponible.

• Grupo de timbrado (Ring Group o Call Group): permite llamar al mismo tiempo a todos los teléfonos de un grupo. Los teléfonos del grupo también pueden consistir en números telefónicos externos como teléfonos móviles.

• Call Pickup: es el hecho de poder descolgar y responder a la llamada entrante a un teléfono o grupo de teléfonos determinado desde un tercer teléfono que no está sonando.

• Remote Pickup: permite coger llamadas de forma remota.

• Colas (Queue): almacenes de llamadas entrantes. Así, las personas que llaman pueden esperar la respuesta de alguien en lugar de obtener una señal de ocupado o ser forzadas a dejar un mensaje. Esta extensión también puede decir a la persona que llama su lugar en la cola y el tiempo estimado de espera. Es posible establecer prioridades de forma que ciertas personas no esperen tanto.

• Parking de llamadas (Call Parking): permite transferir la llamada a un 'parking' virtual. Pudiendo colgar sin que la llamada origen sea desconectada de Asterisk, ya que se encontrará aparcada.

• Megafonía a través del altavoz del teléfono (Paging).

• Espiar llamadas (Call snooping): permite escuchar una llamada, sin que la

persona que ha llamado se dé cuenta.

• Call Whisper: permite intervenir en una llamada de forma que la persona que

ha llamado no escucha nada.

105

Funciones avanzadas:

• Buzón de Voz (Voicemail): sistema de contestador automático personalizado por usuario. Se integra con el sistema de directorio (LDAP) y con el email. Los buzones pueden ser individuales o para todo un grupo de personas.

• Gestión del buzón de voz mediante el terminal telefónico y página web.

• Sistema de Audio conferencias (Web MeetMe): Sistema que permite la conexión remota de 2 o más usuarios que quieren mantener una reunión virtual y suministra la correcta gestión y control de los usuarios que se incorporan a ella.

• IVR (Interactive Voice Response): Operadora Automática. Sistema automatizado de respuesta que permite redirigir las llamadas entrantes en función de las opciones seleccionadas por el llamante.

• Informes detallados de llamadas (CDR): Detalle de llamadas realizadas o recibidas por extensión, para imputación de costes departamentales, por cliente o incluso para facturación.

• ACD: Sistema Automático de Distribución de Llamadas entrantes. Pensado para Centros de Llamadas para atención comercial o soporte técnico.

• CTI: Integración con sistemas de gestión comercial o de atención al cliente (CRM).

• Extensiones Remotas: para poder aceptar un usuario remoto teniendo en cuenta el funcionamiento de NAT con los protocolos utilizados por Asterisk (IAX y SIP).

• Sistema DISA. (método por el cual una persona externa a la oficina puede realizar llamadas a través de la centralita).

• Grabación de llamadas entrantes y salientes.

• AMI (Asterisk Management Interface): gestión y control remoto de Asterisk.

• Monitorización de llamadas en curso.

• Gestión de listas negras (números telefónicos con acceso prohibido).

• LCR (Least Cost Routing): encaminamiento de llamadas por el proveedor VoIP más económico.

106

• AGI (Asterisk Gateway Interface): integración con todo tipo de aplicaciones externas.

• Configuración en base de datos: usuarios, extensiones, proveedores, etc.

• Interfaz gráfica de administración (GUI).

• Acciones a realizar según horarios y fechas (horario laboral, días festivos, etc.). Posibilidad de integración con Google Calendar.

• Posibilidad de integrar un sistema de llamadas pre-pago (solución para locutorios telefónicos).

• Detección automática de faxes y recepción de fax desde el propio sistema y posterior envío por e-mail.

• Almacenamiento y recuperación en Base de Datos.

• Integración de Festival: aplicación que pasa de texto a voz.

• Soporte de vídeo (Asterisk 1.6: “the video release”).

Modificación de funciones:

En el caso de que se desee cambiar horarios o mensajes, añadir nuevas extensiones, modificar los desvíos, cambiar los buzones de correo para los mensajes de voz, o cualquier otra funcionalidad, solamente habría que modificar los archivos de configuración (extensions.conf, sip.conf, features.conf, meetme.conf, manager.conf e iax.conf) y hacer las pruebas necesarias.

Funcionalidad en servidores SIP:

Desde el punto de vista de la clasificación funcional de servidores SIP, las funcionalidades de Asterisk son varias:

� Por una parte, hace función de Registro y Localización de Servidor, ya que acepta peticiones de registro de los usuarios y suministra un servicio de localización y traducción de direcciones en el dominio que controla.

� Por otro lado, también hace función de Proxy Server con estado (Stateful

Proxy), ya que conoce en todo momento el estado de la llamada y posee funcionalidades que dependen del estado de la llamada como servicios de respuesta automática (Interactive Voice Response, IVR) que le permiten actuar sobre el flujo RTP (Real Time Protocol), que es el que contiene la comunicación de voz.

107

Cabe recordar que en contraste con este tipo de Proxy nos encontramos los Proxy server sin estado (Stateless Proxy) como SER (SIP Express Router), que no tienen sentido más que para redes completamente SIP, ya que solo conocen y actúan sobre los paquetes SIP que negocian las direcciones IP, los puertos a utilizar, el códec a utilizar,…, pero no sobre el flujo RTP.

Arquitectura de Asterisk

� Esquema:

� Partes de Asterisk :

108

� Arquitectura de Asterisk:

Está formada por cuatro APIs: API de Canales, de Aplicaciones, de Traducción de Codecs y de Formatos de Ficheros. Un API es el conjunto de funciones y procedimientos que ofrece cierta biblioteca para ser utilizado por otro Software como una capa de abstracción. Usando este sistema basado en APIs, la base del Asterisk no tiene porqué preocuparse por detalles como, que llamada está entrando, que códec se está utilizando, etc.

Descripción de las APIs:

� API de Canales Asterisk:

Maneja el tipo de conexión al cual el cliente está llegando, sea una conexión VoIP, ISDN, PRI, o alguna de otro tipo de tecnología. Módulos dinámicos son cargados para manejar los detalles más bajos de la capa de estas conexiones.

� API de Aplicaciones Asterisk: Permite a varios módulos de tareas cumplir varias funciones, multiconferencias, lista de directorios, buzones de voz, aplicaciones personalizadas, etc.

109

� API de traducción de Codecs:

Carga módulos, codecs, para apoyar varios tipos de audio, codificando y decodificando formatos tales como G711, G729, GSM23, etc.

� API de formato de ficheros Asterisk:

Maneja la lectura y escritura de varios formatos de archivos para el almacenaje de datos en el sistema de archivos.

Usando estas APIs Asterisk alcanza una completa abstracción entre sus funciones básicas y las diferentes tecnologías y aplicaciones relacionadas. La formula modular es lo que le permite al Asterisk integrar Hardware de telefonía implementado y tecnología de paquetes de voz emergentes hoy en día.

La aplicación API provee el flexible uso de aplicaciones modulares para realizar cualquier acción flexible en demanda, también permite un desarrollo abierto de nuevas aplicaciones para satisfacer necesidades o situaciones únicas.

En conclusión, cargar todo el uso como módulos permite un sistema flexible, permitiéndole al administrador diseñar la mejor y más satisfactoria trayectoria para los usuarios en el sistema PBX y también modificar la trayectoria de llamadas para satisfacer las distintas necesidades.

Concepto de Canal:

Canal: Es una conexión que conduce una llamada entrante o saliente en el sistema Asterisk. La conexión puede venir o salir hacia telefonía tradicional analógica o digital o VoIP.

Asterisk soporta una serie de canales, los más importantes:

� H323, IAX2, SIP, MGCP (Protocolos de VoIP). � Zap: Líneas analógicas y digitales. � misdn: RDSI

110

Dialplan de Asterisk

El Dialplan es realmente el corazón de cualquier sistema Asterisk, ya que define de la configuración de la centralita indicando el itinerario que sigue una llamada desde que entra o sale del sistema hasta que llega a su punto final. En pocas palabras, consiste en una lista de instrucciones o pasos que componen el comportamiento lógico de la centralita. A diferencia de los sistemas de teléfono tradicionales, el Dialplan de Asterisk es plenamente personalizable. Para poder crear tu propio sistema de Asterisk, se necesita entender el Dialplan.

La Sintaxis del Dialplan

El Dialplan de Asterisk se especifica en el archivo de configuración extensions.conf que reside en el directorio /etc/asterisk/ pero su ubicación puede variar dependiendo de la instalación de Asterisk. Otros lugares comunes para incluir este archivo:

/usr/local /asterisk/etc/ /opt/asterisk/etc/

Puede encontrar los archivos de configuración de ejemplo (extensions.conf.sample) en el fichero configs de la carpeta /usr/src/asterisk/asterisk-1.4.26.1. El Dialplan se compone de cuatro conceptos principales:

�Contextos �Extensiones �Prioridades �Aplicaciones

Contextos

El Dialplan se divide en uno o varios contextos. Un contexto es una colección de extensiones. Los contextos existen para poder diferenciar el 'lugar' donde se encuentra una llamada, por ejemplo para aplicar políticas de seguridad. Y es que Asterisk no se comporta igual cuando llama un usuario y marca el 1 que cuando un usuario local marca el 1. En general, es una forma de diferenciación. Una extensión definida en un contexto está completamente aislada de las extensiones de cualquier otro contexto. Es posible una iteración entre contextos a través de la palabra “include”.

111

Los contextos se caracterizan por colocar el nombre del contexto dentro de corchetes ([]).El nombre puede estar formado por las letras desde la A hasta la Z (mayúsculas y minúsculas), los números del 0 al 9, el guion de subrayado (_) y el punto (.) (No use espacios en los nombres de su contexto).La longitud máxima es de 79 caracteres (80 caracteres -1 de terminación nula). Por ejemplo: [incoming] Todas las instrucciones después de la definición de un contexto son parte de ese contexto, hasta que el siguiente contexto se define. Al comienzo del Dialplan, hay dos contextos especiales:

�El [general] que contiene una lista de ajustes generales del Dialplan (que probablemente no tenga que preocuparse por el).

�El [globals], la sección de "variables globales" por ahora es importante saber que estos dos contextos son especiales.

Debemos evitar nombrar a nuestros contextos con esos nombres. Cuando se define un canal, uno de los parámetros que se define en el canal es el contexto. En otras palabras, el contexto es el punto donde las conexiones de canal van a comenzar. Otro uso importante de los contextos (quizás el más importante) es para garantizar la seguridad. Mediante el uso correcto de contextos, puede tener acceso a ciertas características que no están a disposición de los demás. Si su Dialplan no ha sido diseñado cuidadosamente, puede permitir que otras personas inadvertidamente utilicen fraudulentamente el sistema. En /usr/src/asterisk/asterisk-1.4.26.1/doc/ se encuentra un archivo muy importante, security.txt, que describe varios pasos que debes tomar para mantener su sistema seguro de Asterisk. Es de vital importancia que se lea y entienda este archivo. Include Asterisk tiene una característica que nos permite utilizar las extensiones de un contexto dentro de otro contexto, a través de la directiva include. Este es usado para controlar el acceso a diferentes secciones del Dialplan. include => contexto Cuando se incluyen otros contextos dentro de nuestro contexto actual, tenemos que ser conscientes de él orden en el que estamos incluyéndolos.

112

[empleados] include => context1

Extensiones

En el mundo de las telecomunicaciones, la palabra extensión se refiere generalmente a un número identificador que posibilita que un teléfono particular suene en una línea. En Asterisk, una extensión es una lista de comandos a ejecutar. Dentro de cada contexto, podemos definir muchas (o pocas) extensiones, según sea necesario.Se accede a las extensiones cuando:

� Se recibe una llamada entrante por un canal dado. � El usuario que ha llamado marca la extensión. � Se ejecuta un salto de extensiones desde el Dialplan de Asterisk.

La sintaxis: exten => Seguido de esto se pone el nombre (o número) de la extensión. Cuando se trata de sistemas de telefonía tradicionales, tendemos a pensar en los números que se marcan para que otro teléfono suene. En Asterisk, se utilizan nombres de extensión que pueden ser cualquier combinación de números y letras. La asignación de nombres a las extensiones puede parecer un concepto revolucionario, la marcación por nombre o dirección de correo electrónico en lugar de solo marcación de un número, tiene un perfecto sentido. Esta es una de las características de Asterisk que lo hace tan flexible y potente. Una extensión se compone de tres componentes:

• El nombre (o numero) de la prorroga. • La prioridad (cada extensión puede incluir varios pasos, el nº del paso se llama "prioridad"). • La aplicación (o comando) que lleva a cabo.

Estos tres componentes están separados por comas, de esta forma:

exten => nombre, prioridad, aplicación() exten => 123,1, Answer ()

Extension “s” Cuando pide entrar en un contexto sin un destino de extensión especifico (por ejemplo, una señal de línea FXO), se pasa a la extensión “s”. (La s significa "comienzo")

113

[incoming] exten => s, 1, aplicacion() exten => s, 2, aplicacion() exten => s, 3, aplicacion()

Manejo de las entradas no validas (i) y tiempos (t) En primer lugar, necesitamos una extensión de las entradas no validas, cuando se pulsa una tecla no valida, la llamada se envía a la extensión “i”. En segundo lugar, necesitamos una extensión para manejar situaciones cuando la persona que llama no pulsa a tiempo ,(el tiempo de espera predeterminado es de 10 segundos) la llamada se envía a la extensión “t”:

[incoming] exten => 123,1, Answer() exten => 123, 2, Background(entrar-ext-de-persona) exten => 123, 3, WaitExten() exten => i, 1, Playback(pbx-invalid) exten => i, 2, Goto(incoming, 123,1) exten => t, 1, Playback(vm-adios) exten => t, 2, Hangup()

El uso de la i y la t hace que nuestro Dialplan sea un poco más robusto y fácil de usar.

Prioridades

Cada extensión puede tener varias etapas, llamadas prioridades. Cada prioridad esta numerada empezando con 1, y ejecuta una aplicación especifica. Por ejemplo, la prorroga Answer (de prioridad 1) y, a continuacion, Hangup (de prioridad 2):

exten => 123,1, Answer() exten => 123,2, Hangup ()

El punto clave a recordar aquí es que una extensión de Asterisk sigue las prioridades en orden. No numerar las prioridades

En emisiones mayores de Asterisk, la numeración de las prioridades ha causado muchos problemas. Imagine tener una extensión que tenia 15 prioridades, y luego tener que añadir algo en la 8. Todas las prioridades desde la posterior tendrían que ser modificadas manualmente. Asterisk no maneja los pasos que faltan o renombra prioridades, y la depuración de estos tipos de errores es inútil y frustrante. A partir de la versión 1.2, en Asterisk se

114

aborda este problema introduciendo el uso de la prioridad “n”, que significa "próximo". Cada vez que encuentra una prioridad n, Asterisk calculará el próximo número de prioridad aumentando 1 la prioridad anterior.Esto hace que sea más fácil hacer cambios en su Dialplan, al no tener que reenumerar en sus cambios. Tener en cuenta que la prioridad 1 sí que es necesaria poner.

exten => 123,1, Answer() exten => 123, n, Hangup()

Prioridades con etiquetas (label)

A partir de la versión de Asterisk 1.2, una práctica común es asignar etiquetas de texto a las prioridades. Esto es para asegurar que se puede hacer referencia a una de las prioridades sin saber su número ya que se ha utilizado la numeración con “n”. Para asignar una etiqueta de texto a una prioridad, solo tiene que añadir la etiqueta entre paréntesis después de la prioridad, de esta forma:

exten => 123, n(label), aplicacion() Un error muy común al escribir las etiquetas es insertar una coma entre n y el paréntesis de esta forma:

exten => 123, n,( etiqueta), aplicacion()

Aplicaciones

Las aplicaciones son las acciones del Dialplan. Cada aplicación realiza una acción sobre el canal actual, tales como la reproducción de un sonido, la aceptación de tonos de entrada, marcar un canal, colgar la llamada, y así sucesivamente. En el ejemplo se presentaron dos aplicaciones sencillas: Answer() y Hangup(). Algunas aplicaciones, como Asnwer() y Hangup(), no necesitan instrucciones para hacer su trabajo. Otras aplicaciones requieren información adicional. Estas piezas de información, llamadas argumentos, pueden ser transmitidas a las aplicaciones para afectar la forma en que realizan sus acciones. Para pasar argumentos a una aplicación, entre paréntesis y separados por comas. Ocasionalmente, también puede aparecer el carácter tubería (|) que se utiliza como un separador entre argumentos, en lugar de una coma. Algunas aplicaciones básicas son:

- Wait (n): Espera n segundos, ignorando los dígitos marcados durante.

- WaitExten(n):Espera n segundos, pero gestionando los dígitos marcados.

- WaitMusicOnHold(n):Reproduce música en espera durante n segundos.

- Answer(): Acepta la llamada entrante por el canal.

115

- Busy(): Envía la señal de ocupado al origen.

- Hangup(): Cuelga la llamada.

- Ringing(): Envía la señal de tono de llamada.

- Dial ( tipo/identificador,timeout,opciones,url ): Aplicación para llamar.

- Goto (contexto, extension, prioridad): Salta al contexto, extensión y prioridad del argumento.

- GotoIf ( condicion ? prioridad1 : prioridad2 ): Salta a la prioridad1 si la condición se cumple. Salta a la prioridad2 si la condición no se cumple.

- GotoIfTime(<times>|<weekdays>|<mdays>| <months>?[[context|]exten|]priority): Igual que GotoIf teniendo en cuenta la fecha y hora actual.

- PlayBack (fichero ): Reproduce el fichero, continua la ejecución cuando finaliza.

- Background (fichero): Reproduce el fichero, pero continua la ejecución inmediatamente.

- SayDigits ( dígitos): Reproduce los dígitos Para ver la lista completa de las aplicaciones de Asterisk.

Uso de variables

Las variables pueden ser utilizadas en el Dialplan de Asterisk para ayudar a reducir la mecanografía, añadir claridad, o añadir características adicionales a la lógica de Dialplan. Para hacer referencia a la variable, simplemente escriba el nombre de ella, si lo que desea hacer es referencia a su valor, usted debe escribir un signo de dollar. exten => 555,1, Dial ($ {JUAN}) : Al marcar 555 llamariamos por el canal y al numero

establecido en esa variable.

Tipos de variables :

Variables globales:

Como su nombre indica, las variables globales se aplican a todas las extensiones en todos los contextos.Las variables globales deben ser declaradas en el contexto [globales], en el inicio del archivo extensions.conf, aunque también pueden ser definidas mediante programación, utilizando la GLOBAL ().

[globals] JUAN = Zap / 1 [empleados] exten => 124,1, Set (GLOBAL (GEORGE) = SIP / George)

116

Variables de canal:

Una variable de canal es una variable que se asocia sólo con una llamada en particular. Hay muchas variables predefinidas de canal disponibles para su uso en el Dialplan, que se explican en el channelvariables.txt en usr/src/asterisk/asterisk-1.4.26.1/doc.

Se definen a través de la aplicación SET() :

exten => 125,1, Set (MAGICNUMBER = 42)

Algunas de las variables más importantes son:

- ${CALLERID}: Caller ID actual, nombre y número.

- ${CONTEXT}: Contexto actual.

- ${EXTEN}: Extensión actual.

- ${CHANNEL}: Canal actual.

- ${DIALSTATUS}: Estado de la llamada: UNAVAILABLE, CONGESTION, BUSY, NOANSWER, ANSWERED, CANCEL o HANGUP.

- ${DATETIME}: Hora actual.

Variables de entorno

Variables de entorno son una forma de acceder a variables de entorno Unix en Asterisk. Estas son referenciadas mediante la aplicación ENV() .

La sintaxis :

ENV {$ (var)}, donde var es la variable de entorno Unix que desee referenciar.

Las variables de entorno no son comúnmente utilizadas en Dialplan´s de Asterisk, pero están disponibles si las necesitas.

Coincidencia de patrones

Los patrones permiten crear una extensión en su Dialplan que coincide con muchos números diferentes.

Sintaxis:

Los patrones siempre empiezan con un guion bajo (_). Después puede utilizar uno o más de los siguientes caracteres:

�X : Coincide con cualquier digito del 0 al 9.

117

�Z : Coincide con cualquier digito del 1 al 9. �N : Coincide con cualquier digito del 2 al 9. �[1,5-7] : Coincide con un solo digito a partir de la serie de dígitos especificado. En este caso, el patrón coincide con 1, 5,6, o 7. �. (punto) : Comodín , coincide con uno o mas caracteres, no importa lo que son. �! (bang) : Comodín , coincide con cero o mas caracteres, no importa lo que son.

Esta expresión nunca���� “ _.” De hecho, Asterisk le avisara si intenta volver a utilizarlo. En cambio, utilizar este si es posible: _X.

Para utilizar la concordancia mediante patrones en su Dialplan, simplemente poner el patrón en el lugar de la extensión (nombre o número):

exten => _NXX, 1, PLayback (thankyou) : Al marcar un número entre 200 y 999 º se escucha el sonido de thankyou.gsm. Otra cosa importante a saber acerca de patrones de Asterisk es que si se encuentra más de un patron que coincida con lo pulsado, se utilizará el más especifico. Supongamos que ha definido los siguientes dos modelos, y marca 555-1212 .

exten => _555XXXX, 1, Playback (digitos / 1) exten => _55512XX, 1, Playback (digitos / 2)

En este caso, la segunda prorroga, porque es mas especifica.

Usando la variable de canal $ (EXTEN):

exten => _XXX, 1, SayDigits ($ {EXTEN}) ; la aplicacion SayDigits () muestra los 3 ;últimos dígitos marcados.

�${EXTEN: x}

x es el lugar donde se desea que la cadena volvio a empezar, de izquierda a derecha.

EXTEN es 95551212 ${EXTEN:1} = 5.551.212

�${EXTEN: x: y}

118

x es el inicio , e y es el numero de dígitos a regresar. EXTEN es 94169671111 $ {EXTEN:1:3} = 416. $ {EXTEN:4:7} = 9671111. $ {EXTEN:-4:4} = 1111 (comenzaría cuatro dígitos desde el final).

Esta es una construcción muy potente, pero la mayoría de estas variaciones no son muy comunes en uso normal.

Manipulación de expresiones y operadores

Expresiones básicas

Las expresiones son combinaciones de variables, operadores, y cadenas de valores para producir un resultado. Una expresión puede mostrar valores, alterar las cadenas, o realizar cálculos matemáticos. Cada una de estas expresiones tiene un resultado o valor, dependiendo del valor de las variables o las cadenas. Sintaxis: $ [expresion] Ejemplos:

$ [$ {COUNT}+ 1] $ [$ {COUNT} / 2]

Operadores

Símbolos que permiten manipular las variables.

Operadores booleanos Estos operadores evalúan si la expresión es cierta o no.

� expr1 | expr2: Este operador (llamado "or" o "pipe") devuelve 1 si la expr1 es verdadera (no es una cadena vacía ni cero). De lo contrario, devuelve la evaluación de expr2.

�expr1 & expr2: Este operador (llamado "and") devuelve 1 si las dos

expresiones son verdaderas (es decir, ninguna expresión es cadena vacía o cero). De lo contrario, devuelve 0.

�expr1 {=,>,> =, <, <=,! =} expr2: Estos operadores retornan el resultado de la

comparación de las dos expresiones sean enteros o

119

cadenas .El resultado de cada comparación es 1 si la relación es cierta , o 0 si la relación es falsa.

Operadores matemáticos

�expr1 (+, -) expr2

�expr1 (*, /,%) expr2 Operadores de expresión regular

�expr1: expr2 : Siendo expr2 un expresión regular comprueba si expr1 es una expresión o subexpresión regular de expr2 ,si lo es la devuelve sino devuelve 0.

Funciones del Dialplan

Las funciones le permiten calcular la longitud de cadena, fechas y horas,…,todo dentro de una expresión. Sintaxis: Function_name (argumento) Al igual que las variables, para referenciar el valor de la función se usan argumentos:

$ {Function_name (argumento)} Las funciones también pueden encapsular otras funciones:

${FUNCTION_NAME(${FUNCTION_NAME(argument)})} Para obtener una lista completa de funciones disponibles:

*CLI> core show functions

Configuración para canales de VoIP: SIP e IAX2

Los ficheros a manipular son sip.conf e iax.conf, la instalación crea ficheros de ejemplo con la sintaxis bastante comentada a modo de guía. En sip.conf se definen:

– Variables generales de SIP. – Clientes SIP. – Servidores SI

120

En sip.conf también se definen tanto los clientes que se conectarán a Asterisk, como los proveedores que se utilizaran para encaminar llamadas. Conceptualmente, se distinguen:

– user: Envia llamadas a Asterisk – peer: Recibe llamadas de Asterisk (proveedor). – friend: Recibe y Envía llamadas (usuario).

Un ejemplo básico del archivo sip.conf:

[general] context=default port=5060 ; Puerto UDP en el que responderá el Asterisk . bindaddr=0.0.0.0 ; Si queremos especificar que Asterisk esté en una IP (si un ; equipo tiene 3 IPs .por ej.) 0.0.0.0 vale para cualquiera. srvlookup=yes ; Habilita servidor DNS SRV. [david] type=friend ;puede recibir y hacer llamadas. secret=1234 qualify=yes ;Tiempo de latencia no superior a 2000 ms. nat=no host=dynamic ; El dispositivo se registra con una IP variante . canreinvite=no ; Asterisk por defecto trata de redirigir. context=internal ; El contexto que controla todo esto.

Igual que tenemos para el protocolo SIP el fichero sip.conf, también tenemos el fichero iax.conf para el protocolo IAX2. En este fichero se definen:

– Variables generales de IAX. – Clientes IAX. – Servidores IAX.

Un ejemplo básico del archivo iax.conf:

[general] bindport = 4569 ;Puerto de IAX bindaddr = 0.0.0.0

disallow=all ;Para permitir la utilizacion de codecs primero hay que ;desabilitar todos

allow=ulaw allow=alaw allow=gsm [david] type=friend

121

username=david secret=1234

host=192.168.1.30 context=fromiax

qualify=yes

Verificación de la configuración con el CLI. Para ver los usuarios sip e iax: *CLI>sip show peers *CLI>iax show peers

Buzones de voz (Voicemail)

Uno de los servicios más interesantes de las PBX, Asterisk implementa un sistema de buzones de voz bastante flexible. Algunas características de este servicio:

- Ilimitados contenedores voicemail con protección de password, contenidos en carpetas.

- Saludos diferentes para los estados busy y unavailable.

- Saludos configurables.

- Habilidad de asociar un telefono con varios voicemail's y un voicemail con varios telefonos.

- Posibilidad de envio al correo electrónico con el archivo de sonido como adjunto.

La configuración se hará en el archivo voicemail.conf (en /etc/asterisk/). Aquí deberemos definir los contextos y contenedores voicemail. A continuación vamos a ver una configuración básica. La configuración avanzada se encuentra en el apartado “Configuración de Asterisk”.

Creación de mailbox

En el contexto de voicemail definimos diferentes mailbox cuya sintaxis es:

mailbox => password,name[,email[,pager_email[,options]]] En la que:

mailbox: Este es el número de buzón. Por lo general, se corresponde con una extensión.

password: Esta es la contraseña numérica que el propietario del buzón usara para acceder a su buzón de voz. name: Este es el nombre del propietario del buzón. email: Esta es la dirección de correo electrónico del propietario del buzón.

122

Asterisk puede enviar notificaciones de voz a la casilla de correo. pager_email: Esta es la dirección de correo electrónico del pager o teléfono

celular. Asterisk puede enviar un breve mensaje de notificación de voz a la dirección de correo electrónico especificada.

options: Este campo es una lista de opciones que establece el propietario del buzón de la zona horaria y redefiniciones de configuración de voz.

Hay nueve opciones validas: attach, serveremail, tz,ssaycid, review,operator, callback, dialout,y exitcontext. Estas opciones deben estar en pares option = value , separados por el carácter tubería (|). La opción tz establece la zona horaria del usuario a una zona horaria previamente definida en el contexto [zonemesages] en voicemail.conf, y las otras ocho opciones son sobre el voicemail.

Un ejemplo de mailbox podría ser algo como esto:

101 => 1234,David,[email protected],tz=central|attach=yes

Añadir el voicemail al Dialplan

Para ello, vamos a utilizar VoiceMail(). VoiceMail() : aplicación que envía al llamante un mensaje. El buzón debe ser

especificado como mailbox@context (el contexto por defecto es default). Si se utiliza la letra b, la persona que llama escuchara el mensaje de ocupado. Si se usa la letra u, la persona que llama escuchará el mensaje de no disponible (si existe).

exten => 101,1,Dial(${JOHN},10) ; después de 10 segundos pasa al voicemail exten => 101,n,VoiceMail(101@default,u)

Acceso al voicemail

Los usuarios pueden recuperar sus mensajes de correo de voz, cambiar sus opciones de voz, y grabar sus saludos de voz utilizando el VoiceMailMain().

exten => 700,1, VoiceMailMain() :accedes al buzon de voz del llamante.

Marcación por nombre de directorio

Una última característica del sistema de correo de voz de Asterisk es la de marcación por nombre de directorio. Esto se crea con Directory(). Esta aplicación utiliza los nombres definidos en los mailbox de voicemail.conf . Sintaxis: Directory (voicemailcontext,context,options)

� voicemailcontext: El contexto voicemail para leer los nombres.

123

� context: El contexto opcional del dialplan para llamar al usuario. � options: Por defecto se busca el usuario por apellido. Con la opción “f” se busca por nombre. Con la opción “e” se busca por extensión.

Se solicita al usuario que introduzca por teclado las 3 primeras letras del nombre/apellido/extension del empleado.

Audio en Asterisk

Reproducción

El audio en Asterisk juega un papel importante. En el mundo de las PBX tradicionales es habitual que mientras el llamante no llega a su destino se le entretenga con musica en espera. Ademas la reproduccion de audio es necesaria para la construccion de sistemas IVR. Asterisk, en su instalacion, facilita algunos sonidos comunes para, por ejemplo, el buzon de voz, o para notificar fallos de la red (el usuario no se encuentra, etc), aunque podemos llevar esto mucho mas alla, mediante Festival y otras aplicaciones.

Música en Espera

Asterisk puede poner un canal dado en espera ('HOLD'), principalmente en las siguientes situaciones:

- Durante una transferencia.

- Durante una llamada si se ha especificado el parámetro 'm', que indica que no se oirá tono de llamada sino música en espera.

- Durante una espera en el parking.

- Si la aplicación MusicOnHold o WaitMusicOnHold ha sido llamada desde el DialPlan.

- Si el destino de la llamada ha solicitado explícitamente que la llamada sea puesta en espera.

Es posible tener distintos tipos de música en espera. La música en espera se configura en musiconhold.conf en /etc/asterisk/. La configuración de este archivo se encuentra en el apartado “Configuración de Asterisk”.

Aplicación Festival

La aplicación Festival en un TTS, es decir un sistema de síntesis de voz. Si queremos crear un menú de voz, saludos de bienvenida, leer archivos de texto, entonces es que lo necesitamos.

Para que Festival se integre en Asterisk, antes de compilar la centralita tenemos que instalar dos paquetes:

124

yum install festival festival-devel

Para averiguar que el modulo de festival esté correctamente cargado en asterisk, desde la consola de la centralita:

*CLI> module unload app_festival == unregistered application 'festival'

*CLI> module load app_festival == parsing '/etc/asterisk/festival.conf': == found == registered application 'festival' loaded app_festival => (simple festival interface)

Si aparece algún tipo de error significa que el modulo no ha sido compilado y tenemos que volver a la compilación de Asterisk.

Festival tiene como idioma predefinido el ingles. Para agregarle el idioma español hay que seguir estos pasos:

cd /usr/share/festival/voices wget http://www.voztovoice.org/tmp/festival-spanish.zip yum install unzip unzip festival-spanish.zip

Ahora modificamos el archivo de configuración de festival

nano /usr/share/festival/festival.scm

añadimos estas líneas:

;(language__spanish) (set! voice_default 'voice_el_diphone)

(define (tts_textasterisk string mode) "(tts_textasterisk string mode) apply tts to string. this function is specifically designed for

use in server mode so a single function call may synthesize the string. this function name may be added to the server safe functions."

(let ((wholeutt (utt.synth (eval (list 'utterance 'text string))))) (utt.wave.resample wholeutt 8000) (utt.wave.rescale wholeutt 5) (utt.send.wave.client wholeutt)))

Guardamos el archivo y modificamos el archivo de configuración de festival en asterisk:

nano /etc/asterisk/festival.conf

estas son la líneas que hay que modificar/activar:

125

[general] host=localhost port=1314 festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n

Guardamos el archivo y reiniciamos Asterisk. Ahora vamos a añadir unas cuantas líneas en extensions.conf.

nano /etc/asterisk/extensions.conf

exten => 650,1,Answer() exten => 650,n,Festival(lo conseguiste!!!) exten => 650,n,Hangup()

Codecs y carga de CPU

En principio Asterisk puede reproducir de muchisimos codecs (GSM,G711,G729,MP3) y de archivos de audio sin codificar (WAV), siempre que nos sea posible deberiamos pasar cualquier archivo que queramos reproducir a WAV, pues decodificar es un trabajo que puede cargar mucho a la CPU con cada reproduccion. Aunque tambien es cierto que un archivo codificado ocupa bastante menos que uno que no lo está, pero sacrificamos espacio por cantidad de llamadas que pueden ser atendidas.

¿Qué uso se da de los Códecs de audio en Asterisk?

• Sirven para digitalizar la voz humana.

• Cuando dos dispositivos van a establecer una comunicación, acuerdan el códec a utilizar.

Factores importantes a la hora de seleccionar un códec:

– Calidad de audio. – Coste computacional. – Gasto de ancho de banda.

Comparación de ancho de banda utilizado por los códecs:

Códec & Bit Rate (Kbps) Bandwidth Ethernet(Kbps)

G.711 (64 Kbps) 87.2 Kbps

G.729 (8 Kbps) 31.2 Kbps

G.723.1 (6.3 Kbps) 21.9 Kbps

G.723.1 (5.3 Kbps) 20.8 Kbps

G.726 (32 Kbps) 55.2 Kbps

126

Los proveedores VoIP suelen trabajar en G.729, que consume muy poco ancho de banda y no sería viable utilizar G.711 por ejemplo. El códec G.729 no es libre, cada licencia de G.729 para un canal es de 10$ pero hay una implementación que puede utilizarse con fines no lucrativos o educacionales, tanto de este códec como del G.723.1, en el siguiente enlace:

http://asterisk.hosting.lv/. Para comprobar cuántos codecs soporta Asterisk : *CLI> core show codecs audio Para comprobar el coste de transcoding :

*CLI> core show translation

Asterisk no soporta por defecto la reproduccion de mp3, puedes activarla compilando el paquete de addons y activando el soporte para MP3, o instalando el paquete de tu distribucion.

Definir un idioma

Un idioma en Asterisk es un conjunto de sonidos colocados en el directorio de sonidos de Asterisk (revisa /etc/asterisk/asterisk.conf). Se puede definir un lenguaje en el archivo de configuracion del canal (por ejemplo sip.conf o iax.conf) o utilizando Set(CHANNEL(language)=idioma) que cambia el idioma para la llamada en curso. Esto permite que aplicaciones que reproducen sonidos, como Playback(), SayDigits() o SayNumber() puedan hacerlo en el idioma del llamante. Es bastante comun definir un idioma global (español , por ejemplo) y para ciertos contextos, (entrantes-internacionales) ponerlo a un idioma más apropiado como ingles.

Castellanizar Asterisk Por defecto las voces que incluye Asterisk están en Inglés, el lenguaje universal, pero a veces para la perfecta compresión de algunas de las diversas funcionalidades de Asterisk, como el buzón de voz, es necesario tener las voces en Castellano. Con estos sencillos pasos lo conseguiremos:

• Añadir lo siguiente al fichero asterisk.conf (en /etc/asterisk/):

[options]

G.726 (24 Kbps) 47.2 Kbps

G.728 (16 Kbps) 31.5 Kbps

127

languageprefix = yes

• Incluir la línea “language=es” en los ficheros de configuración. (sip.conf, iax.conf, extensions.conf, voicemail.conf,...,diposnibles en /etc/asterisk/).

• Editar el fichero indications.conf, poniendo “country=es”.

• Ficheros de sonido en castellano:

- http://www.voipnovatos.es/voces/

- Descargamos en formato gsm, alaw, g729, ...

- Editar árbol de directorios (todo cuelga de “es”)

- Copiar a /var/lib/asterisk/sounds/es/

Grabación

Para la grabación no hace falta ninguna aplicación especial, podríamos coger cualquier aplicación de audio como Audacity o una grabadora de sonidos. No obstante, Asterisk incorpora una serie de aplicaciones para la grabación en el sistema telefónico. Esto puede utilizarse para crear una macro que reproduzca un mensaje de bienvenida personalizado por el usuario. Aplicación para la grabación La aplicacion Record() graba en un archivo la voz del llamante. Sintaxis: Record(nombre.formato[,silencio,duracion_maxima,opciones]) Podemos utilizar %d en el nombre del fichero, así se utilizará un índice auto-incremental, para no sobrescribir grabaciones. El nombre del fichero queda guardado en la variable ${RECORDED_FILE}.

exten => ext1,n,Record(sonido-asterisk%d.alaw)

Legalidad en la grabación de llamadas La legislación actual en España determina que:

• Es ilegal grabar o escuchar una conversación en la que uno no es parte, y los demás desconocen la grabación o escucha.

• Es legal grabar una conversación en la que uno es parte, pero es ilegal facilitar esa grabación a un tercero que no haya sido autorizado por los que participaron en la conversación.

El Tribunal Constitucional lo deja bien claro en su sentencia del 29 de Noviembre de 1984,STC 11/1984,cuando establece, entre otras consideraciones que:

128

“Quien graba una conversación de otros atenta, independientemente de toda otra

consideración, al derecho reconocido en el art. 18.3 CE; por el contrario, quien graba

una conversación con otro no incurre, por este solo hecho , en conducta contraria al

precepto constitucional citado.”

Si uno no es parte en la conversación estará vulnerando un derecho fundamental, reconocido en el artículo 18.3 de la Constitución, pero quien graba las palabras que un tercero le dirige no está realizando por ese sólo hecho ilícito alguno. Cuestión diferente sería si esa conversación se divulga y la intromisión que pueda suponer en la esfera de la persona cuyas palabras se han recogido. Para las grabaciones ajenas, el Código Penal castiga con prisión de uno a cuatro años y multa de doce a veinticuatro meses. El artículo 197 castiga a quien para descubrir los secretos o vulnerar la intimidad de otro, sin su consentimiento, utilice artificios técnicos de escucha, transmisión, grabación o reproducción del sonido o de la imagen, o de cualquier otra señal de comunicación. Se plantearon a la Agencia Española de Protección de Datos diversas cuestiones relacionadas con la recopilación por parte de una empresa de diversos registros de voz, con la finalidad de elaborar un programa de “Software” de reconocimiento de voz. La recopilación tendría lugar mediante la realización de llamadas telefónicas efectuadas desde un Estado miembro de la Unión Europea. En relación con esta cuestión, se considera que “siempre que quien haya de realizar el

tratamiento tenga conocimiento directo o indirecto de quién es la persona cuya voz

está siendo objeto de grabación, así como de su número de teléfono, la grabación

efectuada tendrá la naturaleza de dato de carácter personal” y el tratamiento efectuado estará sometido a la normativa de protección de datos ,al incorporarse al mismo los datos identificativos del sujeto (nombre y apellidos), su número de teléfono y su voz, conforme a lo dispuesto en el artículo 3.a) de la LOPD y el artículo 1.4 del Real Decreto 1332/1994, del 20 de Junio, que indica que dichos datos podrán proceder de información acústica.

Macros

Las macros son una herramienta excelente para ahorrarte repetición de código, y facilidad de cambio y adaptación para tu Dialplan. Si tuviera que repetir para un centenar de usuarios las líneas siguientes supondría una gran cantidad de copy/paste. Sería más sencillo un cambio en la manera en que trabaja las extensiones.

exten => 101,1,Dial(${JOHN},10) exten => 101,n,VoiceMail(101@default) exten => 101,n,Hangup()

. Puede definir una macro que contiene una lista de pasos a seguir. Todo lo que necesita para el cambio es la macro, y las referencias. Si está familiarizado con la programación,

129

usted reconocerá que las macros son similares a las subrutinas en muchos lenguajes de programación modernos.

Definición de macros

Los contextos de toda macro deben ser “[macro-nombreMacro]“. Esto les distingue de los contextos ordinarios y facilita su llamada. Los comandos de la macro se construyen casi igual a cualquier otra cosa en el Dialplan, el único factor limitante es que solo se usan en la extensión “s”.

Llamadas a macros

Para utilizar una macro en nuestro dialplan, utilizamos Macro() .

exten => 101,1, Macro (nombreMacro) Macro () define varias variables especiales para nuestro uso. Son:

${MACRO_CONTEXT}: El contexto original en el que se llama a la macro. ${MACRO_EXTEN}: La extensión original en la que se llama a la macro. ${MACRO_PRIORITY}: La prioridad inicial en el que se llama a la macro. ${ARG n }: El enésimo argumento pasado a la macro .

Aplicando al ejemplo:

exten => 101,1, Macro (voicemail) [macro-voicemail] exten => s,1,Dial(${JOHN},10) exten => s,n,VoiceMail(${MACRO_EXTEN}@default) exten => s,n,Hangup()

Si todo el que llame va a realizar la llamada a través del mismo canal y extensión que define la variable JOHN ya hemos terminado sino es necesario el uso de argumentos.

Utilización de argumentos en macros

Vamos a pasar el canal como argumento:

exten => 101,1,Macro(voicemail,${JOHN})

[macro-voicemail] exten => s,1,Dial(${ARG1},10) exten => s,n,VoiceMail(${MACRO_EXTEN}@default) exten => s,n,Hangup()

130

Uso de la base de datos de Asterisk (AstDB)

Asterisk proporciona un poderoso mecanismo para el almacenamiento de valores de llamada con el uso de una base de datos interna llamada AstDB. Esta no es una relacional tradicional, como MySQL, SQLServer y otras, es del tipo Berkeley DB Version 1. Nos puede ser de utilidad para sistemas pequeños. Existen dos entidades: familias(Families) y llaves(Keys), cada key esta asociada a una Family, si un Key toma un valor nuevo, el anterior es superpuesto por este nuevo valor.

Almacenamiento de datos en AstDB

Para almacenar un nuevo valor en la base de datos de Asterisk, utilizamos la aplicación Set(), pero en lugar de usarlo para establecer un canal de la variable, la usamos para definir una variable AstDB. Para asignar la clave count en la familia test con el valor 1:

exten => 456,1,Set(DB(test/count)=1) También puede guardar los valores de Asterisk con la línea de comandos CLI, ejecutando el comando database poniendo el valor de la clave de la familia. *CLI>database put family key value.

*CLI>database put test count 1

Recuperación de datos de AstDB

Para recuperar un valor de AstDB y asignarlo a una variable, usamos la aplicación Set () de nuevo. Vamos a recuperar el valor de count de la familia test,asignando a una variable llamada COUNT y, a continuación, decimos el valor:

exten => 456,n,Set(COUNT=${DB(test/count)}) exten => 456,n,SayNumber(${COUNT})

También puede comprobar el valor de una clave desde la línea de comandos de Asterisk utilizando el comando:

database get family key database get test key

Para ver todo el contenido de AstDB, se utiliza el comando:

database show

131

Borrado de datos de AstDB

Hay dos maneras de borrar los datos de la base de datos de Asterisk. Borrar solo la llave devolviendo su valor antes de eliminarla: DB_DELETE().

exten => 457,1,Set(COUNT= ${DB_DELETE(test/count)}) En el CLI : *CLI>database del key

Borrar la familia y la clave: DBdeltree(family).

exten => 457,1, DBdeltree(test)

En el CLI: *CLI>database deltree family .

Transferencias de llamadas

La configuración de la transferencia de llamadas entre diversos usuarios, independientemente de la tecnología que usen se realiza en el archivo features.conf en /etc/asterisk/. Hay que especificar en dicho archivo las siguientes características:

� blindxfer => secuencia : Permite realizar una transferencia de llamada a ciegas marcando la secuencia.

� atxfer => secuencia : Permite realizar una transferencia de llamada atendida. El origen es puesto en espera, mientras el destino se comunica con el nuevo destino para anunciarle la llamada. Si el nuevo destino cuelga, la llamada no se transfiere.

� pickupexten => secuencia : Especifica la secuencia a marcar para coger una llamada de alguien del mismo callgroup.

Para poder realizar transferencias vía PBX, Asterisk debe estar a la escucha de los tonos configurados, para ello la aplicación Dial debe haber recibido como parámetro 't' para permitir la transferencia en destino o 'T' para hacerlo en origen (o ambas).

CallParking

El callparking o aparcamiento de llamadas es una funcionalidad que permite transferir la llamada a un 'parking' virtual. Pudiendo colgar sin que la llamada origen sea desconectada de Asterisk, ya que se encontrará aparcada. Para operar, el usuario transfiere la llamada a una extensión especial (parkext en features.conf), Asterisk aparca la llamada y anuncia la posición en el parking.

132

Cualquier usuario que tenga incluido en su contexto el contexto especial 'parkedcalls' puede recuperar la llamada aparcada llamando directamente a su posición en el parking.

Los parámetros para el callparking son controlados con la configuración del features.conf. En el contexto [general] del features.conf hay 4 caracteristicas relacionadas con el callparking:

• parkext: Esta es la extensión del parking. Al transferir una llamada a esta extensión se llama a la posición determinada del aparcamiento .Por defecto es 700.

• parkpos: Esta opción define el número de aparcamientos. Por ejemplo, entre 701-720 crea 20 aparcamientos numeradas del 701 al 720.

• context: Este es el nombre del contexto del aparcamiento.Para poder aparcar llamadas, debe incluir este contexto.

• parkingtime: Si se establece, esta opción controla el tiempo(en segundos) que una llamada puede permanecer en el aparcamiento. Si la llamada no está recogida en el tiempo especificado, se llama de nuevo.

Es necesario reiniciar (restart) Asterisk no vale con hacer reload. También es necesario que el usuario sea capaz de transferir las llamadas a la extensión del parking, debe estar seguro de la utilización de la "t" y / o T del Dial(). Ejemplo: extensions.conf

[incoming] include => parkedcalls exten => 103,1,Dial(SIP/Pedro,,tT) exten => 104,1,Dial(SIP/John,,tT)

features.conf [general] parkext => 700 parkpos => 701 context => parkedcalls parkingtime => 120 [featuremap] blindxfer => # disconnect => *

133

atxfer => *2 parkcall => *7

Para visualizar estos datos desde la linea de commandos CLI: *CLI> show parkedcalls

Para ilustrar como usar el Call Parking, supongamos que David marca la extensión 103 para hablar con Pedro. Después de un tiempo, Pedro transfiere la llamada a la extensión 700 aparcando la llamada de David en la posición 701. Pedro marca la extensión 104 para llamar a John , y le dice que el que la llamada de David se encuentra en la extensión 701. John entonces marca de extensión 701 y comienza a hablar David.

CallPickup

CallPickup es la auto-transferencia de un teléfono que esta sonando, en otras palabras, el hecho de poder descolgar y responder a la llamada entrante a un teléfono o grupo de teléfonos determinado desde un tercer teléfono que no está sonando. La configuración para el 'Callpickup' se configura en features.conf. En cada usuario de la centralita se definen estos dos parámetros:

• callgroup: Toda llamada que entra a una extensión determinada pertenece al/los callgroups de la extensión.

• pickupgroup: Es el/los callgroups de llamadas entrantes en los que el usuario puede hacer 'pickup'.

Hay dos tipos de callpickup:

- Group callpickup: Permite que descuelgues cualquier llamada de alguien de mismo grupo que tu. Para utilizar esta funcionalidad la secuencia a marcar suele ser *8# o *8.

- Directed pickup: Permite que descolgar una llamada según una extensión especifica, suena el telefono y si descuelgas y marcas una secuencia más tu extensión se transfiere la llamada a tu extensión.

Ejemplo: features.conf [general] ……………. pickupexten=*8 ……………

134

sip.conf

[100] ; 100 puede coger llamadas de 101 ya que pickupgroup abarca el ; callgroup de 101

……… callgroup=1 pickupgroup=1-3 [101] ;101 tambien puede coger llamadas de 100 ………. callgroup=2 pickupgroup=1 Para ver estos datos desde el CLI: *CLI>feature show

Manejo de Colas

Una llamada entrante puede ser enviada a una cola de llamadas, que será distribuida entre los agentes disponibles, miembros que contestan las llamadas. Las colas se utilizan mucho en entornos tipo 'Call Center', con los canales tipo de Agente (que hacen 'login en el sistema'). El sistema de colas se compone de:

- Llamadas entrantes que son ubicadas en una cola.

- Miembros que contestan las llamadas en la cola

- Una estrategia sobre cómo manejar la cola y repartir las llamadas entre

los miembros.

- Música que se reproduce durante la espera en la cola.

La configuración de las colas se define:

- Estáticamente: en el archivo queues.conf

- Dinámicamente: la configuración se almacena en una BD,

“disponibilizando” los cambios sin necesidad de realizar un reload.

La configuración de los agentes se define en el archivo agents.conf. Los agentes atienden las llamadas de una cola específica. Un agente debe realizar un login (llamando a una extensión especial que contiene la aplicación AgentLogin()) indicando que está listo para tomar llamadas. También existe

135

el concepto de agente dinámico por si cualquier usuario quiere agregarse a una cola. Para esto se utilizan las aplicaciones AddQueueMember() y RemoveQueueMember(). Los miembros son aquellos canales disponibles que están activamente atendiendo la cola. Pueden ser tanto agentes como también canales regulares (SIP/105). Las llamadas son distribuidas entre los miembros de una cola siguiendo alguna de las siguientes estrategias:

- ringall: hace sonar todos los canales disponibles hasta que alguno

responda (configuración por defecto).

- roundrobin: hace sonar cada agente disponible por turnos.

- leastrecent: hace sonar el agente que es menos recientemente llamado

por esta cola.

- fewestcalls: hace sonar el agente con la menor cantidad de llamadas

completas.

- random: hace sonar una interfaz al azar.

- rrmemory: igual que el round robin pero recuerda cual fue el último

teléfono que atendió una llamada y continúa con el siguiente.

Cada agente tiene lo denominado Penalty(penalidad) de manera que se derivan las llamadas (según la estrategia definida) a los agentes con el menor valor de penalidad. En el caso de estar todos ocupados, se continúa con la siguiente penalty y así sucesivamente. Para establecer esto en los agentes estaticos en queues.conf: member => SIP/3000,1 member => SIP/3001,2 Si hay agentes dinamicos ellos tienen penalidad 1, a no ser que se les asigne otra al agregarse a la cola: exten => 888,1,AddQueueMember(davidqueue||3) ;penalidad 3 Si se asignan a dos agentes la misma penalidad sonarian los dos si hay una llamada. También es posible asignar a cada llamada entrante una Priority(prioridad) permitiendo situarla en un lugar más adelante de la cola (no siempre al final), por ejemplo si es un cliente importante adelantarle en la cola. Por defecto todas tienen prioridad 0 (estrategia FIFO (First In First Out)). Si queremos que cierta llamada sea adelantada en la cola deberemos modificar la variable de prioridad , QUEUE_PRIO.

136

exten => 101,1,Playback(bienvenido) exten =>101,n,SetVar(QUEUE_PRIO=10) exten =>101,n,Queue(davidqueue) Es posible que un miembro de una cola en determinado momento quiera no responder llamadas de esta, esto es posible hacerlo de dos formas:

• Con las aplicaciones de Pausa:

exten => 333,1,PauseQueueMember(davidqueue|SIP/100) exten => 334,n,UnpauseQueueMember(davidqueue|SIP/100)

• Opcion de TimeOut : Cuando no se contexta una llamada se entra en pausa

automaticamente (poniendo en el contexto de la cola “autopause=yes”).

Las aplicaciones principales relacionadas con las colas, utilizadas en extensions.conf:

- Queue(): aplicación utilizada para encolar una llamada (toma como

parámetro las colas definidas en queue.conf).

exten => 1234,n,Queue(ventas|t|||45|)

- AddQueueMember(cola): agrega dinámicamente un miembro a la cola.

- RemoveQueueMember(cola): remueve dinámicamente un miembro

de la cola.

- PauseQueueMember(cola|miembro): Pone en pausa al miembro en la

cola.

- UnpauseQueueMember(cola|miembro) : Reactiva al miembro en la

cola.

- AgentLogin(): login de un agente a una cola.

Comandos relacionados de la CLI:

Mostrar los agentes : *CLI>show agents Lista de todas las colas: *CLI>show queues Muestra los datos de una cola en particular: *CLI>show queue nombrecola

137

Agrega un miembro a la cola: *CLI>queue add member nombremiembro Elimina un miembro de la cola :

*CLI>queue remove member nombremiembro Un ejemplo del archivo queues.conf con una cola definida es: [general]

;Si usamos agentes dinamicos su configuración se guardara en la BD de Asterisk. De ;esta forma si Asterisk se vuelve a arrancar , cada agente será ;enrutado a su ;correspondiente cola.

persistentmembers=yes ;Para mantener las estadísticas en la cola durante un “reload”

keepstats=no [davidqueue] music=default strategy=ringall timeout=15 ;tiempo maximo de ring retry=5 ;tiempo de espera para intentar con otro miembro wrapuptime=0 ;tiempo de espera tras intentar con todos los miembros

member => SIP /100,1 Algunas de las variables para obtener información de las colas son:

• QUEUE_MEMBER_COUNT(queue) : nº de miembros de una cola

exten => 3001,1,Set(NUM = ${QUEUE_MEMBER_COUNT(davidqueue)})

exten =>3001,n,SayNumber(${NUM})

• QUEUE_MEMBER_LIST(queue) :guarda los nombres de los miembros de la cola

exten =>4001,1,Set(MEM=${QUEUE_MEMBER_LIST(davidqueue)})

exten =>4001,n,NoOp(MEM=${MEM})

• QUEUE_WAITING_COUNT(queue): nº de personas esperando en la cola

exten =>5001,1,Set(ESP=${QUEUE_WAITING_COUNT(davidqueue)})

exten =>5001,n,SayNumber(${ESP})

Registro de llamadas(CDR)

Asterisk permite llevar un control exhaustivo de todas las llamadas que se han realizado o recibido. Este control es interesante para el propio control de facturación,

138

independientemente del proveedor y además permite realizar estadísticas. Dicho control se denomina CDR(Call Detail Record). El registro del CDR se escribe por defecto en el archivo:

/var/log/asterisk/cdr-csv/Master.csv

Tambien es posible almacenar los registros en una base de datos MySQL configurando el archivo cdr_mysql.conf en /etc/asterisk/, para configurar el CDR se hace en cdr.conf en la misma carpeta. Para confirmar el estado del CDR desde el CLI, se puede ejecutar:

*CLI> cdr status

Algunos de los campos más importantes son:

• accountcode: código de la cuenta a utilizar.

• src: número del caller ID.

• dst: extensión destino.

• dcontext: contexto destino.

• start: comienzo de la llamada (fecha/hora).

• answer: respuesta de la llamada (fecha/hora).

• end: fin de la llamada (fecha/hora).

• duration: duración de la llamada en segundos, desde que fue

discada hasta el corte.

• billsec: duración de la llamada en segundos, desde que fue

atendida hasta el corte.

• disposition: estado de la llamada (atendida, no atentendida, ocupado, fallida).

Existen muchas aplicaciones que permite gestionar el CDR. Desarrollar una propia no es realmente muy complejo. Para la aplicación se utilizará Asternic CDR Reports de Nicolás Gudiño.

Sala de conferencias

Una conferencia en Asterisk permite que varias personas estén incluidas en una misma conversación, Asterisk trabaja esto de una manera fácil y flexible mediante las Aplicaciones MeetMe (conferencia,opciones,password) para crear conferencias y para contar los participantes MeetMeCount(conferencia,variable_contador). Algunas de las cosas que se pueden hacer en conferencias son:

• Crear passwords para salas de conferencias.

139

• Tipos de conferencia (mute conference, lock conference, kick partipants).

• Posibilidad de silenciar a todos los particiántes menos a uno, útil en caso de discursos de entrada o mensajes importantes.

• Creación de conferencias estáticas o dinámicas.

• Se puede limitar el número de participantes.

Las opciones de configuración para el sistema de MeetMe se encuentran en meetme.conf en la carpeta /etc/asterisk/. Dentro de la configuración, hay que establecer las salas de conferencias y definir un número opcional de contraseñas. (Si una contraseña esta definida aquí, será necesaria para acceder a esta sala para toda la conferencia). Definimos la sala de conferencias en la extensión 600 (en meetme.conf):

[roms] conf => 600

Creamos una simple sala de conferencias utilizando la extensión 600,la opción i (que anuncia cuando la gente entra y sale de la conferencia), y una contraseña de 54321 en extensions.conf:

exten => 600,1, MeetMe (600, i, 54321)

Si usted pasa una variable como segundo argumento para MeetMeCount(), el numero de participantes se asigna a la variable, y la reproducción de estos cada vez que se añade uno se omite. Usted puede usar esto para limitar el número de participantes, de esta forma:

; Limitar la sala de conferencias para 10 participantes exten => 600,1,MeetMeCount(600,CONFCOUNT) exten => 600,n,GotoIf($[${CONFCOUNT} <= 10]?meetme:conf_full,1) exten => 600,n(meetme),MeetMe(600,i,54321) exten => conf_full,1,Playback(conf-full)

IVR (Interactive Voice Response)

IVR es el nombre de la tecnología que permite interactuar con un menú de voz utilizando un teléfono. Es relativamente fácil y sencillo, configurar un menú de ese tipo en Asterisk. Una vez hechas varias grabaciones de mensajes con la aplicación Record() como hemos comentado y haberlas guardado estos en /var/lib/asterisk/sounds/ se puede comenzar a configurar el IVR en extensions.conf.

140

Las ventajas que proporciona el sistema no reside solamente en la reducción de costes y en el incremento de la eficiencia del CallCenter sino que también:

� Ayuda a reducir los turnos de los operadores y sus costes asociados. � Incrementa las horas de servicio. � Disminuye la tasa de llamadas perdidas. � Incrementa la disponibilidad de los operadores. � Proporciona una tasa de re-direccionamiento solucionando un mayor

número de primeras llamadas. � Mejora la flexibilidad para responder a las necesidades del cliente o a

picos de llamadas.

El 95% del éxito del diseño de los sistemas IVR de Asterisk se basa en trabajar junto al cliente desarrollando casos de uso consistentes y probar (y rehacer) prototipos con usuarios finales "reales" (a los cuales, incluidos nosotros mismos, les fastidia "hablar" con una maquina). Si la transacción promedio es corta y amigable, la ventaja frente al acceso Web es que no todos tienen Internet en todo momento, aunque si un teléfono. El 5% restante es solo programación. Principales errores de "ergonomía":

� Menús demasiado largos. � Los usuarios se pierden o no encuentran lo que necesitan. � No comprenden cómo usar el sistema. � Lógica confusa y "callejones sin salida". � Suponer que el usuario conoce la "jerga" del negocio.

Principales errores de diseño:

� Ineficiente recuperación ante fallos. � Falta de canales de atención suficientes. � Carencia de una salida hacia un operador humano.

Resumen de algunos principios generales:

� Los menús no tienen que reproducir la estructura organizativa o departamental de la empresa.

� Si el servicio tiene alguna restricción, es preciso avisar al usuario antes de nada. Por ejemplo, en un servicio de compra de tarjetas de llamadas prepago, si se requiere que el usuario sea cliente, es preciso avisarle antes de nada.

� Proporcionar solo la información que se necesita y de la forma más simple posible.

� Diseñar para la mayoría de los usuarios evitando que tengan que recorrer opciones que solo interesan a unos pocos.

141

� Hacer que el sistema trabaje por el usuario, por ejemplo, no pidiendo el mismo dato varias veces y evitando preguntar información que el sistema puede conocer.

� Ser consistente y no cambiar a menudo las opciones de los menús. Saludo inicial:

� Debe haber una bienvenida breve: buenos días, buenas tardes... � No repetirlo si en algún momento el usuario vuelve al inicio.

Es preciso evitar:

� Mensajes promocionales: poner solo si el usuario los puede encontrar justificados y, sobretodo, han de ser breves permitiendo acceder a la información en aquel mismo momento.

� Tener que pulsar la tecla * para saber si el terminal es de tonos (DTMF) o no.

� Remitir al usuario a otro servicio. Menú principal:

� El primer menú debe ser el principal a no ser que se tenga que pedirse identificación.

� Máximo 20 segundos de duración total contando el saludo inicial y el menú principal.

Identificación:

� Pedir identificación sólo cuando sea necesaria. � Pedir el identificador más fácil de recordar: teléfono, DNI... � Gestionar el final de la entrada de datos por medio de timeout, no solicitar

ningún tecleo adicional. Las opciones de navegación recomendables son:

� Volver atrás. � Menú principal. � Repetir. � Ayuda (si lo necesita la aplicación). � Si existe una opción de paso al operador, debe ser la última. � No hay que cortar nunca la comunicación si el usuario se equivoca. Es

preciso dar caminos alternativos. � Ordenar las opciones de las más específicas a las mas generales.

Preguntas Si/No:

� Se usan para recuperar errores y para confirmar acciones.

142

� Tienen que ser preguntas directas que induzcan a decir de forma natural solo Si o No:

Incorrecto: Por favor, confirme si su DNI es: XXXXXXXX Correcto: DNI: XXXXXXXX. ¿Es correcto?

� Debe ser una única pregunta, no dos en una. � Si además de la pregunta hay texto informativo, poner la pregunta al final

de la frase. Ejemplo: Para obtener más información sobre las condiciones del contrato, ¿desea que pase la llamada a un agente?.

Discado automático (Auto-dial out)

Los Call Files (.call) se utilizan para iniciar llamadas desde una aplicación externa. Son archivos de texto que al copiarse en el directorio /var/spool/asterisk/outgoing, Asterisk notará su presencia e inmediatamente activará la extensión en la prioridad especificada en el archivo .call. Generalmente, se combinan con el programador de tareas de Linux: el cron. Algunos ejemplos de uso son: soluciones de callback, despertador telefónico, anuncios automáticos.

La estructura de un Call File es la siguiente:

Channel: <channel> ; La extensión que queremos llamar.

Callerid: <callerid> ; El identificativo de llamada que queremos enviar a la ;extensión llamada.

WaitTime: <number> ; Cuantos segundos esperamos antes de considerar la ;llamada sin éxito.

Maxretries: <number> ; Numero de veces que intentaremos llamar la ;extensión

RetryTime: <number> ; Cuantos segundos debe esperar asterisk para volver a ; marcar

Account: <account> ; El nombre de la cuenta con la cual queremos grabar ; esta llamada (CDR)

Una vez que la extensión llamada conteste tenemos que decirle a asterisk lo que tiene que hacer. Esto también se define en el mismo archivo. Hay dos opciones:

• Ejecutar una aplicación:

Application: <appname> ; la aplicación que queremos utilizar

Data: <args> ; aquí podemos definir las opciones de la aplicación

143

• Ejecutar un punto exacto del plan de llamadas (Dialplan):

Context: <context> ; El contexto en el dial plan

Extension: <exten> ; La extensión que queremos usar en el contexto ; especificado.

Priority: <priority> ; El numero de la prioridad o la etiqueta si definida

Setvar: <var=value> ; Variables que se pueden necesitar en el ; contexto, extensión y prioridad que definimos.

Ejemplo:

En el siguiente ejemplo: se llama al 43424444 en el canal SIP y envía la llamada al contexto [mensajes-salida], extensión 84, Prioridad 1:

- Archivo mensaje.call

Channel: SIP/43424444

MaxRetries: 2

RetryTime: 60

WaitTime: 30

Context: mensajes-salida

Extension: 84

Priority: 1

- extensions.conf

[mensajes-salida]

exten => 84,1,Playback(anuncio)

exten => 84,2,Playback(vm-goodbye)

exten => 84,3,Hangup

Sistema de logs

En el archivo /etc/asterisk/logger.conf se encuentra la configuración del sistema de logging de Asterisk. Los distintos niveles de información a capturar en los logs son:

Verbose: mensajes generales sobre lo que está ocurriendo en el sistema (por ejemplo si el valor de verbosity es mayor a 3, muestra las instrucciones del plan de marcación). Debug: mensajes con información extendida, en general utilizados por

programadores. Notice: notificaciones no críticas. Warning: mensajes de alerta posiblemente críticos.

144

Error: mensajes indicando que ocurrió algo grave.

En el contexto [logfiles] del archivo logger.conf se indican los archivos y mensajes a loguear en c/u, la sintaxis es: archivo => nivel1,...,niveln Los archivos de log se crean por defecto en /var/log/asterisk/ (esto se puede cambiar /etc/asterisk/asterisk.conf).

Ejemplos: debug => debug full => notice,warning,error,debug,verbose

Para enviar a la consola, hay que definir el archivo especial console:

console => notice,warning,error,debug

También se pueden enviar al syslog:

syslog.local0 => debug, warning, error, notice, verbose Configurando además en /etc/syslog.conf: local0.*@ip_servidor Los comandos relacionados con el manejo del log en el CLI son:

Reabre los archivos de log del Asterisk y recarga la configuración del logger:

*CLI>logger reload

Rota los archivos de log y luego hace un logger reload.

*CLI>logger rótate

Cambia el nivel de información a mostrar en la consola. Por ej.: set verbose 999 *CLI>core set verbose

ENUM y Asterisk

ENUM (proviene de tElephone Number Mapping) o mapeo de números telefónicos, está constituido por una serie de protocolos que permiten crear una convergencia entre la red telefónica tradicional y Internet. Permite asociar (utilizando el protocolo DNS) un número telefónico a todas una serie de servicios típicos de la red internet (VoIP, correo electrónico, pagina web, etc.).

¿Cómo funciona?

145

Se ha creado una nueva jerarquía de dominios bajo el DNS e164.ARPA donde se almacenan los servicios asociados a un determinado numero telefónico.

Un ejemplo:

+5712345678 � 8.7.6.5.4.3.2.1.7.5.e164.arpa

El servidor DNS (Name Authority Pointer o NAPTR) que alberga la entrada, tiene registrados los servicios (sip, mail, http) publicados para dicho número. Ejemplo de entrada en Bind:

$ORIGIN 8.7.6.5.4.3.2.1.7.5.E164.ARPA. IN NAPTR 100 10 "U" "E2U+SIP" "!^.*$!SIP:[email protected]!" IN NAPTR 102 10 "U" "E2U+MAILTO" "!^.*$!MAILTO:[email protected]!"

Prioridad 1: contactar vía SIP con [email protected]. Prioridad 2: contactar por correo con [email protected].

Como queda claro a través de este ejemplo una vez que tengamos estos datos podremos usarlos en nuestra centralita. Llamar directamente la SIP URI en lugar del número telefónico (ahorrando los costos de llamadas) o enviar un correo electrónico.

Ejemplo: Llamada desde un teléfono IP al +34944991234

1) Consulta del teléfono al servidor DNS sobre la dirección 4.3.2.1.9.9.4.4.9.4.3.e164.arpa

2) El DNS responde:

sip:[email protected] mailto:[email protected]

3) El teléfono llama a sip:[email protected]

Si queremos hacer una prueba podemos registrar nuestro número telefónico y asociarlo a distintos servicios Internet a través de E164.org, un directorio ENUM publico.

Utilización de ENUM en Asterisk:

Primero tenemos que modificar el fichero enum.conf.

[general] search => e164.arpa

146

search => e164.org h323driver => H323

Ponemos estas líneas que nos permitirán hacer búsqueda en la jerarquía DNS e164.arpa y e164.org.

Guardamos los cambios y echamos una mirada a las funciones disponibles en Asterisk para hacer consultas a estos DNS:

ENUMLOOKUP: nos permite hacer una consulta de los registros NAPTR asociados a un determinado número telefónico.

ENUMQUERY: nos permite hacer una consulta de los registros NAPTR pero, al contrario de ENUMLOOKUP generará como resultado un ID que luego podremos usar con la función ENUMRESULT.

ENUMRESULT: permite consultar los resultados generados por ENUMQUERY usando el ID creado por ENUMQUERY.

Ejemplo:

Vamos a construir nuestro plan de llamadas de modo que antes de llamar cualquier número (nacional o internacional) haga una consulta en ENUM para ver si es posible usar una SIP URI en lugar del número telefónico:

exten => _00.,1,Set(Enum1=${ENUMLOOKUP(+${EXTEN:2},sip,c)}|counter=0) exten => _00.,2,GotoIf($["${counter}"<"${Enum1}"]?3:6) exten => _00.,3,Set(counter=$[${counter}+1]) exten => _00.,4,Dial(SIP/${ENUMLOOKUP(+${EXTEN:2},sip,,${counter})}) exten => _00.,5,GotoIf($["${counter}"<"${sipcount}"]?3:6) exten => _00.,6,Dial(SIP/MyproveedorVoIP/${EXTEN}) exten => _00.,7,Hangup

DUNDI

DUNDi ™ es un sistema peer-to-peer que permite localizar gateways para servicios telefónicos. A diferencia de los servicios centralizados tradicionales (como ENUM), es totalmente distribuido. No es en sí un protocolo VoIP de señalización. DUNDi se puede utilizar dentro de una empresa para crear una completa PBX federada con ningún punto de fracaso, y la posibilidad de añadir nuevas extensiones arbitrariamente. Diagrama DUNDI:

Hay tres archivos que necesitan ser configurados para DUNDi: dundi.conf, extensions.conf, y iax.conf. El archivo dundi.conf controla la autentificación de los compañeros que nos permitenque es posible ejecutar varias redes diferentes en la misma caja, es necesario definir una sección diferente para cada interlocutor, a continuación, configurar las redes de pares en el que se permiten realizar búsquedas. Además, tenemos que definir los compañeros que desea utiliza Configuracion del archivo dundi.conf:

[general] ; puerto mediante el cual se comunica el protocolo dundi port=4520 ; identificador de mi Asterisk en la nube dundi, se recomienda sea la MAC de la ; tarjeta de red eth0entityid=00:0C:29:0C:AB:C2 ; Tiempo que permanece en cache la ruta para ir a las extensiones aprendidas ;; mediante dundi . cachetime=5 ; Máximo número de saltos que se harán buscando el destino dentro de la red ; dundi . ttl=12 ; si al preguntar a un ;búsqueda a través de ese peer; es ;útil cuando no está activo el peer o cuando ;hay una conexión ;mala hacia el peerautokill=yes

Publicación de mis números en la red dundi (contextos dundi):

• Los contextos en esta sección se enlazan con los contextos de

extensions.conf.

• El contexto referenciado de extensions.conf es donde se controla qué

numeros se publican en la red dundi.

archivos que necesitan ser configurados para DUNDi: dundi.conf, extensions.conf, y iax.conf. El archivo dundi.conf controla la autentificación de los compañeros que nos permiten realizar búsquedas a través de nuestro sistema.

arias redes diferentes en la misma caja, es necesario definir una sección diferente para cada interlocutor, a continuación, configurar las redes de pares en el que se permiten realizar búsquedas. Además, tenemos que definir los compañeros que desea utilizar para realizar búsquedas.

Configuracion del archivo dundi.conf:

puerto mediante el cual se comunica el protocolo dundi.

identificador de mi Asterisk en la nube dundi, se recomienda sea la MAC de la tarjeta de red eth0.

entityid=00:0C:29:0C:AB:C2 ; Tiempo que permanece en cache la ruta para ir a las extensiones aprendidas ;

; Máximo número de saltos que se harán buscando el destino dentro de la red

; si al preguntar a un par, el ACK tarda más de 2 segundos, se cancela la búsqueda a través de ese peer; es ;útil cuando no está activo el peer o cuando hay una conexión ;mala hacia el peer

Publicación de mis números en la red dundi (contextos dundi):

tos en esta sección se enlazan con los contextos de

extensions.conf.

El contexto referenciado de extensions.conf es donde se controla qué

numeros se publican en la red dundi.

147

archivos que necesitan ser configurados para DUNDi: dundi.conf, extensions.conf, y iax.conf. El archivo dundi.conf controla la autentificación de los

realizar búsquedas a través de nuestro sistema. Dado arias redes diferentes en la misma caja, es necesario definir

una sección diferente para cada interlocutor, a continuación, configurar las redes de pares en el que se permiten realizar búsquedas. Además, tenemos que definir los

identificador de mi Asterisk en la nube dundi, se recomienda sea la MAC de la

; Tiempo que permanece en cache la ruta para ir a las extensiones aprendidas ;

; Máximo número de saltos que se harán buscando el destino dentro de la red ;

par, el ACK tarda más de 2 segundos, se cancela la búsqueda a través de ese peer; es ;útil cuando no está activo el peer o cuando

tos en esta sección se enlazan con los contextos de

El contexto referenciado de extensions.conf es donde se controla qué

148

• Al configurar un peer con el que nos vamos a enlazar, se puede determinar

a cuales de los mapas puede tener acceso el peer.

Contextos dundi: nombre_contexto => contexto_extensions,peso,proto,destino[,opciones]]

nombre_contexto: Nombre del contexto al que se hace referencia en una petición dundi. contexto_extensions. Nombre del contexto en el extensions.conf, donde se buscarán los números que son solicitados en la nube dundi. peso. Deberá ser 0 en caso de que nuestro conmutador publique directamente los números, en caso contrario, deberá tener el valor del número de saltos que necesita para llevar al destino. proto. Cualquiera de los protocolos IP (sip, iax,323) con el cual el peer remoto se debe comunicar con nosotros. destino. Es la información que se entrega al peer para que pueda llegar al número que está marcando. opciones. Pueden ser varios argumentos los cuales indican el comportamiento que se tendrá cuando no tengamos nosotros el número que se está solicitando.

- nounsolicited. No se permiten llamadas que no sean solicitadas.

- nocomunsolicited. No se permiten llamadas comerciales que no sean

solicitadas.

- nopartial. No se permiten búsquedas para patrones parciales.

- residential, comercial,mobile. Le indica a los pares qué tipo de números

son los que se están publicando a través de este contexto.

[mappings] priv =>dundi-priv-local,0,IAX2,priv:${SECRET}@162.248.175.91/${NUMBER} ,nounsolicited,nocomunsolicit,nopatial

Variables: ${SECRET}. Es reemplazado por el password almacenado en la base de datos. ${NUMBER}. Es el número solicitado. ${IPADDR}. Es la IP de nuestro Asterisk. No se recomienda su uso. Generación de llaves:

La autenticación en una red dundi normalmente se hace mediante llave pública/privada:

cd /var/lib/asterisk/keys astgenkey -n dundi_ext_44xx

149

yum -y install php cp dundi_ext_44xx.pub /var/www/html service httpd start wget -c http://132.248.175.90/dundi_principal.pub *CLI>reload res_crypto.so *CLI>reload pbx_dundi.so *CLI>dundi lookup 4400@priv Dundi: configuración de pares: ;Par principal, el principal publica las demás extensiones [00:0c:29:d8:86:c0] ; MAC address del par principal model = symmetric host = 132.248.175.90 inkey = dundi_principal ; nombre de la llave pública del par outkey = dundi_ext_44xx ; nombre de mi llave privada include = priv permit = priv qualify = yes dynamic=yes Configuración del archivo extensions.conf:

; tratamos de ir en el contexto local al número de extensión, después vamos a buscar a ;otro contexto. dundi-priv-lookup apunta a la directiva switch la cual permite buscar las ;extensiones ;en otros conmutadores. Esto posibilita la convergencia entre múltiples ;servidores Asterisk con ;diferentes números de bloques de extensiones

[macro-dundi-lookup] exten => s,1,Goto(${ARG1},1) include => dundi-priv-local include => dundi-priv-lookup Definición de contextos: ; Son las extensiones locales, por ejemplo: 44XX [dundi-priv-local] exten => _44XX,1,Macro(Dial,${EXTEN}) ; Buscamos con nuestros pares [dundi-priv-lookup] switch => DUNDi/priv ; Cuando se trata de una llamada de un par privado, llega aquí. [dundi-priv-incoming] include => dundi-priv-local Búsqueda en pares:

150

; Contexto para llamadas salientes, aquí nos comunicamos con la red dundi, pero ;agregamos 4 dígitos

[pares-dundi] exten => _XXXX,1,Macro(dundi-lookup,${EXTEN}) [internos] include => pares-dundi Configuracion del archivo iax.conf: [priv] type=user dbsecret=dundi/secret context=internos disallow=all allow=ulaw allow=alaw allow=gsm

Aspectos avanzados de Asterisk:

¿Qué es AGI?

AGI (Asterisk Gateway Interface) nos permite ejecutar en Asterisk software de terceros escrito en casi cualquier lenguaje (C, C#, Bourne Shell, PHP, Ruby, Python, Perl, Java). Permite extender al infinito las posibilidades de Asterisk, juntando su potencia, con las posibilidades que ofrece un lenguaje de programación. El programa debe cumplir:

– Ser ejecutable (chmod 755 script.php). – Localizado por defecto en /var/lib/asterisk/agi-bin – Asociado con alguna extensión en el Dial Plan: exten => 200,1,AGI(programa.php|argumentos)

El intercambio de información del script con Asterisk se realiza vía los canales de comunicación: STDIN, STDOUT y STDERR.

• Lee desde STDIN para obtener información.

• Escribe en STDOUT para enviar información.

• Escribe en STDERR para enviar información de debugging.

El script AGI envía comandos a Asterisk escribiendo en el STDOUT. Seguidamente Asterisk envía una respuesta por cada uno de ellos que es leída por el script. Algunos ejemplos de comandos son:

• ANSWER: atiende.

151

• HANGUP: cuelga.

• SAY [NUMBER | DIGITS | ALPHA |

• | PRIORITY]: establece un nuevo contexto, extensión o prioridad luego de

finalizada la ejecución de script.

• VERBOSE: imprime un mensaje en el log.

• WAIT FOR DIGIT: PHONETICS]: dice un número, dígito, caracter o una

cadena fonéticamente.

• SET [CONTEXT | EXTENSION espera que se presione un dígito.

• [SET | GET] VARIABLE: asigna u obtiene el valor de una variable del plan de

marcación.

¿Qué es AMI?

AMI (Asterisk Manager TCP/IP API) permite que programas cliente se conecten a Asterisk mediante TCP/IP y sean capaces de ejecutar comandos y leer eventos, como por ejemplo crear o monitorizar llamadas ,canales y colas. Por cada cosa que Asterisk realiza se generan eventos que pueden ser leídos mediante una sesión de manager, y el usuario puede tratarlos a su gusto.

Además, AMI permite la ejecución de comandos, lo que proporcina la posibilidad de alterar el comportamiento de Asterisk desde un programa hecho a medida. Funcionamiento:

Para trabajar con AMI es necesario tener un usuario definido en el fichero manager.conf. A partir de aquí hay que establecer una comunicación TCP/IP con el servidor de Asterisk en el puerto 5038, y una vez conectado y autentificado, se puede comenzar a leer los eventos o ejecutar comandos. Las cuentas de usuario se configuran en /etc/asterisk/manager.conf.

Ejemplo:

[general] enabled=yes [admin]

secret = 1234 deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.0 read = system,call,log,verbose,command,agent,user write = system,call,log,verbose,command,agent,user

En este caso, "admin" es el nombre de usuario, la clave es "1234" y sólo se permiten conexiones para este usuario vía localhost. El resto de las líneas establecen permisos (r,w,r/w) para cada clase (system, call, etc.).

152

Una de las mejores aplicaciones opensource para controlar y visualizar el estado en tiempo real de la centralita Asterisk es: Flash Operator Panel (FOP).

¿Qué es AJAM?

AJAM es una nueva tecnología disponible en Asterisk 1.4 (Asyncronous Javascript Asterisk Manager) que permite conectar con Asterisk por medio de HTTP. Para poder trabajar con AJAM es necesario configurar los ficheros manager.conf y httpd.conf. Configuración del servidor HTTP de Asterisk:

1) Descomentar "enabled=yes" en /etc/asterisk/http.conf para habilitar el pequeño servidor HTTP de Asterisk. 2) Si se desea tener acceso a simples páginas HTML, CSS, JavaScript, etc., hay que descomentar "enablestatic = yes" . 3) Poner la Ip del servidor Asterisk y el puerto en "bindaddr" y "bindport ‘’ respectivamente.

4) Ajuste el "prefix" que debe ser el comienzo de cualquier URI en el servidor . El valor predeterminado es "asterisk" ..

Permitir el acceso al Manager via HTTP: 1) Asegúrese de que tiene tanto "enabled = yes" como "webenabled = yes" en la configuración / etc / asterisk / manager.conf . 2) También puede usar "httptimeout" para establecer el tiempo de espera predeterminado para las conexiones HTTP (en segundos). 3) Asegurarse de la configuración de manager.conf teniendo claro cuál es el username y la password.

Una vez que estos cambios de configuración han sido completados puede reiniciar Asterisk y podrá acceder a distintas funciones de web. Puede encontrar una lista completa de estas funciones:

*CLI> show http o *CLI> http show status Ejemplos de funcionamiento:

� Para abrir una sesión de Asterisk Manager:

http://192.168.1.200:8088/asterisk/manager?action=login&username=admin_de_usuario&secret=amp111

� Para ver la salida del comando status:

153

http://192.168.1.200:8088/asterisk/rawman?action=status

¿Qué es AEL2?

AEL2 (Asterisk Extension Language versión 2) tiene como objetivo proporcionar una forma diferente de escribir el Dialplan ,una forma más flexible. Para utilizar AEL2, lo único que tiene que hacer es tener cargado el modulo pbx_ael2.so. Esto se hará de forma automática si se utiliza 'autoload = yes "en /etc/asterisk/modules.conf. Cuando se carga el módulo, se busca 'extensions.ael2' en /etc/asterisk/. Algunos usuarios pueden mantienen el archivo extensions.conf para conservar las características que se configuran en la sección "general" de extensions.conf. Para volver a cargar extensions.ael2:

*CLI> ael2 reload

Hacer un debug de los Contextos:

*CLI> ael2 debug contexts Hacer un debug de las macros:

*CLI> ael2 debug macros

Ejemplo: context prueba {

1234 => { Dial(SIP/${EXTEN},45); switch (${DIALSTATUS}) {

case BUSY: Voicemail(b200);

break; case NOANSWER:

Voicemail(u200); break; default:

Noop(Algo raro ha pasado); Hangup;

} }

}

Eso seria similar a esto:

[prueba] exten => 1234,1,Dial(SIP/${EXTEN},45) exten => 1234,n,GotoIf($[${DIALSTATUS}=’BUSY’]?BUSY) exten => 1234,n,GotoIf($[${DIALSTATUS}=’NOANSWER’]?NOANSWER) exten => 1234,n,Hangup()

154

exten => 1234,BUSY,Voicemail(b200) exten => 1234,BUSY,Hangup() exten => 1234,NOANSWER,Voicemail(u200); exten => 1234,NOANSWER,Hangup()

¿Qué es ARA?

Asterisk permite ser configurado en una Base de Datos, mediante Asterisk Realtime Architecture. Por ejemplo soporta MySQL, podiendo migrar a la base de datos lo siguiente:

– Configuración de dispositivos SIP e IAX. – Configuración de buzones de voz. – Configuración de colas.

El fichero a configurar es extconfig.conf. El fichero res_mysql.conf contiene la configuración de la base de datos. ARA dispone de 2 tipos de Realtime: estático y dinámico:

– Estático: La configuración esta almacenada en la BD, pero Asterisk la carga al arrancar como si fuera un fichero. Si se realiza algún cambio, es necesario hacer un reload. – Dinámico: La configuración esta almacenada en la BD y Asterisk realiza una consulta a esa BD cada vez que necesita un dato. No es necesario hacer reload si se han realizado cambios. Mucha carga para el servidor... Todos los ficheros no soportan Realtime Dinámico como el fichero de colas (queues.conf).

Ejemplo de configuración (extconfig.conf):

[settings] ;;RealTime Dynamic ;file => driver,database,table ;sipusers => mysql,asterisk,dispositivos_sip ;iaxpeers => mysql,asterisk,dispositivos_iax ;voicemail => mysql,asterisk,buzones ;;RealTime Static ;file => driver,database,table ;sip.conf => mysql,asterisk,sip_conf ;extensions.conf => mysql,asterisk,extensions_conf ;iax.conf => mysql,asterisk,iax_conf ;queues.conf => mysql,asterisk,queues_conf ;voicemail.conf => mysql,asterisk,voicemail_conf

155

Administración de Asterisk

La administración de Asterisk se hace por interfaz web o por la línea de comandos CLI en modo administrador.

Interfaces web para Asterisk:

• Asterisk GUI:

Interfaz gráfica para Asterisk creada por Digium. El AsteriskGUI se creó para hacer que la configuración, gestión, y ajuste de su sistema Asterisk sea menos complicado, proporcionando un fácil uso de la interfaz gráfica. El AsteriskGUI es diferente de la mayoría de las interfaces que se han creado para su uso con Asterisk, ya que la interfaz realmente manipula el Asterisk y los archivos de configuración. Se lanzó tras el lanzamiento del Asterisk Appliance.

Lo “bueno” de esta interfaz, es que lee la configuración que hemos escrito a mano, la entiende y permite gestionarla vía web, algo que las demás interfaces no hacen (siempre machacan los cambios o acuden a archivos externos incluidos para saltarse esta dificultad, en lugar de plantarle cara).

Es importante que conozcamos estas GUI, porque Digium planea convertirla en un estándar para las versiones Appliance, AsteriskNOW y Asterisk Business Edition.

En Agosto de 2008 Digium sacó la versión estable de Asterisk GUI 2.0. Instalación:

Para instalar la interfaz gráfica web lo tenemos que hacer desde subversion, por ello necesitaremos el cliente:

yum install subversion

En /usr/src:

svn checkout http://svn.digium.com/svn/asterisk-gui/branches/2.0 ast-gui cd ast-gui ./configure make && make install && make samples

Ahora configuramos los archivos para poder activar el pequeño servidor http que trae Asterisk GUI y la autenticación para acceder:

156

En /etc/asterisk/http.conf:

[general] enabled=yes enablestatic=yes

En /etc/asterisk/manager.conf:

[general] displaysystemname = yes enabled = yes webenabled = yes port = 5038 ;httptimeout = 60 bindaddr = 0.0.0.0 [admin] secret = clave read = system,call,log,verbose,command,agent,config write = system,call,log,verbose,command,agent,config

Una vez guardados, comprobamos que todo ha ido bien:

make checkconfig

Con este último comando (el make checkconfig) confirmaremos que la configuración es la correcta, sino nos dará algún mensaje de error. Tan solo deberemos asegurarnos que está habilitado el manager en el puerto 5038 así como que existe un usuario valido en el manager.conf y haber des comentado los parámetros en el archivo http.conf, reiniciamos Asterisk y listo.

Arrancamos asterisk:

./asterisk -vvvgc

Ahora ya podemos ir a arrancar el script para finalizar la configuración:

http://ipServidor:8088/asterisk/static/config/cfgbasic.html.

• FreePBX:

FreePBX es una completa aplicación web de PBX. Asterisk no viene con ninguna Interfaz y no podemos conectar un teléfono en ella y hacerlo funcionar sin editar archivos de configuración y crear un Dialplan para su uso. FreePBX simplifica esto ofreciendo funcionalidades pre-programados accesibles a

157

través de una interfaz web amigable que le permite tener un PBX completamente funcional casi de inmediato sin necesidad de programación. FreePBX se basa en la pila LAMPA ™ (Linux, Apache, MySQL, PHP y Asterisk). Es un sistema modular, con clic para instalar plugins descargables a través de Internet desde el repositorio de módulo en línea. Algunas de las características de FreePBX son:

- Agregar o cambiar la extensión y las cuentas de correo de voz en cuestión de

segundos.

- El soporte nativo de SIP, IAX, y los clientes de ZAP (otros criterios de valoración

son apoyados a través de extensiones personalizadas).

- Reducir los costos de larga distancia con LCR.

- Enrrutar las llamadas entrantes basándose en la hora del día.

- Crear Recepcionista digital interactiva (IVR).

- Grupos de llamada de diseño sofisticado.

- Gestión de llamadas con colas.

- Detectar y recibir los faxes entrantes.

- Copias de seguridad y restaurar el sistema.

- Guardar las grabaciones de audio de las llamadas.

- Ver detalle de llamadas con Asterisk-stat.

- Ver las extensiones y el estado de los trunks con Flash Operator Panel.

- Ver grabaciones de la conversación con Asterisk Recording Interface (ARI).

- Número ilimitado de Conferencias (limitado por la potencia de CPU disponible.

(300 usuarios simultáneos en conferencias sobre un Pentium 4 a 3 GHz, 600

con doble núcleo!)...

- Música en espera.

Instalación de FreePBX

1.) Instalar Asterisk.

2.) Deshabilitar SeLinux (si no lo desactivaste en la instalación del sistema operativo).

En /etc/selinux/config � "selinux=disabled"

3.) Instalar paquetes necesarios para FreePBX

yum install e2fsprogs-devel keyutils-libs-devel krb5-devel libogg libselinux-devel libsepol-devel libxml2-devel libtiff-devel gmp php-pear php-pear-DB php-gd php-mysql php-pdo ncurses-devel audiofile-devel libogg-devel mysql-

158

devel zlib-devel perl-DateManip sendmail-cf kernel-devel openssl-devel httpd sox spandsp mpg123

4.) Instalar lame

wget http://easynews.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz tar zxvf lame-3.97.tar.gz cd lame-3.97 ./configure make make install

5.) Descargar FreePBX wget http://mirror.freepbx.org/freepbx.tar.gz

6.) Instalar BD para FreePBX (mysql con password) mysqladmin create asteriskcdrdb –p mysql --user root -p asteriskcdrdb < /usr/src/freepbx/SQL/cdr_mysql_table.sql mysqladmin create asterisk –p mysql --user root -p asterisk < /usr/src/freepbx/SQL/newinstall.sql mysql -u root –p GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asteriskuser@localhost IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost IDENTIFIED BY 'password'; flush privileges;

7.) Cambios en el Sistema Linux useradd -c "Asterisk PBX" -d /var/lib/asterisk asterisk Cambiar el usuario y grupo apache por usuario y grupo asterisk nano +231 /etc/httpd/conf/httpd.conf Cambiar AllowOverride None a AllowOverride All nano +329 /etc/httpd/conf/httpd.conf

8.) Instalar FreePBX yum install db cd /usr/src/freepbx ./start_asterisk start ./install_amp --username=asterisk --password=password

159

En /etc/rc.local � "/usr/local/sbin/amportal start" chkconfig httpd on chkconfig mysqld on

9.) Solucionar Problemas de Flash Operator Panel (Si no tienes instalado Fop2) wget http://www.asternic.org/files/op_panel-0.29.tar.gz tar xvfz op_panel-0.29.tar.gz cd op_panel-0.29 cp op_server.pl /var/www/html/panel/ cp flash/operator_panel.swf /var/www/html/panel/ En el archivo op_server.cfg:

[general] use_amportal_conf=1 //usuario y clave similar al registrado en el archivo /etc/asterisk/manager.conf manager_user=admin manager_secret=password

10.) Solucionar Password de ARI nano /var/www/html/recordings/includes/main.conf.php

$ari_admin_password = "password";

11.) Configurar Sendmail: nano /etc/mail/sendmail.mc

define(`SMART_HOST', `relay.DOMAIN.com)dnl MASQUERADE_AS(`pbx.DOMAIN.com')dnl FEATURE(`masquerade_envelope')dnl make -C /etc/mail

12.) Editar sip_nat.conf para NAT: nano /etc/asterisk/sip_nat.conf

localnet=192.168.1.0/255.255.255.0 externhost=pbx.DOMAIN.com externrefresh=10 fromdomain=DOMAIN.com o externip=ipPublica nat=yes

160

qualify=yes canreinvite=no

13.) Añadir extra codecs a la configuracion: nano /etc/asterisk/sip_custom.conf

allow=gsm allow=h261 allow=h263 allow=h263p videosupport=yes

nano /etc/asterisk/iax_custom.conf

allow=gsm allow=h261 allow=h263 allow=h263p videosupport=yes

14.) Editar Configuracion de Correo:

nano /etc/amportal.conf

//Si la interface web de la PBX sera accedida desde internet o localmente. AMPWEBADDRESS=pbx.DOMAIN.com o IpPublica o ip Privada

nano /etc/asterisk/vm_email.inc

remove "Visit http://AMPWEBADDRESS/cgi- bin/vmail.cgi?action=login &mailbox=${VM_MAILBOX} to check your voicemail with a web browser.\n"

nano /etc/asterisk/vm_general.inc

[email protected] ; // El email desde donde la notificacion pudo venir fromstring=DOMAIN PBX ; // Nombre Real o email Sender

15.) Configuracion para Music on Hold: chown asterisk /var/lib/php/session/ sed -i "s|upload_max_filesize = 2M|upload_max_filesize = 20M|" /etc/php.ini En /etc/httpd/conf.d/php.conf � echo "LimitRequestBody 20000000" ln -s /var/lib/asterisk/moh /var/lib/asterisk/mohmp3

16.) Iniciar FreePBX

161

En consola � amportal start En el Explorador en http://IpDelServidor/admin

Línea de comandos de Asterisk: CLI

Esta línea de comandos es bastante potente, y permite controlar y monitorizar gran parte de la situación de la centralita. Soporta el empleo de la tecla <Tabulador>, al estilo de las consolas de UNIX/GNU Linux, por lo que para ver un listado de todos los comandos disponibles, basta con presionar varias veces la tecla. Asterisk CLI es la consola de Asterisk desde donde podemos “debugear” y comprobar el funcionamiento de Asterisk. Para acceder a ella debemos ejecutar: service asterisk start cd /usr/sbin asterisk –r El CLI permite acciones tales como:

• Ver que versión de Astersik tenemos instalada:

*CLI> show versión

• Tiempo que lleva en ejecución después del último reinicio:

*CLI> core show uptime

• Recargar configuraciones en el PBX funcional (necesario cuando modificamos algún archivo de configuración):

*CLI> reload

• Mostrar aplicaciones registradas en Asterisk:

*CLI>show applications

• Listar los canales definidos:

*CLI>show channels

• Mostrar información sobre los codecs instalados :

*CLI>show codecs

162

• Mostrar un cuadro de doble entrada con los tiempos de conversión entre formatos de codecs:

*CLI>show translation

Es posible realizar una desconexión del CLI 'quit'. Asterisk continuará ejecutándose en segundo plano. Para matar al propio Asterisk desde el CLI, se puede utilizar el comando stop, en sus tres variantes:

• Detiene Asterisk al momento:

*CLI> stop now

• Detiene Asterisk cuando no haya carga:

*CLI> stop when convenient

• Detiene Asterisk cuando no haya carga y deja de aceptar peticiones de llamadas a partir de este momento:

*CLI> stop gracefully

Nivel de “Verbose”: Este valor indica la cantidad de mensajes que se recibirán sobre los eventos generales del sistema. Cuanto más alto, más información sobre lo que sucede en la centralita se recibirá.

Este nivel, se puede establecer de varias formas:

• Al arrancar el demonio: sudo asterisk vvvvvv

• Al conectarse al demonio: sudo asterisk -rvvvvvvvv

• Desde el CLI (Quitar opciones de visualización):

*CLI>set verbose O Nivel de “Debug”: Este valor indica la cantidad de mensajes que se recibirán sobre los eventos generales del sistema, pero utilizado normalmente para depurar problemas de drivers o de aplicaciones. Este nivel, se puede establecer de varias formas:

163

• Al arrancar el demonio:

sudo asterisk dddd

• Al conectarse al demonio:

sudo asterisk –rdddd

• Desde el CLI (Recibir como máximo 30 mensajes):

*CLI> Set Debug 30

• Realizar un debug de un canal:

*CLI>debug channel Acciones del canal de consola (console channel):

• Permite hacer un llamada desde la consola :

*CLI>console dial

• Permite contestar una llamada desde la consola:

*CLI>console answer

• Cuelga la llamada en curso en la consola:

*CLI>console hangup Acciones sobre los módulos:

• Cargar/descargar un módulo específico:

*CLI>module load/unload

• Mostrar todos los módulos levantados: *CLI>module show

Acciones del Dialplan:

• Mostrar el plan de marcación actual:

*CLI>dialplan show

• Guardar los cambios realizados:

*CLI>dialplan save

• Agregar / eliminar una

*CLI>dialplan add/remove extensión

• Incorporar / eliminar un include en un contexto dado en el plan de marcación: *CLI>dialplan add/remove include

A través de la línea de comandos CLI también podemos usuarios SIP e IAX2, el estado de las tarjetas de telefonía o los buzones de voz existentes en la centralita Asterisk:

*CLI>sip show peers *CLI>iax2 show peers *CLI>zap show status *CLI>voicemail show users

Para obtener información detallada sobre todos los comandos del CLI basta con poner: *CLI>help

Versiones Enterprise de Asterisk:

• Asterisk Appliance

Descripción:

El Asterisk Appliance (AA50) es un PBX basado y dirigido hacia las PyMES (2-50 usuarios), grandes organizaciones (2-proveedores de servicios gestionados para la premisa CPE con las soluciones basadas en SIP o IAX trunking.

El AA50 también ofrece una solución híbrida alternativa (una combinaciónaplicaciones de VoIP usando legado de equipo de telecomunicaciones) para los clientes empresariales que todavía no están preparados para migrar a una solución de VoIP.

El Asterisk Appliance 50 tiene las características de la licencia comercial AsteBusiness Edition ™, así como de la Digium AsteriskGUI 1.0 desarrollados.

El AA50 está disponible en las siguientes configuraciones: Sólo VoIP (S800i), ocho FXO (S808B), y cuatro FXS y cuatro FXO (S844B).

Características:

dialplan save

Agregar / eliminar una extensión en un contexto dado al plan de marcación:

dialplan add/remove extensión

Incorporar / eliminar un include en un contexto dado en el plan de marcación:

dialplan add/remove include

A través de la línea de comandos CLI también podemos controlar por ejemplo los usuarios SIP e IAX2, el estado de las tarjetas de telefonía o los buzones de voz existentes en la centralita Asterisk:

sip show peers iax2 show peers zap show status voicemail show users

obtener información detallada sobre todos los comandos del CLI basta con poner:

Versiones Enterprise de Asterisk:

Asterisk Appliance

El Asterisk Appliance (AA50) es un PBX basado y dirigido 50 usuarios), oficinas remotas de

-50 usuarios por sitio), y los proveedores de servicios gestionados para la premisa CPE con las soluciones basadas en SIP o IAX trunking.

El AA50 también ofrece una solución híbrida alternativa (una combinaciónaplicaciones de VoIP usando legado de equipo de telecomunicaciones) para los clientes empresariales que todavía no están preparados para migrar a una solución de VoIP.

El Asterisk Appliance 50 tiene las características de la licencia comercial AsteBusiness Edition ™, así como de la Digium AsteriskGUI 1.0 desarrollados.

El AA50 está disponible en las siguientes configuraciones: Sólo VoIP (S800i), ocho FXO (S808B), y cuatro FXS y cuatro FXO (S844B).

164

extensión en un contexto dado al plan de marcación:

Incorporar / eliminar un include en un contexto dado en el plan de marcación:

controlar por ejemplo los usuarios SIP e IAX2, el estado de las tarjetas de telefonía o los buzones de voz

obtener información detallada sobre todos los comandos del CLI basta con poner:

El AA50 también ofrece una solución híbrida alternativa (una combinación de las aplicaciones de VoIP usando legado de equipo de telecomunicaciones) para los clientes empresariales que todavía no están preparados para migrar a una solución de VoIP.

El Asterisk Appliance 50 tiene las características de la licencia comercial Asterisk Business Edition ™, así como de la Digium AsteriskGUI 1.0 desarrollados.

El AA50 está disponible en las siguientes configuraciones: Sólo VoIP (S800i), ocho FXO

-Servidor Asterisk completo co- Asterisk Business Edition con licencia comercial. -Built-in Router Ideal para pequeñas oficinas-Hasta ocho puertos analógicos. -Apoyo a una combinación de módulos FXO y FXS. -1GB Compact Flash Card ®. -Hardware base de Cancelación de eco. -8 MB Onboard Flash. -64 MB de RAM Onboard. -5 Puertos Ethernet (4 LAN, 1 WAN)

Beneficios:

� Paquetes “Todo en uno” con Hardware de Digium, Asterisk Digium Software, sistema de documentación, y servicios de suscr

� Mayor fiabilidad en el PC.� Baja necesidad de energía � Permite un completo despliegue ofreciendo rentables soluciones de telefonía

con una instalación sencilla y características como el autola posibilidad de utilización de teléfonos IP de Polycom.

� Una suscripción añade la paz mediante la prestación de apoyo en cualquier incidente, en curso de garantía, y en el acceso a las personas adecuadas.

• Asterisk Business Edition

Software Digium

Digium ofrece Asterisk Business Edition, una versión perfeccionada de la versión de fuente abierta Asterisk PBX, para el sistema operativo Linux. Digium Partner también ofrece productos que se integran con Asterisk Business Edition y de fuente abierta Asterisk.

Descripción:

¿Por qué Asterisk Business Edition?

Asterisk es una completa plataforma de telecomunicaciones y representa una muy valiosa pieza de software por una serie de razones:

- Reducción de los costos extrema - Control y personalización - Flexible dial plan - Rich, característica de base amplia

Fácil de Instalar, configurar y Usar

Servidor Asterisk completo con AsteriskGUI. Asterisk Business Edition con licencia comercial.

in Router Ideal para pequeñas oficinas. Hasta ocho puertos analógicos. Apoyo a una combinación de módulos FXO y FXS. 1GB Compact Flash Card ®. Hardware base de Cancelación de eco. 8 MB Onboard Flash. 64 MB de RAM Onboard. 5 Puertos Ethernet (4 LAN, 1 WAN)

Paquetes “Todo en uno” con Hardware de Digium, Asterisk Digium Software, sistema de documentación, y servicios de suscripción. Mayor fiabilidad en el PC. Baja necesidad de energía � Reducidos costes de propiedad. Permite un completo despliegue ofreciendo rentables soluciones de telefonía con una instalación sencilla y características como el auto-aprovisionamiento o

osibilidad de utilización de teléfonos IP de Polycom. Una suscripción añade la paz mediante la prestación de apoyo en cualquier incidente, en curso de garantía, y en el acceso a las personas adecuadas.

Asterisk Business Edition ™

ofrece Asterisk Business Edition, una versión perfeccionada de la versión de fuente abierta Asterisk PBX, para el sistema operativo Linux. Digium Partner también ofrece productos que se integran con Asterisk Business Edition y de fuente abierta Asterisk.

¿Por qué Asterisk Business Edition?

Asterisk es una completa plataforma de telecomunicaciones y representa una muy valiosa pieza de software por una serie de razones:

Reducción de los costos extrema Control y personalización

Rich, característica de base amplia

Fácil de Instalar, configurar y Usar

165

n AsteriskGUI. Asterisk Business Edition con licencia comercial.

. Hasta ocho puertos analógicos.

1GB Compact Flash Card ®.

8 MB Onboard Flash.

Paquetes “Todo en uno” con Hardware de Digium, Asterisk Digium Software,

Permite un completo despliegue ofreciendo rentables soluciones de telefonía

aprovisionamiento o

Una suscripción añade la paz mediante la prestación de apoyo en cualquier incidente, en curso de garantía, y en el acceso a las personas adecuadas.

Asterisk es una completa plataforma de telecomunicaciones y representa una muy

166

Asterisk Business Edition incluye soporte rPath ™ distribución de Linux con una mejor instalación, un manual técnico Asterisk, y una guía rápida; hace que Asterisk sea aún más fácil de instalar, configurar y utilizar.

Para mejorar la interactividad del cliente con un Asterisk PBX, Asterisk Business Edition se integra con el reconocimiento LumenVox ™ Engine ™ y Cepstral Texto-a-Habla. Una versión de prueba de la Cepstral producto está incluido, y un puerto libre de Lumenvox Lite también está disponible la solicitud a Asterisk Business Edition clientes. La compra de una licencia es necesaria para activar funciones adicionales de estos productos.

Rendimiento, interoperabilidad y fiabilidad

El programa de pruebas de Digium asegura la fiabilidad, el rendimiento y la interoperabilidad de Asterisk Business Edition con los principales equipos, software y protocolos. Digium hardware tarjetas se realizarán las pruebas de la total compatibilidad con Asterisk Business Edition, como son varios modelos de seleccionar los servidores, VoIP, y los dispositivos TDM. Todas las principales funciones de software en Asterisk Business Edition son testeadas para la funcionalidad y la fiabilidad. Banco de pruebas de sistemas también son sometidos a extremas condiciones de estrés Empirix ™ utilizando equipos de prueba para simular cientos de miles de llamadas en el mundo real con diversas combinaciones y configuraciones.

Como resultado, los clientes pueden confiar en su probada combinación de Asterisk Digium software y hardware que trabajan juntos para proporcionar una caracteristica-rica VoIP PBX o sistema.

Características:

-Soporte de Asterisk Bussiness Ed. -Hangup -SayUnixTime -AbsoluteTimeout -HasNewVoicemail -SendDTMF -AddQueueMember -HasVoicemail -SetAccount -ADSIprog -IAX2Provision -SetAMAFlags -AgentCallbackLogin -ImportVar -SetCallerID -AgentLogin -LookupBlacklist -SetCallerPres -AgentMonitorOutgoing -LookupCIDName -SetCDRUserField -AGI -Macro -SetCIDName -Answer -MacroExit -SetCIDNum -AppendCDRUserField -MacroIf -SetGlobalVar -Authenticate -MailboxExists -SetGroup -Background -Math -SetLanguage -BackgroundDetect -MD5 -SetMusicOnHold -Busy -MD5Check -SetRDNIS -ChangeMonitor -MeetMe -SetVar -ChanIsAvail -MeetMeAdmin -SIPAddHeader -ChanSpy -MeetMeCount -SIPDtmfMode -CheckGroup -Milliwatt -SIPGetHeader -Congestion -Monitor -SoftHangup -ControlPlayback -MP3Player -StartMusicOnHold -Cut -MusicOnHold -StopMonitor

167

-DateTime -NoCDR -StopMusicOnHold -DBDel -NoOp -StopPlayTones -DBdeltree -Park -StripLSD -DBGet -ParkAndAnnounce -StripMSD -DBPut -ParkedCall -Suffix -Dial -PauseQueueMember -System -DigitTimeout -Playback -TestClient -Directory -PlayTones -TestServer -DISA -Prefix -Transfer -DumpChan -PrivacyManager -TryServer -DUNDiLookup -Progress -TXTCIDName -Echo -Queue -UnpauseQueueMember -Endwhile -Random -UserEvent -EnumLookup -Read -Verbose -Eval -ReadFile -VMAuthenticate -Exec -RealTime -VoiceMail -ExecIf -RealTimeUpdate -VoiceMailMain -ExecIfTime -RemoveQueueMember -Wait -Flash -RetryDial -WaitExten -ForkCDR -ResetCDR -WaitForRing -GetCPEID -ResponseTimeout -WaitForSilence -GetGroupCount -Ringing -WaitMusicOnHold -GetGroupMatchCount -SayAlpha -While -Goto -SayDigits -Zapteller -GotoIf -SayNumber -ZapBarge -GotoIfTime -SayPhonetic -ZapScan

Beneficios:

• Reducción de costos extrema

Combinado con la telefonía de bajo costo de hardware, Asterisk Business Edition se puede utilizar para crear un PBX a una fracción del precio tradicional de PBX y sistemas clave, proporcionando al mismo tiempo un nivel de funcionalidad superior a la de muchos de los más caros sistemas disponibles.

• Control

Asterisk Business Edition permite al usuario tomar el control de su sistema telefónico. Una vez que la llamada es en una caja linux ® con Asterisk, nada se puede hacer para él. De la misma forma que Apache le da al usuario un control de grano fino sobre prácticamente todos los aspectos de su operación (y de su carácter de fuente abierta da más flexibilidad), lo mismo se aplica a Asterisk.

• Rápido Despliegue y desarrollo

Asterisk PBX permite la IVR y aplicaciones que se creó y desplegó rápidamente. Su potente CLI texto y archivos de configuración permite una rápida configuración y diagnóstico en tiempo real.

168

• Rich, característica de base amplia

Porque es de código abierto Asterisk y que se aplica de software, no sólo aportan características como el buzón de voz, menús de voz, IVR, y de las conferencias, que son muy costosas para los sistemas de propiedad, sino que también permite nuevas características que se añadirán rápidamente y con un mínimo de Esfuerzo.

• Personalización

A través de su apoyo a la internacionalización, los archivos de configuración, y el código fuente, cada uno de los aspectos de Asterisk pueden ser ajustados. Por ejemplo, los códigos de Asterisk para funciones de llamadas podría ser cambiado para que coincida con un sistema existente.

• Despliegue de contenido dinámico

De la misma forma que los servidores web como Apache permitirá a los usuarios desplegar contenido dinámico, como la información de la cuenta, la película muestra los tiempos, etc, en la web, Asterisk permite desplegar esos contenidos dinámicos a través del teléfono, con la misma facilidad como CGI.

• Marcado Extremadamente flexible

Asterisk es excepcionalmente flexible de marcado permite una integración sin problemas de IVR y la funcionalidad PBX. Muchas de las características de Asterisk (deseado y las características de la futura) se pueden aplicar usando nada más que la extensión lógica. Asterisk apoya una mezcla de longitudes de extensión.

Distribuciones Linux con Asterisk: Las distribuciones con Asterisk más conocidas son:

� AsteriskNOW � TrixBox � Elastix

El 80% de los usuarios que utilizan este tipo de distribuciones para montar su sistema de comunicaciones, no saben cómo modifican los ficheros de configuración o directamente jamás lo han hecho.

Los usuarios de distribuciones controladas por interfaz web suelen olvidar (o no quieren reconocer)que toda interfaz es creada con un objetivo: simplificar la configuración y gestión de una aplicación (en este caso, de Asterisk), esta simplificación tiene un efecto muy negativo, impide realizar tareas que no han sido previamente preparadas por los creadores de dicha interfaz o incluso han sido

169

desechadas por su complejidad y poca utilidad para un público general, se dice entonces que esa distribución está “a merced” de lo que permita hacer la interfaz . En muchos casos se puede pensar que no se puede hacer algo, simplemente porque la interfaz web no lo permite.

AsteriskNOW

AsteriskNOW es el camino más rápido para empezar la construcción de soluciones personalizadas de telefonía con Asterisk. Simplemente descarga el archivo. Iso, grabarlo en un CD, colóquelo en la unidad de CD o DVD en el equipo de destino y en menos de 30 minutos tendrá un sistema Asterisk funcional lista para su aplicación personalizada de telefonía. Instalar Asterisk y la costumbre comenzar a construir aplicaciones de telefonía con AsteriskNOW. AsteriskNOW instala una distribución completa de Linux (rPath en las primeras versiones y CentOs en la última versión 1.5), Asterisk, el marco de conductor DAHDI, Asterisk-GUI, la base de datos MySQL, el servidor web Apache y una amplia variedad de herramientas de desarrollo y componentes. ¿Qué es AsteriskNOW? AsteriskNOW hace fácil crear soluciones personalizadas de telefonía por la instalación automática de la "plomería". Gran parte de la complejidad de Asterisk y Linux es manejado por el instalador y el GUI de administración. Los desarrolladores de aplicaciones e intergrators pueden concentrarse en la construcción de su solución.

170

¿Qué puedo crear con AsteriskNOW? Entre las muchas aplicaciones que puedes crear con AsteriskNOW son:

• VoIP Gateway • Servidor IVR

• Skype Gateway • Sistema de buzón de voz

• IP PBX • Call Recorder

• Call Center ACD • Servidor de fax

• Conferencia de Puente

• Speech Server

¿A quién está dirigido? AsteriskNOW fue construido para los desarrolladores de aplicaciones, integradores de sistemas, estudiantes, piratas informáticos y otros que quieren para crear soluciones personalizadas con Asterisk. ¿Quién apoya a AsteriskNOW? Los usuarios de AsteriskNOW tienen dos opciones. Hay una comunidad activa de usuarios de AsteriskNOW, integradores y desarrolladores que ofrecen apoyo a la comunidad en los foros de AsteriskNOW y lista de correo. Digium ofrece suscripciones de soporte comercial para AsteriskNOW. Si su aplicación requiere el apoyo directo del fabricante, consulta la página de suscripciones. Características y funciones: AsteriskNOW tiene una larga lista de características que lo convierten en el preferido de Asterisk listo para ejecutar la distribución:

- Instalación fácil y rápida. Normalmente se instala en 15 minutos o menos.

- No requiere un profundo conocimiento de Linux. Seguro para los usuarios de

Mac y Windows.

- Web-interfaz de configuración basada en las tareas de gestión hace que la

mayoría de apuntar y hacer clic.

- Los datos Construir aplicaciones dirigidas con soporte integrado para ODBC y

HTTPS.

- Asistente para la configuración de las conexiones de VoIP hace que sea fácil de

conectar.

- Instalación de pre-construidos, paquetes de aplicaciones utilizando el

administrador de aplicaciones.

- Detección automática y la configuración de analógicas Digium y hardware de

telefonía Digitial.

171

- Sound Manager hace fácil crear, instalar y gestionar el sistema de mensajes y

grabaciones.

- Dialplan y editor de secuencia de comandos AEL con resaltado de sintaxis y

validación simplifica el desarrollo.

- Nombre y Call Detail Record (CDR) Viewer proporciona acceso instantáneo a la

actividad del sistema.

- Integrado de texto de ayuda para las aplicaciones, funciones, CLI, AGI y los

comandos de AMI.

- En tiempo real de seguimiento y depuración de la consola ayuda a simplificar el

proceso de desarrollo.

- Paso a paso el desarrollo de aplicación tutoriales enseñar los fundamentos

rápidamente.

- Apoyo a la creación de agrupaciones y de alta disponibilidad que sea fácil de

escalar las aplicaciones.

- Actualizaciones automáticas mantener su sistema en armonía y seguridad.

- Ahorre dinero con una oferta especial en el apoyo de Digium y servicios de

formación.

Actualidad:

El 1 de Abril Digium publicó la versión estable de AsteriskNOW 1.5.0. Digium publicó su primera beta de esta versión en Octubre de 2008 y ya iba siendo hora de que lo actualizaran. Los principales cambios:

• Distribución CentOS actualizado. • Web basada en httpd y FreePBX • Asterisk 1.6 con soporte de DAHDI. • Versiones x86 (32 bits) y x64 (64 bits)

Podéis descargarlo de aquí: http://www.asterisknow.org/downloads.

TrixBox

TrixBox es una distribución basada en CentOS que comercializa la empresa Fonality. Esta distribución tiene una versión gratuita y es de las distribuciones rápidas, una de las más utilizadas por newbies.

172

Una vez instalado TrixBox, el sistema dispone de:

• Asterisk

• Apache

• MySQL

• SugarCRM

• ARI

• FreePBX

Principales características

Trixbox es una completísima y poderosa plataforma. Los productos que incluye son:

• TrixBox dashboard • Asterisk (tm) Open Source PBX • FreePBX herramienta web de administración • SugarCRM • Munin (en paquete administrador) • HUDLite server/admin (en paquete administrador) • IVRGraph (en paquete administrador) • phpMyAdmin (en paquete administrador) • Webmin (en paquete administrador)

Códecs que soporta:

• ADPCM • G.711 (A-Law & μ-Law) • G.722 • G.723.1 (pass through) • G.726 • G.729 (through purchase of a commercial license) • GSM • iLBC

173

Protocolos con los que trabaja:

• IAX™ (Inter-Asterisk Exchange) • IAX2™ (Inter-Asterisk Exchange V2) • H.323 • SIP (Session Initiation Protocol) • MGCP (Media Gateway Control Protocol • SCCP (Cisco® Skinny®) • Traditional Telephony Interoperability • FXS • FXO • DTMF support • PRI Protocols

Versiones de TrixBox:

Trixbox posee dos tipos de versiones:

1) TrixBox CE (Community Edition)

Comenzó en el año 2004 como un proyecto popular PBX denominado Asterisk@Home. Desde ese momento se convirtió en la distribución más popular, con más de 65.000 descargas al mes. Dicha versión se caracteriza por dos pilares importantes: su flexibilidad para satisfacer las necesidades de los clientes y, sobre todo, por ser gratuita.

¿Por qué utilizar TrixBox CE?

Como se acaba de comentar TrixBox CE es una versión muy flexible, que no solo permite configurar funciones y módulos parametrizables para las necesidades de cada cliente, sino que también es posible acudir a la comunidad de TrixBox para ayudar o ser ayudado. Esta es una de las más grandes y más activas del mundo y sus miembros trabajan entre ellos día a día con el fin de responder consultas, resolver problemas, fallos y en seguir desarrollando la herramienta.

¿Quién utiliza TrixBox CE?

Empresas de todo el mundo, desde aquellas que posen muy pocas estaciones de trabajo, hasta medianas compañías que poseen cientos de empleados.

2) TrixBox Pro (Versión comercial de pago)

Es una solución denominada "hibrid-hosted", que significa que el cliente puede realizar una monitorización 24 horas al día los 7 días de la semana, administrar la central desde cualquier lugar y recibir actualizaciones del software de manera automática. Trixbox Pro es una versión empresarial que se ejecuta sobre tecnologías PBXtra, comercializada desde el 2004 permitiendo enviar/recibir más de 120 millones de llamadas por día. La familia trixbox Pro posee 3 versiones:

174

• Standard Edition (SE) • Enterprise Edition (EE) • Call Center Edition (CCE)

Características y beneficios:

1. Gratis y flexible:

Las 3 versiones poseen las siguientes características:

• Standard Edition (SE) : Gratis. • Enterprise Edition (EE) y Call Center Edition (CCE): coste mensual muy

bajo o una cuota de por vida.

2. Fácil instalación, uso y configuración:

Posee un instalador que hace que la instalación sea sencilla; posee, además, un administrador intuitivo y un panel de control que facilita la instalación, configuración y administración.

3. Características avanzadas:

Posee características como contestador automático, integración con el Outlook, voicemail a email, informes, llamadas en conferencia, etc.

4. HUD:

El Hud es una herramienta denominada de "todo en uno", que permite a los empleados poder manejar las comunicaciones de la empresa desde su propio escritorio. De esta manera pueden acceder a chats privados, realizar llamadas con hacer un solo clic, realizar transferencia de llamadas, etc.

5. Seis idiomas:

El panel de control de trixbox Pro está en 6 idiomas, permitiendo así que cualquier usuario pueda configurar la central: Inglés, Francés, Español, Alemán, Italiano y Portugués.

Descripción de las principales características de TrixBox Pro:

Contestador Automático (IVR):

Una de sus características es la funcionalidad de Contestador-Automático que guía a los que llamen según las opciones predefinidas. Esta característica en este producto es muy poderosa y fácil de usar con solo unos clics. Se puede configurar el flujo de las llamadas, redirigir llamadas fuera del lugar de trabajo y algunas opciones más.

175

Integración con Outlook:

Llamadas entrantes: cuando el teléfono suena, el identificador de llamadas puede analizar contra los contactos del Outlook y si una coincidencia es encontrada se mostrara una ventana con el nombre de la persona.

Hacer llamadas desde su casilla de entrada personal: basta con hacer clic con el botón derecho en el contacto o en un mensaje del contacto para llamarle.

Buzón de voz:

Ofrece cuatro maneras fáciles de almacenar mensajes:

• Presionando un botón en el teléfono. • Marcando remotamente desde cualquier teléfono. • Recibiendo archivos .WAV adjuntos en el mail. • Escuchando a través del panel de control web.

Mensajes de voz a email:

La posibilidad de recibir mensajes de voz como simples emails. Trixbox viene preconfigurado para enviar a cada empleado un email cuando estos reciban un mensaje de voz. También se puede tener el audio adjunto al email y escucharlo directamente en la bandeja de entrada.

Scheduler:

Se pueden reproducir diferentes mensajes a las personas que llaman según la hora del día. Configurar un menú totalmente diferente los fines de semana con opciones diferentes que se pueden elegir.

Teléfonos analógicos e IP:

Es el sistema de teléfonos más flexible del mercado, soportando todos los teléfonos analógicos y numerosos teléfonos IP de marcas como Cisco, Polycom, Aastra, SwissVoice y Snom.

VoIP:

Trixbox está preparado para VoIP dependiendo del producto que se esté usando, el cual limita la cantidad de teléfonos posibles. Fácilmente se puede conectar TrixBox con cualquier proveedor de VoIP (SIP o IAX).

Panel de control web:

Ofrece una interfaz web fácil de usar. Un panel de administrador que maneja todos los aspectos del TrixBox remotamente y un panel de usuario para empleados que les permite manejar sus configuraciones personales (como

176

escuchar sus mensajes de voz, responder llamados mediante un clic, traspaso de llamadas, etc.) desde cualquier parte.

Reportes y monitorización:

Con esta característica se pueden analizar en tiempo real los registros de llamadas para cualquier extensión usando potentes filtros y parámetros de búsqueda. También provee informes de los gastos que un cliente ha hecho o su registro de llamadas individual. Todos estos informes pueden ser exportados en formato .csv.

Puentes para conferencias:

Los puentes para conferencias vienen preconfigurados gratuitamente y soportan un número ilimitado de participantes internos y externos.

Soporte de sucursales:

Desarrollo de servidores de bajo coste en cada sucursal u oficina. Algunas de las opciones de las que se disponen en esta característica:

• Llamadas gratis entre sucursales vía VoIP. • Traspaso de llamadas a cualquier extensión que esté conectada al

servidor.

Elastix

Elastix es un software aplicativo que integra las mejores herramientas disponibles para PBXs basados en Asterisk en una interfaz simple y fácil de usar. Además añade su propio conjunto de utilidades y permite la creación de módulos de terceros para hacer de este el mejor paquete de software disponible para la telefonía de código abierto.

Elastix implementa gran parte de su funcionalidad sobre 4 programas de software muy importantes como son Asterisk, Hylafax, Openfire y Postfix. Estos brindan las funciones de PBX, Fax, Mensajería Instantánea y Correo electrónico respectivamente.

La meta de Elastix son la confiabilidad, modularidad y fácil uso. Estas características añadidas a la robustez para reportar hacen de él, la mejor opción para implementar un PBX basado en Asterisk.

177

Características:

Es difícil hacer una lista con todas las características de Elastix en un simple listado, pero las más importantes son:

VoIP PBX:

• Grabación de llamadas con interfaz vía Web. • Voicemails con soporte para notificaciones por e-mail. • IVR configurable y bastante flexible. • Soporte para sintetización de voz. • Herramienta para crear lotes de extensiones lo cual facilita instalaciones

nuevas. • Cancelador de eco integrado. • Provisionador de teléfonos vía Web. Esto permite instalar numerosos teléfonos

en muy corto tiempo. • Soporte para Video-teléfonos. • Interfaz de detección de hardware de telefonía. • Servidor DHCP para asignación dinámica de IPs a Teléfonos IP. • Panel de operador. Desde donde el operador puede ver toda la actividad

telefónica de manera gráfica y realizar sencillas acciones drag-n-drop como transferencias, aparcar llamadas, etc.

• Aparcamiento de llamadas. • Reporte de detalle de llamadas (CDRs) con soporte para búsquedas por fecha,

extensión y otros criterios. • Tarifación con informes de consumo por destino. • Informe de uso de canales por tecnología (SIP, ZAP, IAX, H323). • Soporte para colas de llamadas. • Centro de conferencias. Desde donde se puede programar conferencias

estáticas o temporales.

178

• Soporta protocolo SIP, IAX, H323, MGCP, SKINNY entre otros. • Codecs soportados: ADPCM, G.711 (A-Law & μ-Law), G.722, G.723.1 (pass

through), G.726, G.729 (si se compra licencia comercial), GSM, iLBC. • Soporte para interfaces análogas FXS/FXO. • Soporte para interfaces digitales E1/T1/J1 a través de protocolos PRI/BRI/R2. • Soporte para interfaces bluetooth para celulares (canal chan_mobile). • Identificación de llamadas. • Troncalización (uso de trunks). • Rutas entrantes y salientes las cuales se pueden configurar por coincidencia de

patrones de marcado lo cual da mucha flexibilidad. • Soporte para follow-me. • Soporte para grupos de timbrado. • Soporte para paging e intercom. El modelo de teléfono debe soportar también

esta característica. • Soporte para condiciones de tiempo. Es decir que la central se comporte de un

modo diferente dependiendo del horario. • Soporte para PINes de seguridad. • Soporte DISA. • Soporte Callback. • Editor Web de archivos de configuración de Asterisk. • Acceso interactivo desde el Web a la consola de Asterisk.

Fax:

• Servidor de Fax administrable desde Web. • Visor de Faxes integrado, pudiendo descargarse los faxes desde el Web en

formato PDF. • Aplicación fax-a-email. • Personalización de faxes-a-email. • Control de acceso para clientes de fax. • Puede ser integrado con WinprintHylafax. Esta aplicación permite, desde

cualquier aplicación Windows, enviar a imprimir un documento y este realmente se envía por fax.

• Configurador Web de plantillas de emails.

General:

• Ayuda en línea incorporada. • Elastix está traducido a 22 idiomas. • Monitor de recursos del sistema. • Configurador de parámetros de red. • Control de apagado/re-encendido de la central vía Web. • Manejo centralizado de usuarios y perfiles gracias al soporte de ACLs. • Administración centralizada de actualizaciones. • Soporte para copias de seguridad y la restauración de las mismas a través del

Web. • Soporte para temas o skins.

179

• Interfaz para configurar fecha/hora/huso horario de la central.

Email:

• Servidor de correo electrónico con soporte multidominio. • Administrable desde Web. • Interfaz de configuración de Relay. • Cliente de Email basado en Web. • Soporte para "cuotas" configurable desde el Web. • Soporte Antispam.

Colaboración:

• Calendario integrado con PBX con soporte para recordatorios de voz. • Libreta telefónica (Phone Book) con capacidad clic-to-call. • Dos productos de CRM integrados a la interfaz como vTigerCRM y SugarCRM.

Extras:

• Interfaz de generación de tarjetas de telefonía basada en software A2Billing. • CRM completo basado en el producto vTigerCRM. • También versión de código abierto de SugarCRM.

Centro de llamadas:

• Módulo de centro de llamadas con marcador predictivo incluido.

El módulo de centro de llamadas puede manejar tanto campañas de llamadas entrantes como salientes. Algunas de las características son:

- Soporte para lista de números no-llamar (Do-Not-Call List). - Soporte para campañas entrantes y salientes. - Asociación de formularios por campaña. - Asociación de guión por campaña. - Consola de agente. - Soporte para breaks, siendo estos configurables y de diferentes

tipos. - Marcador predictivo de código abierto. - Informes avanzados.

Mensajería instantánea:

• Servidor de mensajería instantánea basado en OpenFire e integrado a PBX con soporte para protocolo Jabber, lo que permite usar una amplia gama de clientes de mensajería instantánea disponibles.

• Se puede iniciar una llamada desde el cliente de mensajería (si se usa el cliente Spark).

• El servidor de mensajería es configurable desde Web.

180

• Soporta grupos de usuarios. • Soporta conexión a otras redes de mensajería como MSN, Yahoo Messenger,

GTalk, ICQ, etc. Esto permite estar conectado a varias redes desde un mismo cliente.

• Informe de sesiones de usuarios. • Soporte para plugins. • Soporta LDAP. • Soporta conexiones server-to-server para compartir usuarios.

Soporte para hardware de telefonía:

Elastix cuenta con un buen soporte para hardware de telefonía, contando con drivers para los principales fabricantes de tarjetas como:

• OpenVox • Digium • Sangoma • Rhino Equipment • Xorcom • Yeastar

La mayoría de estos controladores se soportan a través de los drivers del proyecto Zaptel o versiones modificadas del mismo. Otros se soportan en base al proyecto mISDN u otros.

Elastix también soporta muchas marcas de teléfonos gracias a que los protocolos SIP e IAX que usa Asterisk lo permiten. Estos protocolos son abiertos por lo que prácticamente cualquier fabricante puede implementar un teléfono que se comunique sobre estos estándares.

Algunos fabricantes de teléfonos soportados son:

• Polycom • Atcom • Aastra • Linksys • Snom • Cisco • Nokia • UTstarcom

Casos de uso de una Centralita Asterisk:

• Centralita nueva con conexiones y extensiones de varios tipos.

• Pasarela para dotar a una centralita tradicional de servicios nuevos.

• Pasarela para dotar a una centralita tradicional de nuevas extensiones.

• Varias Oficinas con un Asterisk Centralizado.

181

• Varias Oficinas con Sistemas Asterisk interconectados.

Centralita nueva con conexiones y extensiones de varios tipos.

Pasarela para dotar a una centralita tradicional de servicios nuevos.

Posibles servicios: Conexión con Operador IP, Buzón de Voz a email, Sistema de respuesta automático, etc.

182

Pasarela para dotar a una centralita tradicional de nuevas extensiones.

Para poder hacer esto la centralita tradicional debería poder programarse para ello.

Varias Oficinas con un Asterisk Centralizado.

De esta forma, además de comunicaciones entre Sedes, todas las sedes pueden hacer llamadas al exterior a través de la central Asterisk. Las extensiones externas podrán seguir el protocolo SIP o el Protocolo IAX.

183

Varias Oficinas con Sistemas Asterisk interconectados.

Todos los Asterisk Pueden utilizar los otros Asterisk para hablar con números de las provincias donde se encuentran. Entre ellos se pueden conectar mediante IAX o SIP, e incluso se puede montar un plan de numeración único entre todos.

184

Ampliación del sistema de telefonía de una empresa

Supongamos una empresa con una infraestructura de comunicaciones tradicional, basada en una red de telefonía y una red de datos independientes. El sistema de telefonía está controlado por una PBX propietaria que da servicio a un determinado número de extensiones analógicas y digitales, y que se encuentra conectada a la red de telefonía pública. La empresa experimenta un crecimiento inesperado, pero bienvenido, de personal y la PBX alcanza su máxima capacidad y todavía quedan extensiones por asignar.

⊗ Solución Uno: Ampliación de la PBX con los módulos apropiados, siempre que ese modelo no se encuentre descatalogado por el fabricante, asumiendo el elevado coste de este tipo de hardware y exponiéndonos a la misma situación en crecimientos futuros.

⊗ Solución Dos: Compra de nueva PBX, con mayores prestaciones y módulo de VoIP para acercar la empresa a la nueva tecnología. Lo que supone costes elevadísimos, dependencia del fabricante y poca flexibilidad en las aplicaciones disponibles.

� Solución Asterisk: Instalación de una centralita Asterisk que aprovechando la

PBX antigua, ofrece nuevas extensiones analógicas y/o digitales con hardware de menor coste. Pero que, sobretodo, ofrece un número mucho mayor de extensiones VoIP sin hardware adicional, y con gran escalabilidad para próximas ampliaciones.

185

Soluciones de Asterisk para sistemas de telefonía entre sedes remotas

Una ventaja inmediata de las soluciones de telefonía IP consiste en la posibilidad de realizar llamadas entre sedes remotas sin coste e integrando el sistema de numeración (extensiones) entre ellas. Asterisk ofrece una solución ideal para este tipo de organizaciones con sedes distantes.

Sistema Centralizado

Existe un servidor centralizado por donde entran y salen las llamadas a la red de telefonía tradicional, y que se encarga de gestionar los clientes de VoIP (extensiones VoIP) de todas las delegaciones.

186

Sistema Distribuido

Cada delegación tiene su propia centralita Asterisk conectada a la red WAN de la empresa (A través de internet o líneas dedicadas) y a la red telefónica. Entre los Asterisk, a través del protocolo IAX (Inter-Asterisk eXchange) intercambian información de rutado, permitiendo una gestión del sistema de telefonía de la compañía y un rutado inteligente de llamadas.

La revolución Asterisk

Cambio en el concepto de PBX Probablemente lo más importante de Asterisk es que no es un sistema de telefonía en caja negra. Es una plataforma de comunicaciones basada en un servidor informático. Esto no sólo cambia la manera de concebir los sistemas de telefonía, sino que además presenta una serie de ventajas sorprendentes.

Flexibilidad y Customización

Efectivamente una instalación Asterisk puede ser diseñada, configurada, conectada e instalada de diferentes maneras, por lo que se convierte en una solución universal para todas las necesidades.

• Asterisk puede aceptar conexiones a teléfonos locales, pero también a teléfonos en otras partes del mundo, que se convierten en parte de la red telefónica de su oficina.

187

• Asterisk puede interconectarse usando señalización analógica, digital o IP.

• Asterisk funciona igual de bien con viejos teléfonos analógicos que con teléfonos IP o SoftPhones, que son en realidad software del PC.

Escalabilidad

Asterisk es una solución muy buena de PBX para una pequeña oficina con 2 o 3 extensiones internas y 1 línea saliente, pero también funciona perfectamente para una plataforma de comunicaciones de una empresa con 900 teléfonos IP, centenares de llamadas simultáneas y varios primarios RDSI.

Para Asterisk el tamaño no importa. Sin ningún coste añadido incluso la instalación más pequeña puede ofrecer las características más avanzadas de telefonía como IVR, buzón de voz, conferencias, servicio hasta ahora reservado a las grandes empresas.

Es importante recordar que Asterisk puede crecer de forma lineal según sus necesidades. ¿Necesita otro teléfono en su oficina? Sólo debe comprar el teléfono; no deberá modificar las licencias de hardware o software ni justificar gasto alguno ante el Departamento de Finanzas.

Integración

Asterisk puede integrarse con otros sistemas TI (Tecnologías de Información) en la organización empresarial, aportando así un valor añadido a los procesos de negocio nuevos y/o mejorados.

A continuación presentamos una serie de ejemplos que ilustran el valor añadido que representa para una empresa integrar las telecomunicaciones y otros sistemas TI.

Ejemplos de uso de Asterisk:

Ejemplo 1: Centros médicos – Llamada recordatoria

Cuando a un paciente le dan cita con semanas e incluso meses de antelación, es probable que se olvide del día. Si no acude a la cita repercutirá en los ingresos de ese día y el personal médico estará desocupado el tiempo previsto para la consulta. A fin de mejorar su funcionamiento y rendimiento, los centros médicos pueden instalar un sistema telefónico basado en Asterisk, que tras integrarlo con la agenda de visitas programadas, llamará al paciente el día o semana anterior recordándole su cita mediante un mensaje de voz grabado. De esta manera se garantizan los ingresos previstos y se aumenta la productividad.

188

Ejemplo 2: Centros de telemarketing – Integración con sistemas CRM

Los centros de telemarketing llamarán a una lista de números para intentar vender a los usuarios un producto o servicio. La lista con los números se descarga en el software CRM (Customer Relationship Management). El sistema CRM contacta con el sistema de comunicaciones pidiendo que se marque de forma automática el número y de esta manera tener una serie de mejoras:

• Llamada automática: los agentes sólo deben hacer clic sobre el número de teléfono que aparece en la pantalla y el sistema marca el número. • Registro de llamadas: el sistema de comunicaciones genera automáticamente una entrada para cada llamada como parte del historial telefónico del cliente. • Centrarse en el objetivo: el sistema de comunicaciones puede programarse

de modo que en horas laborables sólo marque números de la lista de números, impidiendo a los empleados realizar llamadas personales.

Esta integración genera más productividad al acelerar la cadencia de trabajo y centrar a los agentes en la tarea que están llevando a cabo. También disminuye los costes no relacionados con las operaciones de la empresa.

Ejemplo 3: Agencias de viajes (Self service)

Una agencia de viajes contrata vuelos, estancias en hoteles y visitas para sus clientes. En contextos como excursiones o viajes de trabajo son habituales las cancelaciones y los cambios de planes. ¿Qué sucede si hay que cancelar fuera de horarios de oficina? ¿Qué pasa si hay una avalancha de llamadas entrantes?

Integrando el sistema de comunicaciones con el sistema de reservas, los clientes podrán llamar y cambiar o cancelar su reserva mediante menús interactivos. Por lo tanto, la agencia de viajes podrá optimizar los costes operativos y los costes derivados de proveedores (hoteles y empresas de transporte).

La complejidad Asterisk

Los expertos resaltan que en cualquier Software sea libre o cerrado sus ventajas y riesgos están directamente relacionados con su uso adecuado. Y recuerdan que Asterisk es un sistema complejo, aunque sea una solución avanzada basada en software abierto. Es necesario apoyarse en un equipo técnico o empresas externas que conozcan bien Asterisk para que su implantación y ciclo de vida sea plenamente satisfactorio.

189

En muchos proyectos no solo se tiene que considerar un servicio de instalación, soporte sino también la integración con otros sistemas de la compañía. En el terreno de los problemas que puede presentar Asterisk hay que aclarar que por sí solo no ofrece escalabilidad o alta disponibilidad, pero se puede alcanzar una solución intermedia de alta disponibilidad a través de la redundancia y usando software de terceros.

¿Y el futuro?

“Asterisk es un software abierto y como tal su evolución es posible gracias a una

comunidad de usuarios y empresas que comparten su código y experiencias a través de

Internet. Los Call Centers son los primeros beneficiados de una herramienta como

Asterisk ya que para ellos el PBX es un componente imprescindible para prestar sus

servicios .Igualmente las empresas que pueden beneficiarse de Asterisk no solo para

reducir costes sino también para crear soluciones más sostenibles para diferentes tipos

de negocios”, señala Iván Sixto, CEO Business Development manager de I6NET.

Sobre el futuro de Asterisk podría trazarse un paralelismo a la situación que experimenta Linux en el mercado de los sistemas operativos. “No se convertirá en un

monopolio, pero será un rival totalmente viable en ambos campos. Especialmente en

tiempos de recortes de costes como los que se avecinan, aunado con un cambio en la

tecnología (Voz IP) tendrá una oportunidad única de sustituir a soluciones existentes”, señala Eduardo Malpica, responsable de Consultoría Preventa de Altitude Software España.

Conclusiones La adopción de una centralita VoIP no debería ser una opción para aquellas personas o entidades que hayan llegado a la conclusión de que necesitan una centralita, sino que debería verse como algo inevitable. Los grandes operadores siguen cobrando precios desorbitados por un servicio que, desde la aparición de Internet y la interconexión de grandes redes, ha perdido su razón de ser: la transmisión de voz. Asterisk está revolucionando el mundo de la telefonía, nunca existió una herramienta tan completa, versátil, extensible y flexible en la industria de las comunicaciones de voz, y es que tiene una potencia y escalabilidad que es inalcanzable, en relación prestaciones-precio, para ninguna centralita convencional. Además gracias a que es libre, en licencia y en código, el único límite que existe para los servicios que podemos ofrecer, es nuestra imaginación. Una vez más se demuestra que el paradigma Open Source funciona, y funciona bien, no existen productos comerciales que superen en calidad y características a otros proyectos como son Linux, Apache o Mozilla, por mencionar unos cuantos. Asterisk es en pocas palabras, el futuro de la telefonía.

190

Iniciación en Linux Como todo iniciado en el mundo Linux, lo primero en lo que me centre fue en la elección de la distribución correcta para tener un aprendizaje lo más rápido posible. Tras mirar lo que me ofrecía cada una de las siguientes distribuciones, decidí instalar Kubuntu 9.04.

Pruebas realizadas

3

Capítulo

191

192

Kubuntu & Asterisk Pese a que el aprendizaje y familiarización con Linux fue sencillo y breve no lo fue tanto el primer contacto con Asterisk y tampoco la primera instalación aunque la información en cuanto a instalar de este tipo centralitas es abundante para la mayoría de las distribuciones Kubuntu no es de las más habituales o empleadas .Tras conseguir un funcionamiento correcto de la centralita Asterisk pasé a informarme sobre las distribuciones más empleadas para crear servidores de este tipo.

193

Elección del servidor adecuado para Asterisk

¿Qué hay que tener en cuenta en la elección del servidor Asterisk?

Para la elección del equipo servidor de nuestro sistema Asterisk deberemos tener en cuenta:

� Número de usuarios, o extensiones internas, del sistema y tecnología

empleada, VoIP o teléfonos analógicos. � Códecs empleados y necesidades de conversión. � Cantidad de tráfico de voz esperado. � Existencia de conferencias. � Funcionalidades avanzadas como menús interactivos de voz, integración con

aplicaciones informáticas empresariales, sistemas de facturación,…

¿Cuál es la mejor distribución para instalar Asterisk?

“Asterisk funciona perfectamente bajo cualquier distribución”

No obstante, según una encuesta que se realizó hace algún tiempo en la página web de los usuarios de Asterisk-ES (foro de Asterisk), la mayoría se decantan por dos: Debian y CentOS.

CentOS (acrónimo de Community ENTerprise Operating System) es un clon a nivel binario de la distribución Red Hat Enterprise Linux, compilado por voluntarios. Es una alternativa para aquellos que quieren usar la plataforma RHL pero no quiere alejarse de sus principios de software libre.

Otra ventaja que tiene CentOS es la gran cantidad de usuarios que trabajan con esta distribución y la cantidad de paquetes en ‘rpm’ que existen, lo que hace que existan multitud de foros de usuarios que preguntan y responden basados en esta distribución.

Debian es muy usado por su gran estabilidad y seguridad. Su gran estabilidad se basa en que llevan mucho tiempo arreglando los bugs que puede tener cierto programa antes de ser liberado como estable. Sin embargo este proceso puede durar hasta años por lo que muchos no son tan pacientes en esperar y quizás decidan en migrar a otra distribución.

Mi elección definitiva para las prácticas y el montaje de la centralita Asterisk fue

CentOs 5.4. Para instalarlo seguí el siguiente manual.

194

Puesta a punto del servidor antes de la instalación de Asterisk:

Servidor HTTP Apache

Apache es un proyecto nacido para crear un servidor web estable, fiable y veloz para plataformas Unix. Apache nace, por una parte, de un código ya existente y de una serie de patch para mejorar su fiabilidad y sus características; de ahí su nombre: ¡A PAtCHy sErver! El equipo de desarrollo, además, está formado por voluntarios, repartidos por todo el mundo, que sigue manteniendo este servidor web libre.

Instalación

yum install httpd httpd-devel php php-common php-devel

Arranque de Apache

Iniciar el servicio

service httod start

chkconfig httpd on

Parar el servicio

service httpd stop

Reiniciar el servicio

service httpd restart

Servidor DHCP (DHCPD)

DHCP es un protocolo diseñado principalmente para ahorrar tiempo gestionando direcciones IP en una red grande. El servicio DHCP está activo en un servidor donde se centraliza la gestión de la direcciones IP de la red. Hoy en día, muchos sistemas operativos incluyen este servicio dada su importancia.

Funcionamiento

El funcionamiento DHCP se basa en la arquitectura cliente / servidor (como casi todos los servicios de Internet), por lo que hace falta un servidor DHCP (dhcpd) y el cliente DHCP para su funcionamiento. En el caso más simple es un servidor DHCP el que recibe la solicitud de asignación de dirección IP ( y el resto de los parámetros de configuración) del cliente. Si no existe un servidor DHCP se necesitará un agente (normalmente un router) que sabe la dirección del servidor DHCP.

El protocolo funciona en cuatro pasos:

� DHCP discover � DHCP offer � DHCP request � DHCP ACK

195

Modos en DHCP Existen 3 modos en DHCP para poder asignar direcciones IP a otros equipos:

• Asignación manual: El administrador configura manualmente las direcciones IP del cliente en el servidor DCHP. Cuando la estación de trabajo del cliente pide una dirección IP, el servidor mira la dirección MAC y procede a asignar la que configuró el administrador.

• Asignación automática: Al cliente DHCP (ordenador, impresora, etc.) se le asigna una dirección IP cuando contacta por primera vez con el DHCP Server. En este método la IP es asignada de forma aleatoria y no es configurada de antemano.

• Asignación dinámica: El servidor DHCP asigna una dirección IP a un cliente de forma temporal. Digamos que es entregada al cliente que hace la petición por un espacio de tiempo. Cuando este tiempo acaba, la IP es revocada y la estación de trabajo ya no puede funcionar en la red hasta que no pida otra.

Instalación

yum install –y dhcpd

Configuración

El fichero de configuración está en /etc/ y se denomina dhcpd.conf.

La configuración es la siguiente:

; Esta opción especifica si el servidor de DHCP debe intentar actualizar el servidor de DNS ddns-update-style interim; ignore client-updates;

;Segmento red y submascara de red subnet 192.168.1.0 netmask 255.255.255.0 {

;Definimos la gateway y la submascara de red

option routers 192.168.1.3; option subnet-mask 255.255.255.0;

196

;Rango de IP´S que repartirá range 192.168.1.201 192.168.1.203;

; Tiempo de vida por defecto de la IP default-lease-time 86400;

;Máximo tiempo de vida de la IP max-lease-time 608400;

;DNS option domain-name-servers 194.179.1.100;

;Servidor TFTP option tftp-server-name "192.168.1.3"; }

DHCP también usa el fichero /var/lib/dhcp/dhcpd.leases para almacenar la información de los clientes, se utiliza para saber las IP´s que va asignando.

Un ejemplo del contenido del archivo dhcpd.leases tras asignar la IP 192.168.1.203 a un teléfono IP Sipura es:

lease 192.168.1.203 {

starts 2 2009/09/22 09:56:15;

ends 3 2009/09/23 09:56:15;

binding state active;

next binding state free;

hardware ethernet 00:0e:08:da:c2:3c;

uid "\001\000\016\010\332\302<";

client-hostname "SipuraSPA";

}

Arranque del demonio DHCPD

Iniciar el servicio

service dhcpd start

chkconfig dhcpd on

Parar el servicio

service dhcpd stop

Reiniciar el servicio

service dhcpd restart

197

Servidor TFTP (TFTPD)

TFTP (Trivial file transfer Protocol) es un protocolo de red para la transferencia de archivos entre sistemas conectados a una red TCP (Transmission Control Protocol), basado en la arquitectura cliente-servidor. Desde un equipo cliente se puede conectar a un servidor para descargar archivos desde él o para enviarle archivos, independientemente del sistema operativo utilizado en cada equipo.

Características

• Utiliza UDP (en el puerto 69) como protocolo de transporte (a diferencia del FTP que utiliza el puerto 21 TCP).

• No puede listar el contenido de los directorios.

• No existen mecanismos de autenticación o cifrado.

• Se utiliza para leer o escribir archivos de un servidor remoto. • Soporta tres modos diferentes de transferencia, "netascii", "octet" y "mail", de

los que los dos primeros corresponden a los modos "ascii" e "imagen" (binario) del protocolo FTP.

Instalación del servidor TFTP

yum install –y xinetd

Configuración

El fichero de configuración se encuentra en /etc/xinetd.d/ y se denomina tftp. La configuración es la siguiente:

service tftp { disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = /root/tftpboot per_source = 11 cps = 100 2 flags = IPv4 }

Arranque del servicio Xinetd

Iniciar el servicio

service xinetd start

chkconfig xinetd on

Parar el servicio

service xinetd stop

198

Reiniciar el servicio

service xinetd restart

Servidor MySQL (MySQLD)

MySQL es un sistema de administración relacional de bases de datos. Una base de datos relacional archiva datos en tablas separadas en vez de colocar todos los datos en un gran archivo. Esto permite velocidad y flexibilidad. Las tablas están conectadas por relaciones definidas que hacen posible combinar datos de diferentes tablas sobre pedido.

MySQL es software de fuente abierta. Fuente abierta significa que es posible para cualquier persona usarlo y modificarlo. Cualquier persona puede bajar el código fuente de MySQL y usarlo sin pagar. Cualquier interesado puede estudiar el código fuente y ajustarlo a sus necesidades. MySQL usa el GPL (GNU General Public License) para definir que puede hacer y que no puede hacer con el software en diferentes situaciones. Si usted no se ajusta al GPL o requiere introducir código MySQL en aplicaciones comerciales, usted puede comprar una versión comercial licenciada.

Instalación del servidor y el cliente MySQL

yum install mysql-server yum install mysql

Arranque del servicio mysqld

Iniciar el servicio

service mysqld start

chkconfig mysqld on

Parar el servicio

service mysqld stop

Reiniciar el servicio

service mysqld restart

Establecimiento de contraseña de root y privilegios

mysql –u root -p mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'root' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql>quit;

phpMyAdmin

phpMyAdmin es una herramienta escrita en PHP con la intención de manejar la administración de MySQL a través de páginas web, utilizando Internet.

199

Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y modificar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL, administrar claves en campos, administrar privilegios, exportar datos en varios formatos y está disponible en 50 idiomas. Se encuentra disponible bajo la licencia GPL.

Instalación php

yum install –y php*

Instalación phpMyAdmin

cd /var/www/html wget –c http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin-3.2.4-rc1-all-languages.tar.gz

tar xvfz phpMyAdmin-3.2.4-rc1-all-languages.tar.gz mv phpMyAdmin-3.2.4-rc1-all-languages.tar.gz phpmyadmin cd phpmyadmin cp config.sample.inc.php config.inc.php nano config.inc.php

Sustituir “ $cfg['Servers'][$i]['auth_type'] = ‘cookies ’ ” por :

$cfg['Servers'][$i]['auth_type'] = ‘http‘;

service httpd restart

Acceso a phpmyadmin

http://IP del servidor/phpmyadmin/

Servidor SNMP (SNMPD)

SNMP (Simple Network Management Protocol), en sus distintas versiones, es un conjunto de aplicaciones de gestión de red que emplea los servicios ofrecidos por TCP/IP y que ha llegado a convertirse en un estándar. Y es que este protocolo de gestión facilita de una manera simple y flexible el intercambio de información de forma estructurada y efectiva. Los elementos básicos son los Administradores ( Management Stations) ubicados en el/los equipo/s de gestión de red y los Gestores (Network Agents: elementos pasivos ubicados en los nodos -host, routers, modems, multiplexores, ... a ser gestionados), siendo los segundos los que envían información a los primeros, relativa a los elementos gestionados, por iniciativa propia o al ser interrogados (polling) de manera secuencial, apoyándose en los parámetros contenidos en sus MIB (Management Information Base).

200

Su principal inconveniente es el exceso de tráfico que se genera, lo que lo puede hacer incompatible para entornos amplios de red. Los cinco tipos de mensajes SNMP intercambiados entre los Agentes y los Administradores, son:

� Get Request: Una petición del Administrador al Agente para que envíe los

valores contenidos en el MIB (base de datos).

� Get Next Request: Una petición del Administrador al Agente para que envíe los

valores contenidos en el MIB referente al objeto siguiente al especificado

anteriormente.

� Get Response: La respuesta del Agente a la petición de información lanzada

por el Administrador.

� Set Request: Una petición del Administrador al Agente para que cambie el

valor contenido en el MIB referente a un determinado objeto.

� Trap: Un mensaje espontáneo enviado por el Agente al Administrador, al

detectar una condición predeterminada, como es la conexión/desconexión de

una estación o una alarma.

Instalación de SNMP

Instalar NETSNMP y otros paquetes:

# perl -MCPAN -e shell

/etc/perl/CPAN/Config.pm inicialize.

CPAN is the world-wide archive of perl resources. It consists of about 100 sites that all replicate

the same contents all around the globe. Many countries have at least one CPAN site already.

The resources found on CPAN are easily accessible with the CPAN.pm module. If you want to use

CPAN.pm, you have to configure it properly.

If you do not want to enter a dialog now, you can answer 'no' to this question and I'll try to auto

configure. (Note: you can revisit this dialog anytime later by typing 'o conf init' at the cpan

prompt.)

Are you ready for manual configuration? [yes] “no”

cpan> install Net::SNMP

Checking if your kit is complete...

Looks good Warning:

prerequisite Crypt::DES 2.03 not found.

Warning: prerequisite Digest::HMAC 1.00 not found.

Warning: prerequisite Digest::SHA1 1.02 not found.

Writing Makefile for Net::SNMP ----

Unsatisfied dependencies detected during [D/DT/DTOWN/Net-SNMP-5.2.0.tar.gz] -----

Digest::HMAC

Crypt::DES

Digest::SHA1

Shall I follow them and prepend them to the queue

of modules we are processing right now? [yes] “Enter”

201

cpan>exit

Ahora es necesario instalar los paquetes de SNMP:

yum install arpwatch.i386 net-snmp-devel.i386 net-snmp-libs.i386 net-snmp-perl.i386 net-snmp-utils.i386 cluster-snmp.i386 openhpi-subagent.i386 php-snmp.i386

Configuración del SNMP

Necesitas modificar el fichero snmpd.conf:

# nano /etc/snmp/snmpd.conf

Borra todo su contenido pulsando continuamente “Ctrl+K” y copia lo siguiente:

master agentx

agentXPerms 0660 0660 root root

com2sec local localhost public_asterisk

com2sec mynetwork 230.5.42.12 public_asterisk

group MyROGroup any local

group MyROGroup any mynetwork

view all included .1

access MyROGroup "" any noauth 0 all none none

Guarda el fichero y reinicia el demonio SNMPD:

# /etc/init.d/snmpd restart

Cambia los privilegios a agentx:

# chmod 755 /var/agentx

Acceso al Servidor: PUTTY

Se trata de una aplicación gratuita SSH41, Telnet, rlogin y cliente TCP raw que nos permite acceder al servidor Asterisk en modo consola y así poder acceder a la línea de comandos.En Host Name: 192.168.1.200 IP del servidor Asterisk y pulsamos en “Open”.

202

Nos aparecerá una pantalla negra solicitando que nos loguemos “Login as” Ejemplo de Login como “Root”.

Acceso al Servidor: WinSCP

Se trata de un cliente SFTP (Security File Transfer Protocol) gráfico que emplea SSH (Security Shell) y que hemos utilizado en algunos casos para transferir y editar archivos de configuración de Asterisk. Ejemplo de acceso al directorio de archivos de Asterisk:

203

Instalación de Asterisk:

Asterisk 1.4.xx (de 1.4.0 a 1.4.21)

1.) El primer paso es descargar los módulos necesarios: zaptel, libpri, asterisk y asterisk-addons desde los repositorios públicos de Digium y guardarlos en nuestro sistema( /usr/src/) :

cd /usr/src/ mkdir asterisk

204

cd asterisk

wget http://downloads.digium.com/pub/libpri/libpri-1.4-current.tar.gz wget http://downloads.digium.com/pub/zaptel/zaptel-1.4-current.tar.gz wget http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.4-current.tar.gz

2.) Ahora debemos averiguar la versión exacta de nuestro kernel con el comando uname –a, deberíamos ver algo como:

[root@asterisk~]# uname -a

Linux asterisk.asteriskclub.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux

Apuntamos si la versión del kernel es 2.4 o 2.6, ya que necesitaremos esta información luego.

3.) Luego verificamos si tenemos instaladas las fuentes del kernel, para ello utilizamos el comando rpm -q kernel-devel:

[root@asterisk ~]# rpm -q kernel-devel

kernel-devel-2.6.18-8.el5

Si no están instaladas podemos hacerlo con yum de la siguiente forma:

yum install kernel-devel

4.) Ahora sí, instalamos los siguientes paquetes necesarios para al instalación de Asterisk:

yum install bison bison-devel ncurses ncurses-devel zlib zlib-devel gcc-c++ openssl-devel gnutls-devel gcc openssl

5.) Un paso más antes de empezar con la instalación, CentOS no instala las fuentes del kernel en el directorio /usr/src/linux como está escrito en los Makefile de Zaptel y Astersik, para ello nos vamos a /usr/src/ y creamos un link llamado linux hacia el directorio con las fuentes del kernel el cual está ubicado en /usr/src/kernels/mi_version_del_kernel (aquí utilizamos la información obtenida del paso 2) estos son los resultados que esperamos:

[root@asterisk ~]# cd /usr/src/

[root@asterisk src]# ln -s kernels/2.6.18-8.el5-i686/ linux [root@asterisk src]# ll

205

total 28 drwxr-xr-x 2 root root 4096 jun 13 08:43 asterisk drwxr-xr-x 3 root root 4096 jun 12 13:17 kernels lrwxrwxrwx 1 root root 26 jun 13 09:12 linux -> kernels/2.6.18-8.el5-i686/ drwxr-xr-x 7 root root 4096 jun 12 13:34 redhat

6.) Listo, ahora sí, nos posicionamos en la carpeta donde bajamos los paquetes (/usr/src/), los desempaquetamos y descomprimimos, así:

cd /usr/src/asterisk tar -vxzf libpri-current tar.gz tar -vxzf zaptel-current.tar.gz tar -vxzf asterisk-current.tar.gz tar -vxzf asterisk-addons-current.tar.gz

Luego ingresamos a la carpeta libpri

cd libpri-1.4.0

y ejecutamos:

make clean make make install

Grabamos y cerramos el archivo.

Luego ingresamos a la carpeta zaptel

cd ../zaptel-1.4.2.1

y ejecutamos:

make clean make make install make config (para hacer que el modulo zaptel se carge al tiempo de boot)

Finalmente ingresamos a la carpeta asterisk:

cd ../asterisk-1.4.4

206

y ejecutamos:

make clean ./configure make make install make samples (para crear archivos de ejemplo) make config

7.) Listo !! si todo salió bien deberíamos poder cargar Asterisk con:

asterisk –vvvvvvvvcg o asterisk –rvvvvvvv

8.) Opcionalmente podemos ponerle a nuestra central soporte para códec g729, descargando una version OpenSource.

cd /var/lib/asterisk/modules wget http://asterisk.hosting.lv/bin/codec_g729-ast14-gcc4-glibc- pentium4.so mv codec_g729-ast14-gcc4-glibc-pentium4.so codec_g729.so chmod +x codec_g729.so service asterisk restart

Asterisk 1.4xx (de 1.4.22 a 1.4.27) y 1.6.x

1.) Empezamos actualizando el S.O.

yum -y update

2.) Instalaremos algunos paquetes necesarios antes de Asterisk en sí mismo.

yum install libtiff-devel php-pear php-pear-db php-gd php-mysql php-pdo

audiofile-devel mysql-devel perl-datemanip

3.) Creamos la carpeta dónde guardaremos los paquetes de asterisk y los descargamos:

cd /usr/src mkdir asterisk cd asterisk

Instalamos el subversion para para poder descargar el Asterisk:

yum –y install subversión

207

svn checkout http://svn.digium.com/svn/asterisk/branches/1.4/asterisk-1.4.26.1 svn checkout http://svn.digium.com/svn/asterisk-addons/branches/1.4/asterisk- addons-1.4.9 wget http://downloads.digium.com/pub/telephony/dahdi-linux/dahdi-linux- 2.1.0.4.tar.gz wget http://downloads.digium.com/pub/telephony/dahdi-tools/dahdi-tools- 2.1.0.2.tar.gz wget http://downloads.digium.com/pub/libpri/releases/libpri-1.4.9.tar.gz

Descomprimimos:

tar zxvf libpri-1.4.9.tar.gz tar zxvf dahdi-linux-2.1.0.4.tar.gz tar zxvf dahdi-tools-2.1.0.2.tar.gz

4.) Instalamos libpri:

cd libpri-1.4.9

make

make install

cd ..

5.) Instalamos dahdi-linux

cd dahdi-linux-2.1.0.4

make

make install

cd ..

6.) Instalamos dahdi-tools

cd dahdi-tools-2.1.0.2

./configure

make menuselect

make

make install

make config

cd ..

7.) Instalamos asterisk

cd asterisk-1.4.26.1/

./configure

make menuselect

make

make install

8.) Instalamos asterisk-addons

208

cd /usr/src/asterisk-addons-1.4.9/

./configure

make menuselect

make

make install

Elección de la version Asterisk:

Diferencia entre los Asterisk 1.4 (hasta 1.4.21) y los Asterisk 1.4.22 (y superiores) y 1.6 en telefonía analógica: De Zaptel a DAHDI

En el paso de Asterisk 1.4.21 a Asterisk 1.4.22 Digium como ya anuncié, cambió el nombre de la interfaz de telefonía analógica Zaptel a DAHDI (Digium Asterisk Hardware Device Interface) para dar cabida a los deseos del titular de la marca Zaptel. A parte del cambio de nombre Digium aprovechó para efectuar la corrección de errores e introducir una serie de características:

• Los supresores de eco pueden aplicarse por canal y seleccionando el tiempo de configuración.

• La asignación de memoria de canal ha pasado de un gran bloque a bloques más pequeños con el fin de reducir los errores de memoria.

• Apoyo para las tarjetas RDSI BRI (Basic Rate Interface), concretamente para las tarjetas B410P (módulo con 4 puertos BRI).

Otros de los avances es el empaquetamiento de los módulos, pasando de uno sólo (zaptel) a dos diferenciados por tener uno los módulos del Kernel (dahdi-linux) y otro con las herramientas para su uso (dahdi-tools). En el primer paquete, dahdi-linux la equivalencia de módulos es la siguiente:

- zaptel.ko � dahdi.ko

- ztd-eth.ko � dahdi_dynamic_eth.ko

- ztd-loc.ko � dahdi_dynamic_loc.ko

- ztdummy.ko � dahdi_dummy.ko

- ztdynamic.ko � dahdi_dynamic.ko

- zttranscode.ko � dahdi_transcode.ko

En el segundo paquete, dahdi-tools la equivalencia de módulos es la siguiente:

- ztcfg � dahdi_cfg

- ztmonitor � dahdi_monitor

- ztscan � dahdi_scan

- ztspeed � dahdi_speed

209

- zttest � dahdi_test

- zttool � dahdi_tool

- zapconf �dahdi_genconf En las versiones de Asterisk 1.4 y 1.6 en las que se usa DAHDI, los módulos que utilizan los servicios de este canal son:

- chan_zap.so � chan_dahdi.so

- app_zapbarge.so � app_dahdibarge.so

- app_zarpras.so � app_dahdiras.so

- app_zapscan.so � app_dahdiscan.so

- codec_zap.so � codec_dahdi.so La descripción de cada módulo es la siguiente:

• chan_dahdi.so: Este modulo determina que nombre del canal se debe utilizar para llamadas entrantes .Si no se quiere usar el nombre de canal DAHDI y se quiere seguir usando el canal Zap hay que añadir la siguiente línea al archivo asterisk.conf de /etc/asterisk/:

dahdichanname=no

• app_dahdibarge.so: La aplicación ZapBarge será ahora DAHDIBarge.

• app_dahdiras.so: La aplicación ZapRAS será ahora DAHDIRAS.

• app_dahdiscan.so: La aplicación ZapScan será ahora DAHDIScan. Por último, la configuración para el controlador del canal se lee del archivo chan_dahdi.conf en /etc/asterisk/ en vez del zapata.conf, mientras que la información de las tarjetas que detecte aparecerá en dahdi-channels.conf en vez de en zaptel.conf.

Configuración DAHDI

1.) Ejecutamos dahdi_scan y veremos que las tarjetas que reconoce DAHDI y su estado (actualmente Unconfigured).En este caso disponemos de una tarjeta de telefonía con 4 puertos,2 de ellos ocupados por dos módulos un FXO y un FXS.

[root@asterisk ~]# dahdi_scan

[1]

active=yes alarms=OK description=Wildcard TDM400P REV E/F Board 5 name=WCTDM/4 manufacturer=Digium devicetype=Wildcard TDM400P REV E/F location=PCI Bus 08 Slot 02 basechan=1 totchans=4 irq=209

210

type=analog port=1,FXO port=2,FXS port=3,none port=4,none

2.) Ahora que sabemos que dahdi reconoce nuestras tarjetas, pasamos a configurarlas. para eso ejecutamos:

[root@asterisk ~]# dahdi_genconf

[root@asterisk ~]# dahdi_cfg -vv

dahdi tools version - 2.2.0

dahdi version: 2.2.0

echo canceller(s):

configuration

======================

channel map:

channel 01: fxs kewlstart (default) (echo canceler: mg2) (slaves: 01)

channel 02: fxo kewlstart (default) (echo canceler: mg2) (slaves: 02)

2 channels to configure.

setting echocan for channel 1 to mg2

setting echocan for channel 2 to mg2

3.) A partir de aquí ajustaremos la configuración de dahdi para adaptarla a nuestras necesidades.

3.1.) Editamos /etc/dahdi/modules y comentamos todos aquellos drivers que no usamos.

[root@asterisk asterisk]# nano /etc/dahdi/modules # Contains the list of modules to be loaded / unloaded by /etc/init.d/dahdi.

# # NOTE: Please add/edit /etc/modprobe.d/dahdi or /etc/modprobe.conf if you # would like to add any module parameters. # # Format of this file: list of modules, each in its own line. # Anything after a '#' is ignore, likewise trailing and leading # whitespaces and empty lines.

# Digium TE205P/TE207P/TE210P/TE212P: PCI dual-port T1/E1/J1 # Digium TE405P/TE407P/TE410P/TE412P: PCI quad-port T1/E1/J1 # Digium TE220: PCI-Express dual-port T1/E1/J1 # Digium TE420: PCI-Express quad-port T1/E1/J1 #wct4xxp

# Digium TE120P: PCI single-port T1/E1/J1 # Digium TE121: PCI-Express single-port T1/E1/J1

211

# Digium TE122: PCI single-port T1/E1/J1 #wcte12xp

# Digium T100P: PCI single-port T1 # Digium E100P: PCI single-port E1 #wct1xxp

# Digium TE110P: PCI single-port T1/E1/J1 #wcte11xp

# Digium TDM2400P/AEX2400: up to 24 analog ports # Digium TDM800P/AEX800: up to 8 analog ports # Digium TDM410P/AEX410: up to 4 analog ports #wctdm24xxp

# X100P - Single port FXO interface # X101P - Single port FXO interface #wcfxo

# Digium TDM400P: up to 4 analog ports wctdm

# Digium B410P: 4 NT/TE BRI ports #wcb4xxp

# Digium TC400B: G729 / G723 Transcoding Engine #wctc4xxp

# Xorcom Astribank Devices #xpp_usb

3.2.) A continuación editamos /etc/dahdi/system.conf. ponemos controlar aparte del idioma el número de canal para cada módulo.

[root@asterisk asterisk]# nano /etc/dahdi/system.conf

# Autogenerated by /usr/sbin/dahdi_genconf on Thu Nov 5 06:19:40 2009 # If you edit this file and execute /usr/sbin/dahdi_genconf again, # your manual changes will be LOST. # Dahdi Configuration File # # This file is parsed by the Dahdi Configurator, dahdi_cfg # # Span 1: WCTDM/4 "Wildcard TDM400P REV E/F Board 5" (MASTER) fxsks=1 echocanceller=mg2,1 fxoks=2 echocanceller=mg2,2 # channel 3, WCTDM/4/2, no module. # channel 4, WCTDM/4/3, no module. # Global data loadzone = es defaultzone = es

4.) Echemos un vistazo al fichero /etc/asterisk/dahdi_channels.conf

212

[root@asterisk asterisk]# nano /etc/asterisk/dahdi-channels.conf ; Autogenerated by /usr/sbin/dahdi_genconf on Thu Nov 5 06:19:40 2009

; If you edit this file and execute /usr/sbin/dahdi_genconf again, ; your manual changes will be LOST. ; Dahdi Channels Configurations (chan_dahdi.conf) ; ; This is not intended to be a complete chan_dahdi.conf. Rather, it is intended ; to be #include-d by /etc/chan_dahdi.conf that will include the global settings ; ; Span 1: WCTDM/4 "Wildcard TDM400P REV E/F Board 5" (MASTER) ;;; line="1 WCTDM/4/0 FXSKS" signalling=fxs_ks callerid=asreceived group=0 context=from-pstn channel => 1 callerid= group= context=default

;;; line="2 WCTDM/4/1 FXOKS" signalling=fxo_ks callerid="Channel 2" <4002> mailbox=4002 group=5 context=from-internal channel => 2 callerid= mailbox= group= context=default

Tenemos las tarjetas reconocidas pero no tenemos canales.

[root@asterisk etc]# asterisk -r

*CLI> dahdi show channels

Chan extension Context Language Moh interpret

pseudo default default

*CLI> dahdi show status

Description Alarms IRQ bpviol CRC4 Wildcard TDM400P REV E/F Board 5 OK 0 0 0

5.) Asterisk interpreta los canales a través del fichero de configuración chan_dahdi.conf. Este fichero no existe, así que lo crearemos nosotros.

[root@asterisk asterisk]# nano chan_dahdi.conf

Añadiremos simplemente 2 líneas:

213

[channels]

#include dahdi-channels.conf

con esto le decimos al sistema asterisk que lea el fichero dahdi-channels.conf (creado en la ejecución de dahdi_genconf y dahdi_cfg -vv).

6.) Ahora simplemente reiniciamos asterisk

[root@asterisk asterisk]# asterisk -r

*CLI> dahdi show channels

Chan Extension Context Language MOH Interpret

pseudo default default

1 default default

2 default default

7.) Paramos Asterisk :

[root@asterisk asterisk]# service asterisk stop

Reiniciamos DAHDI:

[root@asterisk asterisk]# service dahdi restart

Iniciamos Asterisk y listo:

[root@asterisk asterisk]# service asterisk start

8.) Al descolgar el telefono analógico en el CLI: -- Starting simple switch on 'DAHDI/2-1' -- Hungup 'DAHDI/2-1'

Pruebas de llamada al canal DAHDI en Asterisk 1.4.26.1

La configuración del canal DAHDI en el extensions.conf es: exten => 1234,1,Dial(DAHDI/2-1,30,Ttm)

exten => 1234,n,Hangup

Llamada de la extensión 105 a la extensión 1234 que desvía al canal DAHDI, la salida del CLI es la siguiente:

214

-- Executing [1234@incoming:1] Dial("SIP/105-08601bd0", "DAHDI/2-1|30|Ttm") in new stack

-- Called 2-1 -- Started music on hold, class 'default', on SIP/105-08601bd0 -- DAHDI/2-1 is ringing -- DAHDI/2-1 is ringing -- Stopped music on hold on SIP/105-08601bd0 -- Hungup 'DAHDI/2-1' == Spawn extension (incoming, 1234, 1) exited non-zero on 'SIP/105-08601bd0'

Llamada del teléfono analógico (canal DAHDI) a la extensión 105:

-- Starting simple switch on 'DAHDI/2-1' -- Executing [105@incoming:1] Dial("DAHDI/2-1", "SIP/105|30|Ttm") in new stack -- Called 105 -- Started music on hold, class 'default', on DAHDI/2-1 -- SIP/105-0948a5a0 is ringing -- Stopped music on hold on DAHDI/2-1 == Spawn extension (incoming, 105, 1) exited non-zero on 'DAHDI/2-1' -- Hungup 'DAHDI/2-1'

Pruebas básicas realizadas en Asterisk 1.4.21

Pruebas SoftPhones:

1.) Realizamos la configuración de 2 usuarios SIP y de 2 usuarios IAX2 en los ficheros extensions.conf, iax.conf y sip.conf.

extensions.conf

exten => 100,1,Dial(SIP/100,30,Ttm) exten => 100,n,Hangup exten => 101,1,Dial(SIP/101,30,Ttm) exten => 101,n,Hangup ;exten => 300,1,Dial(IAX2/300,30,Ttrm) ;exten => 300,n,Hangup ;exten => 400,1,Dial(IAX2/400,30,Ttrm) ;exten => 400,n,Hangup

sip.conf

[general] context=default allowoverlap=no bindport=5060 bindaddr=0.0.0.0 srvlookup=yes language=es callevents=yes [100] type=friend username=100

215

secret=1234 mailbox=100 host=dynamic context=default canreinvite=yes dtmfmode=rfc2833 nat=no [101] type=friend username=101 secret=1234 mailbox=101 host=dynamic context=default canreinvite=yes dtmfmode=rfc2833 nat=no

iax.conf [general]

bindport=4569 bindaddr=0.0.0.0 srvlookup=yes accountcode=lss0101 delayreject=yes language=es disallow=all allow=gsm allow=ulaw allow=alaw

[300] type=friend host=dynamic secret=1234 auth=md5,plain context=default qualify=yes callerid = "300" autokill=yes

[400] type=friend host=dynamic secret=1234 auth=md5,plain context=default qualify=yes callerid = "400" autokill=yes

2.) Hacemos un “reload” de Asterisk para que detecte las extensiones de los usuarios.

216

[root@asterisk]# asterisk –rvvv *CLI> reload

3.) Realizamos la configuración de los 4 usuarios en 2 Softphones Zoiper situados

en dos ordenadores diferentes.

De la misma manera se configuran las otras dos extensiones de cada protocolo. Para tener más información sobre la configuración de este y otros SoftPhones ir al subcapítulo SoftPhones del capítulo de Asterisk.(ENLACE)

4.) Comprobamos que los usuarios se han registrado correctamente en los SoftPhones.

-- Registered IAX '300' at 192.168.1.200 port 4569 -- Registered SIP '100' at 192.168.1.200 port 5060 -- Saved useragent "Zoiper rev.5324" for peer 300 -- Saved useragent "Zoiper rev.5324" for peer 100

217

5.) Vemos el comportamiento de la centralita Asterisk, a través del SoftPhone, al realizar llamadas entre las extensiones (teniendo en cuenta que no podemos llamar de una extensión SIP a una IAX2 y bicerversa).

-- Executing [100@default:1] Dial("SIP/101- 097f7fb8", "SIP/100|30|Ttm") in new stack

-- Called 100 -- Started music on hold, class 'default', on SIP/101-097f7fb8 -- SIP/100-097f9a98 is ringing -- SIP/100-097f9a98 answered SIP/101-097f7fb8 -- Stopped music on hold on SIP/101-097f7fb8 == Spawn extension (default, 100, 1) exited non-zero on 'SIP/101-097f7fb8'

218

Pruebas teléfonos IP (SipuraSPA):

1.) Realizamos la configuración de 4 usuarios SIP en los ficheros extensions.conf y

sip.conf. De la misma forma que en el apartado anterior realizamos la configuración en dichos ficheros de las extensiones SIP: 102, 103, 104, 105, que serán utilizadas también en pruebas posteriores.

2.) Hacemos un “reload” de Asterisk para que detecte las extensiones de los usuarios.

[root@asterisk]# asterisk –rvvv *CLI> reload

3.) Realizamos la configuración de los 4 usuarios en 2 telefenos IP SipuraSPA de dos extensiones cada uno. La configuración del teléfono en cuanto al servidor Asterisk es la siguiente:

Un ejemplo de configuración de una extensión de las dos que permite configurar cada teléfono IP es:

219

4.) Comprobamos que los usuarios se han registrado correctamente en los

teléfonos IP.

-- Registered SIP '102' at 192.168.1.201 port 5060

-- Saved useragent "Sipura/SPA841-3.1.3(a)" for peer 102

5.) Vemos el comportamiento de la centralita Asterisk, a través del CLI, al realizar llamadas entre las extensiones SIP de los teléfonos IP y las de los SoftPhones configuradas en el apartado anterior.

-- Executing [100@default:1] Dial("SIP/102-097f96a8", "SIP/100|30|Ttm") in new stack -- Called 100 -- Started music on hold, class 'default', on SIP/102-097f96a8 -- SIP/100-098066d8 is ringing -- Stopped music on hold on SIP/102-097f96a8

220

== Spawn extension (default, 100, 1) exited non-zero on 'SIP/102-097f96a8'

Pruebas de funcionamiento de buzones de voz:

1.) Desconectamos un teléfono IP paa obligar la redirección a los buzones de las extensiones registradas en él.

extensions.conf

exten => 100,1,Dial(SIP/100,30,Ttm) exten => 100,n,Voicemail(100) exten => 100,n,Hangup

voicemail.conf

[general] format=wav49|gsm|wav ;serveremail=asterisk attach=yes skipms=3000 maxsilence=10 silencethreshold=128 maxlogins=3 emaildateformat=%A, %B %d, %Y at %r sendvoicemail=yes

[zonemessages] eastern=America/New_York|'vm-received' Q 'digits/at' IMp central=America/Chicago|'vm-received' Q 'digits/at' IMp central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours' military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p' european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM

[default] 100 => 1234,100,100@localhost

2.) Vemos el comportamiento de la centralita Asterisk, a través del CLI, al realizar una llamada a una de las extensiones del teléfono IP que no está registrada.

-- Executing [100@default:1] Dial("SIP/102-0891c9f0", "SIP/100|30|Ttm") in new stack == Everyone is busy/congested at this time (1:0/0/1) -- Executing [100@default:2] VoiceMail("SIP/102-0891c9f0", "100") in new stack

-- <SIP/102-0891c9f0> Playing 'vm-intro' (language 'es') -- <SIP/102-0891c9f0> Playing 'beep' (language 'es') -- Recording the message

-- x=0, open writing: /var/spool/asterisk/voicemail/default/100/tmp/ylgos8 format: wav49, 0x889d9f0 -- x=1, open writing: /var/spool/asterisk/voicemail/default/100/tmp/ylgos8 format: gsm, 0x89181f0 -- x=2, open writing: /var/spool/asterisk/voicemail/default/100/tmp/ylgos8 format: wav, 0x88fc230

221

-- User hung up

Al grabar el primer mensaje en la cuenta de voicemail hay que especificar los códecs en los que quieres que se grabe el mensaje. A continuación grabará en esos formatos todos los mensajes que se dejen a no ser que se cambie.

3.) Vemos cómo escuchar el mensaje guardado en el buzón.

extensions.conf

;exten => 1001,1,VoiceMailMain(100)

Para escuchar los mensajes: Marcar 1001. Tras grabar dejar dos mensajes en el buzón de voz a la extensión 100: Después de marcar la extensión para escuchar los buzones de voz de la extensión 100 (1001) te pide la password del buzón, si la metes correctamente t dice el numero de mensajes que tienes en el buzón y te da una serie de opciones:

-- Executing [1001@default:1] VoiceMailMain("SIP/102-08914790", "100") in new stack -- <SIP/102-08914790> Playing 'vm-password' (language 'es') -- <SIP/102-08914790> Playing 'vm-youhave' (language 'es')

-- <SIP/102-08914790> Playing 'digits/2' (language 'es') -- <SIP/102-08914790> Playing 'vm-messages' (language 'es') -->OPCION 1 -- <SIP/102-08914790> Playing 'vm-INBOX' (language 'es') -->OPCION 2 -- <SIP/102-08914790> Playing 'vm-onefor' (language 'es') -->OPCION 3

Pulsamos el 1 para escuchar los mensajes.Te dice la fecha y hora del primero y reproduce la grabación:

-- <SIP/102-08914790> Playing 'vm-first' (language 'es') -- <SIP/102-08914790> Playing 'vm-message' (language 'es')

== Parsing '/var/spool/asterisk/voicemail/default/100/INBOX/msg0000.txt': Found

-- <SIP/102-08914790> Playing 'vm-received' (language 'es') -- <SIP/102-08914790> Playing 'digits/today' (language 'es') -- <SIP/102-08914790> Playing 'digits/at' (language 'es') -- <SIP/102-08914790> Playing 'digits/11' (language 'es') -- <SIP/102-08914790> Playing 'digits/24' (language 'es') -- <SIP/102-08914790> Playing 'digits/a-m' (language 'es')

-- <SIP/102-08914790> Playing '/var/spool/asterisk/voicemail/default/100/INBOX/msg0000' (language 'es')

Entre otras opciones te permite volverlo a escuchar y escuchar el siguiente mensaje,etc. -- <SIP/102-08914790> Playing 'vm-advopts' (language 'es') -->OPCION 4 -- <SIP/102-08914790> Playing 'vm-repeat' (language 'es') -->OPCION 5

222

-- <SIP/102-08914790> Playing 'vm-next' (language 'es') -->OPCION 6 -- <SIP/102-08914790> Playing 'vm-delete' (language 'es') -->OPCION 7 -- <SIP/102-08914790> Playing 'vm-toforward' (language 'es') -->OPCION 8 -- <SIP/102-08914790> Playing 'vm-savemessage' (language 'es') -->OPCION 9 -- <SIP/102-08914790> Playing 'vm-helpexit' (language 'es') -->OPCION 0

Escuchamos el siguiente pulsando el 6.

== Parsing '/var/spool/asterisk/voicemail/default/100/INBOX/msg0001.txt': Found

-- <SIP/102-08914790> Playing 'vm-received' (language 'es') -- <SIP/102-08914790> Playing 'digits/today' (language 'es') -- <SIP/102-08914790> Playing 'digits/at' (language 'es') -- <SIP/102-08914790> Playing 'digits/11' (language 'es') -- <SIP/102-08914790> Playing 'digits/28' (language 'es') -- <SIP/102-08914790> Playing 'digits/a-m' (language 'es')

-- <SIP/102-08914790> Playing '/var/spool/asterisk/voicemail/default/100/INBOX/msg0001' (language 'es')

Pruebas utilización de las aplicaciones Goto() y GotoIf() y de variables de canal:

1.) Llamamos a la extensión 100 dependiendo del contenido de la variable de canal

DIALSTATUS que comprueba el estado de la extensión a la que llamamos. Si la llamada no es contestada pero el canal esta activo --> Cuelga Si la llamada está ocupada o la línea está saturada --> Aplicaciones Busy() y Congestion() Si la llamada que estamos realizando es a un canal inactivo la redirecciona a la extensión 102 tras decir la extensión marcada.

exten => 1222,1,Dial(SIP/100,30,Ttm) exten => 1222,n,NoOp(Dial Status : ${DIALSTATUS}) exten => 1222,n,Set(COUNT=${EXTEN}) exten => 1222,n,Goto(${DIALSTATUS},1)

exten => NOANSWER,1,Hangup exten => CONGESTION,1,Congestion exten => CANCEL,1,Hangup exten => BUSY,1,Busy exten => CHANUNAVAIL,1,SayNumber(${COUNT}) exten => CHANUNAVAIL,2,Dial(SIP/101,30,Ttm)

-- Executing [1222@default:1] Dial("SIP/102-08915210", "SIP/100|30|Ttm") in new stack == Everyone is busy/congested at this time (1:0/0/1)

-- Executing [1222@default:2] NoOp("SIP/102-08915210", "Dial Status : CHANUNAVAIL") in new stack -- Executing [1222@default:3] Set("SIP/102-08915210", "COUNT=1222") in new stack -- Executing [1222@default:4] Goto("SIP/102-08915210", "CHANUNAVAIL|1") in new stack

-- Goto (default,CHANUNAVAIL,1) -- Executing [CHANUNAVAIL@default:1] SayNumber("SIP/102-08915210", "1222") in new stack

-- <SIP/102-08915210> Playing 'digits/thousand' (language 'es')

223

-- <SIP/102-08915210> Playing 'digits/200' (language 'es') -- <SIP/102-08915210> Playing 'digits/22' (language 'es') -- Executing [CHANUNAVAIL@default:2] Dial("SIP/102-08915210", "SIP/101|30|Ttm") in new stack

-- Called 101 -- Started music on hold, class 'default', on SIP/102-08915210 -- SIP/101-08920878 is ringing -- Stopped music on hold on SIP/102-08915210

== Spawn extension (default, CHANUNAVAIL, 2) exited non-zero on 'SIP/102-08915210'

2.) Vemos el funcionamiento del GotoIf, tal que dependiendo del valor de una variabvle se llama a una extension o a otra.

exten => 6666,1,Set(TEST=2) ;exten => 6666,1,Set(TEST=1) exten => 6666,n,GotoIf($[${TEST} = 1]?ir,1:adios,1) exten => adios,1,Goto(default,100,1) exten => ir,1,Goto(default,101,1) exten => t,1,Goto(default,101,1)

Probamos con la variable TEST=2 (redirecciona a dios y llama a la extensión 100 que no está registrada y por tanto salta el buzón).

-- Executing [6666@default:1] Set("SIP/102-0891dbe0", "TEST=2") in new stack -- Executing [6666@default:2] GotoIf("SIP/102-0891dbe0", "0?ir|1:adios|1") in new stack -- Goto (default,adios,1) -- Executing [adios@default:1] Goto("SIP/102-0891dbe0", "default|100|1") in new stack

-- Goto (default,100,1) -- Executing [100@default:1] Dial("SIP/102-0891dbe0", "SIP/100|30|Ttm") in new stack

== Everyone is busy/congested at this time (1:0/0/1) -- Executing [100@default:2] VoiceMail("SIP/102-0891dbe0", "100") in new stack

-- <SIP/102-0891dbe0> Playing 'vm-intro' (language 'es') == Spawn extension (default, 100, 2) exited non-zero on 'SIP/102-0891dbe0'

Probamos con la variable TEST=1 (redirecciona a ir y llama a la extensión 101).

-- Executing [6666@default:1] Set("SIP/102-b756d130", "TEST=1") in new stack -- Executing [6666@default:2] GotoIf("SIP/102-b756d130", "1?ir|1:adios|1") in new stack

-- Goto (default,ir,1) -- Executing [ir@default:1] Goto("SIP/102-b756d130", "default|101|1") in new stack

-- Goto (default,101,1) -- Executing [101@default:1] Dial("SIP/102-b756d130", "SIP/101|30|Ttm") in new stack

-- Called 101 -- Started music on hold, class 'default', on SIP/102-b756d130 -- SIP/101-0891db38 is ringing -- Stopped music on hold on SIP/102-b756d130 == Spawn extension (default, 101, 1) exited non-zero on 'SIP/102-b756d130'

224

3.) Contador decreciente.

exten => 1123,1,Set(COUNT=10) exten => 1123,n(start),GotoIf($[${COUNT} > 0]?:goodbye) exten => 1123,n,SayNumber(${COUNT}) exten => 1123,n,Set(COUNT=$[${COUNT} - 1]) exten => 1123,n,Goto(start) exten => 1123,n(goodbye),Hangup

-- Executing [1123@default:1] Set("SIP/102-b7568b98", "COUNT=10") in new stack -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "10") in new stack

-- <SIP/102-b7568b98> Playing 'digits/10' (language 'es') -- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=9") in new stack

-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2)

-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "9") in new stack -- <SIP/102-b7568b98> Playing 'digits/9' (language 'es')

-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=8") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "8") in new stack -- <SIP/102-b7568b98> Playing 'digits/8' (language 'es')

-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=7") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "7") in new stack -- <SIP/102-b7568b98> Playing 'digits/7' (language 'es')

-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=6") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2)

-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "6") in new stack -- <SIP/102-b7568b98> Playing 'digits/6' (language 'es') -- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=5") in new stack

-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack

-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "5") in new stack -- <SIP/102-b7568b98> Playing 'digits/5' (language 'es') -- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=4") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "4") in new stack -- <SIP/102-b7568b98> Playing 'digits/4' (language 'es') -- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=3") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "3") in new stack -- <SIP/102-b7568b98> Playing 'digits/3' (language 'es')

225

-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=2") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "2") in new stack -- <SIP/102-b7568b98> Playing 'digits/2' (language 'es') -- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=1") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack -- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "1") in new stack -- <SIP/102-b7568b98> Playing 'digits/1' (language 'es') -- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=0") in new stack -- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack -- Goto (default,1123,2) -- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "0?:goodbye") in new stack -- Goto (default,1123,6) -- Executing [1123@default:6] Hangup("SIP/102-b7568b98", "") in new stack == Spawn extension (default, 1123, 6) exited non-zero on 'SIP/102-b7568b98'

Pruebas de funcionamiento colas y registro de miembros:

queues.conf

[general] persistentmembers = yes keepstats=no

[davidqueue] musiconhold = default strategy = ringall ;servicelevel = 0 eventwhencalled = yes timeout = 10 retry = 1 ;autofil = yes context = intern ;wrapuptime = 0 ;maxten = 0 ;joinempty = yes announce-frequency = 30 announce-holdtime = yes leavewhenempty = strict

member => SIP/100,1 member => SIP/103,2 member => SIP/104,3 member => SIP/105,1

extensions.conf exten => 2000,1,Queue(davidqueue|tThH||)

exten => 2001,1,AddQueueMember(davidqueue|SIP/101)

226

exten => 2001,n,Hangup exten => 2002,1,RemoveQueueMember(davidqueue|SIP/101) exten => 2002,n,Hangup

exten => 2003,1,AddQueueMember(davidqueue,,1) exten => 2003,n,Hangup

exten => 2004,1,RemoveQueueMember(davidqueue) exten => 2004,n,Hangup

exten => 3009,1,Set(NUM=${QUEUE_MEMBER_COUNT(davidqueue)}) exten => 3009,n,SayNumber(${NUM})

exten => 3004,1,PauseQueueMember(davidqueue|SIP/105) exten => 3004,n,Hangup

exten => 3005,1,UnpauseQueueMember(davidqueue|SIP/105) exten => 3005,n,Hangup

exten => 3006,1,PauseQueueMember(davidqueue|SIP/100) exten => 3006,n,Hangup

exten => 3007,1,UnpauseQueueMember(davidqueue|SIP/100) exten => 3007,n,Hangup

1.) Comprobamos que la cola a sido correctamente configurada desde el CLI:

*CLI> queue show davidqueue has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:0, SL:0.0% within 0s

Members: SIP/105 with penalty 1 (Not in use) has taken no calls yet SIP/104 with penalty 3 (Not in use) has taken no calls yet SIP/103 with penalty 2 (Not in use) has taken no calls yet SIP/100 with penalty 1 (Not in use) has taken no calls yet

No Callers>

2.) Llamada desde la extensión 102 a la cola (2000) -- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack -- Started music on hold, class 'default', on SIP/102-09368d60 -- Called SIP/100 -- Called SIP/105 -- SIP/100-093ce628 is ringing -- SIP/105-0936a510 is ringing -- Stopped music on hold on SIP/102-09368d60 == Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'

Vemos que suenan a la vez los teléfonos de los miembros de menor penalidad.

3.) Pausamos la extensión 105 y llamamos de nuevo a la cola.

227

-- Executing [3004@default:1] PauseQueueMember("SIP/102-09368d60", "davidqueue|SIP/105") in new stack -- Executing [3004@default:2] Hangup("SIP/102-09368d60", "") in new stack == Spawn extension (default, 3004, 2) exited non-zero on 'SIP/102-09368d60' -- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack -- Started music on hold, class 'default', on SIP/102-09368d60 -- Called SIP/100 -- SIP/100-093cba30 is ringing -- Stopped music on hold on SIP/102-09368d60 == Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'

Esta vez solo suena la extensión 100 de forma que en cualquier momento podemos evitar contestar las llamadas de la cola.

4.) Añadimos dinámicamente el miembro 101 con prioridad 1 a la cola , llamamos a la cola para ver su funcionamiento y lo eliminamos.

*CLI> queue add member SIP/101 to davidqueue penalty 1

Added interface 'SIP/101' to queue 'davidqueue'

-- Executing [2000@default:1] Queue("SIP/102-093d98a0", "davidqueue|tThH||") in new stack

-- Started music on hold, class 'default', on SIP/102-093d98a0 -- Called SIP/100 -- Called SIP/101 -- SIP/100-093dd8c0 is ringing -- SIP/101-093e18e0 is ringing -- Stopped music on hold on SIP/102-093d98a0 == Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-093d98a0'

Como se puede observar a pesar de ser un miembro dinámico el funcionamiento es el mismo que cualquier miembro estático. -- Executing [2002@default:1] RemoveQueueMember("SIP/102-09368d60", "davidqueue|SIP/101") in new stack -- Executing [2002@default:2] Hangup("SIP/102-09368d60", "") in new stack == Spawn extension (default, 2002, 2) exited non-zero on 'SIP/102-09368d60'

A través de la extension 2002 eliminamos dichos miembro dinámico.

*CLI> queue show davidqueue has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:0, SL:0.0% within 0s

Members: SIP/105 with penalty 1 (paused) (Not in use) has taken no calls yet SIP/104 with penalty 3 (Not in use) has taken no calls yet

228

SIP/103 with penalty 2 (Not in use) has taken no calls yet SIP/100 with penalty 1 (Not in use) has taken no calls yet No Callers

5.) Pausamos el miembro 100 y llamamos a la cola para observar como sonará el

de penalidad inmediatamente superior.

-- Executing [3006@default:1] PauseQueueMember("SIP/102-093ce628", "davidqueue|SIP/100") in new stack -- Executing [3006@default:2] Hangup("SIP/102-093ce628", "") in new stack == Spawn extension (default, 3006, 2) exited non-zero on 'SIP/102-093ce628' -- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack -- Started music on hold, class 'default', on SIP/102-09368d60 -- Called SIP/103 -- SIP/103-093ce628 is ringing -- Stopped music on hold on SIP/102-09368d60 == Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'

Efectivamente el siguiente de mayor penalidad es el miembro 103 y por tanto es el que suena.

6.) Comprobamos que pasa si tenemos que esperar en la cola

Llama la extensión 102 a la cola y comienza a ser atendido por el miembro 103.

-- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack -- Started music on hold, class 'default', on SIP/102-09368d60 -- Called SIP/103 -- SIP/103-093ce628 is ringing -- SIP/103-093ce628 answered SIP/102-09368d60 -- Stopped music on hold on SIP/102-09368d60 -- Started music on hold, class 'default', on SIP/103-093ce628

A continuación llama a la cola la extensión 101, pero resulta que el miembro 103 está hablando y por tanto no puede coger, el llamante es avisado de que es el primero esperando y tras dejar de hablar con la extensión 102 atiende a la extensión que estaba esperando.

-- Executing [2000@default:1] Queue("SIP/101-0936a510", "davidqueue|tThH||") in new stack -- Started music on hold, class 'default', on SIP/101-0936a510 -- Called SIP/103 -- SIP/103-093e2ac0 is ringing -- Nobody picked up in 10000 ms -- Stopped music on hold on SIP/101-0936a510 -- <SIP/101-0936a510> Playing 'queue-youarenext' (language 'es') -- Told SIP/101-0936a510 in davidqueue their queue position (which was 1) -- <SIP/101-0936a510> Playing 'queue-thankyou' (language 'es') -- Started music on hold, class 'default', on SIP/101-0936a510 -- Called SIP/103

229

-- SIP/103-093e2ac0 is ringing -- Nobody picked up in 10000 ms -- Called SIP/103 -- SIP/103-093e2ac0 is ringing -- Stopped music on hold on SIP/103-093ce628 == Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60' -- SIP/103-093e2ac0 answered SIP/101-0936a510 -- Stopped music on hold on SIP/101-0936a510 == Spawn extension (default, 2000, 1) exited non-zero on 'SIP/101-0936a510'

7.) ¿Cuántos miembros hay en la cola?

-- Executing [3009@default:1] Set("SIP/102-093ce628", "NUM=4") in new stack -- Executing [3009@default:2] SayNumber("SIP/102-093ce628", "4") in new stack -- <SIP/102-093ce628> Playing 'digits/4' (language 'es')

Otras pruebas:

Pruebas de uso de conferencias en Asterisk 1.4.26.2:

1.) Agregamos a la conferencia creada en el fichero meetme.conf en la extensión

600 a 3 usuarios que desean conversar. La configuración en el fichero extensions.conf para acceder a la conferencia es:

;Agregarse a la conferencia 600 exten => 600,1,Meetme(600,i,1234)

Al llamar el primer miembro (5000), hace una grabación con su nombre y tras pulsar # te da un serie de opciones como escuchar la grabación, regrabarla o aceptarla y después de elegir esta última opción la operadora le indica de su posición en la conferencia (en este caso el 1).

-- Executing [600@acceso:1] MeetMe("SIP/5000-08d7d820", "600|i|1234") in new stack == Parsing '/etc/asterisk/meetme.conf': Found -- Created MeetMe conference 1023 for conference '600' -- Recording -- <SIP/5000-08d7d820> Playing 'vm-rec-name' (language 'es') -- <SIP/5000-08d7d820> Playing 'beep' (language 'es') -- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-1 format: sln, 0x8d8f598 [Dec 10 21:49:55] DTMF[29532]: channel.c:2330 __ast_read: DTMF begin '#' received on SIP/5000-08d7d820 [Dec 10 21:49:55] DTMF[29532]: channel.c:2340 __ast_read: DTMF begin passthrough '#' on SIP/5000-08d7d820 [Dec 10 21:49:55] DTMF[29532]: channel.c:2262 __ast_read: DTMF end '#' received on SIP/5000-08d7d820, duration 140 ms [Dec 10 21:49:55] DTMF[29532]: channel.c:2299 __ast_read: DTMF end accepted with begin '#' on SIP/5000-08d7d820 [Dec 10 21:49:55] DTMF[29532]: channel.c:2315 __ast_read: DTMF end passthrough '#' on SIP/5000-08d7d820 -- User ended message by pressing # -- <SIP/5000-08d7d820> Playing 'auth-thankyou' (language 'es')

230

-- <SIP/5000-08d7d820> Playing 'vm-review' (language 'es') [Dec 10 21:50:02] DTMF[29532]: channel.c:2330 __ast_read: DTMF begin '1' received on SIP/5000-08d7d820 [Dec 10 21:50:02] DTMF[29532]: channel.c:2334 __ast_read: DTMF begin ignored '1' on SIP/5000-08d7d820 [Dec 10 21:50:02] DTMF[29532]: channel.c:2262 __ast_read: DTMF end '1' received on SIP/5000-08d7d820, duration 110 ms [Dec 10 21:50:02] DTMF[29532]: channel.c:2315 __ast_read: DTMF end passthrough '1' on SIP/5000-08d7d820 -- <SIP/5000-08d7d820> Playing 'vm-msgsaved' (language 'es') -- <SIP/5000-08d7d820> Playing 'conf-onlyperson' (language 'es') [Dec 10 21:50:06] DEBUG[29532]: app_meetme.c:1817 conf_run: Placed channel SIP/5000-08d7d820 in DAHDI conf 1023

Hacemos lo mismo con los otros dos usuarios (2003 y 4000):

-- Executing [600@acceso:1] MeetMe("SIP/2003-08df6190", "600|i|1234") in new stack -- Recording -- <SIP/2003-08df6190> Playing 'vm-rec-name' (language 'es') -- <SIP/2003-08df6190> Playing 'beep' (language 'es') -- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-2 format: sln, 0x8d8f598 [Dec 10 21:54:56] DTMF[29573]: channel.c:2262 __ast_read: DTMF end '#' received on SIP/2003-08df6190, duration 90 ms [Dec 10 21:54:56] DTMF[29573]: channel.c:2288 __ast_read: DTMF begin emulation of '#' with duration 90 queued on SIP/2003-08df6190 [Dec 10 21:54:56] DTMF[29573]: channel.c:2407 __ast_read: DTMF end emulation of '#' queued on SIP/2003-08df6190 -- User ended message by pressing # -- <SIP/2003-08df6190> Playing 'auth-thankyou' (language 'es') -- <SIP/2003-08df6190> Playing 'vm-review' (language 'es') [Dec 10 21:55:05] DTMF[29573]: channel.c:2262 __ast_read: DTMF end '2' received on SIP/2003-08df6190, duration 90 ms [Dec 10 21:55:05] DTMF[29573]: channel.c:2315 __ast_read: DTMF end passthrough '2' on SIP/2003-08df6190 -- Reviewing the recording -- <SIP/2003-08df6190> Playing '/var/spool/asterisk/meetme/meetme-username-600-2' (language 'es') -- <SIP/2003-08df6190> Playing 'vm-review' (language 'es') [Dec 10 21:55:13] DTMF[29573]: channel.c:2262 __ast_read: DTMF end '1' received on SIP/2003-08df6190, duration 90 ms [Dec 10 21:55:13] DTMF[29573]: channel.c:2315 __ast_read: DTMF end passthrough '1' on SIP/2003-08df6190 -- <SIP/2003-08df6190> Playing 'vm-msgsaved' (language 'es') [Dec 10 21:55:15] DEBUG[29533]: app_meetme.c:1457 announce_thread: About to play /var/spool/asterisk/meetme/meetme-username-600-2

-- <DAHDI/pseudo-1307374741> Playing '/var/spool/asterisk/meetme/meetme-username-600-2' (language 'es')

-- <DAHDI/pseudo-1307374741> Playing 'conf-hasjoin' (language 'es') [Dec 10 21:55:19] DEBUG[29573]: app_meetme.c:1817 conf_run: Placed channel SIP/2003-08df6190 in DAHDI conf 1023

-- Executing [600@acceso:1] MeetMe("SIP/4000-08d910f8", "600|i|1234") in new stack -- Recording -- <SIP/4000-08d910f8> Playing 'vm-rec-name' (language 'es') -- <SIP/4000-08d910f8> Playing 'beep' (language 'es')

231

-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-3 format: sln, 0x8d90478 [Dec 10 21:56:35] DTMF[29589]: channel.c:2330 __ast_read: DTMF begin '#' received on SIP/4000-08d910f8 [Dec 10 21:56:35] DTMF[29589]: channel.c:2340 __ast_read: DTMF begin passthrough '#' on SIP/4000-08d910f8 [Dec 10 21:56:35] DTMF[29589]: channel.c:2262 __ast_read: DTMF end '#' received on SIP/4000-08d910f8, duration 170 ms [Dec 10 21:56:35] DTMF[29589]: channel.c:2299 __ast_read: DTMF end accepted with begin '#' on SIP/4000-08d910f8 [Dec 10 21:56:35] DTMF[29589]: channel.c:2315 __ast_read: DTMF end passthrough '#' on SIP/4000-08d910f8

-- User ended message by pressing # -- <SIP/4000-08d910f8> Playing 'auth-thankyou' (language 'es') -- <SIP/4000-08d910f8> Playing 'vm-review' (language 'es')

[Dec 10 21:56:43] DTMF[29589]: channel.c:2330 __ast_read: DTMF begin '3' received on SIP/4000-08d910f8 [Dec 10 21:56:43] DTMF[29589]: channel.c:2334 __ast_read: DTMF begin ignored '3' on SIP/4000-08d910f8 [Dec 10 21:56:43] DTMF[29589]: channel.c:2262 __ast_read: DTMF end '3' received on SIP/4000-08d910f8, duration 140 ms [Dec 10 21:56:43] DTMF[29589]: channel.c:2315 __ast_read: DTMF end passthrough '3' on SIP/4000-08d910f8 -- Re-recording -- <SIP/4000-08d910f8> Playing 'vm-rec-name' (language 'es') -- <SIP/4000-08d910f8> Playing 'beep' (language 'es') -- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-3 format: sln, 0x8d90478 [Dec 10 21:56:49] DTMF[29589]: channel.c:2330 __ast_read: DTMF begin '#' received on SIP/4000-08d910f8 [Dec 10 21:56:49] DTMF[29589]: channel.c:2340 __ast_read: DTMF begin passthrough '#' on SIP/4000-08d910f8 [Dec 10 21:56:49] DTMF[29589]: channel.c:2262 __ast_read: DTMF end '#' received on SIP/4000-08d910f8, duration 130 ms [Dec 10 21:56:49] DTMF[29589]: channel.c:2299 __ast_read: DTMF end accepted with begin '#' on SIP/4000-08d910f8 [Dec 10 21:56:49] DTMF[29589]: channel.c:2315 __ast_read: DTMF end passthrough '#' on SIP/4000-08d910f8 -- User ended message by pressing # -- <SIP/4000-08d910f8> Playing 'auth-thankyou' (language 'es') -- <SIP/4000-08d910f8> Playing 'vm-review' (language 'es') [Dec 10 21:56:52] DTMF[29589]: channel.c:2330 __ast_read: DTMF begin '1' received on SIP/4000-08d910f8 [Dec 10 21:56:52] DTMF[29589]: channel.c:2334 __ast_read: DTMF begin ignored '1' on SIP/4000-08d910f8 [Dec 10 21:56:52] DTMF[29589]: channel.c:2262 __ast_read: DTMF end '1' received on SIP/4000-08d910f8, duration 140 ms [Dec 10 21:56:52] DTMF[29589]: channel.c:2315 __ast_read: DTMF end passthrough '1' on SIP/4000-08d910f8 -- <SIP/4000-08d910f8> Playing 'vm-msgsaved' (language 'es') [Dec 10 21:56:54] DEBUG[29533]: app_meetme.c:1457 announce_thread: About to play /var/spool/asterisk/meetme/meetme-username-600-3

-- <DAHDI/pseudo-1307374741> Playing '/var/spool/asterisk/meetme/meetme-username-600-3' (language 'es')

-- <DAHDI/pseudo-1307374741> Playing 'conf-hasjoin' (language 'es') [Dec 10 21:56:58] DEBUG[29589]: app_meetme.c:1817 conf_run: Placed channel SIP/4000-08d910f8 in DAHDI conf 1023

232

En estos momentos hay 3 personas en la conferencia (600). Vamos a comprobarlo:

;Saber cuantas personas hay en la conferencia exten => 601,1,Playback(conf-thereare) exten => 601,n,MeetMeCount(600) exten => 601,n,Playback(conf-peopleinconf)

-- Executing [601@acceso:1] Playback("SIP/2000-08e14e28", "conf-thereare") in new stack -- <SIP/2000-08e14e28> Playing 'conf-thereare' (language 'es') -- Executing [601@acceso:2] MeetMeCount("SIP/2000-08e14e28", "600") in new stack -- <SIP/2000-08e14e28> Playing 'digits/3' (language 'es') -- Executing [601@acceso:3] Playback("SIP/2000-08e14e28", "conf-peopleinconf") in new stack -- <SIP/2000-08e14e28> Playing 'conf-peopleinconf' (language 'es') == Auto fallthrough, channel 'SIP/2000-08e14e28' status is 'UNKNOWN'

2.) Vamos a restringir el número de personas de la conferencia a 2: Para esto utilizaremos una macro que irá comparando cada vez que alquien intente acceder a la conferencia dejándole o no dependiendo del número de usuarios que ya hay en ella.

;Retringir Numero de personas en la conferencia exten => 610,1,Set(confmax=2) exten => 610,n,Macro(meetme)

[macro-meetme] ;exten => s,1,NoOp("confmax=" ${confmax}) exten => s,1,MeetMeCount(${MACRO_EXTEN},count) ;exten => s,n,NoOp("count=" ${count}) ;exten => s,n,NoOp(${count}">" ${confmax}) exten => s,n,Gotoif($[${count} >= ${confmax}]?103) exten => s,n,MeetMe(${MACRO_EXTEN}) exten => s,n,Hangup exten => s,103,Playback(conf-invalid) exten => s,104,Hangup

Como podemos ver en el archivo meetme.conf:

conf => 600,1234

Esto indica que sólo hay una conferencia creada y que para acceder a ella habrá que marcar el número 600. Por esto en la primera prueba al marcar el 610 nos saca esto por el CLI a la par que nos informa que no es un número de conferencia el que acabamos de marcar.

-- Executing [610@acceso:1] Set("SIP/5000-08d7d7e0", "confmax=2") in new stack -- Executing [610@acceso:2] Macro("SIP/5000-08d7d7e0", "meetme") in new stack -- Executing [s@macro-meetme:1] MeetMeCount("SIP/5000-08d7d7e0", "610|count") in new stack == Parsing '/etc/asterisk/meetme.conf': Found [Dec 10 22:04:27] DEBUG[29699]: app_meetme.c:2587 find_conf: 610 isn't a valid conference

233

[Dec 10 22:04:27] DEBUG[29699]: app_macro.c:379 _macro_exec: Executed application: MeetMeCount -- Executing [s@macro-meetme:2] GotoIf("SIP/5000-08d7d7e0", "0?103") in new stack [Dec 10 22:04:27] DEBUG[29699]: app_macro.c:379 _macro_exec: Executed application: Gotoif -- Executing [s@macro-meetme:3] MeetMe("SIP/5000-08d7d7e0", "610") in new stack == Parsing '/etc/asterisk/meetme.conf': Found [Dec 10 22:04:27] DEBUG[29699]: app_meetme.c:2587 find_conf: 610 isn't a valid conference -- <SIP/5000-08d7d7e0> Playing 'conf-invalid' (language 'es') == Spawn extension (macro-meetme, s, 3) exited non-zero on 'SIP/5000-08d7d7e0' in macro 'meetme' == Spawn extension (acceso, 610, 2) exited non-zero on 'SIP/5000-08d7d7e0'

Modificamos el archivo meetme.conf añadiendo la linea: conf => 610 para así crear una nueva conferencia de extensión 610, la cual la limitaremos a 2 personas. No le ponemos contraseña porque esta conferencia al tener restringido el acceso a sólo 2 personas el acceso de ambas personas para hablar será instantáneo.

Al igual que antes, agregamos los dos usuarios a la conferencia y probamos con un tercero para ver que resultados obtenemos:

-- Executing [610@acceso:1] Set("SIP/5000-b6911148", "confmax=2") in new stack -- Executing [610@acceso:2] Macro("SIP/5000-b6911148", "meetme") in new stack -- Executing [s@macro-meetme:1] MeetMeCount("SIP/5000-b6911148", "610|count") in new stack [Dec 10 22:41:46] DEBUG[30235]: app_macro.c:379 _macro_exec: Executed application: MeetMeCount -- Executing [s@macro-meetme:2] GotoIf("SIP/5000-b6911148", "1?103") in new stack -- Goto (macro-meetme,s,103) [Dec 10 22:41:46] DEBUG[30235]: app_macro.c:379 _macro_exec: Executed application: Gotoif

-- Executing [s@macro-meetme:103] Playback("SIP/5000-b6911148", "conf-invalid") in new stack -- <SIP/5000-b6911148> Playing 'conf-invalid' (language 'es') [Dec 10 22:41:51] DEBUG[30235]: app_macro.c:379 _macro_exec: Executed application: Playback -- Executing [s@macro-meetme:104] Hangup("SIP/5000-b6911148", "") in new stack == Spawn extension (macro-meetme, s, 104) exited non-zero on 'SIP/5000-b6911148' in macro 'meetme' == Spawn extension (acceso, 610, 2) exited non-zero on 'SIP/5000-b6911148'

El mensaje es claro: "Este no es un numero de conferencia valido, inténtelo de nuevo".

3.) Como último ejemplo vamos a crear una conferencia dinámicamente, es decir, sin configurarla en el meetme.conf.

;Crear una conferencia dinámica exten => 620,1,Meetme(,scDM(default)) exten => 620,n,Hangup

El proceso de creacion es el siguiente:

234

1. Introduzca el numero de conferencia + #:

-- Executing [620@acceso:1] MeetMe("SIP/5000-b6902bf0", "|scDM(default)") in new stack

-- <SIP/5000-b6902bf0> Playing 'conf-getconfno' (language 'es')

2. Introduzca el pin d ela conferencia -- <SIP/5000-b6902bf0> Playing 'conf-getpin' (language 'es')

3. Crea la conferencia y te pide de nuevo el pin

-- Created MeetMe conference 1023 for conference '621' -- <SIP/5000-b6902bf0> Playing 'conf-getpin' (language 'es')

4. Te dice si estas solo o no

-- <SIP/5000-b6902bf0> Playing 'conf-onlyperson' (language 'es')

Ahora probemos a añadir otro usuario a la conferencia que la hemos creado con la extensión 621 y 1234 de contraseña.Es importante que no generemos una conferencia con la misma extensión de la creación dinámica de conferencias (620).

Para el acceso a cualquier conferencia hay que definir una extensión, en el archivo extensions.conf en este caso la 621:

;Acceso a conferencias dinamicas y estaticas exten => 621,1,Meetme() exten => 621,n,Hangup

-- Executing [621@acceso:1] MeetMe("SIP/2003-b6910c70", "") in new stack

-- <SIP/2003-b6910c70> Playing 'conf-getconfno' (language 'es') -- <SIP/2003-b6910c70> Playing 'conf-getpin' (language 'es')

-- Stopped music on hold on SIP/5000-b690f648

Tras poner el número de conferencia + # y el pin se accede a la conferencia.

Pruebas Proveedor VoIP: Gizmo5

Uso de Gizmo 5 con Asterisk

Este proveedor tiene dos servicios fácilmente acoplables a las centralitas Asterisk:

� Recepción de llamadas. � Realización de llamadas.

El primero se consigue a través de una cuenta Call In, de forma que tras obtener la cuenta solo habría que configurar el archivo sip.conf con la información del proveedor

235

y el Dialplan a través del extensions.conf para que determinadas llamadas sean recibidas a través de dicho proveedor. El segundo se consigue a través de una cuenta Call Out, de forma que tras obtener la cuenta, al igual en el servicio Call In, se configuran los archivos sip.conf y extensions.conf. En los siguientes apartados se ve un ejemplo de estas configuraciones y del uso de este servicio.

Configuración

sip.conf

[general] […] register => 17473702523:Yet100:[email protected]/17473702523

[proxy01.sipphone.com] type=peer context=from-external disallow=all allow=ulaw allow=alaw allow=ilbc dtmfmode=rfc2833 host=proxy01.sipphone.com fromdomain=proxy01.sipphone.com insecure=very qualify=yes username=17473702523 fromuser=17473702523 authuser=17473702523 secret=XXXXXXXX canreinvite=no

extensions.conf

;exten => _6XXXXXXXX,1,Dial(SIP/+34${EXTEN}@proxy01.sipphone.com,20,r) ;exten => _6XXXXXXXX,n,Hangup

Comprobación del registro

*CLI> sip show peers

Name/username Host Dyn Nat ACL Port Status ---------------------- ------- ----------------------- --------- proxy01.sipphone.com/1747 198.65.166.131 5060 OK (216 ms)

Llamada a movil desde GIZMO 5 utilizando cuenta Call Out:

Realización de una llamada desde el usuario SIP/102 hacia un móvil:

236

-- Executing [650XXXXXX@default:1] Dial("SIP/102-08913970", "SIP/[email protected]|20|r") in new stack

-- Called [email protected] -- SIP/proxy01.sipphone.com-089213f8 answered SIP/102-08913970 -- Packet2Packet bridging SIP/102-08913970 and SIP/proxy01.sipphone.com-089213f8 == Spawn extension (default, 650XXXXXX, 1) exited non-zero on 'SIP/102-08913970'

Pruebas Trunk IAX entre dos servidores Asterisk

¿Qué es un Trunk?

Un Trunk es una conexión, bien entre dos servidores o entre un servidor y las aplicaciones de un operador de Telefonía IP que permite el tráfico de VoIP.

Trunk IAX Local entre dos servidores Asterisk

Como se ve en la imagen siguiente el Trunk IAX enlaza dos servidores de la misma red.

La configuración necesaria para que las extensiones de ambos servidores puedan comunicarse es la siguiente:

237

Tras reiniciar ambos servidores, comprobamos que el registro de las extensiones trunk es correcto:

Al realizar una llamada desde la extensión 2003 del Servidor a la 100 del Portátil en el CLI de Asterisk obtenemos:

238

Al realizar una llamada desde la extensión 100 del Portátil a la 2003 del Servidor en el CLI de Asterisk obtenemos:

239

Trunk IAX entre dos servidores Asterisk

La configuración sería igual a la del Trunk IAX local, la única diferencia es que sería necesario abrir el puerto correspondiente al protocolo IAX 2 en ambos routers para poder recibir los paquetes uno del otro.

Pruebas extensión remota

Para configurar una extensión remota debemos configurarla como cualquier otra en iax.conf:

[6000] type=friend username=6000 secret=1234 host=dynamic context=remoto canreinvite=yes dtmfmode=rfc2833

Debemos configurar su acceso en el fichero extensions.conf:

[remoto] exten => 6000,1,Dial(IAX2/${EXTEN},30,Ttm) exten => 6000,n,Hangup

En el otro lado tendremos configurado en un softphone Zoiper una extensión IAX poniendo como Dominio la IP externa del servidor.

240

Para poder establecer el registro de dicha extensión es necesario abrir el puerto correspondiente al protocolo IAX 2 (4569) en el router por el que se comunica con el exterior la centralita Asterisk.Tras abrir el puerto deberíamos ver algo similar a esto:

Este es el esquema de la conexión con una extensión remota:

Para comprobar el correcto funcionamiento vemos el registro de la extensión remota(6000):

-- Registered IAX2 '6000' (AUTHENTICATED) at 82.130.246.138:45755 localhost*CLI> iax2 show peers Name/Username Host Mask Port Status 6001/6001 192.168.1.50 (D) 255.255.255.255 4569 Unmonitored 6000/6000 82.130.246.138 (D) 255.255.255.255 45755 Unmonitored 2 iax2 peers [0 online, 0 offline, 2 unmonitored]

241

Y probamos a llamar desde la extensión de prueba 6001 a la extensión remota:

-- Accepting AUTHENTICATED call from 192.168.1.50: > requested format = gsm, > requested prefs = (), > actual format = gsm, > host prefs = (gsm|ulaw|alaw), > priority = mine -- Executing [6000@remoto:1] Dial("IAX2/6001-14139", "IAX2/6000|30|Ttm") in new stack -- Called 6000 -- Started music on hold, class 'default', on IAX2/6001-14139 -- Call accepted by 82.130.246.138 (format gsm) -- Format for call is gsm -- IAX2/6000-9140 is ringing -- IAX2/6000-9140 answered IAX2/6001-14139 -- Stopped music on hold on IAX2/6001-14139 -- Hungup 'IAX2/6000-9140' == Spawn extension (remoto, 6000, 1) exited non-zero on 'IAX2/6001-14139' -- Hungup 'IAX2/6001-14139'

Prueba con Adaptador Telefónico Analógico SPA 3000

El esquema de las pruebas es el siguiente:

242

En primer lugar tenemos que acceder a la configuración del SPA 3000 a través de la IP (192.168.1.211) para configurar las llamadas entrantes a través del apartado PSTN Line (PSTN->VoIP) y las llamadas salientes a través del apartado Line 1 (VoIP->PSTN). Line 1

PSTN Line

Vemos la configuración del fichero sip.conf:

[9000] type=friend username=9000 secret=1234 host=dynamic context=pstn qualify=yes

243

[9001] type=peer username=9001 fromuser=9001 secret=1234 host=dynamic port=5061 context=pstn dtmfmode=rfc2833 insecure=very

Comprobamos el registro de las dos líneas:

-- Registered SIP '9000' at 192.168.1.211 port 5060 -- Saved useragent "Sipura/SPA3000-2.0.13(GWg)" for peer 9000 -- Registered SIP '9001' at 192.168.1.211 port 5061 -- Saved useragent "Sipura/SPA3000-2.0.13(GWg)" for peer 9001 NOTICE[3840]: chan_sip.c:13107 handle_response_peerpoke: Peer '9000' is now Reachable. (25ms / 2000ms) localhost*CLI> sip show peers Name/username Host Dyn Nat ACL Port Status 9001/9001 192.168.1.211 D 5061 Unmonitored 9000/9000 192.168.1.211 D 5060 OK (14 ms)

La configuración del fichero extensions.conf teniendo en cuenta que queremos que las llamadas entrantes de números que empiecen por 9 se redireccionen a un teléfono analógico y las de los números que empiecen por 6 se redireccionen a un teléfono IP y que también queremos que las llamadas salientes que empiecen por 9 salgan por la PSTN:

[globals] PSTN=192.168.1.211:5061 [pstn] ;Entrantes exten => 9001,1,NoOP("El CALLERID es: ${CALLERID(num)}") exten => 9001,n,GotoIf($["${CALLERID(num):0:1}"= "9"]?100:200) exten => 9001,100,Goto(pstn,9000,1) exten => 9001,200,Goto(pstn,103,1) ;Si es un numero que empieza por 9 exten => 9000,1,Dial(SIP/9000,30,Ttm) exten => 9000,n,Hangup

;Si es un numero que empieza por 6 exten => 103,1,Dial(SIP/103,30,Ttm) exten => 103,n,Hangup ;Salientes exten => _9XXXXXXXX,1,Dial(SIP/${EXTEN}@${PSTN},30,Ttm) exten => _9XXXXXXXX,n,Hangup

Realizamos 3 pruebas para comprobar el correcto funcionamiento: Prueba 1) Llamada desde un móvil al número que está conectado con el SPA 3000:

244

-- Executing [9001@pstn:1] NoOp("SIP/9001-b7776538", ""El CALLERID es: 650664616"") in new stack -- Executing [9001@pstn:2] GotoIf("SIP/9001-b7776538", "0?100:200") in new stack -- Goto (pstn,9001,200) -- Executing [9001@pstn:200] Goto("SIP/9001-b7776538", "pstn|103|1") in new stack -- Goto (pstn,103,1) -- Executing [103@pstn:1] Dial("SIP/9001-b7776538", "SIP/103|30|Ttm") in new stack -- Called 103 -- Started music on hold, class 'default', on SIP/9001-b7776538 -- SIP/103-0a157af0 is ringing -- Stopped music on hold on SIP/9001-b7776538 == Spawn extension (pstn, 103, 1) exited non-zero on 'SIP/9001-b7776538'

Prueba 2) Llamada desde un teléfono fijo al número que está conectado con el SPA:

-- Executing [9001@pstn:1] NoOp("SIP/9001-b7771ae0", ""El CALLERID es: 945177145"") in new stack -- Executing [9001@pstn:2] GotoIf("SIP/9001-b7771ae0", "1?100:200") in new stack -- Goto (pstn,9001,100) -- Executing [9001@pstn:100] Goto("SIP/9001-b7771ae0", "pstn|9000|1") in new stack -- Goto (pstn,9000,1) -- Executing [9000@pstn:1] Dial("SIP/9001-b7771ae0", "SIP/9000|30|Ttm") in new stack -- Called 9000 -- Started music on hold, class 'default', on SIP/9001-b7771ae0 -- SIP/9000-0a157af0 is ringing -- Stopped music on hold on SIP/9001-b7771ae0 == Spawn extension (pstn, 9000, 1) exited non-zero on 'SIP/9001-b7771ae0'

Prueba 3) Llamada desde la extensión 103 de la centralita a un número fijo:

-- Executing [945177145@acceso2:1] Dial("SIP/103-0a157af0", "SIP/[email protected]:5061|30|Ttm") in new stack -- Called [email protected]:5061 -- Started music on hold, class 'default', on SIP/103-0a157af0 -- SIP/192.168.1.211:5061-0a15d138 is ringing -- SIP/192.168.1.211:5061-0a15d138 answered SIP/103-0a157af0 -- Stopped music on hold on SIP/103-0a157af0 == Spawn extension (acceso2, 945177145, 1) exited non-zero on 'SIP/103-0a157af0'

245

Descripción de la centralita nueva: Asterisk Para la correcta creación e implantación de la centralita Asterisk en la empresa Yet Informática S.L. se ha hecho un Demo para ver el futuro funcionamiento de la central de una manera más reducida, tras las pruebas generales , las de las aplicaciones integradas en la centralita y las de otras funcionalidades nuevas estaremos preparados para dicha implantación. A continuación veremos cada uno de estos pasos a realizar.

Centralita Asterisk para Yet Informática y Pruebas realizadas

4

Capítulo

246

Esquema Conceptual del Demo realizado antes de la implantación

247

Explicación del Plan de llamadas de la Centralita (Dialplan)

Llamadas entrantes

248

249

250

251

252

Accesos Directos a usuarios de la Empresa

253

Gestión de Buzones de Voz

Gestión de las Colas de la aplicación

254

255

Funcionamiento de la Funcionalidad CallBack

Los pasos para realizar el CallBack son los siguientes:

1) Marcar el teléfono al que se llamará. 2) Marcar la fecha de la llamada en el formato siguiente:

4 dígitos para el año 2 dígitos para el mes 2 dígitos para el día

3) Marcar la hora de la llamada en el formato siguiente:

2 dígitos para la hora 2 dígitos para los minutos

4) Verificar que los datos introducidos son correctos o volver a introducirlos. 5) Se generará el Call File teniendo en cuenta si la llamada será a un número

externo o no, para comprobarlo mira que el primer digito sea un 6.

256

Uso de Conferencias en la aplicación

Agregarse a la conferencia 600

Saber cuántas personas hay en la conferencia

Restringir el número de participantes de una conferencia

Uso de Conferencia dinámica

Última llamada recibida

Esta funcionalidad en los teléfonos IP de gama media o alta no haría falta pero para poder obtener esta información usando cualquier teléfono IP se ha implementado.

257

Consiste en comprobar en la base de datos del CDR cuál ha sido la última llamada recibida para el CALLERID que ha llamado a la extensión de esta funcionalidad y llamarla.

Última llamada realizada

Consiste en comprobar en la base de datos del CDR cuál ha sido la última llamada realizada por el CALLERID que ha llamado a la extensión de esta funcionalidad y llamarla. Si la última llamada a sido realizada a un usuario interno se mira cual es la llamada anterior y si no es interna se realiza la llamada.

258

Funcionamiento de la Funcionalidad DISA

Configuración 1) Al llamar a la centralita un determinado número, está le llama y le da tono para llamar a través de esta.

Configuración 2) Al llamar a la extensión 333 de la centralita, está le llama y le da tono para llamar a través de esta.

259

Configuración 3) Al llamar a la extensión 9999 de la centralita, tras marcar la contraseña 1234 seguido del carácter #, está da tono para llamar a través de esta a cualquier número de salida que este en el contexto “acceso”.

Funcionamiento del desvío de las llamadas de usuarios internos a otro teléfono

Activación del desvío de llamadas de una extensión de un usuario interno

Desactivación del desvío de llamadas de una extensión de un usuario interno

260

Prueba para la extensión 5000 tras efectuar el desvío.

Pruebas generales

Prueba 1) Llama a la centralita en un horario no laborable un usuario VIP.

Parte de código utilizado:

[acceso] exten => 787,1,Set(NUM=${EXTEN}) exten => 787,n,Macro(general,soportelaboral,${CALS},${NUM}) [macro-general] ;1)COMPROBACION CON EL CALENDARIO exten => s,1,Answer exten => s,n,Set(SALTO=${ARG1}) exten => s,n,AGI(${ARG2}) exten => s,n,Goto(${SALTO},${ARG3},1) [No Disponible Soporte] ;Comprobar en la base de datos si el cliente es VIP(contrato de mantenimiento de 24h).Si lo es se le envia a la prioridad 100 sino lo es a la 90. exten => 787,1,MYSQL(Connect connid localhost root root agenda) exten => 787,n,NoOp(connid = ${connid}) exten => 787,n,Set(NUM2= ${CALLERID(num)}) exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=650664616) ;exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=${NUM2}) exten => 787,n,NoOp(resultid = ${resultid}) exten => 787,n,MYSQL(Fetch fetchid ${resultid} MANT) exten => 787,n,NoOp(MANT = ${MANT}) exten => 787,n,MYSQL(Disconnect ${connid}) exten => 787,n,GotoIf($["${MANT}"="VIP"]?100:90) exten => 787,90,Macro(nodisponible,${BS}) exten => 787,100,Set(N=650664616) ;exten => 787,100,Set(N=${NUM2}) exten => 787,n,Gotoif($["${N:0:1}" = "6"]?200:300) exten => 787,200,Dial(SIP/+34${MOVIL1}@proxy01.sipphone.com,20,r) exten => 787,n,Dial(Sebi/g1/${MOVIL1},30) exten => 787,n,Dial(SIP/+34${MOVIL2}@proxy01.sipphone.com,20,r) exten => 787,n,Dial(Sebi/g1/${MOVIL2},30) exten => 787,n,AGI(sms_send.php) exten => 787,n,Voicemail(3333) exten => 787,n,Hangup ;sI ESTUVIERA CONECTADO A LA PSTN Y NO FUERA UN MOVIL SALDRIA POR AHI exten => 787,300,Dial(DAHDI/${MOVIL1},20,r)

261

exten => 787,n,Dial(DAHDI/${MOVIL2},20,r) exten => 787,n,AGI(sms_send.php) exten => 787,n,Voicemail(3333) exten => 787,n,Hangup

El log en caso de que coja el móvil el encargado de atender a usuarios 24 desde el proveedor IP Gizmo 5: -- Executing [787@acceso:1] Set("SIP/2003-b6901320", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/2003-b6901320", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/2003-b6901320", "") in new stack -- Executing [s@macro-general:2] Set("SIP/2003-b6901320", "SALTO=soportelaboral") in new stack -- Executing [s@macro-general:3] AGI("SIP/2003-b6901320", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0 -- Executing [s@macro-general:4] Goto("SIP/2003-b6901320", "No Disponible Soporte|787|1") in new stack -- Goto (No Disponible Soporte,787,1) == Channel 'SIP/2003-b6901320' jumping out of macro 'general' -- Executing [787@No Disponible Soporte:1] MYSQL("SIP/2003-b6901320", "Connect connid localhost root root agenda") in new stack -- Executing [787@No Disponible Soporte:2] NoOp("SIP/2003-b6901320", "connid = 1") in new stack -- Executing [787@No Disponible Soporte:3] Set("SIP/2003-b6901320", "NUM2= 2003") in new stack -- Executing [787@No Disponible Soporte:4] MYSQL("SIP/2003-b6901320", "Query resultid 1 SELECT mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE telefono=650664616") in new stack -- Executing [787@No Disponible Soporte:5] NoOp("SIP/2003-b6901320", "resultid = 2") in new stack -- Executing [787@No Disponible Soporte:6] MYSQL("SIP/2003-b6901320", "Fetch fetchid 2 MANT") in new stack -- Executing [787@No Disponible Soporte:7] NoOp("SIP/2003-b6901320", "MANT = VIP") in new stack -- Executing [787@No Disponible Soporte:8] MYSQL("SIP/2003-b6901320", "Disconnect 1") in new stack -- Executing [787@No Disponible Soporte:9] GotoIf("SIP/2003-b6901320", "1?100:90") in new stack -- Goto (No Disponible Soporte,787,100) -- Executing [787@No Disponible Soporte:100] Set("SIP/2003-b6901320", "N=650664616") in new stack -- Executing [787@No Disponible Soporte:101] GotoIf("SIP/2003-b6901320", "1?200:300") in new stack -- Goto (No Disponible Soporte,787,200) -- Executing [787@No Disponible Soporte:200] Dial("SIP/2003-b6901320", "SIP/[email protected]|20|r") in new stack -- Called [email protected] -- SIP/proxy01.sipphone.com-0a1e3628 answered SIP/2003-b6901320 -- Packet2Packet bridging SIP/2003-b6901320 and SIP/proxy01.sipphone.com-0a1e3628 == Spawn extension (No Disponible Soporte, 787, 200) exited non-zero on 'SIP/2003-b6901320'

Para ver el correcto envio de SMS quito el valor a las variables que contienen los móviles a llamar en horario no laboral: -- Executing [787@acceso:1] Set("SIP/2003-b6900f70", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/2003-b6900f70", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/2003-b6900f70", "") in new stack -- Executing [s@macro-general:3] AGI("SIP/2003-b6900f70", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0

262

-- Executing [s@macro-general:4] Goto("SIP/2003-b6900f70", "No Disponible Soporte|787|1") in new stack -- Goto (No Disponible Soporte,787,1) == Channel 'SIP/2003-b6900f70' jumping out of macro 'general' -- Executing [787@No Disponible Soporte:1] MYSQL("SIP/2003-b6900f70", "Connect connid localhost root root agenda") in new stack -- Executing [787@No Disponible Soporte:2] NoOp("SIP/2003-b6900f70", "connid = 1") in new stack -- Executing [787@No Disponible Soporte:3] Set("SIP/2003-b6900f70", "NUM2= 2003") in new stack -- Executing [787@No Disponible Soporte:4] MYSQL("SIP/2003-b6900f70", "Query resultid 1 SELECT mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE telefono=650664616") in new stack -- Executing [787@No Disponible Soporte:5] NoOp("SIP/2003-b6900f70", "resultid = 2") in new stack -- Executing [787@No Disponible Soporte:6] MYSQL("SIP/2003-b6900f70", "Fetch fetchid 2 MANT") in new stack -- Executing [787@No Disponible Soporte:7] NoOp("SIP/2003-b6900f70", "MANT = VIP") in new stack -- Executing [787@No Disponible Soporte:8] MYSQL("SIP/2003-b6900f70", "Disconnect 1") in new stack -- Executing [787@No Disponible Soporte:9] GotoIf("SIP/2003-b6900f70", "1?100:90") in new stack -- Goto (No Disponible Soporte,787,100) -- Executing [787@No Disponible Soporte:100] Set("SIP/2003-b6900f70", "N=650664616") in new stack -- Executing [787@No Disponible Soporte:101] GotoIf("SIP/2003-b6900f70", "1?200:300") in new stack -- Goto (No Disponible Soporte,787,200) -- Executing [787@No Disponible Soporte:200] Dial("SIP/2003-b6900f70", "SIP/[email protected]|20|r") in new stack == Everyone is busy/congested at this time (1:0/0/1) -- Executing [787@No Disponible Soporte:201] Dial("SIP/2003-b6900f70", "Sebi/g1/|30") in new stack == Everyone is busy/congested at this time (1:0/0/1) -- Executing [787@No Disponible Soporte:202] Dial("SIP/2003-b6900f70", "SIP/[email protected]|20|r") in new stack == Everyone is busy/congested at this time (1:0/0/1) -- Executing [787@No Disponible Soporte:203] Dial("SIP/2003-b6900f70", "Sebi/g1/|30") in new stack == Everyone is busy/congested at this time (1:0/0/1) -- Executing [787@No Disponible Soporte:204] AGI("SIP/2003-b6900f70", "sms_send.php") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/sms_send.php -- AGI Script sms_send.php completed, returning 0 == Spawn extension (No Disponible Soporte, 787, 205) exited non-zero on 'SIP/2003-b6900f70'

Prueba 2) Llama a la centralita en un horario no laborable un usuario no VIP.

Parte de código utilizado: [No Disponible Soporte]

;Comprobar en la base de datos si el cliente es VIP(contrato de mantenimiento de 24h).Si lo es se le envia a la prioridad 100 sino lo es a la 90. exten => 787,1,MYSQL(Connect connid localhost root root agenda) exten => 787,n,NoOp(connid = ${connid}) exten => 787,n,Set(NUM2= ${CALLERID(num)}) exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=650664616) ;exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=${NUM2}) exten => 787,n,NoOp(resultid = ${resultid}) exten => 787,n,MYSQL(Fetch fetchid ${resultid} MANT) exten => 787,n,NoOp(MANT = ${MANT}) exten => 787,n,MYSQL(Disconnect ${connid}) exten => 787,n,GotoIf($["${MANT}"="VIP"]?100:90)

263

exten => 787,90,Macro(nodisponible,${BS})

[macro-nodisponible] exten => s,1,PLayBack(grabacion2) exten => s,n,Voicemail(${ARG1}) exten => S,n,Hangup

El log desde el CLI es el siguiente: -- Executing [787@acceso:1] Set("SIP/2003-0a1e3110", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/2003-0a1e3110", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/2003-0a1e3110", "") in new stack -- Executing [s@macro-general:2] Set("SIP/2003-0a1e3110", "SALTO=soportelaboral") in new stack -- Executing [s@macro-general:3] AGI("SIP/2003-0a1e3110", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0 -- Executing [s@macro-general:4] Goto("SIP/2003-0a1e3110", "No Disponible Soporte|787|1") in new stack -- Goto (No Disponible Soporte,787,1) == Channel 'SIP/2003-0a1e3110' jumping out of macro 'general' -- Executing [787@No Disponible Soporte:1] MYSQL("SIP/2003-0a1e3110", "Connect connid localhost root root agenda") in new stack -- Executing [787@No Disponible Soporte:2] NoOp("SIP/2003-0a1e3110", "connid = 1") in new stack -- Executing [787@No Disponible Soporte:3] Set("SIP/2003-0a1e3110", "NUM2= 2003") in new stack -- Executing [787@No Disponible Soporte:4] MYSQL("SIP/2003-0a1e3110", "Query resultid 1 SELECT mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE telefono= 2003") in new stack -- Executing [787@No Disponible Soporte:5] NoOp("SIP/2003-0a1e3110", "resultid = 2") in new stack -- Executing [787@No Disponible Soporte:6] MYSQL("SIP/2003-0a1e3110", "Fetch fetchid 2 MANT") in new stack -- Executing [787@No Disponible Soporte:7] NoOp("SIP/2003-0a1e3110", "MANT = ") in new stack -- Executing [787@No Disponible Soporte:8] MYSQL("SIP/2003-0a1e3110", "Disconnect 1") in new stack -- Executing [787@No Disponible Soporte:9] GotoIf("SIP/2003-0a1e3110", "0?100:90") in new stack -- Goto (No Disponible Soporte,787,90) -- Executing [787@No Disponible Soporte:90] Macro("SIP/2003-0a1e3110", "nodisponible|3333") in new stack -- Executing [s@macro-nodisponible:1] Playback("SIP/2003-0a1e3110", "grabacion2") in new stack -- Executing [s@macro-nodisponible:2] VoiceMail("SIP/2003-0a1e3110", "3333") in new stack -- <SIP/2003-0a1e3110> Playing 'vm-intro' (language 'es') == Spawn extension (macro-nodisponible, s, 2) exited non-zero on 'SIP/2003-0a1e3110' in macro 'nodisponible' == Spawn extension (No Disponible Soporte, 787, 90) exited non-zero on 'SIP/2003-0a1e3110'

Prueba 3) Llama a la centralita en un horario laboral un usuario VIP.

1) Pausar todos los miembros menos el 2001 de la cola del Departamento de Soporte, al que le llegarán todas las llamadas. 2) El 2005 llama a la cola.(se le mantiene en espera) 3) El 4000 llama a la cola.(se le mantiene en espera) 4) El 2003 llama a la cola --> QUEUE_PRIO=10 (se le mantiene en espera) 5) Cuando el 2001 coja el telefono deberia hablar con 2003.

264

El código utilizado en el apartado 1 es el siguiente:

exten => _XXXX22,1,PauseQueueMember(${QS}|SIP/${EXTEN:0:4}) exten => _XXXX22,n,Hangup

El log del CLI del apartado 1 es: -- Executing [200022@acceso:1] PauseQueueMember("SIP/2003-b6900590", "soportequeue|SIP/2000") in new stack -- Executing [200022@acceso:2] Hangup("SIP/2003-b6900590", "") in new stack -- Executing [200522@acceso:1] PauseQueueMember("SIP/2003-b690ea58", "soportequeue|SIP/2005") in new stack -- Executing [200522@acceso:2] Hangup("SIP/2003-b690ea58", "") in new stack == Spawn extension (acceso, 200522, 2) exited non-zero on 'SIP/2003-b690ea58' -- Executing [200322@acceso:1] PauseQueueMember("SIP/2003-b690d430", "soportequeue|SIP/2003") in new stack -- Executing [200322@acceso:2] Hangup("SIP/2003-b690d430", "") in new stack

El código utilizado en los apartados 2,3,4 y 5 es el siguiente:

exten => 787,1,Set(NUM=${EXTEN}) exten => 787,n,Macro(general,soportelaboral,${CALS},${NUM}) [macro-general] ;1)COMPROBACION CON EL CALENDARIO exten => s,1,Answer exten => s,n,Set(SALTO=${ARG1}) exten => s,n,AGI(${ARG2}) exten => s,n,Goto(${SALTO},${ARG3},1) [soportelaboral] exten => 787,1,Macro(laboral,${QS}) [macro-laboral] exten => s,1,Answer exten => s,n,Wait(2) exten => s,n,SetMusicOnHold(default) ;Consultar con la base de datos si es VIP para pasar a la primera posicion de la cola exten => s,n,MYSQL(Connect connid localhost root root agenda) exten => s,n,MYSQL(Query resultid ${connid SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp WHERE\ telefono="NUM2"}) exten => s,n,NoOp(resultid = ${resultid}) ;Si es VIP --> POSICIONAR DELANTE EN LA COLA exten => s,n,MYSQL(Fetch fetchid ${resultid} PRIO) exten => s,n,NoOp( ${PRIO}) exten => s,n,GotoIf($["${PRIO}"="VIP"]?prio:no) exten => s,n(prio),MYSQL(Disconnect ${connid}) ;exten => s,n,GotoIf($["${NUM}"=2003]?prio2:no) exten => s,n,Set(QUEUE_PRIO=10) exten => s,n,Queue(${ARG1}|r) exten => s,n,Hangup exten => s,n(no),MYSQL(Disconnect ${connid}) exten => s,n,Queue(${ARG1}|r) exten => s,n,Hangup

265

El log del CLI del apartado 2 es: -- Executing [787@acceso:1] Set("SIP/2005-b6902d00", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/2005-b6902d00", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/2005-b6902d00", "") in new stack -- Executing [s@macro-general:2] Set("SIP/2005-b6902d00", "SALTO=soportelaboral") in new stack -- Executing [s@macro-general:3] AGI("SIP/2005-b6902d00", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0 -- Executing [s@macro-general:4] Goto("SIP/2005-b6902d00", "soportelaboral|787|1") in new stack -- Goto (soportelaboral,787,1) == Channel 'SIP/2005-b6902d00' jumping out of macro 'general' -- Executing [787@soportelaboral:1] Macro("SIP/2005-b6902d00", "laboral|soportequeue") in new stack -- Executing [s@macro-laboral:1] Answer("SIP/2005-b6902d00", "") in new stack -- Executing [s@macro-laboral:2] Wait("SIP/2005-b6902d00", "2") in new stack -- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/2005-b6902d00", "default") in new stack -- Executing [s@macro-laboral:5] MYSQL("SIP/2005-b6902d00", "Query resultid ") in new stack -- Executing [s@macro-laboral:6] NoOp("SIP/2005-b6902d00", "resultid = ") in new stack -- Executing [s@macro-laboral:7] MYSQL("SIP/2005-b6902d00", "Fetch fetchid PRIO") in new stack -- Executing [s@macro-laboral:8] NoOp("SIP/2005-b6902d00", " ") in new stack -- Executing [s@macro-laboral:9] GotoIf("SIP/2005-b6902d00", "0?prio:no") in new stack -- Goto (macro-laboral,s,14) -- Executing [s@macro-laboral:14] MYSQL("SIP/2005-b6902d00", "Disconnect 1") in new stack -- Executing [s@macro-laboral:15] Queue("SIP/2005-b6902d00", "soportequeue|r") in new stack -- Called SIP/2001 -- SIP/2001-0a17d960 is ringing

El log del CLI del apartado 3 es: -- Executing [787@acceso:1] Set("SIP/4000-b6900590", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/4000-b6900590", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/4000-b6900590", "") in new stack -- Executing [s@macro-general:2] Set("SIP/4000-b6900590", "SALTO=soportelaboral") in new stack -- Executing [s@macro-general:3] AGI("SIP/4000-b6900590", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0 -- Executing [s@macro-general:4] Goto("SIP/4000-b6900590", "soportelaboral|787|1") in new stack -- Goto (soportelaboral,787,1) == Channel 'SIP/4000-b6900590' jumping out of macro 'general' -- Executing [787@soportelaboral:1] Macro("SIP/4000-b6900590", "laboral|soportequeue") in new stack -- Executing [s@macro-laboral:1] Answer("SIP/4000-b6900590", "") in new stack -- Executing [s@macro-laboral:2] Wait("SIP/4000-b6900590", "2") in new stack -- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/4000-b6900590", "default") in new stack -- Executing [s@macro-laboral:4] MYSQL("SIP/4000-b6900590", "Connect connid localhost root root agenda") in new stack -- Executing [s@macro-laboral:5] MYSQL("SIP/4000-b6900590", "Query resultid ") in new stack -- Executing [s@macro-laboral:6] NoOp("SIP/4000-b6900590", "resultid = ") in new stack -- Executing [s@macro-laboral:7] MYSQL("SIP/4000-b6900590", "Fetch fetchid PRIO") in new stack -- Executing [s@macro-laboral:8] NoOp("SIP/4000-b6900590", " ") in new stack -- Executing [s@macro-laboral:9] GotoIf("SIP/4000-b6900590", "0?prio:no") in new stack -- Goto (macro-laboral,s,14) -- Executing [s@macro-laboral:14] MYSQL("SIP/4000-b6900590", "Disconnect 1") in new stack

266

-- Executing [s@macro-laboral:15] Queue("SIP/4000-b6900590", "soportequeue|r") in new stack -- Called SIP/2001 -- SIP/2001-0a1fb1b8 is ringing -- Nobody picked up in 10000 ms

El log del CLI del apartado 4 es: -- Executing [787@acceso:1] Set("SIP/2003-b6902d00", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/2003-b6902d00", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/2003-b6902d00", "") in new stack -- Executing [s@macro-general:2] Set("SIP/2003-b6902d00", "SALTO=soportelaboral") in new stack -- Executing [s@macro-general:3] AGI("SIP/2003-b6902d00", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0 -- Executing [s@macro-general:4] Goto("SIP/2003-b6902d00", "soportelaboral|787|1") in new stack -- Goto (soportelaboral,787,1) == Channel 'SIP/2003-b6902d00' jumping out of macro 'general' -- Executing [787@soportelaboral:1] Macro("SIP/2003-b6902d00", "laboral|soportequeue") in new stack -- Executing [s@macro-laboral:1] Answer("SIP/2003-b6902d00", "") in new stack -- Executing [s@macro-laboral:2] Wait("SIP/2003-b6902d00", "2") in new stack -- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/2003-b6902d00", "default") in new stack -- Executing [s@macro-laboral:4] MYSQL("SIP/2003-b6902d00", "Connect connid localhost root root agenda") in new stack -- Executing [s@macro-laboral:5] MYSQL("SIP/2003-b6902d00", "Query resultid 1 SELECT mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE telefono=650664616") in new stack -- Executing [s@macro-laboral:6] NoOp("SIP/2003-b6902d00", "resultid = 2") in new stack -- Executing [s@macro-laboral:7] MYSQL("SIP/2003-b6902d00", "Fetch fetchid 2 PRIO") in new stack -- Executing [s@macro-laboral:8] NoOp("SIP/2003-b6902d00", " VIP") in new stack -- Executing [s@macro-laboral:9] GotoIf("SIP/2003-b6902d00", "1?prio:no") in new stack -- Goto (macro-laboral,s,10) -- Executing [s@macro-laboral:10] MYSQL("SIP/2003-b6902d00", "Disconnect 1") in new stack -- Executing [s@macro-laboral:11] Set("SIP/2003-b6902d00", "QUEUE_PRIO=10") in new stack -- Executing [s@macro-laboral:12] Queue("SIP/2003-b6902d00", "soportequeue|r") in new stack -- Called SIP/2001 -- SIP/2001-0a1ee040 is ringing -- Nobody picked up in 10000 ms

El log del CLI del apartado 5 es: -- SIP/2001-0a217400 answered SIP/2003-b69196e8 -- Native bridging SIP/2003-b69196e8 and SIP/2001-0a217400

Prueba 4) Llama a la centralita en un horario laboral un usuario no VIP.

Parte de código utilizado:

[macro-general] ;1)COMPROBACION CON EL CALENDARIO exten => s,1,Answer exten => s,n,Set(SALTO=${ARG1})

267

exten => s,n,AGI(${ARG2}) exten => s,n,Goto(${SALTO},${ARG3},1) [soportelaboral] ;PRUEBAS exten => 787,1,Macro(laboral,${QS}) [macro-laboral] exten => s,1,Answer exten => s,n,Wait(2) exten => s,n,SetMusicOnHold(default) ;Consultar con la base de datos si es VIP para pasar a la primera posicion de la cola exten => s,n,MYSQL(Connect connid localhost root root agenda) exten => s,n,MYSQL(Query resultid ${connid SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp WHERE\ telefono="NUM2"}) ;exten => s,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=650664616) exten => s,n,NoOp(resultid = ${resultid}) ;Si es VIP --> POSICIONAR DELANTE EN LA COLA exten => s,n,MYSQL(Fetch fetchid ${resultid} PRIO) exten => s,n,NoOp( ${PRIO}) exten => s,n,GotoIf($["${PRIO}"="VIP"]?prio:no) exten => s,n(prio),MYSQL(Disconnect ${connid}) ;exten => s,n,GotoIf($["${NUM}"=2003]?prio2:no) exten => s,n,Set(QUEUE_PRIO=10) exten => s,n,Queue(${ARG1}|r) exten => s,n,Hangup exten => s,n(no),MYSQL(Disconnect ${connid}) exten => s,n,Queue(${ARG1}|r) exten => s,n,Hangup

El log desde el CLI es el siguiente: -- Executing [787@acceso:1] Set("SIP/2003-092dc808", "NUM=787") in new stack -- Executing [787@acceso:2] Macro("SIP/2003-092dc808", "general|soportelaboral|pyastcal.py|787") in new stack -- Executing [s@macro-general:1] Answer("SIP/2003-092dc808", "") in new stack -- Executing [s@macro-general:2] Set("SIP/2003-092dc808", "SALTO=soportelaboral") in new stack -- Executing [s@macro-general:3] AGI("SIP/2003-092dc808", "pyastcal.py") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py -- AGI Script pyastcal.py completed, returning 0 -- Executing [s@macro-general:4] Goto("SIP/2003-092dc808", "soportelaboral|787|1") in new stack -- Goto (soportelaboral,787,1) == Channel 'SIP/2003-092dc808' jumping out of macro 'general' -- Executing [787@soportelaboral:1] Macro("SIP/2003-092dc808", "laboral|soportequeue") in new stack -- Executing [s@macro-laboral:1] Answer("SIP/2003-092dc808", "") in new stack -- Executing [s@macro-laboral:2] Wait("SIP/2003-092dc808", "2") in new stack -- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/2003-092dc808", "default") in new stack -- Executing [s@macro-laboral:4] MYSQL("SIP/2003-092dc808", "Connect connid localhost root root agenda") in new stack -- Executing [s@macro-laboral:5] Set("SIP/2003-092dc808", "NUM = 2003") in new stack -- Executing [s@macro-laboral:6] MYSQL("SIP/2003-092dc808", "Query resultid ") in new stack -- Executing [s@macro-laboral:7] NoOp("SIP/2003-092dc808", "resultid = ") in new stack

268

-- Executing [s@macro-laboral:8] GotoIf("SIP/2003-092dc808", "0?prio:no") in new stack -- Goto (macro-laboral,s,13) -- Executing [s@macro-laboral:13] MYSQL("SIP/2003-092dc808", "Disconnect 1") in new stack -- Executing [s@macro-laboral:14] Queue("SIP/2003-092dc808", "soportequeue|r") in new stack -- Called SIP/2001 -- Called SIP/2004 -- Called SIP/2003 -- Called SIP/2002 -- SIP/2001-09337208 is ringing -- Got SIP response 486 "Busy Here" back from 192.168.1.206 -- SIP/2004-0933b228 is busy -- Nobody picked up in 1000 ms -- Got SIP response 486 "Busy Here" back from 192.168.1.206 -- SIP/2003-0933f248 is busy -- Nobody picked up in 1000 ms -- Got SIP response 486 "Busy Here" back from 192.168.1.206 -- SIP/2002-09343268 is busy -- Nobody picked up in 1000 ms -- Nobody picked up in 10000 ms -- Nobody picked up in 10000 ms -- Called SIP/2001 -- Called SIP/2004 -- Called SIP/2003 -- Called SIP/2002 -- SIP/2001-09337208 is ringing -- Got SIP response 486 "Busy Here" back from 192.168.1.206 -- SIP/2004-0933b228 is busy -- Nobody picked up in 0 ms -- Got SIP response 486 "Busy Here" back from 192.168.1.206 -- SIP/2003-0933f248 is busy -- Nobody picked up in 0 ms -- Got SIP response 486 "Busy Here" back from 192.168.1.206 -- SIP/2002-09343268 is busy -- Nobody picked up in 1000 ms == Spawn extension (macro-laboral, s, 14) exited non-zero on 'SIP/2003-092dc808' in macro 'laboral' == Spawn extension (soportelaboral, 787, 1) exited non-zero on 'SIP/2003-092dc808'

Prueba 5) Comportamiento en el menú

Parte de código utilizado:

exten => 902147424,1,Answer exten => 902147424,n,Background(menu) exten => 902147424,n,Wait(10) exten => 0,1,Goto(recepcion,${PHONE1},1) exten => 1,1,Goto(comercial,${PHONE1},1) exten => 2,1,Goto(soporte,${PHONE2},1) exten => 3,1,Goto(twister,${PHONE3},1) exten => 4000,1,Goto(acceso,${EXTEN},1) exten => t,1,Goto(${PHONE1},1) exten => i,1,Goto(${PHONE1},1) exten => 4000,1,Macro(acceso,${EXTEN})

269

[macro-acceso] exten => s,1,Dial(SIP/${ARG1},30,Ttm) exten => s,n,Voicemail(${ARG1}) exten => s,n,Hangup

El log desde el CLI es el siguiente: -- Executing [902147424@acceso:1] Answer("SIP/2003-b6900590", "") in new stack -- Executing [902147424@acceso:2] BackGround("SIP/2003-b6900590", "menu") in new stack -- <SIP/2003-b6900590> Playing 'menu' (language 'es') == CDR updated on SIP/2003-b6900590 -- Executing [4000@acceso:1] Macro("SIP/2003-b6900590", "acceso|4000") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/2003-b6900590", "SIP/4000|30|Ttm") in new stack -- Called 4000 -- Started music on hold, class 'default', on SIP/2003-b6900590 -- SIP/4000-0a17d5c8 is ringing -- Stopped music on hold on SIP/2003-b6900590 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/2003-b6900590' in macro 'acceso' == Spawn extension (acceso, 4000, 1) exited non-zero on 'SIP/2003-b6900590'

Configuración de ficheros más utilizados

Tabla de descripción de ficheros de configuración

Fichero Descripción

extensions.conf

En este fichero, junto con los ficheros

que incluye la carpeta dialplan se concentra el núcleo de la centralita, el

plan de llamadas, explicado anteriormente.

sip.conf

En este fichero se registran

los usuarios SIP

iax.conf

En este fichero se registran

los usuarios IAX

features.conf

En Este fichero se establece la configuración de Call Parking

y Call Pickup

270

manager.conf

En este fichero se configuran

los usuarios del AMI.

meetme.conf

En este fichero se configuran las

conferencias por defecto de la centralita.

queues.conf

En este fichero se configuran

las colas de la centralita.

voicemail.conf

En este fichero se configuran

los buzones de voz.

Fichero de configuración: EXTENSIONS.CONF, SIP.CONF, IAX.CONF

Para visualizar estos ficheros acudir al anexo.

Fichero de configuración: FEATURES.CONF

271

Fichero de configuración: MANAGER.CONF

Fichero de configuración: MEETME.CONF

Fichero de configuración: QUEUES.CONF

272

Fichero de configuración: VOICEMAIL.CONF

273

Bases de datos empleadas

Tabla de descripción de las bases de datos utilizadas

Nombre de Base de Datos Descripción

cdr

En esta base de datos se guardan los datos del registro de llamadas y los

canales de la aplicación CDR Reports.

fop2

En esta base de datos se guardan los

datos del FOP 2.

qstats

En esta base de datos se guardan los datos del Asternic Call Center Stats.

274

agenda

En esta base de datos se guardan los

usuarios, clientes y teléfonos de estos de la aplicación YetBook.

nagios

En esta base de datos se guarda la

configuración y los datos de Nagios.

Conocimiento de las tablas de cada base de datos mostrando parte de su contenido

Base de Datos: cdr

Tablas de cdr

cdr

channels

� Tabla cdr

calldate clid src dst dcontext

channel dstchannel

lastapp

2009-12-22

21:44:43

"2000"

<2000> 2000 2003 acceso

SIP/2000-

b6800a38

SIP/2003-

0a30b038 VoiceMail

lastdata duration billsec disposition amaflags accountcode uniqueid

userfield

2003 34 3 ANSWERED 3

� Tabla channels

id channel accountcode

name

1 SIP/2003

David

2 SIP/2000

275

Mikel

3 SIP/2001

Eduardo

4 SIP/2004

Josemi

5 SIP/2002

Josean

Base de Datos: fop2

Tablas de cdr

visual_phonebook

� Tabla visual_phonebook

id firstname lastname company phone1 phone2 picture

1 Mikel Yet Informatica 2000 1-mark.jpg

2 Eduardo Yet Informatica 2001

3 Josean Yet Informatica 2002

4 David Yet Informatica 2003

5 Josemi Yet Informatica 2004

Base de Datos: qstats

Tablas de cdr

qagent

qevent

qname

queue_stats

276

� Tabla qagent

agent_id agent

2 SIP/2001

3 SIP/2004

4 SIP/2003

5 SIP/2002

6 SIP/2000

7 SIP/2005

8 SIP/4000

� Tabla qevent

event_id event

1 ABANDON

2 AGENTDUMP

3 AGENTLOGIN

4 AGENTCALLBACKLOGIN

5 AGENTLOGOFF

6 AGENTCALLBACKLOGOFF

7 COMPLETEAGENT

8 COMPLETECALLER

9 CONFIGRELOAD

10 CONNECT

11 ENTERQUEUE

12 EXITWITHKEY

13 EXITWITHTIMEOUT

14 QUEUESTART

15 SYSCOMPAT

16 TRANSFER

17 PAUSE

277

18 UNPAUSE

� Tabla qname

qname_id queue

2 recepcionqueue

3 comercialqueue

4 soportequeue

� Table queue_stats

queue_stats_id uniqueid datetime qname qagent qevent info1 info2 info3

1 SIP/2003

2009-11-05

05:01:19

4 4 14

… … … … … …

705 SIP/2003

2009-12-22

23:35:20

4 4 9

Base de Datos: agenda

Tablas de agenda

clientes

telefono

usuarios

� Tabla clientes

id nameEmp cliente mant

1 Calnaba Yet VIP

2 Puma Yet Completo

278

3 Adidas Yet VIP

� Tabla telefono

idEmp telefono

1 650664616

2 654545454

2 676767676

2 943212112

2 945787876

3 654323232

3 656997878

3 698987332

� Tabla usuarios

id name extension tipo

2 Mikel 2000 Soporte

5 Valentin 5000 Direccion

6 Alberto Acosta 3000 Twister

7 Eduardo 2001 Soporte

9 Josean 2002 Soporte

10 Irune 1000 Administracion

Base de Datos: nagios

Tablas de nagios

nagios_acknowledgements

nagios_commands

nagios_commenthistory

nagios_comments

279

nagios_configfiles

nagios_configfilevariables

….

nagios_timedeventqueue

nagios_timedevents

nagios_timeperiod_timeranges

nagios_timeperiods

280

Explicación teórica y práctica de funcionalidades extra:

Agenda de Contactos: YetBook

Esta aplicación Web se diseñó para solucionar varios problemas:

� Necesidad de control exhaustivo de clientes de la empresa, así como, del

mantenimiento que tienen contratado con esta.

� Control de número de extensión de los usuarios de la empresa y de las

opciones programadas en el Dialplan para satisfacer determinadas

funcionalidades de la centralita Asterisk. Por ejemplo, extensión para

agregarse a una cola en concreto o como realizar el desvío de llamadas de tu

extensión a tu móvil.

� Acceso a las diferentes aplicaciones necesarias para el control de distintas

actividades a realizar, como por ejemplo la aplicación FOP 2.

Como se puede ver en la siguiente imagen, la aplicación está dividida en diferentes

apartados, en los cuales se puede añadir/eliminar/modificar usuarios y clientes, tener

acceso a las extensiones especiales del Dialplan y a las direcciones de las aplicaciones

integradas con la centralita.

A continuación se explicará el funcionamiento de cada una de estas funciones:

281

En este apartado tenemos una visión de los usuarios de la centralita.

Añadir Usuarios: Permite agregar un usuario a la base de datos a la que está enlazada

la aplicación, no modifica el fichero sip.conf, la idea es agregar el usuario y después

modificar dicho fichero de configuración.

282

En la imagen anterior hemos visto como es el proceso de adicción de un usuario,

rellenando los campos Nombre, Extensión y Departamento, y en la imagen siguiente

vemos el resultado.

Eliminar Usuarios: Permite eliminar un usuario de la base de datos a la que está

enlazada la aplicación, no modifica el fichero sip.conf, la idea es eliminar el usuario y

después modificar dicho fichero de configuración.

283

En la imagen anterior vemos el identificador del usuario a eliminar, en el ejemplo será

el 8, y a continuación en la siguientes imágenes vemos la elección de usuario a eliminar

y comprobamos que se ha eliminado.

284

Modificar Usuarios: Permite modificar un usuario en la base de datos a la que está

enlazada la aplicación, no modifica el fichero sip.conf, la idea es modificar el usuario y

después modificar dicho fichero de configuración.

En la siguiente imagen vemos el usuario que vamos a modificar.

En la siguiente imagen vemos el formulario de modificación de usuarios, rellenando el

identificador de usuario, Nombre, Extensión y Departamento.

285

En la imagen siguiente vemos el resultado de la modificación:

En este apartado tenemos una visión de los clientes de la expresa.

286

Añadir Clientes: Permite agregar un cliente a la base de datos a la que está enlazada la

aplicación.

En la siguiente imagen vemos como es el proceso de adicción de un cliente, rellenando

los campos Nombre de Empresa, Mantenimiento (Parcial, Completo, VIP) y el nº de

teléfonos asociados a dicha empresa.

En la siguiente imagen vemos el formulario de introducción de teléfonos.

287

En la siguiente imagen vemos el resultado tras añadir el cliente:

Eliminar Clientes: Permite eliminar un cliente de la base de datos a la que está

enlazada la aplicación.

En la imagen siguiente vemos el formulario es similar al de la eliminación de usuarios.

288

Comprobamos que la eliminación se ha efectuado adecuadamente.

Modificar Clientes: Permite modificar un cliente en la base de datos a la que está

enlazada la aplicación.

A continuación vemos los formularios de modificación:

289

En las dos imágenes siguientes vemos como nos da la posibilidad de simplemente

modificar los valores actuales o agregar también más teléfonos al cliente.

290

Rellenamos el campo del teléfono que vamos a añadir:

Vemos las modificaciones realizadas:

A continuacion veremos un recordatorio de las extensiones del Dialplan para que los

usuarios puedan consultarlo cuando quieran.

291

292

293

294

Por último para recordar el acceso a la aplicaciones integradas con la centralita Asterisk :

295

296

297

Integración con Google Calendar

La utilización de Google Calendar será la siguiente:

• Para tener diferentes calendarios y así hacer una gestión óptima de las

llamadas, comprobando los eventos de dichos calendarios y redireccionando a

unos contextos u otros dependiendo de estos en el momento de las llamadas.

• Uso de los recordatorios a través de mensajes de texto en determinadas

situaciones.

Para tener un uso correcto de Google Calendar visualizar la Guía. Pruebas de existencia de evento en el momento en un calendario

El código de la aplicación que comprueba la existencia de eventos es el siguiente:

298

Prueba 1 ) Hay un evento de 10:30 a 11:30

[root@localhost agi-bin]# python pyastcal.py ---------------------------------- Fecha inicio evento: 2009-12-23 Fecha actual: 2009-12-23 Fecha fin evento: 2009-12-23 Hora inicio evento: 10:30:00 Hora actual: 10:48:47.174531 Hora fin evento: 11:30:00 ---------------------------------- SET VARIABLE "SALTO" "No Disponible Soporte"

299

El calendario tiene el siguiente aspecto:

Prueba 2 ) No hay ningun evento

[root@localhost agi-bin]# python pyastcal.py ---------------------------------- Fecha inicio evento: 2009-12-23 Fecha actual: 2009-12-23 Fecha fin evento: 2009-12-24 Hora inicio evento: 23:00:00 Hora actual: 10:47:05.294826 Hora fin evento: 08:00:00 ---------------------------------- SET VARIABLE "SALTO" "soportelaboral"

300

El calendario tiene el siguiente aspecto:

Prueba 2 ) Hay un evento de dia completo [root@localhost agi-bin]# python pyastcal.py ---------------------------------- Fecha inicio evento: 2009-12-22 Fecha actual: 2009-12-23 Fecha fin evento: 2009-12-23 Hora inicio evento: 23:00:00 Hora actual: 10:50:29.834773 Hora fin evento: 23:00:00 ---------------------------------- SET VARIABLE "SALTO" "No Disponible Soporte"

301

El calendario tiene el siguiente aspecto:

Pruebas de envío de recordatorios a través de SMS con Google Calendar Configuración de la extensión que ejecuta el programa que interactúa con Google Calendar para que se genere un evento en el calendario por el cual se enviará el SMS como recordatorio:

exten => 1200,1,Answer exten => 1200,n,NoOp("CallerID=${ARG1}") exten => 1200,n,AGI(sms_send.php) exten => 1200,n,NoOp("Sms_send.php ejecutado...") exten => 1200,n,Hangup

Vemos el comportamiento de Asterisk al llamar a la extensión 1200 a través del CLI:

-- Executing [1200@acceso:1] Answer("SIP/4000-b68150b0", "") in new stack -- Executing [1200@acceso:2] NoOp("SIP/4000-b68150b0", ""CallerID="") in new stack -- Executing [1200@acceso:3] AGI("SIP/4000-b68150b0", "sms_send.php") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/sms_send.php -- AGI Script sms_send.php completed, returning 0 -- Executing [1200@acceso:4] NoOp("SIP/4000-b68150b0", ""Sms_send.php ejecutado..."") in new stack -- Executing [1200@acceso:5] Hangup("SIP/4000-b68150b0", "") in new stack == Spawn extension (acceso, 1200, 5) exited non-zero on 'SIP/4000-b68150b0'

Comprobamos el log de la aplicación para ver que los datos enviados son los correctos:

302

[email protected] Password=XXXXXXX Minutos despues de la hora actual en la que empieza el evento=10 Duracion del Evento=10 Mensaje enviado: 'Asterisk: Tiene una llamada perdida de la extension: 100' Enviado: Resource id #8

Miramos en el calendario para comprobar que se ha creado el evento:

Para ver el código de los archivos utilizados acudir al anexo correspondiente.

303

Chan_Sebi

¿Qué?,¿Cómo? y ¿Por qué?

Chan_sebi es un canal para Asterisk, que utiliza modems Huawei para proveer de gateways gsm de voz y/o sms.

En principio se ha hecho pensando en los E169/K3520 de Huawei, modems que tienen capacidades de llamada de voz. Internamente utilizan un chipset de Qualcomm (de la serie MSM7200). Con un modem usb de estos modelos, tenemos un gateway de voz que además no tiene que hacer conversiones de audio como las que se hacen con un FXO analógico, ni los problemas de señalización inherentes a los canales analógicos, ya que toda la gestión de audio y de señalización se hace de forma digital (bien a través del canal de audio, bien a través del canal de datos), pudiendo ser comparado a un router RDSI=>GSM de un puerto.

La idea surgió, según su creador “Odicha”, de la posibilidad de aprovechar las capacidades de voz de estos modems para tener un gateway gsm a un costo muy económico. La mayor parte de los operadores los dan a costo cero cumpliendo unos mínimos de permanencia o consumo, como cualquier otro terminal telefónico.

Técnicamente estos modems son vistos por el S.O. como un “hub” usb con varios dispositivos. En principio tres puertos seriales y un puerto de almacenamiento con dos dispositivos (un cd y un lector de memoria). Asi los subid 00,01 y 02 serán los puertos de comunicación, cada uno con distintas funciones (audio, datos y gestión general) y el subid 03 que nos dará control sobre el cd virtual y el lector de tarjetas.

A partir de esta base se construye un controlador de canal que toma como punto de partida el chan_mobile, ya existente en Asterisk.

Para descargar asterisk-addons con chan_sebi:

svn export http://asterisk-es-rsp.irontec.com/svn/team/Odicha/asterisk-addons-1.4.9 asterisk-addons/

Instalación y Configuración de chan_sebi

A nivel de descarga e instalación comentar cuáles son sus prerrequisitos.

El S.O. debe ser capaz de montar los subid 00, 01 y 02 del modem Huawei como usbTTYx. Los kernels antiguos (por debajo de 2.6.20 generalmente) no son capaces de hacerlo automáticamente por lo que habrá que modificar algunas cosas para que se detecten de la forma adecuada y sean cargados por usbserial. Normalmente es suficiente con /sbin/modprobe usbserial vendor=0×12d1 product=0×1003 o bien

/sbin/modprobe usbserial vendor=0×12d1 product=0×1001 dependiendo de si el modem es 1001 (169,k3520, e270,etc…) o es 1003 (e220…). A veces también entran en conflicto con el driver de option resolviendose añadiendo al blacklist el módulo ”option”. Si aun así sigue intentando cargar puede intentar resolverse eliminando el fichero option.ko y ejecutando un depmod después.

304

Los puertos ttyUSBx que se crean al conectar el modem tienen que tener permiso de lectura y escritura para el usuario que ejecuta Asterisk, si no es así no será posible que Asterisk se comunique con el modem. Si no se ejecuta Asterisk como root lo mejor es agregar el usuario que corre Asterisk al grupo propietario de los puertos que en función de distros y kernels puede variar (en Fedora es uucp, por ej.).

Algo como esto por ejemplo:

chmod 660 /dev/ttyUSB* chown asterisk:uucp /dev/ttyUSB* echo ‘KERNEL==”ttyUSB[0-9*]“, MODE=”0660″, OWNER=”asterisk”, GROUP=”uucp”‘ >> /etc/udev/rules.d/92-sebi.rules

Cumpliendo esto podremos instalar asterisk-addons sobre nuestro asterisk 1.4.x con chan_sebi incluido.

Al instalarlo y arrancarlo el canal analizará los dispositivos usb que tenemos conectados y generará un fichero sebi_devices.conf en /etc/asterisk/ que contendrá algo similar a esto:

[2-1] data = /dev/ttyUSB2 voice = /dev/ttyUSB1 imei = 35413702XXXXXXX

A partir de aquí sabemos que el modem está siendo detectado correctamente y pasaremos a generar el fichero de configuración sebi.conf. Si hicimos un make samples al instalar asterisk-addons ya tendremos un fichero sebi.conf en /etc/asterisk/ que tendremos que adaptar.

[huawei1] imei=35xxxxxxxxxxx ; imei of modem ;pin=1234 ; pin (use only if sim card has pin request enabled) csca=+34607003110 ; sms centre number (vodafone es – example) sms=yes ; enable sms send/receive voice=yes ; enable voice for calls context=from-pstn ; dialplan context for incoming calls group=1 ; this phone is in channel group 1 volume=5 ; modem volume (1-5) language=es ; channel language ;nocallsetup=yes ; set this only if you want override call status notifications

El campo imei del canal es el que combina la información de configuración del modem con el equipo físico. No olviden que el número de puerto ttyUSB depende del orden en que se cargan o de la cantidad de dispositivos usb que están conectados en cada momento. Los demás campos de configuración creo que están claros, prácticamente se describen solos. Es interesante hacer notar que el nombre del canal lo asignamos nosotros libremente en el identificador de sección (en el ejemplo [huawei1])

Si reiniciamos Asterisk y todo ha ido bien tras cargar ejecutaremos el comando sebi show devices y obtendremos algo parecido a esto:

305

*CLI> sebi show devices

Id Imei Group Provider Connected State Voice SMS huawei1 3541370xxxxxxxx 1 vodafone es yes free yes yes

A partir de aquí podemos usar el modem como una canal de voz realizando y recibiendo llamadas y como gateway sms. Cabe observar que en los modelos que no soporten voz el resultado será como este:

*CLI> sebi show devices

Id Imei Group Provider Connected State Voice SMS huawei1 3541370xxxxxxxx 1 vodafone es yes free no yes

Nos dirá que no tenemos servicios de voz en ese dispositivo, y lo usaremos solo como gateway sms.

Para enviar y recibir sms, usaremos convenciones muy similares a las de chan_mobile. Para recibir un sms y guardarlo en la base de datos tendremos las instruccciones correspondientes en el Dialplan (por cierto, solo procesa sms recibidos mientras está activo, por el momento).

[from-pstn] exten => sms,1,verbose(incoming sms from ${smssrc} ${smstxt}) exten => sms,n,set(db(sms/${smssrc})=${smstxt}) exten => sms,n,hangup

Para enviar un sms:

originate sip/109 application sebisendsms huawei1|6xxxxxxxx|”texto de prueba del sms”

Para revisar si el canal está libre antes de enviar el sms tenemos la aplicación SebiStatus:

SebiStatus(device,variable) Device : Id del dispositivo en sebi.conf Variable: Variable donde almacenamos el estado (1-3)

1-Desconectado 2-Disponible 3-Ocupado

306

Pruebas realizadas con un Modem Huawei K3520

Tras introducir en el modem Huawei K3520 una tarjeta Orange y conectarlo a nuestro

servidor por un puerto USB, instalamos como se indica en los apartados anteriores el

chan_sebi y lo siguiente que tenemos que hacer es comprobar que Asterisk a captado

el modem, para esto comprobamos el contenido del fichero de configuración situado

en la carpeta /etc/asterisk/ sebi_devices.conf:

[6-1] data = /dev/ttyUSB2 imei = 353284021181626 voice = /dev/ttyUSB1

Si no lo hemos hecho antes, damos a los dispositivos USB los permisos adecuados: chmod a+x /dev/ttyUSB*

Confuramos el chan_sebi desde el fichero de configuración sebi.conf:

[huawei1] dataport=/dev/ttyUSB2 voiceport=/dev/ttyUSB1 imei=35328XXXXXXXXXX pin=1626 csca=+34644109030 ; SMS centre number (SYMYO) sms=yes voice=yes context=from-sebi group=1 volume=5 language=es

Reiniciamos Asterisk y comprobamos que la configuración realizada es la correcta:

*CLI> sebi show devices ID IMEI Group Provider Connected State Voice SMS huawei1 353284021181626 1 Orange Yes Free Yes Yes

Las 3 pruebas realizadas con el chan_sebi serán recepción y envio de SMS y realización

de llamadas a través de este canal.

Prueba 1) Llamada con chan_sebi

Configuración del fichero extensions.conf:

[from-sebi] ;LLamadas con Chan_Sebi exten => 650664616,1,NoOp(Outgoing call through the SEBI device to ${EXTEN}) exten => 650664616,n,Dial(Sebi/g1/${EXTEN},60) exten => 650664616,n,Hangup

307

Miramos el log en el CLI de Asterisk al hacer una llamada:

-- Executing [650664616@acceso2:1] NoOp("SIP/100-08bedc70", "Outgoing call through the SEBI device to 650664616") in new stack -- Executing [650664616@acceso2:2] Dial("SIP/100-08bedc70", "Sebi/g1/650664616|60") in new stack -- Called g1/650664616 -- Sebi/huawei1-4b5e is making progress passing it to SIP/100-08bedc70 == Spawn extension (acceso2, 650664616, 2) exited non-zero on 'SIP/100-08bedc70

Prueba 2) Envio de SMS con chan_sebi: Configuración del fichero extensions.conf:

[from-sebi] include => acceso2 exten => 1111,1,NoOp(Envio de Sms) exten => 1111,n,SebiSendSMS(huawei1,650664616,"sms prueba") exten => 1111,n,Hangup [acceso2] exten => 100,1,Dial(SIP/100,30,Ttm) exten => 100,n,Hangup

Hacemos la prueba marcando 1111 y vemos el log del CLI:

-- Executing [1111@acceso2:1] NoOp("SIP/100-08bf7548", "Envio de Sms") in new stack -- Executing [1111@acceso2:2] SebiSendSMS("SIP/100-08bf7548", "huawei1|650664616|"sms prueba"") in new stack -- Executing [1111@acceso2:3] Hangup("SIP/100-08bf7548", "") in new stack == Spawn extension (acceso2, 1111, 3) exited non-zero on 'SIP/100-08bf7548'

El sms ha llegado al instante. También se puede realizar esta prueba desde el CLI directamente, pero de esta forma suena la extensión que le indicas, en este caso la 100, y al contestar se envía el SMS: *CLI> originate sip/100 application SebiSendSMS huawei1|650664616|"SMS DE PRUEBA" -- Launching SebiSendSMS(huawei1|650664616|SMS DE PRUEBA) on SIP/100-b7780b98

Prueba 3) Recepción de SMS desde el chan_sebi:

Configuración del fichero extensions.conf:

[from-sebi] exten => sms,1,NoOp(Incoming SMS from ${SMSSRC}) exten => sms,n,System(/usr/src/recvSMS.sh "${SMSSRC}" "${SMSTXT}") exten => sms,n,Hangup

Para esta prueba hacemos uso de un ejecutable que enviará un email a una dirección indicada al recibir el SMS, el código de este archivo es:

308

#!/bin/bash if [ $# -ne 2 ] then echo "Invalid parameters." exit 0 fi echo $2 | mail -s "SMS from $1" [email protected]

Miramos el log en el CLI de Asterisk al hacer una llamada:

-- Executing [sms@from-sebi:1] NoOp("Sebi/huawei1-1de3", "Incoming SMS from +34650664616") in new stack -- Executing [sms@from-sebi:2] System("Sebi/huawei1-1de3", "/usr/src/recvSMS.sh "+34650664616" "Prueba recepcion de SMS."") in new stack -- Executing [sms@from-sebi:3] Hangup("Sebi/huawei1-1de3", "") in new stack == Spawn extension (from-sebi, sms, 3) exited non-zero on 'Sebi/huawei1-1de3'

309

Flash Operator Panel 2 (FOP 2)

¿Qué es FOP2? Flash Operator Panel 2 es una aplicación de tipo panel de control para las PBX Asterisk. Se ejecuta en un navegador web con el plugin de flash. Es capaz de mostrar información sobre su actividad PBX en tiempo real. El diseño es configurable (tamaño y color de los botones, etc.). Su creador, Nicolas Gudiño, fue ganador hace unos meses del premio que otorga Digium, Digium Innovation Awards, y es que FOP 2 es un producto ideal y muy recomendable. Características

• Acciones

o Iniciar llamadas o Acceso telefónico a cualquier número o Acceso a la agenda de llamadas o Notificación de entrada de llamadas o Agenda de Contactos (Visual Phonebook) o Transferencia de llamadas o Transferencia al buzón de voz o Registro de llamadas o Atención de llamadas directas (Pick Up) o Colgar llamadas o Funcionalida Spy & Whisper (Escuchar llamada y comunicarse con uno de

los hablantes sin que el otro escuche)

• Botones de Extensión

o 2 líneas por botón o Callerid y temporizador o Indicador de pausa o Indicador de pertenencia a una cola o Indicador de grabación

• Botones Trunk

o Muestra una lista con los trunks establecidos o configurados

• Botones de Conferencia

o Lista de miembros de la conferencia o Bloqueo / Desbloqueo de conferencias o Silenciar / Activar audio a los miembros o Silenciar / Activar a todos los miembros o Expulsar miembros de la conferencia

310

• Botones de Cola

o Lista de agentes/miembros o Lista de llamadas en espera o Miembros en pausa o Miembros ocupados o Miembros disponibles o Miembros invalidos

¿A quién va dirigido FOP 2?

A los recepcionistas:

Desarrollado con una recepcionista en la mente. Todas las acciones están disponibles en dos clics del ratón.

• Ver quién está disponible o no. • Transferencia en forma directa a la extensión de destino o al buzón de voz. • Habilitar los permisos de PickUp. • Búsqueda en tiempo real y filtro de extensiones (ideal para las grandes

empresas con cientos de extensiones).

A los supervisores del centro de llamadas:

No sólo puede ver el estado de la extensión, sino también una rápida visión de las colas:

• Ver agentes registrados en una cola. • Ver estado del agente (en pausa, ocupado, disponible, no válido). • Ver todas las llamadas en espera en la cola con su temporizador. • Espiar y/o susurrar a sus agentes.

A los usuarios finales:

Usted no necesita ser un recepcionista o tener un centro de llamadas para aprovechar las características de FOP2, ya que este permite controlar sus propias llamadas, incluso antes de cogerlas.

• Notificaciones de llamadas (número y nombre de callerid, llamada de la cola). • Búsqueda de llamada o marcarción a cualquier número escrito. • Control de llamadas: Trasferencia, Colgar, etc.

311

Instalación

Requisitos del Sistema El programa consta de dos componentes, un demonio del lado del servidor que se conecta a la interfaz de Asterisk y será el mediador entre Asterisk y los clientes Web.

Si tiene instalada una distribución de Linux Red Hat y va a instalar el panel desde un tarball(.tar), tendrá que obtener el tarball correcto dependiendo de su versión de glibc. Puede averiguar la versión de glibc escribiendo en la consola:

#> /lib/libc.so.6

La respuesta será similar a esta:

GNU C Library stable release version 2.3.6, by Roland McGrath et al. Copyright (C) 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled by GNU CC version 3.4.4 20050721 (Red Hat 3.4.4-2). Compiled on a Linux 2.4.20 system on 2005-11-03. Available extensions: GNU libio by Per Bothner crypt add-on version 2.1 by Michael Glad and others linuxthreads-0.10 by Xavier Leroy The C stubs add-on version 2.1.2. BIND-8.2.3-T5B NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk Glibc-2.0 compatibility add-on by Cristian Gafton GNU Libidn by Simon Josefsson libthread_db work sponsored by Alpha Processor Inc Thread-local storage support included. For bug reporting instructions, please see: <http://www.gnu.org/software/libc/bugs.html>.

El otro componente es la aplicación web, que consiste en su mayoría en Javascript, HTML, CSS y un componente Flash. Por esa razón se necesita un servidor web corriendo para servir a estos archivos. Para la agenda de llamadas necesita soporte para PHP en el servidor web y base de datos MySQL instalada.

Por último, su navegador necesita Adobe Flash Player (versión 9) y el Javascript activado.

Instalación desde tarball

Después de descargar el paquete adecuado, tendrá que extraerlo y comenzar la instalación:

#> tar zxvf fop2-001-i386-glibc2.5-centos5.tgz #> cd fop2 #> make install

312

La instalación copiará los archivos del servidor en / usr/local/fop2 y las páginas web bajo / var/www/html/fop2.

Before starting the service, some basic configuration is required in fop2.cfg and probably in /etc/asterisk/manager.conf, because the FOP2 daemon connects via TCP to the Asterisk Manager Interface (AMI) using a username and secret. Antes de iniciar el servicio, es necesaria la configuración básica de fop2.cfg y de manager.conf en /etc /asterisk/, porque el demonio FOP2 se conecta a través de TCP a la interfaz de Asterisk Manager (IAM), utilizando un nombre de usuario y una clave.

Una vez configurado esto habrá que iniciar el servicio.

#> cd / usr/local/fop2 #> ./fop2_server

Configuración

El archivo principal de configuración del servidor es / usr/local/fop2/fop2.cfg. Los parámetros más importantes y necesarios para este fichero son los establecidos en el manager.conf.

Ejemplos de configuración:

/usr/local/fop2/fop2.cfg

[general] ; AMI definitions manager_host = 127.0.0.1 manager_port = 5038 manager_user = admin manager_secret = amp111

/etc / asterisk / manager.conf

[general] enabled = yes port = 5038 bindaddr = 127.0.0.1

[admin] secret = amp111 deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.0 read = system,call,command,agent,user,originate write = system,call,command,agent,user,originate

También es recomendable la configuración siguiente:

/etc/asterisk/sip.conf

callevents=yes

313

Para que se efectue el envio de eventos al FOP2.

/etc/asterisk/queues.conf

[testqueue] eventwhencalled=yes

Para que efectue el envio de eventos relacionados con las colas y los agentes.

Configuración de botones

Además de la configuración del servidor, es importante la configuración de los botones que desea mostrar.

Los botones de configuración se realizan en distintos archivos de configuración para que sean más fáciles de mantener y organizar. En el fichero / usr/local/fop2/fop2.cfg hay que especificar el parámetro buttonfile, que apunta al archivo que contendrá las definiciones de los botones.

/usr/local/fop2/fop2.cfg

... ... buttonfile= buttons.cfg

Botones de Extensión

Este tipo de botones representan una extension. Se mostrarán dos líneas para cada botón y algunos datos específicos, como la presencia, estado de pausa, etc.

/usr/local/fop2/ buttons.cfg

[SIP/600] type=extension extension=600 context=from-internal label=John mailbox=600@default extenvoicemail=*600@default

Botones de cola

Similares a los botones de extensión, los botones de cola hacen uso de los mismos parámetros con la diferencia que no sólo el tipo se debe establecer en la cola, sino también el nombre, entre paréntesis, debe estar precedido de "QUEUE /".

/usr/local/fop2/buttons.cfg

[QUEUE/101] type=queue label=Sales

314

extension=101 context=from-internal

Los botones de cola no aceptan los parámetros mailbox o extenvoicemail, ya que sólo se aplican a los botones de extensión.

Botones de Conferencia

Al igual que los botones de cola, los botones de conferencia tienen que ser definidos como type=conference y el contexto debe empezar con el prefijo "CONFERENCE/".

/usr/local/fop2/buttons.cfg

[CONFERENCE/1000] type=conference label=Main Conference extension=1000 context=from-internal

Botones Trunk

Para los trunks que hay muy pocos parámetros que establecer. Un trunk no se puede marcar, por esa razón no es necesario especificar la extensión ni el contexto. Sólo el type que sería “trunk” debe ser especificado, junto con la etiqueta del botón.

/usr/local/fop2/buttons.cfg

[DAHDI/1] type=trunk label=DAHDI 1-4 server=1

Tenga en cuenta que también hay que establecer el parámetro server, ya que si se supervisa más de un servidor, y tiene DAHDI / 1 definido sin especificar el servidor, usted experimentará una colisión por el canal, y la situación no será correcta.

Configuración de Visual Phonebook

La agenda requiere php y mysql para ser instalada y funcionar. Es necesario crear una base de datos con una tabla y dar los adecuados permisos. También tienes que configurar el idioma de la aplicación PHP. Con el fin de empezar, asegúrese de crear una base de datos MySQL utilizando la contraseña correcta (sustituir XXXXX con su contraseña de root de MySQL):

#> cd /var/www/html/fop2 #> mysqladmin -u root -pXXXXX create fop2 #> mysql -u root -pXXXXX < mysql.db

Después de crear una base de datos y la tabla, dar permisos:

315

#> mysql -u root -pXXXXX -e \"grant all privileges on fop2.* to root@localhost \" identified by 'myPassw0rd'"

Por último hay que editar el archivo de configuración y seleccionar el idioma adecuado:

/var/www/html/fop2/config.php

<? // Database connection details $DBHOST = 'localhost'; $DBNAME = 'fop2'; $DBUSER = 'fop2'; $DBPASS = ' myPassw0rd '; $language=’’en ‘’; // --------------------------------------------------------- / / ------------------------------------------------ --------- // Do not modify below this line // --------------------------------------------------------- / / ------------------------------------------------ --------- .. ..

Para tener una información amplia revise el Manual de uso de FOP 2.

316

Practicas de la aplicación con FOP 2

1) Acceso a FOP 2: http://192.168.1.200/fop2

Panel Principal de FOP 2:

2) Configurar el archivo principal del FOP 2 (fop2.cfg)

[general]

; AMI definitions

manager_host=localhost

manager_port=5038

manager_user=admin

manager_secret=amp111

;event_mask=call,agent

; Daemon definitios

listen_port = 4445

restrict_host = www.asternic.org

web_dir = /var/www/html/fop2

; Global Config language = en

317

poll_interval = 86400 poll_voicemail = 1 monitor_ipaddress = 0 ;master_key = 5678 user=2000:1234:all user=2001:1234:all user=2002:1234:all user=2003:1234:all user=2004:1234:all user=2005:1234:all user=2006:1234:all buttonfile=autobuttons.cfg #exec autoconfig-users-freepbx.sh

Configurar el archive de botones (autobuttons.cfg) [SIP/2000] type=extensión extension=2000 context=acceso label=Mikel mailbox=2000@default extenvoicemail=20008@acceso

[SIP/2001] type=extensión extension=2001 context=acceso label=Eduardo mailbox=2001@default extenvoicemail=20018@acceso

[SIP/2002]

type=extensión extension=2002 context=acceso label=Josean mailbox=2002@default extenvoicemail=20028@acceso

[SIP/2003]

type=extensión extension=2003 context=acceso label=David mailbox=2003@default extenvoicemail=20038@acceso

[SIP/2004]

type=extensión extension=2004 context=acceso label=Josemi mailbox=2004@default extenvoicemail=20048@acceso

[SIP/2005]

type=extensión

318

extension=2005 context=acceso label=Usuario1 mailbox=2005@default extenvoicemail=20058@acceso

[SIP/2006]

type=extensión extension=2006 context=acceso label=Usuario2 mailbox=2006@default extenvoicemail=20068@acceso

[QUEUE/ soportequeue]

type=queue label= soportequeue extension=784 context= soportelaboral

[DAHDI/2]

type=trunk label=DAHDI

[CONFERENCE/600]

type=conference label=Conferencia Estatica server=1 extension=600 context=meetme

3) Agregar usuarios/clientes a la Visual phonebook para que al recibir una llamada

aparezca el perfil de dicho usuario/cliente en vez de la imagen siguiente:

Con el usuario/cliente que llama agregado a la agenda la llamada sería así:

319

Tras rellenar la agenda queda de la siguiente forma:

4) Pruebas de la barra de herramientas de FOP 2:

� Botón de llamada:

La realización de llamadas desde FOP 2 se realiza como se describe en el siguiente ejemplo, en el cual la llamada se realizará entre la extensión 2003, con la que nos logueamos en FOP 2, y la extensión 2005.

320

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

> Channel SIP/2003-09349390 was answered. -- Executing [2005@acceso:1] Macro("SIP/2003-09349390", "acceso|2005") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/2003-09349390", "SIP/2005|30|Ttm") in new stack -- Called 2005 -- Started music on hold, class 'default', on SIP/2003-09349390 -- SIP/2005-09346740 is ringing -- SIP/2005-09346740 answered SIP/2003-09349390 -- Stopped music on hold on SIP/2003-09349390 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/2003-09349390' in macro 'acceso' == Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/2003-09349390'

� Botón de transferencia:

Cuando se está llevando a cabo una llamada el receptor de esta, usuario de la centralita, puede transferir la llamada a otro usuario. En el ejemplo siguiente la llamada entre el usuario 4000 y el 2003 es transferida por este último a la extensión 2005, como se puede ver en la siguiente imagen.

321

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2003@acceso:1] Macro("SIP/4000-08b81180", "acceso|2003") in new stack

-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2003|30|Ttm") in new stack

-- Called 2003

-- Started music on hold, class 'default', on SIP/4000-08b81180

-- SIP/2003-08b8b550 is ringing

-- SIP/2003-08b8b550 answered SIP/4000-08b81180

-- Stopped music on hold on SIP/4000-08b81180

== Spawn extension (acceso, 2005, 0) exited non-zero on 'SIP/4000-08b81180' in macro 'acceso'

== Spawn extension (acceso, 2005, 0) exited non-zero on 'SIP/4000-08b81180'

-- Executing [2005@acceso:1] Macro("SIP/4000-08b81180", "acceso|2005") in new stack

-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2005|30|Ttm") in new stack

-- Called 2005

-- Started music on hold, class 'default', on SIP/4000-08b81180

-- SIP/2005-08b99410 is ringing

-- SIP/2005-08b99410 answered SIP/4000-08b81180

-- Stopped music on hold on SIP/4000-08b81180

== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b81180' in macro 'acceso'

== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b81180'

� Botón de transferencia a voicemail:

Cuando se está llevando a cabo una llamada el receptor de esta, usuario de la centralita, puede transferir la llamada a su buzón de voz. En el ejemplo siguiente la llamada entre el usuario 4000 y el 2003 es transferida por este último a su buzón de voz, como se puede ver en la siguiente imagen.

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es: -- Executing [2003@acceso:1] Macro("SIP/4000-08b87368", "acceso|2003") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/4000-08b87368", "SIP/2003|30|Ttm") in new stack -- Called 2003 -- Started music on hold, class 'default', on SIP/4000-08b87368 -- SIP/2003-08b8f570 is ringing -- SIP/2003-08b8f570 answered SIP/4000-08b87368 -- Stopped music on hold on SIP/4000-08b87368 == Spawn extension (acceso, 20038, 0) exited non-zero on 'SIP/4000-08b87368' in macro 'acceso' == Spawn extension (acceso, 20038, 0) exited non-zero on 'SIP/4000-08b87368' -- Executing [20038@acceso:1] VoiceMail("SIP/4000-08b87368", "2003") in new stack

322

-- <SIP/4000-08b87368> Playing 'vm-intro' (language 'es') -- <SIP/4000-08b87368> Playing 'beep' (language 'es') -- Recording the message -- x=0, open writing: /var/spool/asterisk/voicemail/default/2003/tmp/RMyVLR format: gsm, 0x8b70578 -- x=1, open writing: /var/spool/asterisk/voicemail/default/2003/tmp/RMyVLR format: wav, 0x8b23bb8 -- User hung up == Parsing '/var/spool/asterisk/voicemail/default/2003/INBOX/msg0000.txt': Found == Parsing '/var/spool/asterisk/voicemail/default/2003/INBOX/msg0000.txt': Found == Parsing '/var/spool/asterisk/voicemail/default/2003/INBOX/msg0000.txt': Found == Spawn extension (acceso, 20038, 1) exited non-zero on 'SIP/4000-08b87368'

� Botón de PickUp de llamadas:

Cuando una extensión está llamando a otra, el usuario con el que te registraste en FOP 2, si es del mismo grupo de la extensión llamada puede contestarla. En el ejemplo siguiente la extensión 4000 está llamando a la 2005 y como este no la acepta, la extensión con la que nos registramos acepta la llamada..

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b87368", "acceso|2005") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/4000-08b87368", "SIP/2005|30|Ttm") in new stack -- Called 2005 -- Started music on hold, class 'default', on SIP/4000-08b87368 -- SIP/2005-08b8df48 is ringing > Channel SIP/2003-08b81180 was answered. > Launching Pickup(2005@acceso) on SIP/2003-08b81180 -- SIP/2003-08b81180 answered SIP/4000-08b87368 -- Stopped music on hold on SIP/4000-08b87368 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b87368' in macro 'acceso' == Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b87368'

323

� Botón de escucha de llamadas:

Cuando se está llevando a cabo una llamada, la extensión con la que nos registramos en FOP 2 puede escucharla sin que ambas extensiones lo sepan. En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es escuchada por la 2003, como se puede ver en la siguiente imagen. El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es: -- Executing [2005@acceso:1] Macro("SIP/4000-08b81180", "acceso|2005") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2005|30|Ttm") in new stack -- Called 2005 -- Started music on hold, class 'default', on SIP/4000-08b81180 -- SIP/2005-08b8b550 is ringing -- SIP/2005-08b8b550 answered SIP/4000-08b81180 -- Stopped music on hold on SIP/4000-08b81180 > Channel SIP/2003-08b8f570 was answered. > Launching ChanSpy(SIP/2005) on SIP/2003-08b8f570 -- <SIP/2003-08b8f570> Playing 'beep' (language 'es') -- <SIP/2003-08b8f570> Playing 'spy-sip' (language 'es') -- <SIP/2003-08b8f570> Playing 'digits/2' (language 'es') -- <SIP/2003-08b8f570> Playing 'digits/0' (language 'es') -- <SIP/2003-08b8f570> Playing 'digits/0' (language 'es') -- <SIP/2003-08b8f570> Playing 'digits/5' (language 'es') == Spying on channel SIP/2005-08b8b550 [Dec 17 04:58:48] NOTICE[8836]: app_chanspy.c:218 start_spying: Attaching SIP/2003-08b8f570 to SIP/2005-08b8b550 == Done Spying on channel SIP/2005-08b8b550 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b81180' in macro 'acceso' == Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b81180'

324

� Botón de escucha y susurro en llamadas:

Cuando se está llevando a cabo una llamada entre dos extensiones, la extensión con la que nos registramos en FOP 2 puede escuchar e incluso susurrar a una de las partes sin que la otra oiga nada. En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es escuchada por la extensión 2003 que puede hablar a la extensión 2005 sin que la 4000 se entere.

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b81180", "acceso|2005") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2005|30|Ttm") in new stack -- Called 2005 -- Started music on hold, class 'default', on SIP/4000-08b81180 -- SIP/2005-08b8b550 is ringing -- SIP/2005-08b8b550 answered SIP/4000-08b81180 -- Stopped music on hold on SIP/4000-08b81180 > Channel SIP/2003-08b90b98 was answered. > Launching ChanSpy(SIP/2005|w) on SIP/2003-08b90b98 -- <SIP/2003-08b90b98> Playing 'beep' (language 'es') -- <SIP/2003-08b90b98> Playing 'spy-sip' (language 'es') -- <SIP/2003-08b90b98> Playing 'digits/2' (language 'es') -- <SIP/2003-08b90b98> Playing 'digits/0' (language 'es') -- <SIP/2003-08b90b98> Playing 'digits/0' (language 'es') -- <SIP/2003-08b90b98> Playing 'digits/5' (language 'es') == Spying on channel SIP/2005-08b8b550

La extensión 2005 escucha a la 2003 pero la 4000 no.

325

� Botón de colgar llamadas:

Cuando se está llevando a cabo una llamada entre dos extensiones, la extensión con la que nos registramos puede colgar dicha llamada sin que ambas partes sepan quien fue. En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es colgada por la 2003, como se puede ver en la siguiente imagen. El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es: -- Executing [2005@acceso:1] Macro("SIP/4000-08b872d8", "acceso|2005") in new stack

-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b872d8", "SIP/2005|30|Ttm") in new stack -- Called 2005 -- Started music on hold, class 'default', on SIP/4000-08b872d8 -- SIP/2005-08b8df48 is ringing -- SIP/2005-08b8df48 answered SIP/4000-08b872d8 -- Stopped music on hold on SIP/4000-08b872d8 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b872d8' in macro 'acceso' == Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b872d8'

Cabe destacar que en el CLI no se ve si cuelga uno u otro, simplemente se acaba la llamada.

326

� Botón de grabar llamadas:

Cuando se está llevando a cabo una llamada entre dos extensiones, la extensión que se registró en el FOP 2 puede grabar dicha llamada. En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es grabada por la extensión 2003, como se puede ver en la siguiente imagen. El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es: -- Executing [2005@acceso:1] Macro("SIP/4000-08b872d8", "acceso|2005") in new stack

-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b872d8", "SIP/2005|30|Ttm") in new stack -- Called 2005 -- Started music on hold, class 'default', on SIP/4000-08b872d8 -- SIP/2005-08b8df48 is ringing -- SIP/2005-08b8df48 answered SIP/4000-08b872d8 -- Stopped music on hold on SIP/4000-08b872d8 [Dec 17 05:23:21] DEBUG[9112]: res_monitor.c:328 ast_monitor_stop: monitor executing ( nice -n 19 sox -m "/var/spool/asterisk/monitor/1261023719.156-2005-in.wav" "/var/spool/asterisk/monitor/1261023719.156-2005-out.wav" "/var/spool/asterisk/monitor/1261023719.156-2005.wav" && rm -f "/var/spool/asterisk/monitor/1261023719.156-2005-"* ) & == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b872d8' in macro 'acceso' == Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b872d8'

Se generan dos archivos:

• 1261023719.156-2005-in.wav

• 1261023719.156-2005-out.wav

327

Escuchamos los dos archives de grabación:

exten => 1122,1,Playback(/var/spool/asterisk/monitor/1261023719.156-2005-in) exten => 1123,1,Playback(/var/spool/asterisk/monitor/1261023719.156-2005-out)

-- Executing [1122@acceso:1] Playback("SIP/2003-08b872d8", "/var/spool/asterisk/monitor/1261023719.156-2005-in") in new stack -- <SIP/2003-08b872d8> Playing '/var/spool/asterisk/monitor/1261023719.156-2005-in' (language 'es') -- Executing [1123@acceso:1] Playback("SIP/2003-08b872d8", "/var/spool/asterisk/monitor/1261023719.156-2005-out") in new stack -- <SIP/2003-08b872d8> Playing '/var/spool/asterisk/monitor/1261023719.156-2005-out' (language 'es')

5) Pruebas de funcionamiento de botones de colas, conferencias y trunks

� Botón de Colas:

El código utilizado en estas pruebas es:

[soportelaboral]

exten => 784,1,Queue(${QS}|tThH)

exten => _XXXX22,1,PauseQueueMember(${QS}|SIP/${EXTEN:0:4})

exten => _XXXX22,n,Hangup

Pausamos los miembros 2000 y 2001 de la cola soportequeue y vemos el aspecto

de estos en FOP 2 y el de la cola:

-- Executing [200122@acceso:1] PauseQueueMember("SIP/2003-b6800a38",

"soportequeue|SIP/2001") in new stack

-- Executing [200122@acceso:2] Hangup("SIP/2003-b6800a38", "") in new stack

== Spawn extension (acceso, 200122, 2) exited non-zero on 'SIP/2003-b6800a38'

-- Executing [200022@acceso:1] PauseQueueMember("SIP/2003-b6800a38",

"soportequeue|SIP/2000") in new stack

-- Executing [200022@acceso:2] Hangup("SIP/2003-b6800a38", "") in new stack

== Spawn extension (acceso, 200022, 2) exited non-zero on 'SIP/2003-b6800a38'

328

Vemos cual es el comportamiento visual del boton de cola de FOP2 al realizarse

una llamada a la cola desde la extensión 4000 que será cogida por el miembro

2004 (Josemi):

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [784@acceso:1] Queue("SIP/4000-08b88260", "soportequeue|r") in new stack

-- Called SIP/2004

-- Called SIP/2000

-- Called SIP/2005

-- SIP/2000-08b9a368 is ringing

-- SIP/2005-08ba85f0 is ringing

-- SIP/2004-08b89f28 is ringing

-- Nobody picked up in 1000 ms

-- SIP/2004-08b89f28 answered SIP/4000-08b88260

-- Native bridging SIP/4000-08b88260 and SIP/2004-08b89f28

329

� Botón de Trunks:

Como hemos visto en la configuración del fichero de botones del FOP 2. Es

posible generar botones de Trunk.

En la aplicación para la realización de pruebas se configuró el botón del canal 2

de la tarjeta de telefonía anteriormente instalada (ENLACEEE).

De esta forma tras configurar la extensión 783 para llamar a ese canal:

exten => 783,1,Dial(DAHDI/2,30,tTm) exten => 783,n,Hangup

Al realizar una llamada a esta extensión desde la 2003 el resultado obtenido es el siguiente: El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [783@acceso:1] Dial("SIP/2003-08b89f98", "DAHDI/2|30|tTm") in new stack

-- Called 2 -- Started music on hold, class 'default', on SIP/2003-08b89f98 -- DAHDI/2-1 is ringing -- DAHDI/2-1 is ringing -- Stopped music on hold on SIP/2003-08b89f98 -- Hungup 'DAHDI/2-1' == Spawn extension (acceso, 783, 1) exited non-zero on 'SIP/2003-08b89f98'

� Botón de Conferencias

Como hemos visto en la configuración del fichero de botones del FOP 2. Es

también es posible generar botones de Conferencia. Se ha configurado un botón y

vamos a ver su funcionamiento frente a llamadas a la conferencia.

Registramos dos extensiones en la conferencia y vemos el efecto en el botón

de conferencia.

330

El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es: -- Executing [600@acceso:1] MeetMe("SIP/2005-08b876a8", "600|i|1234") in new stack == Parsing '/etc/asterisk/meetme.conf': Found -- Created MeetMe conference 1023 for conference '600' -- Recording -- <SIP/2005-08b876a8> Playing 'vm-rec-name' (language 'es') -- <SIP/2005-08b876a8> Playing 'beep' (language 'es') -- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-1 format: sln, 0x8b7b718 -- User ended message by pressing # -- <SIP/2005-08b876a8> Playing 'auth-thankyou' (language 'es') -- <SIP/2005-08b876a8> Playing 'vm-review' (language 'es') -- <SIP/2005-08b876a8> Playing 'vm-msgsaved' (language es') -- <SIP/2005-08b876a8> Playing 'conf-onlyperson' (language 'es') -- Executing [600@acceso:1] MeetMe("SIP/2003-08b8df48", "600|i|1234") in new stack -- Recording -- <SIP/2003-08b8df48> Playing 'vm-rec-name' (language 'es') -- <SIP/2003-08b8df48> Playing 'beep' (language 'es') -- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-2 format: sln, 0x8b2e168 -- User ended message by pressing # -- <SIP/2003-08b8df48> Playing 'auth-thankyou' (language 'es') -- <SIP/2003-08b8df48> Playing 'vm-review' (language 'es') -- <SIP/2003-08b8df48> Playing 'vm-msgsaved' (language 'es') -- <DAHDI/pseudo-1935991902> Playing '/var/spool/asteriskmeetme/meetme-username-600-2' (language 'es') -- <DAHDI/pseudo-1935991902> Playing 'conf-hasjoin' (language 'es') == Spawn extension (acceso, 600, 1) exited non-zero on 'SIP/2003-08b8df48' -- <DAHDI/pseudo-1935991902> Playing '/var/spool/asterisk/meetme/meetme-username-600-2' (language 'es') -- <DAHDI/pseudo-1935991902> Playing 'conf-hasleft' (language 'es') -- Hungup 'DAHDI/pseudo-1935991902' == Spawn extension (acceso, 600, 1) exited non-zero on 'SIP/2005-08b876a8'

331

Asternic Call Center Stats

¿Qué es Asternic Call Center Stats?

Esta sencilla y poderosa herramienta le permitirá analizar los registros de cola de su centralita Asterisk y mostrarlos de manera amigable en su navegador web. Es de los creadores de FOP 2.

Características

• Reportes detallados: Los reportes muestran información exacta sobre la activdad de su call center en tablas amistosas y gráficos flash vistosos.También puede exportar los reportes a pdf o csv (Excel). Hay una gran cantidad de métricas disponibles: nivel de servicio, nivel de abandonos, distribución de llamados, actividad de agentes, y mucho más.

• Asequible: Asternic Call Center Stats viene en dos versiones, una gratuita con capacidad limitada que se distribuye bajo la licencia GPL v3, y una versión comercial con un montón de características adicionales e informes. La concesión de licencias se realiza por servidor, no hay licencias por puesto, y el código fuente completo se incluye en ambas versiones.

• Estado en tiempo real: Tanto la version Lite como la Pro le permiten ver el estado de sus colas y agentes en tiempo real.

• Sólido y probado: La herramienta está siendo utilizada en pequeñas oficinas y en grandes call centers por igual, reportando cientos de miles de llamadas de forma consistente.

Requisitos:

En el servidor

1. Servidor web con soporte PHP. 2. Base de datos MySQL. 3. Asterisk 1.2, 1.4 o 1.6.

En el cliente

1. Navegador web con soporte javascript. 2. Plugin Flash para los gráficos.

332

Instalación

Estas instrucciones se aplican para la versión Lite del Asternic Call Center Stats.

- Descargamos la aplicación:

cd /usr/src wget http://www.asternic.org/stats/asternic-stats-1.0.1.tgz

- Descomprimimos:

tar zvxf asternic-stats-1.0.1.tgz cd asternic-stats

- Creamos la base de datos:

mysqladmin create qstats

- Cargamos la estructura de la base de datos:

mysql -u root < sql/qstat.sql

- Editamos /usr/src/asternic-stats/html/config.php e ingresamos la información referente a la base de datos:

$dbhost = 'localhost'; $dbname = 'qstat'; $dbuser = 'root'; $dbpass = '';

$language = "es";

- Editar /usr/src/asternic-stats/html/config_realtime.php la información referente a Asterisk Manager, esta la podemos encontrar en el archivo /etc/asterisk/manager.conf :

<? $manager_host = "127.0.0.1"; $manager_user = "admin"; $manager_secret = "amp111"; session_start(); session_register("QSTATS"); ?>

- Editamos /usr/src/asternic-stats/parselog/config.php con información referente a la base de datos y manager de asterisk:

$queue_log_dir = '/var/log/asterisk/'; $queue_log_file = 'queue_log'; $dbhost = 'localhost'; $dbname = 'qstat';

333

$dbuser = 'root'; $dbpass = '';

- Copiamos la carpeta html a /var/www/:

cp -Rf /usr/src/asternic-stats /var/www/queue-stats cp -Rf /usr/src/asternic-stats/parselog /var/www/queue-stats

- Creamos una tarea programada para consolidar la información del archivo queue_log:

php -q /var/www/queue-stats/parselog/parselog.php

- Visualizamos unas bonitas y completas estadísiticas de cada una de las colas disponibles desde:

http://ip.asterisk/queue_stats

334

Practicas de la aplicación con Asternic Call Center Stats Tras el acceso a la aplicación ( http://192.168.1.200/stats/ ) elegimos las colas, los agentes y el intervalo de tiempo del que realizaremos el reporte.

Pulsamos el botón “Mostrar Reporte” y vemos las llamadas atendidas por cada cola y agente seleccionados y las no atendidas.

335

336

A continuación vemos las llamadas atendidas por hora, día y por día de la semana.

Para una mejor visualización vemos 3 gráficas:

• La relación entre llamadas atendidas y desatendidas por hora.

337

• Número de horas desatendidas de las recibidas.

• Tiempo de espera por hora.

338

Vemos la distribución de llamadas por día de la semana:

Vemos a tiempo real que sucede cuando se está haciendo una llamada a la cola.

339

Cuando se contesta la llamada la aplicación lo refleja de la siguiente forma:

340

Asternic CDR Reports

¿Qué es Asternic CDR Reports?

Es una herramienta de fácil manejo que le permitirá analizar los registros de llamadas de cada uno de los usuarios de la centralita Asterisk y mostrarlos a través de diversas tablas y gráficos en su navegador web.Es de los creadores de FOP 2 y Asternic Call Center Stats.

Características

• Versión de Prueba: Para obtener esta aplicación y probarla es necesario ponerse en contacto con los creadores de esta.

• Referencias: El éxito de FOP 2 y lo consistente y solida que es la aplicación Asternic Call Center Stats nos da un punto de confianza.

• Estado en tiempo real: Esta versión permite ver el estado de una llamada en tiempo real.

• Reportes Detallados: La herramienta permite ver reportes de las llamadas entrantes y salientes por usuario y duración total de todas estas, también es posible ver la distribución en minutos mensual de cada usuario.

Requisitos:

En el servidor

4. Servidor web con soporte PHP. 5. Base de datos MySQL. 6. Asterisk 1.2, 1.4 o 1.6.

En el cliente

3. Navegador web con soporte javascript. 4. Plugin Flash para los gráficos.

341

Instalación

Con estas simples instrucciones instalaremos la aplicación en nuestro servidor:

- Obtenemos la aplicación:

En este caso gracias a Nicolas Gudiño.

- Descomprimimos en /var/www/html/ y cambiamos de nombre a la carpeta a "cdr":

tar zvxf asternic-cdr-free.tgz mv asternic-cdr-free cdr cd cdr

- Agregamos el contenido de el fichero db.sql a la base de datos "cdr" anteriormente creada para llevar los registros de llamadas desde MySQL:

service mysqld start

mysql -u root -p root use cdr;

Pegamos el contenido del fichero db.sql.

- Editamos el archivo config.php de la siguiente manera:

// Credentials for MYSQL databases $dbhost = 'localhost'; $dbname = 'cdr'; $dbuser = 'root'; $dbpass = 'root'; // Credentials for AMI (for the realtime tab to work) // See /etc/asterisk/manager.conf $manager_host = "localhost"; $manager_user = "admin"; $manager_secret = "amp111"; // Available languages "es", "en", "ru", "de", "fr" $language = "es";

- Visualizamos el registro de llamadas desde:

http://ip.asterisk/cdr

342

Practicas de la aplicación con Asternic CDR Reports Tras el acceso a la aplicación ( http://192.168.1.200/cdr/ ) configuramos los usuarios y establecemos el intervalo de tiempo del que realizaremos el reporte.

Agregamos uno a uno los usuarios de los que registraremos las llamadas.

Tras agregar todos los usuarios este es el aspecto de la aplicación y ya podemos hacer el reporte.

343

Elegimos el intervalo de tiempo y pulsamos el botón “Mostrar Reporte”.

Tras hacer el reporte empezamos a observar las tablas y gráficos que se realizan empezando por las llamadas salientes por usuario.

A partir de esa tabla se generan las siguientes gráficas:

344

Ahora vemos las llamadas entrantes recibidas por usuario:

345

A partir de la tabla de llamadas entrantes se generan las siguientes gráficas:

346

Vemos la distribución de llamadas en los 23 dias de los que se ha hecho el reporte:

347

Por último se visualiza como se muestra una llamada a tiempo real:

348

Verbio

Verbio Technologies S.L. es una empresa especializada en el desarrollo de tecnologías del habla, básicamente síntesis y reconocimiento de voz.

Verbio diseña, desarrolla y comercializa productos software de tecnologías del habla y ofrece los servicios asociados de soporte técnico, consultoría, desarrollos I+D a medida, ajuste y tuning de aplicaciones de voz y mantenimiento. Por suerte nos han concedido una versión de prueba para aplicar y probar el funcionamiento del reconocimiento y síntesis de voz a nuestra centralita Asterisk.

¿Qué es Verbio TTS? Verbio TTS es el motor de síntesis de voz o conversión de texto en voz de Verbio.

• ¿Qué es la Conversión de texto en voz?

La conversión de texto en habla o síntesis de voz (TTS - Text-to-Speech) es la tecnología que permite convertir, de forma automática, un texto escrito en una locución de voz natural, con la mejor naturalidad e inteligibilidad. Permite al sistema que dispone de dicho motor "leer en voz alta" un texto escrito.

• ¿Cuándo es indicado utilizarlo?

- Es una herramienta imprescindible en aplicaciones cuyo texto a pasar a voz, a priori, es desconocido o muy cambiante y por lo tanto hay que comunicar información dinámica.

- La síntesis no pretende sustituir nunca a la calidad de una grabación profesional hecha en un estudio de grabación, pero sí que se dispone de calidad suficiente como para sustituir temporalmente cuando se necesitan de forma inmediata mensajes o locuciones estáticas o definitivamente cuando lo que se pretende es un ahorro directo de costes.

- Cuando se persigue mayor calidad que lo que representa la simple concatenación directa de ficheros .wav de pequeñas locuciones grabadas en estudio, ya que con ellas se perdería la entonación dinámica necesaria en un idioma concreto. Un ejemplo típico de ello es la locución de cantidades numéricas.

349

¿Qué es Verbio ASR?

Verbio ASR es el motor de reconocimiento del habla de Verbio muy orientado a aplicaciones telefónicas e independientes del locutor, si bien es aplicable también en muchas otras aplicaciones microfónicas y multimedia.

• ¿Qué es el Reconocimiento del habla?

El reconocimiento del habla (ASR - Automatic Speech Recognition) es la tecnología que permite convertir, de forma automática, una locución de voz natural en un texto que se corresponda con ésta con la máxima fiabilidad posible. Permite al sistema que dispone de dicho motor "entender" o interpretar el contenido de una locución con independencia de la voz del locutor.

• ¿Cuándo es indicado utilizarlo?

- Verbio ASR es una herramienta imprescindible en aplicaciones interactivas entre usuarios y sistemas automáticos o de control por voz, ya sean IVR, Portales de voz o dispositivos en general.

- Muy orientado para el entorno telefónico, si bien el canal de voz forma parte de otros muchos sistemas multicanal o multimodal que requieren ASR para ser automatizados.

- Cuando se requiere una navegación más flexible, con iniciativa y control por parte del usuario.

- Para ahorrar tiempos de interacción y evitar memorización de menús muy largos.

- En aplicaciones en las que el teléfono, o simplemente la voz, sigue siendo el único canal o medio de interacción.

Introducción a Verbio-Asterisk

Para poder poner en marcha el sistema Verbio-Asterisk, deberemos disponer de los siguientes componentes:

•••• Servidor Verbio (voxserver).

•••• Servidor Asterisk con las aplicaciones Verbio instaladas. Ambos componentes pueden estar instalados en el mismo equipo.

350

Listado de paquetes de Verbio:

El listado de paquetes disponibles es el siguiente:

� Motor de síntesis/recnocimiento (servidor voxserver (verbiod)):

verbio-engines: Este paquete es de obligada instalación cuando estamos montando el servidor de síntesis/reconocimiento. En este caso el paquete necesario es: verbio-engines-8.02-0.i386.rpm

� Cliente verbio (Verbio Developer):

verbio-clients: Contiene las librerías, ejemplos y documentación necesaria, para el desarrollo de aplicaciones de voz. En este caso el paquete necesario es: verbio-clients-8.02-0.i386.rpm

� Text To Speech (síntesis):

Id. Locutor Nombre del paquete Descripción

esAO verbio-tts-laura-esao locutor de síntesis español (mujer -Laura-) 8KHz

esAO verbio-tts-laura-esao-16k locutor de síntesis español (mujer -Laura-) 16KHz

esEB verbio-tts-carlos-eseb locutor de síntesis español (hombre -Carlos-) 8KHz

Servidor Asterisk

Mediante las aplicaciones (Dialplan) Verbio, se realizan peticiones de

síntesis y reconocimiento al voxserver.

Servidor Verbio (voxserver)

Proporciona recursos de sintesis y reconocimiento.

351

esEB verbio-tts-carlos-eseb-16k locutor de síntesis español (hombre -Carlos-) 16KHz

esVA verbio-tts-amaya-esva locutor de síntesis español (mujer -Amaya-) 8KHz

esVA verbio-tts-amaya-esva-16k locutor de síntesis español (mujer -Amaya-) 16KHz

ca-c0CD verbio-tts-pau-ca-c0cd locutor de síntesis catalán (hombre -Pau-) 8KHz

ca-c0CD verbio-tts-pau-ca-c0cd-16k locutor de síntesis catalán (hombre -Pau-) 16KHz

ca-c0FE verbio-tts-meritxell-ca-c0fe locutor de síntesis catalán (mujer -Meritxell-) 8KHz

ca-c0FE verbio-tts-meritxell-ca-c0fe -16k locutor de síntesis catalán (mujer -Meritxell-) 16KHz

caJO verbio-tts-oriol-cajo locutor de síntesis catalán (hombre -Oriol-) 8KHz

caJO verbio-tts-oriol-cajo-16k locutor de síntesis catalán (hombre -Oriol-) 16KHz

euSK verbio-tts-ainhoa-eusk locutor de síntesis euskera (mujer -Ainhoa-) 8KHz

euSK verbio-tts-ainhoa-eusk-16k locutor de síntesis euskera (mujer -Ainhoa-) 16KHz

euVZ verbio-tts-amaia-euvz locutor de síntesis euskera (mujer -Amaia-) 8KHz

euVZ verbio-tts-amaia-euvz-16k locutor de síntesis euskera (mujer -Amaia-) 16KHz

ca-v0EM verbio-tts-empar-ca-v0em locutor de síntesis valenciano (mujer -Empar-) a 8KHz

ca-v0EM verbio-tts-empar-ca-v0em-16k locutor de síntesis valenciano (mujer -Empar-) a 16KHz

gaFR verbio-tts-freire-gafr locutor de síntesis gallego (hombre -Freire-) 8KHz/16KHz

es-mxYO verbio-tts-celia-es-mxyo locutor de síntesis mexicano (mujer -Celia-) 8KHz

es-mxYO verbio-tts-celia-es-mxyo-16k locutor de síntesis mexicano (mujer -Celia-) 16KHz

ptMU verbio-tts-adriana-ptmu locutor de síntesis portugués (mujer -Adriana-) 8KHz

ptMU verbio-tts-adriana-ptmu-16k locutor de síntesis portugués (mujer -Adriana-) 16KHz

pt-brPA verbio-tts-julia-pt-brpa locutor de síntesis portugués brasileño (mujer -Julia-) 8KHz

pt-brPA verbio-tts-julia-pt-brpa-16k locutor de síntesis portugués brasileño (mujer -Julia-) 16KHz

frIF verbio-tts-brigitte-frif locutor de síntesis francés (mujer -Brigitte-) 8KHz

frIF verbio-tts-brigitte-frif-16k locutor de síntesis francés (mujer -Brigitte-) 16KHz

en-usJA verbio-tts-jane-en-usja locutor de síntesis inglés (mujer -Jane-) 8KHz

en-usJA verbio-tts-jane-en-usja-16k locutor de síntesis inglés (mujer -Jane-) 16KHz

es-arLO verbio-tts-javier-es-arlo locutor de síntesis argentino (hombre -Javier-) 8KHz

es-arLO verbio-tts-javier-es-arlo-16k locutor de síntesis argentino (hombre -Javier-) 16KHz

Se instalarán los paquetes según los locutores que necesitemos. Hay que tener en cuenta que, a la hora de realizar la instalación de los locutores (TTS) de Verbio, deberemos usar la versión a 8Khz de los mismos. En este caso los paquetes necesarios son: verbio-tts-amaia-euvz-8.02-0.i386.rpm

y verbio-tts-amaya-esva-8.02-0.i386.rpm

� Configuraciones de reconocimiento (ASR):

Id. configuración Nombre del paquete Descripción (lenguajes que proporciona)

es verbio-asr-es reconocimiento español (es).

es_ca verbio-asr-es_ca reconocimiento español + catalán (es,ca)

es_eu verbio-asr-es_eu reconocimiento español + euskera (es,eu)

es_ga verbio-asr-es_ga reconocimiento español + gallego (es,ga)

es_ca_eu_ga verbio-asr-es_ca_eu_ga reconocimiento español + catalán + euskera + gallego (es,ca,eu,ga)

es-ar verbio-asr-es-ar reconocimiento argentino/uruguayo/paraguayo (es-ar)

es-cl verbio-asr-es-cl reconocimiento chileno (es-cl)

es-co verbio-asr-es-co reconocimiento Colombiano/panameño (es-co)

es-mx verbio-asr-es-mx reconocimiento mexicano (es-mx)

es-ve verbio-asr-es-ve reconocimiento venezolano/portorriqueño/cubano/ dominicano (es-ve)

pt verbio-asr-pt reconocimiento portugués (pt)

352

pt-br verbio-asr-pt-br reconocimiento portugués brasileño (pt-br)

fr verbio-asr-fr reconocimiento francés (fr)

en-us verbio-asr-en-us reconocimiento inglés americano (en-us)

es16k verbio-asr-es16k reconocimiento español 16Khz (es16k).

ca16k verbio-asr-ca16k reconocimiento catalán 16Khz (ca16k).

Se instalarán los paquetes según los locutores que necesitemos. En este caso el paquete necesario es: verbio-asr-es_eu-8.02-0.i386.

Instalación de Verbio

1. Desinstalar (si tenemos alguna instalación previa) todos los paquetes Verbio:

• Encontrar los paquetes Verbio que tengamos instalados en nuestro sistema.

# rpm -qa | grep -i verbio verbio-tts-* verbio-engines verbio-asr-* verbio-clients [...]

• Desinstalar los paquetes encontrados (verbio-engines deberá ser el último).

[...] # rpm -e verbio-tts-* # rpm -e verbio-asr-* # rpm -e verbio-clients # rpm -e verbio-engines

2. Instalar los nuevos paquetes Verbio (verbio-engines deberá ser el primero)

# rpm -ivh verbio-engines-x.yy.i386.rpm # rpm -ivh --force verbio-clients-x.yy.i386.rpm # rpm -ivh --force verbio-tts-*-x.yy.i386.rpm # rpm -ivh --force verbio-asr-*-x.yy.i386.rpm

3. Si disponemos de una mochila con licencia, deberemos instalar el paquete (que encontraremos en: /usr/share/doc/verbio/) que contiene el driver de dicho dispositivo:

# rpm -ivh sntl-sud-x.y.z.i386.rpm

Si disponemos de una licencia en fichero, copiarla en: /opt/verbio/lic/

4. Copiar el directorio /usr/share/doc/verbio/samples/ a nuestra 'home' (por ejemplo),para poder compilar y ejecutar algunos ejemplos que allí encontraremos.

353

5. La documentación de verbio la podemos encontrar en: /usr/share/doc/verbio/:

• library-sdk_es.pdf (documentación sdk verbio). • guide_es.pdf (capítulos 4 y 5 para aprender sobre reconocimiento y

síntesis del habla) Configuración y puesta en marcha del sevidor voxserver (verbiod)

La configuración del servidor voxserver, reside en el fichero:

/etc/software-verbio-server.

Los parámetros más importantes de dicho fichero son:

VERBIO_ASR_CONF : debe contener todas las configuraciones de ASR instaladas. VERBIO_START_CONF : debe contener todas las configuraciones ASR que queremos arrancar. VERBIO_START_LANG : lenguaje por defecto. VERBIO_TTS_SPK : debe contener todos los locutores TTS instalados. VERBIO_START_SPK : debe contener los locutores TTS que queremos tener disponibles. VERBIO_IN_MEMORY : 1 --> cargar todo el locutor en memoria, 0 --> carga parcial. FREQUENCY : 8000 o 16000 (según la version que hayamos instalado)

Nota: podemos usar la aplicación 'verbioconf' (como root desde un terminal) para llevar a cabo la configuración del fichero '/etc/software-verbio-server'. Cada vez que instalemos/eliminemos un paquete de síntesis y/o reconocimiento, deberemos ejecutar 'verbioconf' para reflejar los cambios en el fichero /etc/software-verbio-server. Puesta en marcha del servidor Verbio:

Comprobamos el correcto funcionamiento del servidor verbio ejecutando (como 'root'): # verbiod -d (con -d indicamos modo debug)

Si todo está correctamente instalado deberemos obtener una salida similar a: verbiod-6: StartUp TTS Speakers: esEB,esAO verbiod-3: Serial number = H9D1CCE7 verbiod-3: ERROR mc_libinit(, , 262144) failed: NO LICENSE FILE WAS FOUND

Si disponemos de licencia, y el servidor está correctamente instalado y configurado, el mensaje "NO LICENSE FILE WAS FOUND" no aparecerá y 'verbiod' quedará arrancado.

354

Si no tenemos licencia, una vez comprobada la correcta instalación de 'verbiod', podemos arrancar en modo evaluación, para realizar las pruebas que consideremos oportunas. Para ello ejecutaremos (como 'root'): # verbiod -e

El servidor quedará arrancado (ejecutar 'pgrep verbiod' para comprobar). También podemos comprobar el estado del servidor 'verbiod' ejecutando (como 'root'): # grep verbiod /var/log/syslog o # grep verbiod /var/log/messages

Nota: en modo evaluación, 'verbiod' permanecerá arrancado durante, únicamente, 30/60 minutos. Esta opción de evaluación únicamente es válida para comprobar el correcto funcionamiento del sistema. Se recomienda adquirir una licencia de evaluación una vez comprobado el correcto funcionamiento de verbio. Los parámetros que acepta verbiod son: -d (modo debug), -e (modo evaluación) o ningún parámetro para iniciar en modo 'normal'. Instalación de las aplicaciones de Verbio en Asterisk

Para instalar las aplicaciones Asterisk de Verbio, hay que seguir los siguientes pasos:

1.) Copiar el fichero 'app_verbio_speech.c' a la carpeta 'apps' de las fuentes de

Asterisk.

2.) Editar el fichero 'Makefile' de dicha ubicacion (carpeta 'apps') y añadir:

Si usamos Asterisk 1.4 o 1.6 (añadir justo antes de la etiqueta 'all:') MENUSELECT_DEPENDS_app_verbio_speech+=VOX VOX_LIB=-lvoxlib

Nota: para que la aplicación compile y linkee correctamente deberemos tener, como mínimo, el paquete 'verbio-clients' instalado.

3.) Ejecutar 'make install' (desde el directorio principal de nuestras fuentes de

Asterisk).

4.) Crear las siguientes carpetas (si conviene):

/var/lib/asterisk/verbio/text /var/lib/asterisk/verbio/gram /var/lib/asterisk/verbio/audio

5.) Copiar el fichero 'verbio.conf' (que encontramos en el paquete verbio-

asterisk)a: /etc/asterisk/.

355

Carga y descarga de las aplicaciones de Verbio en Asterisk.

Las aplicaciones Verbio se cargan y descargan automáticamente al iniciar o parar Asterisk. Si, desde el CLI de Asterisk, queremos cargar las aplicaciones Verbio pedemos ejecutar:

*CLI> module load app_verbio_speech.so

Para la descarga de las aplicaciones Verbio podemos ejecutar:

*CLI> module unload app_verbio_speech.so

Si hay algún error de configuración/conexión se nos reportará por pantalla. Nota: al cargar las aplicaciones Verbio (bien cuando arranca Asterisk o bien cuando cargamos manualmente con '(module) load app_verbio_speech.so'). Se intentará establecer la conexión con el servidor Verbio por lo cual, es muy importante que tengamos el servidor de síntesis/ reconocimiento arrancado. La conexión con el servidor Verbio se mantiene abierta hasta que paremos Asterisk o ejecutemos '(module) unload app_verbio_speech.so'.

Configuración de verbio.conf (en /etc/asterisk/)

;; Verbio ASR and TTS engines Configuration ;;;;;;;;;;;;;;;;;;;;;; ;General options ; ;;;;;;;;;;;;;;;;;;;;;; [general] primary_vox_server = 127.0.0.1 backup_vox_server = 127.0.0.1 ; default 5 net_timeout = 5 ;;;;;;;;;;;;;;;;;;;;;; ; TTS Engine Options ; ;;;;;;;;;;;;;;;;;;;;;; [tts] default_language = es ; es (español) ;default_language = eu ; eu (euskera) default_speaker = amaya ;default_speaker = amaia text_prompts_path =/var/lib/asterisk/verbio/text init_delay = 300 end_delay = 20 ;;;;;;;;;;;;;;;;;;;;;; ; ASR Engine Options ; ;;;;;;;;;;;;;;;;;;;;;; [asr] ;default_config = es default_config = es_eu ;(español, euskera) default_language = es grammar_path = /var/lib/asterisk/verbio/gran ; default: 300

356

init_sil = 300 ; default: 200 max_sil = 200 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; VAD (client-side) options ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [vad] ;min_ref = 5 ;mode = standard ;default: 2.5 ;low_factor = 2.5 ;default: 4.5 ;high_factor = 4.5 ; default: 0.8 ;final_factor = 0.8 ; default: 2.5 ;final_high_factor = 2.5 ; default: 500.0 ;min_high_thresh = 500.0 ; default: 50 ;aam_min = 50 ; default: 200 ;aam_max = 200 ;;;;;;;;;;;;;;;;;;;;;; ; Debug options ; ;;;;;;;;;;;;;;;;;;;;;; [debug] verbose = 1 extended_verbose = 1 keep_recorded_files = 1 recorded_files_path = /var/lib/asterisk/verbio/audio recorded_files_exten = pcm mark_recorded_files = 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Wordspotting options (future application) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [ws] ;path = /var/lib/asterisk/verbio/ws ;silence = 500 ;threshold = 30 ;command = /var/lib/asterisk/verbio/ws/ws.sh

Descripcion de las diferentes aplicaciones. Nota: Si los parámetros marcados como opcionales se omiten, estos tomaran los valores del fichero /etc/asterisk/verbio.conf.

o VerbioLoadVcb

o VerbioUnloadVcb

o VerbioRec

o VerbioPrompt

o VerbioPromptAndRec

o VerbioStreamAndRec

o VerbioLastErr

357

o VerbioInfo

o VerbioFreeChannel

o VerbioLoadVcb(gram_file|gram_type[|config][|lang][|options]) Descripción: Esta funcion carga una gramatica (sobre un puerto verbio asociado al canal Asterisk). Parametros: gram_file : fichero de gramatica. gram_type : tipo de gramatica ((ISOLATED, CONNECTED, ABNF o BUILTIN)). config : configuracion de reconocimiento (opcional). lang : lenguaje a utilizar (opcional). options : opciones. Las opciones disponibles son: - v (verbose) - n (no ejecutar colgado cuando se produzca un error referente a Verbio) Una vez cargada la gramatica, se establecera una variable de canal (VVCB_HANDLE) la cual contiene el identificador de la gramatica cargada.

o VerbioUnloadVcb(vcb_handle[|config][|lang][|options]) Descripción: Descarga una gramatica. Parametros: vcb_handle : identificador de gramatica (-1 para descargar todas) config : configuracion de reconocimiento (opcional). lang : lenguaje a utilizar (opcional). options : opciones. Las opciones disponibles son: - v (verbose) - n (no ejecutar colgado cuando se produzca un error referente a Verbio).

o VerbioRec([|config][|lang][|initsil][|maxsil][|abs_timeout][|options])

Descripcion: Lanza el reconocimiento. Antes de hacer cualquier llamada a esta aplicación, deberemos haber cargado alguna gramatica con la función 'VerbioLoadVcb'. Parametros: config : configuracion de reconocimiento (opcional). lang : lenguaje a utilizar (opcional). initsil : maxima duracion de silencio de inicio (unidades de 10ms). maxsil : maxima duracion de silencio final (unidades de 10ms). abs_timeout : timeout absoluto de reconocimiento (segundos)(opcional) options : opciones. Las opciones disponibles son: - b (beep antes de lanzar el reconocimiento) - v (verbose) - a (descolgar el canal)

358

- d (habilitar la deteccion de dtmf) - n (no ejecutar colgado cuando se produzca un error referente a Verbio) Para acceder al resultado del reconocimiento, podemos consultar (desde el dialplan de Asterisk) las siguientes variables de canal:

VASR_WORDS : Numero de palabras reconocidas (n).

VASR_INDEXn : Indice (dentro de la gramatica) de la palabra-n reconocida. VASR_RESULTn : Resultado-n del reconocimiento.

VASR_SCOREn : Score-n (confianza) del reconocimiento. VASR_UTTERANCEn : Utterance el resultado n. VASR_WEIGHTn : Peso del resultado n dentro de la gramatica. VASR_RULEn : Regla a la que pertenece el resultado n. Para compatibilidad con anteriores versiones: VASR_INDEX = VASR_INDEX0 VASR_RESULT = VASR_RESULT0 VASR_SCORE = VASR_SCORE0 VASR_UTTERANCE = VASR_UTTERANCE0 VASR_WEIGHT = VASR_WEIGHT0 VASR_RULE = VASR_RULE0 Si la deteccion de dtmf (opcion 'd') está habilitada, podemos consultar su estado con las siguientes variables de canal:

VDTMF_DETECTED:TRUE (se ha detectado un tono) o FALSE (no se ha detectado tono) VDTMF_RESULT :si VDTMF_DETECTED = TRUE, VDTMF_RESULT contiene el valor de la tecla pulsada -0,1,2,3,4,5,6,7,8,9,*,#...-.

Se puede configurar el número maximo de dtmf a detectar y el dtmf de terminación, configurando (set) las siguientes variables del dialplan:

VERBIO_DTMF_MAXLEN VERBIO_DTMF_TERMINATOR

Nota: si la opcion 'keep_recorded_files' esta activada en 'verbio.conf', podemos consultar el nombre del fichero generado (una vez la aplicacion de reconocimiento ha terminado), mediante la siguiente variable del dialplan: VASR_REC_FILE.

o VerbioPrompt(text_or_file[|lang][|speaker][|options])

Descripción: Sintetiza un texto o fichero de texto. Parámetros: text_or_file : texto (o fichero - ver opciones -) a sintetizar. lang : lenguaje a utilizar (opcional).

359

speaker : locutor a utilizar (opcional). options : opciones. Las opciones disponibles son: - f (tratar el parametro fichero_o_texto como si fuera un fichero) - v (verbose) - p (habilitar pausa/reproduccion mediante dtmf -tecla por defecto '#'.Para especificar una tecla: p0,p1,..,p*,p#. p. para cualquier tecla) - s (habilitar parada del prompt mediante dtmf -tecla por defecto '#'. Para especificar una tecla: s0,s1,..,s*,s#. s. para cualquier tecla)

- a (descolgar el canal) - n (no ejecutar colgado cuando se produzca un error referente a Verbio)

Si la opcion de parar el prompt ('s') esta habilitada, podemos consultar su estado con las siguientes variables de canal:

VDTMF_DETECTED (TRUE -si el usuario ha pulsado la tecla de parada del prompt- or FALSE) VDTMF_RESULT (si VDTMF_DETECTED = TRUE, contiene el valor de la tecla pulsada)

Al trabajar con la opcion 'f', los ficheros de texto a sintetizar, se buscaron en la ruta definida por el parametro 'text_prompts_path', del fichero de configuracion ('/etc/asterisk/verbio.conf'). Si queremos sintetizar un fichero de texto que se encuentre en una ubicacion distinta, deberemos introducir el path completo al fichero. No olvidarse de escapar las comas (',') del texto que queremos sintetizar (ejemplo: "Hola\, buenas tardes.").(Si usamos un fichero de texto -opcion 'f'-esto último no aplica).

o VerbioPromptAndRec(text_or_file[|initsil][|maxsil][|tts_lang][|tts_spkr][|asr

_conf][|asr_lang][|abs_timeout][|options])

Descripción: Lanza (al mismo tiempo) una sintesis y un reconocimiento. Dicha aplicacion permite, si la opcion bargein esta activada, que el usuario interrumpa la maquina (si durante la locucion el reconocedor detecta que el usuario ha dicho algo, se parara la sintesis y la aplicacion terminara. Permitiendonos, así, consultar el resultado del reconocimiento efectuado). Parametros: text_or_file : texto (o fichero - ver opciones -) a sintetizar. initsil : maxima duracion de silencio de inicio (unidades de 10ms) (opcional). maxsil : maxima duracion de silencio final (unidades de 10ms) (opcional)

360

tts_lang : lenguaje (del sintetizador) a utilizar (opcional). tts_spkr : locutor (del sintetizador) a utilizar (opcional). asr_conf : configuracion de reconocimiento (opcional). asr_lang : lenguaje (del reconocedor) a utilizar (opcional). abs_timeout : timeout absoluto de reconocimiento (segundos)(opcional) options : opciones. Las opciones disponibles son: - f (tratar el parametro fichero_o_texto como si fuera un fichero) - v (verbose) - a (descolgar el canal) - b (beep antes de reconocer) - g (activar bargein. Permitir al usuario interrumpir a la maquina. Esta opción desactivara 'b'.) - i (interrumpir de manera inmediata el prompt al detectar voz. Esta opción activara 'g'.) - d (habilitar la deteccion de dtmf) - n (no ejecutar colgado cuando se produzca un error referente a Verbio). Al trabajar con la opcion 'f', los ficheros de texto a sintetizar, se buscaran en la ruta definida por el parametro 'text_prompts_path' del fichero de configuración (/etc/asterisk/verbio.conf). Si queremos sintetizar un fichero de texto que se encuentre en una ubicacion distinta, deberemos introducir el path completo al fichero. No olvidarse de escapar las comas (',') del texto que queremos sintetizar (ejemplo: "Hola\, buenas tardes.").(Si usamos un fichero de texto -opcion 'f'- esto ultimo no se aplica). Cuando usemos bargein, hay que tener mucho cuidado al seleccionar los parametros 'initsil', 'maxsil' y 'abs_timeout'. Si, por ejemplo, seleccionamos un 'initsil' o 'abs_timeout' demasiado pequeño, no le daremos suficiente tiempo de escucha al usuario, y nuestro mensaje (prompt) se vera interrumpido. Si no indicamos un valor para 'initsil', 'maxsil' o 'abs_timeout', se utilizaran los valores indicados en el fichero de configuracion (verbio.conf). Para acceder al resultado del reconocimiento, podemos consultar (desde el dialplan de Asterisk) las siguientes variables de canal (una vez la aplicacion 'VerbioPromptAndRec' haya terminado): VASR_WORDS : Numero de palabras reconocidas (n). VASR_INDEXn : indice (dentro de la gramatica) de la palabra-n reconocida. VASR_RESULTn : Resultado-n del reconocimiento. VASR_SCOREn : Score-n (confianza) del reconocimiento.

361

VASR_UTTERANCEn : Utterance el resultado n. VASR_WEIGHTn : Peso del resultado n dentro de la gramatica. VASR_RULEn : Regla a la que pertenece el resultado n. Para compatibilidad con anteriores versiones: VASR_INDEX = VASR_INDEX0 VASR_RESULT = VASR_RESULT0 VASR_SCORE = VASR_SCORE0 VASR_UTTERANCE = VASR_UTTERANCE0 VASR_WEIGHT = VASR_WEIGHT0 VASR_RULE = VASR_RULE0 Si la deteccion de dtmf (opcion 'd') esta habilitada, podemos consultar su estado con las siguientes variables de canal: VDTMF_DETECTED :TRUE (se ha detectado un tono) o FALSE (no se ha detectado tono) VDTMF_RESULT :si VDTMF_DETECTED = TRUE, VDTMF_RESULT contiene el valor de la tecla pulsada -0,1,2,3,4,5,6,7,8,9,*,#...-. Se puede configurar el numero maximo de dtmf a detectar y el dtmf de terminacion, configurando (set) las siguientes variables del dialplan: VERBIO_DTMF_MAXLEN VERBIO_DTMF_TERMINATOR Nota: si la opcion 'keep_recorded_files' esta activada en 'verbio.conf', podemos consultar el nombre del fichero generado (una vez la aplicacion de reconocimiento ha terminado), mediante la siguiente variable del Dialplan: VASR_REC_FILE.

o VerbioStreamAndRec(audio_file[|initsil][|maxsil][|asr_conf][|asr_lang][|abs

_timeout][|options])

Descripcion: Lanza (al mismo tiempo) la reproduccion de un fichero de sonido y un reconocimiento. Esta aplicacion, igual que la anterior, nos permite realizar 'bargein'. Parametros: audio_file : fichero a reproducir. initsil : maxima duracion de silencio de inicio (unidades de 10ms) (opcional) maxsil : maxima duracion de silencio final (unidades de 10ms) (opcional) asr_conf : configuracion de reconocimiento (opcional). asr_lang : lenguaje (del reconocedor) a utilizar (opcional). abs_timeout : timeout absoluto de reconocimiento (segundos)(opcional) options : opciones.Las opciones disponibles son: - v (verbose) - a (descolgar el canal)

362

- b (beep antes de reconocer) - g (activar bargein. Permitir al usuario interrumpir a la maquina. Esta opción desactivara 'b'.) - i (interrumpir de manera inmediata el stream al detectar voz. Esta opción activara 'g'.) - d (habilitar la deteccion de dtmf) - n (no ejecutar colgado cuando se produzca un error referente a Verbio) Cuando usemos bargein, hay que tener mucho cuidado al seleccionar los parametros 'initsil', 'maxsil' y 'abs_timeout'. Si, por ejemplo, seleccionamos un 'initsil' o 'abs_timeout' demasiado pequeno, no le daremos suficiente tiempo de escucha al usuario, y nuestro fichero a reproducir se vera interrumpido. Si no indicamos un valor para 'initsil', 'maxsil' o 'abs_timeout', se utilizaran los valores indicados en el fichero de configuracion (verbio.conf). Para acceder al resultado del reconocimiento, podemos consultar (desde el dialplan de Asterisk)las siguientes variables de canal (una vez la aplicacion 'VerbioPromptAndRec' haya terminado): VASR_WORDS : Numero de palabras reconocidas (n). VASR_INDEXn : indice (dentro de la gramatica) de la palabra-n reconocida. VASR_RESULTn : Resultado-n del reconocimiento. VASR_SCOREn : Score-n (confianza) del reconocimiento. VASR_UTTERANCEn : Utterance el resultado n. VASR_WEIGHTn : Peso del resultado n dentro de la gramatica. VASR_RULEn : Regla a la que pertenece el resultado n. Para compatibilidad con anteriores versiones: VASR_INDEX = VASR_INDEX0 VASR_RESULT = VASR_RESULT0 VASR_SCORE = VASR_SCORE0 VASR_UTTERANCE = VASR_UTTERANCE0 VASR_WEIGHT = VASR_WEIGHT0 VASR_RULE = VASR_RULE0 Si la deteccion de dtmf (opcion 'd') esta habilitada, podemos consultar su estado con las siguientes variables de canal: VDTMF_DETECTED :TRUE (se ha detectado un tono) o FALSE (no se ha detectado tono) VDTMF_RESULT :si VDTMF_DETECTED = TRUE, VDTMF_RESULT contiene el valor de la tecla pulsada -0,1,2,3,4,5,6,7,8,9,*,#...-.

363

Se puede configurar el numero maximo de dtmf a detectar y el dtmf de terminacion, configurando (set) las siguientes variables del dialplan: - VERBIO_DTMF_MAXLEN - VERBIO_DTMF_TERMINATOR Nota: si la opcion 'keep_recorded_files' esta activada en 'verbio.conf', podemos consultar el nombre del fichero generado (una vez la aplicacion de reconocimiento ha terminado), mediante la siguiente variable del dialplan: VASR_REC_FILE.

o VerbioLastErr(var)

Descripcion: Esta aplicacion permite consultar el último mensaje de error referente a las funciones Verbio. Parametros: var: variable de canal donde guardaremos el mensaje de error. Las aplicaciones Verbio deberan ser ejecutadas con la opcion 'n' (para evitar,cuando se produzca un error por parte de las funciones de Verbio, el cuelgue de la llamada). Codigos de error:

EVX_NOERROR NO ERROR EVX_INVSETUP Vox ERROR (Files may be corrupted.Check disk and repeat Vox Setup) EVX_NOMEM OUT OF MEMORY. (Check memory leakages). EVX_VCBFILE THE VOCABULARY FILE NAME IS NOT VALID. (Check the vocabulary file name and path writing permission). EVX_INVWORD THE VOCABULARY CONTAINS AN INVALID WORD. (Check and correct invalid words). EVX_NOLICFILE NO LICENSE FILE WAS FOUND. (Use Setup and CheckOut to obtain the Vox directory structure and the license file). EVX_INVLIC THE LICENSE FILE IS NOT VALID. (Use CheckOut to obtain a valid license file). EVX_SYSTEM SYSTEM ERROR (Check errno). EVX_NOLIBINIT VOXLIB WAS NOT SUCCESSFULLY LOADED. (Call vox_libinit() before using any Vox function). EVX_NOLIC NO LICENSE EVX_NOSETVCB NO ACTIVE VOCABULARY. (Use vox_setvcb() to set the active vocabulary). EVX_NORECSTR NO RECOGNITION. (Use vox_recstr() to init recognition). EVX_NOLINE NO MORE LINES ARE AVAILABLE FOR THE SPECIFIED CHANNEL DEVICE EVX_BADPARM INVALID PARAMETER IN FUNCTION CALL

364

EVX_NOTIMP NOT IMPLEMENTED EVX_NORECIND NO RECIND OR NBEST. (Call vox_recind() before calling ATVOX_NIND()). EVX_INVFILE INVALID FILENAME EVX_NETWORK NETWORK ERROR EVX_DICFILE THE DICTIONARY FILE NAME IS NOT VALID EVX_PARSER ABNF PARSER ERROR EVX_INVVER THE VOXSERVER VERSION DOES NOT MATCH THE CLIENT VERSION EVX_UNKNOWN Unknown error

o VerbioInfo()

Descripcion: Esta aplicacion imprimira informacion diversa sobre la configuracion de Verbio (locutores instalados,configuraciones de reconocimiento instaladas, versiones, licencias, etc...). Esta aplicacion creara las siguientes variables de canal:

VTTS_SPEAKERS : locutores disponibles (formato:

'id1:name1:gender1:age1:lang1; id2:name2:gender2:age2:lang2;') VASR_CONFIGS : configuraciones de reconocimiento disponibles.

o VerbioFreeChannel()

Descripcion: Esta aplicacion liberara los recursos (licencias y memoria) del servidor Verbio para el canal actual. Esta aplicacion debera ser ejecutada SIEMPRE, antes de terminar una llamada que haga uso de las aplicaciones Verbio. Esta aplicacion es equivalente a ejecutar VerbioUnloadVcb con el parametro vcb_handle a -1.

365

Pruebas con Verbio

Prueba 1) En la prueba siguiente se utiliza Verbio para saber el número de incidencia

del llamante para que, por ejemplo en un horario no laboral, se compruebe este con

una base de datos con los diferentes códigos de incidencia y se le informe.

Lo primero que se hace es carga el diccionario, en este caso es el archivo david.txt cuyo

contenido es el siguiente:

0 cero 1 uno 2 dos 3 tres 4 cuatro 5 cinco 6 seis 7 siete 8 ocho 9 nueve SI si NO no

Despues se indica que al llamante que deletree el número de incidencia que tiene 4

dígitos, se comprueba que se ha dicho algo que este por encima de un umbral

determinado de acierto y se consulta con el llamante lo captado.Si este indica que es

correcto se le dice “Gracias” y lo siguiente sería revisar en la base de datos.

Al tratarse de una versión “no Premium” de Verbio, al finalizar la llamada bien sea

colganda por el Dialplan o por el llamante se debe descargar el diccionario y dejar libre

el canal, para esto se ha dejado la extensión 8091.

El código utilizado es el siguiente:

[verbio] include => acceso

exten => 8000,1,Answer() exten => 8000,n,Set(UMBRAL=90) exten => 8000,n,VerbioLoadVcb(david.txt,connected,,,v) exten => 8000,n,Goto(8090,1) exten => 8090,1,VerbioPromptAndRec(Indique el numero de incidencia para consultar su estado.Recuerde que tiene cuatro digitos.) exten => 8090,n,NoOp(“PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT0} ${VASR_RESULT1} ${VASR_RESULT2} ${VASR_RESULT3}. Score: ${VASR_SCORE} Umbral: ${UMBR$}”) exten => 8090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si:no) exten => 8090,n(si),VerbioPromptAndRec(Su numero de incidencia es: ${VASR_RESULT0} ${VASR_RESULT1} ${VASR_RESULT2} ${VASR_RESULT3}\, no?) exten => 8090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v)

366

exten => 8090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si2:no2) exten => 8090,n(si2),VerbioPrompt(Gracias.) exten => 8090,n,Hangup exten => 8090,n,VerbioFreeChannel() exten => 8090,n(no),VerbioPrompt(Repita por favor.) exten => 8090,n,Goto(8090,1) exten => 8090,n(no2),VerbioPrompt(Repita por favor.) exten => 8090,n,Goto(8090,1) exten => 8091,1,VerbioFreeChannel()

El resultado que se visualiza en el CLI de Asterisk tras llamar a la extensión 8000 es la

siguiente:

-- Executing [8000@acceso:1] Answer("SIP/2003-0a1926d0", "") in new stack -- Executing [8000@acceso:2] Set("SIP/2003-0a1926d0", "UMBRAL=90") in new stack -- Executing [8000@acceso:3] VerbioLoadVcb("SIP/2003-0a1926d0", "david.txt|connected|||v") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3774]: app_verbio_speech.c:4549 verbio_load_vcb: Verbose enabled in config file. NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3 NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3 NOTICE[3774]: app_verbio_speech.c:4597 verbio_load_vcb: -------------------------- NOTICE[3774]: app_verbio_speech.c:4598 verbio_load_vcb: VerbioLoadVcb param summary: NOTICE[3774]: app_verbio_speech.c:4599 verbio_load_vcb: Prim vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:4600 verbio_load_vcb: Bckp vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:4601 verbio_load_vcb: Gram path : /var/lib/asterisk/verbio/gram/david.txt NOTICE[3774]: app_verbio_speech.c:4602 verbio_load_vcb: ASR config : es_eu NOTICE[3774]: app_verbio_speech.c:4603 verbio_load_vcb: ASR lang : es NOTICE[3774]: app_verbio_speech.c:4607 verbio_load_vcb: Grammar type: CONNECTED NOTICE[3774]: app_verbio_speech.c:4615 verbio_load_vcb: Voxlib device: 3 NOTICE[3774]: app_verbio_speech.c:4616 verbio_load_vcb: -------------------------- == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3774]: app_verbio_speech.c:501 verbio_md5_grammar_exists: Grammar /var/lib/asterisk/verbio/gram/david.txt exists in cache (/var/lib/asterisk/verbio/gram/.cache/9488d95d905801b3ece8a8a7d4cdc88a). NOTICE[3774]: app_verbio_speech.c:4747 verbio_load_vcb: vc_handle 0 -- Executing [8000@acceso:4] Goto("SIP/2003-0a1926d0", "8090|1") in new stack -- Goto (acceso,8090,1) -- Executing [8090@acceso:1] VerbioPromptAndRec("SIP/2003-0a1926d0", "Indique el numero de incidencia para consultar su estado.Recuerde que tiene cuatro digitos.") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3774]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file. NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3 NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3 NOTICE[3774]: app_verbio_speech.c:2800 verbio_prompt_and_rec: -------------------------- NOTICE[3774]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param summary: NOTICE[3774]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es NOTICE[3774]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya

367

NOTICE[3774]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: Indique el numero de incidencia para consultar su estado.Recuerde que tiene cuatro digitos. NOTICE[3774]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300 NOTICE[3774]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20 NOTICE[3774]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu NOTICE[3774]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es NOTICE[3774]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300 NOTICE[3774]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200 NOTICE[3774]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30 NOTICE[3774]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file :/var/lib/asterisk/verbio/audio/verbio-rec-126259827-1262598275.3.alaw NOTICE[3774]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 3 NOTICE[3774]: app_verbio_speech.c:2844 verbio_prompt_and_rec: -------------------------- -- Executing [8090@acceso:2] NoOp("SIP/2003-0a1926d0", ""PALABRAS 4. Resultado: 1 1 1 1. Score: 95 Umbral: 90"|||v") in new stack -- Executing [8090@acceso:3] GotoIf("SIP/2003-0a1926d0", "1?si:no") in new stack -- Goto (acceso,8090,4) -- Executing [8090@acceso:4] VerbioPromptAndRec("SIP/2003-0a1926d0", "Su numero de incidencia es: 1 1 1 1, no?") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3774]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file. NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3 NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3 NOTICE[3774]: app_verbio_speech.c:2800 verbio_prompt_and_rec: -------------------------- NOTICE[3774]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param summary: NOTICE[3774]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es NOTICE[3774]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya NOTICE[3774]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: Su numero de incidencia es: 1 1 1 1, no? NOTICE[3774]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300 NOTICE[3774]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20 NOTICE[3774]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu NOTICE[3774]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es NOTICE[3774]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300 NOTICE[3774]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200 NOTICE[3774]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30 NOTICE[3774]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file :/var/lib/asterisk/verbio/audio/verbio-rec-126259828-1262598275.3.alaw NOTICE[3774]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 3 NOTICE[3774]: app_verbio_speech.c:2844 verbio_prompt_and_rec: -------------------------- -- Executing [8090@acceso:5] NoOp("SIP/2003-0a1926d0", ""PALABRAS 1. Resultado: 6. Score: 99 Umbral: 90"|||v") in new stack -- Executing [8090@acceso:6] GotoIf("SIP/2003-0a1926d0", "1?si2:no2") in new stack -- Goto (acceso,8090,7) -- Executing [8090@acceso:7] VerbioPrompt("SIP/2003-0a1926d0", "Gracias.") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3774]: app_verbio_speech.c:1298 verbio_prompt: Verbose enabled in config file. NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3 NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3 NOTICE[3774]: app_verbio_speech.c:1371 verbio_prompt: -------------------------- NOTICE[3774]: app_verbio_speech.c:1372 verbio_prompt: VerbioPrompt param summary: NOTICE[3774]: app_verbio_speech.c:1373 verbio_prompt: Prim vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:1374 verbio_prompt: Bckp vox srv : 127.0.0.1 NOTICE[3774]: app_verbio_speech.c:1375 verbio_prompt: TTS language : es

368

NOTICE[3774]: app_verbio_speech.c:1376 verbio_prompt: TTS speaker : amaya NOTICE[3774]: app_verbio_speech.c:1379 verbio_prompt: Text to synth: Gracias. NOTICE[3774]: app_verbio_speech.c:1380 verbio_prompt: Init delay : 300 NOTICE[3774]: app_verbio_speech.c:1381 verbio_prompt: End delay : 20 NOTICE[3774]: app_verbio_speech.c:1394 verbio_prompt: Voxlib device: 3 NOTICE[3774]: app_verbio_speech.c:1395 verbio_prompt: -------------------------- -- Executing [8090@acceso:8] Hangup("SIP/2003-0a1926d0", "") in new stack == Spawn extension (acceso, 8090, 8) exited non-zero on 'SIP/2003-0a1926d0'

Prueba 2) En la prueba siguiente se utiliza Verbio para saber el Dpto con el que desea

hablar el llamante para que, por ejemplo, se le redireccione directamente sin pasar por

Administración.

De nuevo lo primero que se realiza es cargar el diccionario, en este caso el archivo

datos.txt cuyo contenido es:

SOPORTE soporte ADMINISTRACION administracion COMERCIAL comercial TWISTER twister

A continuación se le dan las posibilidades a elegir al llamante y se comprueba que lo

dicho por este, es muy parecido a alguna palabra del diccionario dependiendo del

umbral establecido, si es así, tras cargar otro archivo con las palabras si y no se le

indica el resultado al llamante para que acepte o no si es el Dpto correcto. Despues de

esto se le redireccionaria al Dpto adecuado o se le haría repetir lo dicho.

El código utilizado en el ejemplo es el siguiente:

[verbio] include => acceso exten => 7000,1,Answer() exten => 7000,n,Set(UMBRAL=20) exten => 7000,n,VerbioLoadVcb(datos.txt,isolated,,,v) exten => 7000,n,Goto(7090,1) exten => 7090,1,VerbioPromptAndRec(Bienvenido a Yet Informatica \, de los siguientes departamentos indiquenos con cual desea hablar\, Soporte\, Administracio$ exten => 7090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v) exten => 7090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si:no) exten => 7090,n,VerbioFreeChannel() exten => 7090,n(si),VerbioLoadVcb(sino.txt,isolated,,,v) exten => 7090,n,Set(DPTO= ${VASR_RESULT}) exten => 7090,n,VerbioPromptAndRec(El departamento elegido es: ${VASR_RESULT} \, no?) exten => 7090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v) exten => 7090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si2:no2) exten => 7090,n(si2),NoOp(" Vamos a llamar: ${DPTO}") exten => 7090,n,GotoIf($[${DPTO} = SOPORTE ]?soporte:otro)

369

exten => 7090,n(soporte),Dial(SIP/2000,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(otro),GotoIf($[${DPTO} = TWISTER ]?twister:otro1) exten => 7090,n(twister),Dial(SIP/2003,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(otro1),GotoIf($[${DPTO} = COMERCIAL ]?comercial:otro2) exten => 7090,n(comercial),Dial(SIP/4000,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(otro2),Dial(SIP/5000,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(no),VerbioPrompt(Repita por favor.) exten => 7090,n,Goto(7090,1) exten => 7090,n(no2),VerbioPrompt(Repita por favor.) exten => 7090,n,Goto(7090,si)

El resultado visualizado en el CLI al llamar a la extensión 7000 es:

-- Executing [7000@acceso:1] Answer("SIP/2003-0a197d18", "") in new stack -- Executing [7000@acceso:2] Set("SIP/2003-0a197d18", "UMBRAL=20") in new stack -- Executing [7000@acceso:3] VerbioLoadVcb("SIP/2003-0a197d18", "datos.txt|isolated|||v") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3797]: app_verbio_speech.c:4549 verbio_load_vcb: Verbose enabled in config file. NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5 NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5 NOTICE[3797]: app_verbio_speech.c:4597 verbio_load_vcb: -------------------------- NOTICE[3797]: app_verbio_speech.c:4598 verbio_load_vcb: VerbioLoadVcb param summary: NOTICE[3797]: app_verbio_speech.c:4599 verbio_load_vcb: Prim vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:4600 verbio_load_vcb: Bckp vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:4601 verbio_load_vcb: Gram path : /var/lib/asterisk/verbio/gram/datos.txt NOTICE[3797]: app_verbio_speech.c:4602 verbio_load_vcb: ASR config : es_eu NOTICE[3797]: app_verbio_speech.c:4603 verbio_load_vcb: ASR lang : es NOTICE[3797]: app_verbio_speech.c:4605 verbio_load_vcb: Grammar type: ISOLATED NOTICE[3797]: app_verbio_speech.c:4615 verbio_load_vcb: Voxlib device: 5 NOTICE[3797]: app_verbio_speech.c:4616 verbio_load_vcb: -------------------------- == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3797]: app_verbio_speech.c:501 verbio_md5_grammar_exists: Grammar /var/lib/asterisk/verbio/gram/datos.txt exists in cache (/var/lib/asterisk/verbio/gram/.cache/893dfb11158fc1ad4aa7d5e09fc1605f). NOTICE[3797]: app_verbio_speech.c:4747 verbio_load_vcb: vc_handle 0 -- Executing [7000@acceso:4] Goto("SIP/2003-0a197d18", "7090|1") in new stack -- Goto (acceso,7090,1) -- Executing [7090@acceso:1] VerbioPromptAndRec("SIP/2003-0a197d18", "Bienvenido a Yet Informatica , de los siguientes departamentos indiquenos con cual desea hablar, Soporte, Administracion, Twister, Comercial.") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3797]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file. NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5 NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5 NOTICE[3797]: app_verbio_speech.c:2800 verbio_prompt_and_rec: --------------------------

370

NOTICE[3797]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param summary: NOTICE[3797]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es NOTICE[3797]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya NOTICE[3797]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: Bienvenido a Yet Informatica , de los siguientes departamentos indiquenos con cual desea hablar, Soporte, Administracion, Twister, Comercial. NOTICE[3797]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300 NOTICE[3797]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20 NOTICE[3797]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu NOTICE[3797]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es NOTICE[3797]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300 NOTICE[3797]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200 NOTICE[3797]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30 NOTICE[3797]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file :/var/lib/asterisk/verbio/audio/verbio-rec-126259839-1262598382.5.alaw NOTICE[3797]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 5 NOTICE[3797]: app_verbio_speech.c:2844 verbio_prompt_and_rec: -------------------------- -- Executing [7090@acceso:2] NoOp("SIP/2003-0a197d18", ""PALABRAS 1. Resultado: SOPORTE. Score: 58 Umbral: 20"|||v") in new stack -- Executing [7090@acceso:3] GotoIf("SIP/2003-0a197d18", "1?si:no") in new stack -- Goto (acceso,7090,5) -- Executing [7090@acceso:5] VerbioLoadVcb("SIP/2003-0a197d18", "sino.txt|isolated|||v") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3797]: app_verbio_speech.c:4549 verbio_load_vcb: Verbose enabled in config file. NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5 NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5 NOTICE[3797]: app_verbio_speech.c:4597 verbio_load_vcb: -------------------------- NOTICE[3797]: app_verbio_speech.c:4598 verbio_load_vcb: VerbioLoadVcb param summary: NOTICE[3797]: app_verbio_speech.c:4599 verbio_load_vcb: Prim vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:4600 verbio_load_vcb: Bckp vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:4601 verbio_load_vcb: Gram path : /var/lib/asterisk/verbio/gram/sino.txt NOTICE[3797]: app_verbio_speech.c:4602 verbio_load_vcb: ASR config : es_eu NOTICE[3797]: app_verbio_speech.c:4603 verbio_load_vcb: ASR lang : es NOTICE[3797]: app_verbio_speech.c:4605 verbio_load_vcb: Grammar type: ISOLATED NOTICE[3797]: app_verbio_speech.c:4615 verbio_load_vcb: Voxlib device: 5 NOTICE[3797]: app_verbio_speech.c:4616 verbio_load_vcb: -------------------------- == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3797]: app_verbio_speech.c:501 verbio_md5_grammar_exists: Grammar /var/lib/asterisk/verbio/gram/sino.txt exists in cache (/var/lib/asterisk/verbio/gram/.cache/6343121acb03e3e93cf7cbf7ff3b38ba). NOTICE[3797]: app_verbio_speech.c:4747 verbio_load_vcb: vc_handle 1 -- Executing [7090@acceso:6] Set("SIP/2003-0a197d18", "DPTO= SOPORTE") in new stack -- Executing [7090@acceso:7] VerbioPromptAndRec("SIP/2003-0a197d18", "El departamento elegido es: SOPORTE , no?") in new stack == Parsing '/etc/asterisk/verbio.conf': Found NOTICE[3797]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file. NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5 NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5 NOTICE[3797]: app_verbio_speech.c:2800 verbio_prompt_and_rec: -------------------------- NOTICE[3797]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param summary: NOTICE[3797]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1

371

NOTICE[3797]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1 NOTICE[3797]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es NOTICE[3797]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya NOTICE[3797]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: El departamento elegido es: SOPORTE , no? NOTICE[3797]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300 NOTICE[3797]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20 NOTICE[3797]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu NOTICE[3797]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es NOTICE[3797]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300 NOTICE[3797]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200 NOTICE[3797]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30 NOTICE[3797]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file :/var/lib/asterisk/verbio/audio/verbio-rec-126259841-1262598382.5.alaw NOTICE[3797]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 5 NOTICE[3797]: app_verbio_speech.c:2844 verbio_prompt_and_rec: -------------------------- -- Executing [7090@acceso:8] NoOp("SIP/2003-0a197d18", ""PALABRAS 1. Resultado: SI. Score: 93 Umbral: 20"|||v") in new stack -- Executing [7090@acceso:9] GotoIf("SIP/2003-0a197d18", "1?si2:no2") in new stack -- Goto (acceso,7090,10) -- Executing [7090@acceso:10] NoOp("SIP/2003-0a197d18", "" Vamos a llamar: SOPORTE"") in new stack -- Executing [7090@acceso:11] GotoIf("SIP/2003-0a197d18", "1?soporte:otro") in new stack -- Goto (acceso,7090,12) -- Executing [7090@acceso:12] Dial("SIP/2003-0a197d18", "SIP/2000|30|Ttm") in new stack -- Called 2000 -- Started music on hold, class 'default', on SIP/2003-0a197d18 -- SIP/2000-0a1926d0 is circuit-busy == Everyone is busy/congested at this time (1:0/1/0) -- Stopped music on hold on SIP/2003-0a197d18 -- Executing [7090@acceso:13] Hangup("SIP/2003-0a197d18", "") in new stack == Spawn extension (acceso, 7090, 13) exited non-zero on 'SIP/2003-0a197d18'

372

Skype

¿Qué es Skype? Es el más conocido de los SoftPhones y quizás un responsable importante de la popularización de la VozIP. Creado por los fundadores de Kazaa: Zennström y Friis. Según su página web www.skype.com ha sido descargado 236.259.232 veces. Skype fue comprado por la firma de subastas por Internet EBay por 2.100 millones de dolares. Las comunicaciones de Voz viajan cifradas por la red y utiliza un protocolo propietario. Ventajas

• Disponible para muchas plataformas: Windows, Mac OSX, GNU Linux.

• Codificación de audio con mucha calidad y gran compresión: 3-16 kbytes/seg.

• Conferencias de llamadas. Envío de Video (V2.x).

• Firewall / Nat discover: En casi todas las situaciones funciona sin necesidad de configurar PNAT.

Problemas: Protocolo cerrado

• ¿Qué están haciendo con mis paquetes de voz?

Los creadores de la Red Kazaa están bajo sospecha de distribuir spyware de forma intencionada.

• ¿Qué están haciendo con mi ancho de banda?

Utilizarlo para otros clientes de Skype.

• No es posible programar nuevos clientes a medida.

• Interconexión con otras redes: el salto a la red telefónica pública solo puede realizarse con el sistema SkypeOut, lo cual no favorece la competencia.

• Integración profesional: No existen centralitas (exceptuando Asterisk) que soporten el protocolo de Skype, tampoco teléfonos puros (USB sí).

Alternativas a Skype

• Gizmo Project (http://www.gizmoproject.com/

– Multiplataforma.– Interconexión con Asterisk.– Protocolo SIP.

• Open Wengo (http://www.openwengo.org/

– #include gizmo.h– Posibilidad de usarlo

• Servidor Asterisk:

– Extensiones SIP o – Varios proveedores IP.– Conexión con la PSTN.

Skype para Asterisk (SfA)

Como tanto los drivers como la estructura de Asterisk son libres (cómo es por dentro el comportamiento de los módulos que dan soporte al hardware para hacerlo compatible con Asteriskotras tarjetas para aprovechar el tirón de esta aplicación, por lo que Digium continúa pensando nuevas formas de conseguir beneficios. Una de estas formas es compatibilizando una aplicación conocida y muy utili

No obstante, lo que Skype (del concepto ‘VoIP‘) representa, provoca que muchas personas de Asterisk no vean este producto con buenos ojos.sido que Digium empleara recursos en crear un canal para Skype en lugar de mejorar el canal SIP. Quizá desde el punto de vista de la comunidad sea esta acción algo reprochable, aunque desde epensaba en un principio), ha sido todo un éxito.

http://www.gizmoproject.com/):

Multiplataforma. Interconexión con Asterisk. Protocolo SIP.

http://www.openwengo.org/):

#include gizmo.h Posibilidad de usarlo solo como softphone.

Extensiones SIP o IAX2. Varios proveedores IP. Conexión con la PSTN.

Digium en Septiembre de 2009 sacó un modulo de Skype para Asterisky es que este “controvertidomódulo dio y está dando bastante de qué hablar, tanto a favor como en contra entre los seguidores y usuarios de Asterisk.

Como tanto los drivers como la estructura de Asterisk son libres (cualquiera puede ver cómo es por dentro el comportamiento de los módulos que dan soporte al hardware para hacerlo compatible con Asterisk), muchas otras empresas cuando surgió crearon otras tarjetas para aprovechar el tirón de esta aplicación, por lo que Digium continúa pensando nuevas formas de conseguir beneficios. Una de estas formas es compatibilizando una aplicación conocida y muy utilizada como es Skype

No obstante, lo que Skype (como protocolo cerrado y como empresa monopolizadora ) representa, provoca que muchas personas de la comunidad

este producto con buenos ojos. Quizá lo que menos ha gustado ha sido que Digium empleara recursos en crear un canal para Skype en lugar de mejorar el canal SIP. Quizá desde el punto de vista de la comunidad sea esta acción algo reprochable, aunque desde el punto de vista empresarial (y al contrario de lo que

), ha sido todo un éxito.

373

Digium en Septiembre de 2009 sacó Skype para Asterisk, controvertido”

módulo dio y está dando bastante de qué hablar, tanto a favor como

contra entre los seguidores y usuarios de Asterisk.

cualquiera puede ver cómo es por dentro el comportamiento de los módulos que dan soporte al hardware

, muchas otras empresas cuando surgió crearon otras tarjetas para aprovechar el tirón de esta aplicación, por lo que Digium continúa pensando nuevas formas de conseguir beneficios. Una de estas formas es

Skype, con Asterisk.

como protocolo cerrado y como empresa monopolizadora la comunidad

Quizá lo que menos ha gustado ha sido que Digium empleara recursos en crear un canal para Skype en lugar de mejorar el canal SIP. Quizá desde el punto de vista de la comunidad sea esta acción algo

y al contrario de lo que

374

Skype es un buen SoftPhone, utiliza un protocolo propio, pero no hay duda que su sencillez de configuración y la forma de “saltarse” los problemas de NAT lo hacen un candidato excelente para aquellas extensiones tanto locales como externas a la vez que aporta características de mensajería instantánea (chat, compartición de archivos, etc.) algo que también existe en otros SoftPhones compatibles con SIP, pero que al requerir introducir determinados valores (códecs a utilizar, servidor SIP, dominio, tipo de NAT, etc.) lo hace una aplicación “difícil” y “anti-intuitiva” para muchas personas.

En todo buen proyecto existen dos formas de ver el desarrollo y la evolución de este:

- Cómo proyecto de software libre: donde todo lo que se desarrolle debe ser libre y gratis (algo únicamente libre no causa buena impresión).

- Cómo proyecto empresarial: donde la obtención de un beneficio económico es el principal objetivo.

Ambas visiones son irreconciliables: o se desarrolla algo pensando en la comunidad (donde otras empresas sacarán tajada tanto como puedan mientras tú te centras en desarrollar el producto que luego ofrecerás) o creas un producto cerrado (donde tú seas el único que saques provecho del tiempo invertido).

Son muchas las voces que defienden un modelo de desarrollo basado en software libre basado en la venta de servicios (soporte, documentación, formación, etc.) pero muchas de estas voces son las que defienden el “soporte gratuito” mediante foros y listas, “aprender por cuenta propia” con lo que se encuentra por Internet, y ahorrar hasta el último céntimo si otro servicio similar puede salir más barato que un servicio confiable. Es decir… lo gratuito, o si no lo hay, lo más económico. Por desgracia, el concepto de “Software libre” sigue siendo el de “Software gratis” y con esta mentalidad, se termina dando la razón a las empresas de software comercial.

Skype para Asterisk (SFA) es el primer y único controlador de canal nativo que conecta Asterisk a la red de Skype. El controlador de canal soporta un número ilimitado de usuarios simultáneos y un número ilimitado de llamadas simultáneas por usuario.

SFA es un producto que ofrecerá una solución a muchas empresas que utilizan Skype y a las que no les interesa cambiar de SoftPhone porque su personal ya conoce esta aplicación y lo usan en su casa “como Windows“. Uno puede estar más o menos de acuerdo con que Digium se haya metido a desarrollar esta solución en lugar de mejorar los protocolos IAX2 y SIP, pero mejorar esto no da de comer y crear un canal para Skype, sí.

El canal Skype cuesta 66$ e incluye las licencias G.729 para poder utilizarlo.

Ventajas:

- Llamadas salientes: llama más, por más tiempo y paga menos.

• Llama a usuarios de Skype directamente desde una centralita Asterisk.

375

• Reduce los gastos en comunicaciones a teléfonos fijos y móviles de todo el mundo gracias a las tarifas económicas para llamadas de Skype.

• Skype para Asterisk complementa tu sistema de comunicación actual. • Añade Skype a tus tablas de enrutamiento de llamadas para optimizar

los gastos de llamadas internacionales.

- Llamadas entrantes: integra tu empresa a la comunidad de Skype.

Clientes

• Con botones para hacer clic y llamar, los clientes pueden comunicarse contigo directamente desde tu sitio o correo electrónico.

• Los clientes pueden llamar gratis a tu empresa desde Skype. • Función de volver a llamar al cliente a través de Skype. • Permite que los clientes te llamen a través de un número de Internet

local. • Tu empresa estará presente en una comunidad de más de 440 millones

de usuarios registrados de Skype.

Empleados que trabajan a distancia y personas que lo hacen desde el hogar

• Llamadas gratis de Skype a la oficina mientras viajas. • Para quienes trabajan desde el hogar, la actividad empresarial no

cambia, ya que la oficina está a un solo clic. • El estado de conexión de Skype permite trabajar de manera más

inteligente, traspasa zonas horarias y posibilita el trabajo a distancia.

Proveedores y socios

• Se visible y accesible internacionalmente para la comunidad de Skype y para socios potenciales.

• Mejora tus relaciones comerciales a larga distancia con llamadas entrantes gratis.

No se necesita PC

Aprovecha las llamadas a tarifas formidables sin necesidad de usar un equipo de PC.

Facil integración

Implementa Skype para Asterisk fácilmente dentro de tu infraestructura actual.

376

Inconvenientes

- Las versiones de Asterisk 1.4 anteriores a 1.4.25 tienen un error que hace que Skype no funcione correctamente. No utilice dichas versiones con SFA. La versión de nuestro servidor es 1.4.26.2 lo que nos permite usarlo sin problemas, no obstante las versiones más estables de la rama 1.4 están por debajo de la 1.4.25.

- Sólo los usuarios de Skype que se crean en Skype Business Control Panel (http://skype.com/business/) se pueden utilizar con Skype para Asterisk. La cuenta utilizada para administrar el BCP y los miembros que se han añadido a través de invitaciones a los nombres de Skype o dirección de correo electrónico no se podrán utilizar con Skype para Asterisk por el momento.

Lo que puedes hacer con Skype para Asterisk

Cuando complementas tu centralita Asterisk con Skype puedes hacer lo siguiente:

• Hacer llamadas entre usuarios de Skype a teléfonos fijos y móviles. • Recibir llamadas de Skype. • Habilitar llamadas múltiples y simultáneas de Skype desde la misma cuenta de

Skype. • Transferir llamadas de Skype. • Usar asistencia para DTMF (multifrecuencia bitonal) para llamadas salientes y

entrantes. • Leer los campos del perfil de usuario de Skype de llamadas entrantes. • Recuperar el saldo del crédito de Skype de cuentas que iniciaron sesión en

Asterisk. • Establecer y recuperar el estado de conexión. • Establecer la configuración de privacidad. • Usar los códecs G.711 y G.729.

Instalación

1. Adquirir la licencia del canal Skype. 2. Descarga de paquetes necesarios:

http://downloads.digium.com/pub/telephony/skypeforasterisk/asterisk-1.4/x86- 32/skypeforasterisk-1.4_1.0.6-x86_32.tar.gz http://downloads.digium.com/pub/register/x86-32/register

3. Instalar el chan_skype en Asterisk para ello descomprimiremos el paquete

tar.gz: tar xvzf skypeforasterisk-1.4_1.0.6-x86_32.tar.gz cd skypeforasterisk-1.4_1.0.6-x86_3 make && make install && make samples

377

4. Dar permisos de ejecución a la aplicación register y ejecutarla: chmod a+x register ./register

[root@localhost skypeasterisk]# ./register Digium Product Registration - Version 3.0.4 Copyright (C) 2004-2007, Digium, Inc. Use the '-l' option to see license information for software included in this program. Please select a category 1 - Digium Products 2 - Cepstral Products 0 - Quit Your Choice: 1 You selected 1, Digium Products Please select a product 1 - Asterisk Business Edition 2 - Asterisk Business Edition C Expansion 3 - Asterisk For Smart Cube 4 - Asterisk For Smart Cube Expansion 5 - G.729 Codec 6 - High Performance Echo Can 7 - Skype For Asterisk 8 - Fax for Asterisk 9 - Free Fax for Asterisk 10 - Vestec Speech Engine 0 - Quit Your Choice: 7 You selected 7, Skype For Asterisk Please enter your Key-ID: S4A-YE76MXLEJW7W Product available to be registered. Do you want to register this key now(y/n) y

5. Con esto ya tendremos instalado Skype para Asterisk en Asterisk 1.4.26.2 y

sólo nos faltará cargar los dos módulos:

- res_skypeforasterisk.so Este módulo contiene el motor de Skype, junto con varias librerias y otros componentes necesarios para hablar con el motor de Skype y administrar cuentas de usuario, las llamadas, etc. - chan_skype.so

378

Este módulo es el controlador del canal Asterisk que ofrece los servicios de llamadas desde y hacia la red de Skype, utilizando laqs librerías proporcionadas por res_skypeforasterisk.so.

Si su archivo modules.conf Asterisk contiene 'autoload=yes', estos módulos serán cargados automáticamente la próxima vez que se reinicie Asterisk. Si no, tendrá que añadir las siguientes líneas a modules.conf: load = res_skypeforasterisk.so load = chan_skype.so

Cargamos los módulos:

*CLI> module load res_skypeforasterisk.so Loading Skype For Asterisk engine NOTICE[4957]: res_skypeforasterisk.c:17 load_module: Skype For Asterisk module, Copyright (C) 2008-2009 Digium, Inc. NOTICE[4957]: res_skypeforasterisk.c:18 load_module: This module is supplied under a commercial license granted by Digium, Inc. NOTICE[4957]: res_skypeforasterisk.c:19 load_module: Please see the full license text supplied by the accompanying NOTICE[4957]: res_skypeforasterisk.c:20 load_module: "register" utility, or ask for a copy from Digium. NOTICE[4957]: res_skypeforasterisk.c:23 load_module: This product includes software developed by the OpenSSL Project NOTICE[4957]: res_skypeforasterisk.c:24 load_module: for use in the OpenSSL Toolkit. (http://www.openssl.org/) NOTICE[4957]: res_skypeforasterisk.c:25 load_module: Copyright (C) 1998-2008 The OpenSSL Project Loaded res_skypeforasterisk.so => (Skype For Asterisk Engine)

*CLI> module load chan_skype.so

== Parsing '/etc/asterisk/chan_skype.conf': Found DEBUG[4957]: core.cpp:1285 sfa_startup: License directory set to: /var/lib/asterisk/licenses NOTICE[4957]: core.cpp:1122 skype_cp_handler: Found license 'S4A-YE76MXLEJW7W' providing 1 concurrent calls NOTICE[4957]: core.cpp:963 display_host: Skype For Asterisk Host-ID: 6c:cf:7a:1b:1a:f0:29:43:11:2d:06:8c:d9:65:76:4b:81:50:f3:ed NOTICE[4957]: core.cpp:1299 sfa_startup: Found a total of 1 Skype For Asterisk licenses DEBUG[4989]: core.cpp:1403 sfa_startup: starting skyhost as: skypeforasterisk -z -f /var/spool/asterisk/skype/data DEBUG[4989]: core.cpp:1405 sfa_startup: [Jan 11 13:37:51] DEBUG[4988]: core.cpp:1491 sfa_startup: skyhost environment is : HOME=/var/spool/asterisk/skype starting skypewatcher as: skypewatcher 4989 DEBUG[4987]: core.cpp:440 skyhost_watcher: got SkyHost Copyright (C) 2003-2008 Skype Technologies S.A. DEBUG[4987]: core.cpp:440 skyhost_watcher: got Proprietary and confidential, do not share this application. DEBUG[4987]: core.cpp:440 skyhost_watcher: got Ready to accept connections DEBUG[4987]: core.cpp:445 skyhost_watcher: skyhost is ready! == Registered channel type 'Skype' (Skype For Asterisk Channel Driver) == Manager registered action SkypeBuddies

379

== Manager registered action SkypeBuddy == Manager registered action SkypeAccountProperty == Manager registered action SkypeAddBuddy == Manager registered action SkypeRemoveBuddy == Manager registered action SkypeLicenseStatus == Manager registered action SkypeLicenseList == Registered custom function SKYPE_CALL_PROPERTY == Registered custom function SKYPE_ACCOUNT_PROPERTY == Registered custom function SKYPE_BUDDIES == Registered custom function SKYPE_BUDDY_FETCH Loaded chan_skype.so => (Skype For Asterisk Channel Driver)

6. Configurar la cuenta de Skype.

Skype necesita que los usuarios que vayan a hacer uso de Skype para Asterisk ,

esten dados de alta en una cuenta Skype Business.

Por lo que tendréis que hacer login en https://secure.skype.com/business/

info/login con vuestra cuenta actual de Skype o bien si queréis dar de alta otra

podéis darla en ese mismo momento usando el cliente de Skype.

A continuación pulsamos el botón de agregar persona:

380

Creamos una cuenta comercial:

7. Probamos la correcta instalación del chan_skype:

Comprobamos la versión de SFA: *CLI> skype show version Skype For Asterisk Components: Channel Driver: 1.4_1.0.6 Library: 1.4_1.0.6

Comprobamos la configuración general: *CLI> skype show settings Skype For Asterisk Settings: engine_directory: /tmp data_directory: /var/spool/asterisk/skype defaultuser: bind_address: 0.0.0.0 bind_port: 0 rtp_address: 127.0.0.1 https_proxy: https_proxy_user: https_proxy_password: socks5_proxy: socks5_proxy_user: socks5_proxy_password: disable_tcpauto: no disable_udp: no

381

debug: no

Comprobamos si hemos activado la licencia correctamente: *CLI> skype show licenses Skype For Asterisk Licensing Information ======================================== Total licensed channels: 1 Licenses Found:

File: S4A-YE76MXLEJW7W.lic -- Key: S4A-YE76MXLEJW7W -- Expires: 2030-01-11 -- Host-ID: 6c:cf:7a:1b:1a:f0:29:43:11:2d:06:8c:d9:65:76:4b:81:50:f3:ed -- Channels: 1 (OK)

8. Configuramos el fichero chan_skype.conf situado en /etc/asterisk/:

[general] engine_directory=/usr/src/skypeengine default_user=davidea11 debug=yes bind_address=0.0.0.0 bind_port=0 [davidea11] secret=pkxarc11 context=incoming exten=7000 disallow=all allow=ulaw direction=both auth_policy=accept

Comprobamos tras reiniciar Asterisk que se han configurado bien los usuarios:

*CLI> skype show users Skype Users davidea11: Logged In

Para acceder a Asterisk desde cualquier cuenta Skype comunicaremos la cuenta de Skype con la que se ha creado en Skype Business de forma que las llamadas serán gratuitas. Para hacer las pruebas con SFA creamos una cuenta de Skype: davidin99. Configuramos el Dialplan de Asterisk (extensions.conf) para recibir las llamadas en el teléfono de extensión 3000 y hacer llamadas a la cuenta de Skype creada:

[skype] include => acceso exten => 7000,1,Goto(acceso,3000,1) exten => 8000,1,Dial(Skype/davidin99,30,tT)

382

Hacemos una llamada desde la extensión 5000 a la cuenta de Skype davidin99:

El log del CLI muestra lo siguiente:

-- Executing [8000@acceso:1] Dial("SIP/5000-09936608", "Skype/davidin99|30|tT") in new stack DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 NOTICE[29792]: core.cpp:2096 sfa_call_ring: calling create_control_socket for oid 32

DEBUG[29792]: core.cpp:265 create_control_socket: creating socket sfa-control-0x96a0f78- 00000020

DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds -- Called davidin99 DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:790 queue_event: got control event type 4 with subclass 3. DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds -- Skype/davidea11-098e0218 is ringing DEBUG[29792]: core.cpp:1642 sfa_call_process: accepting socket connection from voice engine DEBUG[29792]: core.cpp:1615 process_ve_frame: received audio socket address 127.0.0.1:38065 DEBUG[29792]: core.cpp:1752 sfa_call_set_audio_socket_address: sending audio socket address 127.0.0.1:14568 DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1

DEBUG[26468]: chan_skype.c:790 queue_event: got control event type 4 with subclass 4. DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds -- Skype/davidea11-098e0218 answered SIP/5000-09936608 DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[29792]: chan_skype.c:3433 unlink_client_call: channel 0x98e0218 NOTICE[29792]: core.cpp:2126 sfa_call_hangup: ending call DEBUG[29792]: chan_skype.c:3447 destroy_client_call: channel 0x98e0218 == Spawn extension (acceso, 8000, 1) exited non-zero on 'SIP/5000-09936608' DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: ACallMember.cpp:209 OnDelete: call member deleted DEBUG[26468]: ACall.cpp:71 OnDelete: call deleted DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds

383

En la cuenta de Skype se ve asi:

Llamamos desde la cuenta de Skype davidin99 a la cuenta creada en Skype Business davidea11 registrada en SFA: El log del CLI de Asterisk muestra:

-- Executing [7000@incoming:1] Goto("Skype/davidea11-b7d7e3c8", "acceso|3000|1") in new stack -- Goto (acceso,3000,1) -- Executing [3000@acceso:1] Macro("Skype/davidea11-b7d7e3c8", "acceso|3000") in new stack -- Executing [s@macro-acceso:1] Dial("Skype/davidea11-b7d7e3c8", "SIP/3000|30|Ttm") in new stack -- Called 3000 -- Started music on hold, class 'default', on Skype/davidea11-b7d7e3c8 -- SIP/3000-098ee660 is ringing -- SIP/3000-098ee660 answered Skype/davidea11-b7d7e3c8 -- Stopped music on hold on Skype/davidea11-b7d7e3c8 DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[28850]: core.cpp:1642 sfa_call_process: accepting socket connection from voice engine DEBUG[28850]: core.cpp:1615 process_ve_frame: received audio socket address 127.0.0.1:57238 DEBUG[28850]: core.cpp:1752 sfa_call_set_audio_socket_address: sending audio socket address 127.0.0.1:14690 DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds

384

DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:790 queue_event: got control event type 4 with subclass 4. DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds == Spawn extension (macro-acceso, s, 1) exited non-zero on 'Skype/davidea11-b7d7e3c8' in macro 'acceso' == Spawn extension (acceso, 3000, 1) exited non-zero on 'Skype/davidea11-b7d7e3c8' DEBUG[28850]: chan_skype.c:3433 unlink_client_call: channel 0xb7d7e3c8 NOTICE[28850]: core.cpp:2126 sfa_call_hangup: ending call DEBUG[28850]: chan_skype.c:3447 destroy_client_call: channel 0xb7d7e3c8 DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1 DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds

385

Nagios

¿Qué es Nagios?

Nagios es un software de monitorización de redes. Con Nagios podremos saber en cada momento, que máquinas y dispositivos de la red están encendidas, cuales están apagadas, cuales están fallando, cuales funcionan correctamente, que servicios van bien y cuáles van mal, en definitiva, sirve para mirar el estado casi en tiempo real de una red, sea grande o pequeña.

Originalmente se llamaba Netsaint, fue creado y es mantenido actualmente por Ethan Galstad, junto con un grupo de desarrolladores de Software que mantienen también varios plugins.

Nagios fue diseñado para ser ejecutado en Linux, pero también se ejecuta bien en variantes de Unix.

Nagios está licenciada bajo la GNU (General Public License Version 2 ) publicada por la Free Software Fundation.

¿Qué podemos realizar con Nagios?

- Monitoreo de servicios de red (SMTP, POP3, HTTP, NTTP, ICMP, SNMP). - Monitoreo de los recursos de un host (carga del procesador, uso de los

discos, logs del sistema) en varios sistemas operativos, incluso Microsoft Windows con el plugin NRPE_NT.

- Monitoreo remoto, a través de túneles SSL cifrados o SSH. - Diseño simple de plugins, que permiten a los usuarios desarrollar sus

propios chequeos de servicios dependiendo de sus necesidades, usando sus herramientas preferidas (Bash, C++, Perl, Ruby, Python, PHP, C#, etc.).

- Chequeo de servicios paralizados. - Posibilidad de definir la jerarquía de la red, permitiendo distinguir entre

host caídos y host inaccesibles. - Notificaciones a los contactos cuando ocurren problemas en servicios o

hosts, así como cuando son resueltos (via email, pager, SMS, o cualquier método definido por el usuario junto con su correspondiente plugin).

- Posibilidad de definir manejadores de eventos que ejecuten al ocurrir un evento de un servicio o host para resoluciones de problemas proactivas.

- Rotación automática del archive de log. - Soporte para implementar host de monitores redundantes. - Interfaz web opcional, para observar el estado de la red actual,

notificaciones, historial de problemas, archivos de logs, etc.

386

Descarga de Nagios

http://sourceforge.net/projects/nagios/files/nagios-3.x/nagios-3.2.0/nagios-3.2.0.tar.gz/download

http://sourceforge.net/projects/nagiosplug/files/nagiosplug/1.4.14/nagios-plugins-1.4.14.tar.gz/download

http://sourceforge.net/projects/nagios/files/nrpe-2.x/nrpe-2.12/nrpe-2.12.tar.gz/download

http://sourceforge.net/projects/nagios/files/nsca-2.x/nsca-2.7.2/nsca-2.7.2.tar.gz/download

http://sourceforge.net/projects/nagios/files/ndoutils-1.x/ndoutils-1.4b9/ndoutils-1.4b9.tar.gz/download

Instalación de Nagios

Descomprimimos el tar:

tar xvf nagios.3.2.0.tar.gz

Creamos los usuarios y grupos para Nagios:

useradd nagios groupadd nagios groupadd nagcmd

Nos ubicamos dentro de la carpeta Nagios, y procedemos a compilarlo:

./configure --with-command-group=nagcmd make all make install make-webconf make install-init (no necesario) make install-config (no necesario) make install-commandmode (no necesario)

Ahora vamos a compilar los plugins para Nagios (descomprirlo dentro de la carpeta donde se encuentra Nagios): ./configure --with-nagios-user=nagios --with-nagios-group=nagios make make install

Ahora agregaremos el usuario nagios para la autenticación vía web:

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Reiniciamos servicios e iniciamos otros:

service httpd restart service nagios start

387

Accedemos a Nagios:

http://localhost/nagios

Configuración de Nagios

Configurando nagios.cfg

Por defecto no hace falta tocar este fichero, tal y como viene de "serie" funciona perfectamente. Posteriormente, deberás cambiar cosas si quieres aprovechar al máximo el poder de Nagios.

Deberemos asegurarnos de tener bien configurados las líneas referentes a los ficheros principales de configuración:

# LOG FILE log_file=/usr/local/nagios/var/nagios.log # OBJECT CONFIGURATION FILE(S) cfg_file=/usr/local/nagios/etc/objects/commands.cfg cfg_file=/usr/local/nagios/etc/objects/contacts.cfg cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg cfg_file=/usr/local/nagios/etc/objects/templates.cfg .....

Configurando cgi.cfg

Configuramos las siguientes líneas para que "nagiosadmin" tenga acceso total a Nagios. No queremos que nadie más tenga acceso a él.

# MAIN CONFIGURATION FILE main_config_file=/usr/local/nagios/etc/nagios.cfg # PHYSICAL HTML PATH physical_html_path=/usr/local/nagios/share # URL HTML PATH url_html_path=/nagios # SYSTEM/PROCESS INFORMATION ACCESS authorized_for_system_information=nagiosadmin # CONFIGURATION INFORMATION ACCESS authorized_for_configuration_information=nagiosadmin # SYSTEM/PROCESS COMMAND ACCESS authorized_for_system_commands=nagiosadmin # GLOBAL HOST/SERVICE VIEW ACCESS authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin

388

# GLOBAL HOST/SERVICE COMMAND ACCESS authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin ......

Configurando localhost.cfg

En el fichero hosts.cfg deberemos incluir todas las máquinas que queremos monitorizar. Cada máquina debe tener al menos un servicio.Puede funcionar también sin configurarle ningún servicio, pero no obtendríamos un resultado "profesional", lo único que haríamos sería añadir la maquina o dispositivo al MAPA de RED.

define host{ use linux-server ; Name of host template to use ; This host definition will inherit all variables that are defined ; in (or inherited by) the linux-server host template definition. host_name localhost alias localhost address 127.0.0.1 }

Cada host, debe pertenecer a un hostgroups.

define hostgroup{ hostgroup_name linux-servers ; The name of the hostgroup alias Linux Servers ; Long name of the group members localhost ; Comma separated list of hosts that belong to this group }

Más adelante veremos como se configuran los servicios de monitorización de Asterisk.

Configurando contacts.cfg

Los contactos, son las personas a las que se les notificará de las posibles incidencias de las máquinas de la Red. En nuestro caso, como solo somos un único administrador, nagios y se le notificará mediante un e-mail.

define contact{ contact_name nagiosadmin use generic-contact alias David email [email protected] }

Cada contacto, debe pertenecer a un grupo de contacto.

define contactgroup{ contactgroup_name admins alias Nagios Administrators members nagiosadmin }

389

Configurando commands.cfg

Este es posiblemente el fichero de configuración más importante, ya que en él, vamos a definir absolutamente todos los servicios que queremos monitorizar.En nuestro caso sólo serán servicios de Asterisk, más adelante veremos dicha configuración.

Verificando la configuración

Una vez configurados todos los ficheros de Nagios, hay que verificar la configuración:

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios/nagios.cfg

Si todo sale bien, deberemos obtener un total de CERO errores. Puede que tengamos algún warning, pero funcionará .

Arrancamos el demonio

# service nagios restart

Configuración para entrar a Nagios via Web:

ln -s /usr/share/nagios/htdocs/ /var/www/nagios/

Monitorizando Asterisk

Lo que nos interesa conseguir con la monitorización de Asterisk con Nagios es lo siguiente:

� Saber si Asterisk esta arrancado o no

� Estado de la tarjeta

� Estado del proveedor IP Gizmo 5

� Estado del Chan_sebi

� Estado del Chan_skype

� Comprobar si hay usuarios SIP registrados

� Comprobar si hay usuarios IAX registrados

La configuración para conseguir esto será la configuración de cada comando, de cada servicio y de los scripts Perl que obtendrán la información a través de comandos CLI. Como ejemplo la configuración de la obtención del estado del chan_skype es la siguiente: commands.cfg

define command{ command_name check_asterisk_skype command_line /usr/src/SCRIPTS/skype.pl }

390

localhost.cfg

define service{ use local-service host_name localhost service_description Chan_skype check_command check_asterisk_skype }

skype.pl

#!/usr/bin/perl -w use Getopt::Std; use strict; my $asterisk_bin="/usr/bin/sudo /usr/sbin/asterisk"; my $asterisk_option="-rx"; my $asterisk_skype="skype show version"; my $return; my $cmd = qq($asterisk_bin $asterisk_option "$asterisk_skype" ); foreach (`($cmd)`) { if (/Skype\ For\ Asterisk/) { $return = 0; } } if($return==0){ print(" Chan_skype activado. \n"); exit($return); } else{ print(" Chan_skype desconectado. \n "); exit(1); }

Tras la configuración en la interfaz de Nagios podemos ver lo siguiente: Despues de configurar el archivo contacts.cfg:

391

Despues de configurar el archivo contactgroups.cfg: Despues de configurar los archivos localhost.cfg y commands.cfg:

Teniendo Asterisk en marcha y sin conectar el chan_sebi veremos esto:

Si Asterisk no está arrancado lo que veremos será:

392

393

Actualización de firmware del Teléfono Cisco 7941 de SCCP a SIP

Tenemos un Teléfono Cisco 7941 de la centralita actual, uno de los requisitos para la implantación de una centralita nueva, en este caso Asterisk, es el aprovechamiento de Hardware. Teniendo en cuenta el coste de los teléfonos Cisco por la serie de funcionalidades que traen el traspaso del protocolo Skynny Client Control Protocol (SCCP) al SIP es lo más adecuado para poder usarlos.

Para hacer este cambio de protocolo hay que tener en cuenta la configuración del teléfono que se centra en un fichero XML llamado SEP<MAC-del-Teléfono>.conf.xml. De este fichero se realizará el registro con la centralita por eso es importante. El contenido en nuestro caso es el siguiente: <device xsi:type="axl:XIPPhone" ctiid="1566023366"> <deviceProtocol>SIP</deviceProtocol> <sshUserId>5000</sshUserId> <sshPassword>1234</sshPassword> <devicePool> <dateTimeSetting>

<dateTemplate>D/M/Y</dateTemplate> <timeZone>W. Europe Standard/Daylight Time</timeZone> <ntps> <ntp>

<name>192.168.1.200</name> <ntpMode>Unicast</ntpMode> </ntp> </ntps> </dateTimeSetting>

<callManagerGroup> <members> <member priority="0"> <callManager> <ports> <ethernetPhonePort>2000</ethernetPhonePort> <sipPort>5060</sipPort> <securedSipPort>5061</securedSipPort> </ports> <processNodeName>192.168.1.200</processNodeName> </callManager> </member> </members>

394

</callManagerGroup> </devicePool> <commonProfile>

<phonePassword>1234</phonePassword> <backgroundImageAccess>true</backgroundImageAccess> <callLogBlfEnabled>2</callLogBlfEnabled> </commonProfile>

<vendorConfig> <disableSpeaker>false</disableSpeaker> <disableSpeakerAndHeadset>false</disableSpeakerAndHeadset> <pcPort>0</pcPort> <settingsAccess>1</settingsAccess> <garp>1</garp> <voiceVlanAccess>0</voiceVlanAccess> <videoCapability>0</videoCapability> <autoSelectLineEnable>0</autoSelectLineEnable> <webAccess>1</webAccess> <spanToPCPort>1</spanToPCPort> <loggingDisplay>1</loggingDisplay> <loadServer></loadServer>

</vendorConfig> <userLocale>

<name>Spanish</name> <uid>1</uid> <langCode>es</langCode>

<version>4.1(3)</version> <winCharSet>iso-8859-1</winCharSet>

</userLocale> <networkLocale>Spain</networkLocale>

<networkLocaleInfo> <name>Spain</name> <uid>64</uid> <version>4.1(3)</version>

</networkLocaleInfo> <deviceSecurityMode>1</deviceSecurityMode> <sipProfile>

<sipProxies> <registerWithProxy>true</registerWithProxy> </sipProxies> <enableVad>false</enableVad> <preferredCodec>g711ulaw</preferredCodec> <natEnabled></natEnabled> <phoneLabel>Usuario 5000</phoneLabel> <stutterMsgWaiting>1</stutterMsgWaiting> <ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy> <callStats>false</callStats> <silentPeriodBetweenCallWaitingBursts>10 </silentPeriodBetweenCallWaitingBursts> <disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig> <callHoldRingback>2</callHoldRingback> <localCfwdEnable>true</localCfwdEnable> <semiAttendedTransfer>true</semiAttendedTransfer> <anonymousCallBlock>2</anonymousCallBlock> <callerIdBlocking>2</callerIdBlocking> <dndControl>1</dndControl>

<remoteCcEnable>true</remoteCcEnable> <startMediaPort>10000</startMediaPort>

395

<stopMediaPort>20000</stopMediaPort> <sipLines> <line button="1"> <featureID>9</featureID> <featureLabel>Usuario 5000</featureLabel> <proxy>192.168.1.200</proxy> <name>5000</name> <displayName>Valentin</displayName> <authName>5000</authName> <authPassword>1234</authPassword> <messagesNumber>50008</messagesNumber> </line> </sipLines>

<dialTemplate>dialplan.xml</dialTemplate> </sipProfile> <loadInformation>SIP41.8-4-2S</loadInformation> <versionStamp>1143565489-a3cbf294-7526-4c29-8791-c4fce4ce4c37</versionStamp> <directoryURL></directoryURL> <servicesURL></servicesURL>

</device>

También es necesaria la configuración de otro fichero XML llamado dialplan.xml. En este archivo se especifica el tiempo de espera a llamar que tendrán los diferentes patrones. El contenido de este fichero es el siguiente:

<DIALTEMPLATE> <TEMPLATE MATCH="3..." TIMEOUT="0"/> <TEMPLATE MATCH="9........" TIMEOUT="0"/> <TEMPLATE MATCH="6........" TIMEOUT="0"/> <TEMPLATE MATCH="*" TIMEOUT="4"/> </DIALTEMPLATE>

Todos los números que empiecen por 3 y tengan 4 dígitos. Todos los números que empiecen por 9 y tengan 9 dígitos. Todos los números que empiecen por 6 y tengan 9 dígitos. El resto, espera 4 segundos a marcar, a menos que le des al botón de llamada. Lo siguiente será la actualización del firmware del teléfono a un firmware SIP para eso debemos seguir los siguientes pasos:

1) Debemos tener instalado un servidor TFTP, al que los teléfonos se conectarán para descargarse la versión más moderna del firmware. En la configuración del servidor DHCP debe estar la IP del servidor TFTP:

subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.3; option subnet-mask 255.255.255.0; range 192.168.1.201 192.168.1.203; default-lease-time 86400; max-lease-time 608400; option domain-name-servers 194.179.1.100; option tftp-server-name "192.168.1.210"; }

396

2) Obtener el firmware adecuado para la actualización. La versión de firmware que utilizaremos es la jar41sip.8-4-1-23 y consta de diversos archivos entre ellos uno llamado term41.default donde tendremos que nombrar los 5 archivos .sbn que se instalarán, concretamente son:

- apps41.8-4-1-23

- cnu41.8-4-1-23

- cvm41sip.8-4-1-23

- dsp41.8-4-1-23

- jar41sip.8-4-1-23

Estos archivos componen la imagen que se instalará el teléfono cuando actualice su firmware.

Ahora ya tenemos listos todos los archivos que necesitaremos para actualizar el firmware del telefono, por lo que pasaremos a “formatear” el teléfono.

3) Metemos los ficheros del firmware y los dos anteriormente configurados en la carpeta del servidor TFTP, por defecto es /tftpboot/.

4) Si queremos restaurar el teléfono a los valores de fabrica tenemos que

encender el teléfono con la tecla # pulsada, en unos segundos el teléfono pasará a modo “actualización”, hecho que veremos por un parpadeo alterno de los dos “leds” superiores del teléfono (los de línea).

El parpadeo indica que el teléfono espera la secuencia de “reseteo” para llevarlo a cabo. Esta secuencia es “123456789*0#”.

Una vez hayamos pulsado esta combinación debemos esperar, veremos como el teléfono se “ resetea”, quedándose con sus valores de fábrica. Luego el solo ira a buscar su archivo de actualización term41.default y se descargará la imagen que este indica mediante TFTP.

Una vez se haya terminado este proceso, el teléfono se reiniciará con el nuevo firmware y buscara su SEP<MAC-del-telefono>.conf.xml.

• Si tras la descarga y posterior instalación del firmware en la pantalla del teléfono aparece la palabra UNPROVISIONED significa que no se ha registrado el teléfono contra la centralita Asterisk, la parte del fichero de configuración del teléfono que no está bien configurada es la de los botones de línea, el featureID es muy importante:

<line button="1"> <featureID>9</featureID> <featureLabel>Usuario 5000</featureLabel> <proxy>192.168.1.200</proxy> <name>5000</name> <displayName>Valentin</displayName> <authName>5000</authName>

397

<authPassword>1234</authPassword> <messagesNumber>50008</messagesNumber> </line>

Tras estos pasos vamos a comprobar que funcionan las llamadas salientes y entrantes al teléfono a través de unas pruebas: La configuración de los archivos sip.conf y voicemail.conf para las extensiones del teléfono es la misma que para otros teléfonos, la configuración del archivo extensions.conf es: [cisco] include => acceso exten => 5000,1,Dial(SIP/5000) exten => 5000,n,Hangup()

Comprobamos que se ha registrado correctamente:

localhost*CLI> sip show peers Name/username Host Dyn Nat ACL Port Status 5000/5000 192.168.1.202 D 5060 Unmonitored

Llamada de un teléfono IP ALL Net 7960 a Cisco 7941 reconvertido a SIP: -- Executing [5000@acceso:1] Dial("SIP/2003-08e0ffb0", "SIP/5000") in new stack -- Called 5000 -- SIP/5000-08e85c98 is ringing -- SIP/5000-08e85c98 answered SIP/2003-08e0ffb0 -- Native bridging SIP/2003-08e0ffb0 and SIP/5000-08e85c98 == Spawn extension (acceso, 5000, 1) exited non-zero on 'SIP/2003-08e0ffb0'

Llamada de teléfono IP Cisco 7941 reconvertido a SIP a Sipura 841: -- Executing [4000@acceso:1] Macro("SIP/5000-08e0ffb0", "acceso|4000") in new stack

-- Executing [s@macro-acceso:1] Dial("SIP/5000-08e0ffb0", "SIP/4000|30|Ttm") in new stack

-- Called 4000 -- Started music on hold, class 'default', on SIP/5000-08e0ffb0 -- SIP/4000-08e85c98 is ringing -- SIP/4000-08e85c98 answered SIP/5000-08e0ffb0 -- Stopped music on hold on SIP/5000-08e0ffb0 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/5000-08e0ffb0' in macro 'acceso' == Spawn extension (acceso, 4000, 1) exited non-zero on 'SIP/5000-08e0ffb0'

398

Actualización de firmware del Teléfono Cisco 7905 de SCCP a SIP

Esta vez el teléfono es un Cisco 7905, de gama más baja que el anterior, pero igual de importante su aprovechamiento en la nueva centralita.

Tras la configuración detallada del proceso de cambio de firmware del teléfono anterior evitaremos la repetición pasando directamente, tras obtener el firmware SIP para este modelo, a la configuración de los ficheros que introduciremos en la carpeta del servidor TFTP /tftp/:

- CP7905080001SIP060412A.sbin

- CP7905080001SIP060412A.zup

- ld00127fae8c7c.cfg

- SEP00127FAE8C7C.cnf

- XMLDefault.cnf

Los dos últimos son los ficheros de configuración, a continuación vemos el código de estos dos ficheros. SEP0012FAE8C7C.cnf.xml: (Fichero por teléfono)

<device xsi:type="axl:XIPPhone" ctiid="1566023366"> <deviceProtocol>SIP</deviceProtocol> <sshUserId>3000</sshUserId> <sshPassword>1234</sshPassword> <devicePool> <dateTimeSetting> <dateTemplate>D/M/Y</dateTemplate> <timeZone>W. Europe Standard/Daylight Time</timeZone> <ntps> <ntp> <name>192.168.1.200</name> <ntpMode>Unicast</ntpMode> </ntp> </ntps> </dateTimeSetting> <callManagerGroup> <members> <member priority="0"> <callManager> <ports> <ethernetPhonePort>2000</ethernetPhonePort> <sipPort>5060</sipPort> <securedSipPort>5061</securedSipPort> </ports> <processNodeName>192.168.1.200</processNodeName> </callManager> </member> </members> </callManagerGroup> </devicePool>

399

<commonProfile> <phonePassword>1234</phonePassword> <backgroundImageAccess>true</backgroundImageAccess> <callLogBlfEnabled>2</callLogBlfEnabled> </commonProfile> <vendorConfig> <disableSpeaker>false</disableSpeaker> <disableSpeakerAndHeadset>false</disableSpeakerAndHeadset> <pcPort>0</pcPort> <settingsAccess>1</settingsAccess> <garp>1</garp> <voiceVlanAccess>0</voiceVlanAccess> <videoCapability>0</videoCapability> <autoSelectLineEnable>0</autoSelectLineEnable> <webAccess>1</webAccess> <spanToPCPort>1</spanToPCPort> <loggingDisplay>1</loggingDisplay> <loadServer></loadServer> </vendorConfig> <loadInformation>CP7905080001SIP060412A</loadInformation> <versionStamp>1143565489-a3cbf294-7526-4c29-8791-c4fce4ce4c37</versionStamp> <directoryURL></directoryURL> <servicesURL></servicesURL> </device>

XMLDefault.cnf.xml: (Fichero para varios teléfonos)

<Default> <callManagerGroup> <members> <member priority="0"> <callManager> <ports> <ethernetPhonePort>2000</ethernetPhonePort> </ports> <processNodeName>192.168.1.200</processNodeName> </callManager> </member> </members> </callManagerGroup> <loadInformation20000 model="IP Phone 7905"> CP7905080001SIP060412A </loadInformation20000> </Default>

Encendemos el teléfono y tras obtener la IP del servidor DHCP se descargará la nueva versión del firmware del servidor TFTP y se actualizará. El cambio de versión de firmware es el siguiente:

� CP7905080001SCCP061117A � CP7905080001SIP060412A

400

Lo siguiente será configurar la extensión que tendrá el teléfono desde la configuración SIP del mismo. Para poder actualizar los valores que haiga por defecto se deben pulsar las teclas “**#”. Comprobamos el registro de la extensión en Asterisk: localhost*CLI> sip show peers 3000/3000 192.168.1.204 D 5060 Unmonitored

Llamamos del Cisco 7941 (5000) a este teléfono (3000):

-- Executing [3000@acceso:1] Macro("SIP/5000-09f1fcf8", "acceso|3000") in new stack -- Executing [s@macro-acceso:1] Dial("SIP/5000-09f1fcf8", "SIP/3000|30|Ttm") in new stack -- Called 3000 -- Started music on hold, class 'default', on SIP/5000-09f1fcf8 -- SIP/3000-09f3c250 is ringing -- SIP/3000-09f3c250 answered SIP/5000-09f1fcf8 -- Stopped music on hold on SIP/5000-09f1fcf8 == Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/5000-09f1fcf8' in macro 'acceso' == Spawn extension (acceso, 3000, 1) exited non-zero on 'SIP/5000-09f1fcf8'

Llamamos de este teléfono (3000) al Cisco 7941 (5000):

-- Executing [5000@acceso:1] Dial("SIP/3000-09f35eb0", "SIP/5000") in new stack -- Called 5000 -- SIP/5000-09f47448 is ringing -- SIP/5000-09f47448 answered SIP/3000-09f35eb0 -- Native bridging SIP/3000-09f35eb0 and SIP/5000-09f47448 == Spawn extension (acceso, 5000, 1) exited non-zero on 'SIP/3000-09f35eb0'

401

Descripción breve de la centralita actual: Cisco y mejoras realizadas en la nueva.

Esquema Conceptual de la centralita actual: Cisco

402

Mejoras de la nueva centralita Asterisk:

Agenda de clientes

La empresa requiere una agenda de contactos con posibilidad de añadir a más de 100 clientes, en la actual centralita el Call Manager posee una agenda de clientes limitada.

La centralita Asterisk soluciona esto a través de dos aplicaciones: FOP 2 que posee una agenda de contactos de forma que cuando te llaman se ve la etiqueta de dicho cliente, y la agenda creada para la clasificación de los clientes según mantenimiento, YetBook, dándoles de esta forma una atención especial en caso de ser clientes VIP.

Usuarios o extensiones remotas

Para posibilitar el teletrabajo y la conexión con la oficina de Elche son necesarias las extensiones remotas, algo que en la central actual supondría la compra de Softphones Cisco o Telefonos IP, mientras que en la central Asterisk con cualquier Softphone con posibilidad de extensiones IAX el problema estaría solucionado.

Gestión de horarios y festivos con calendarios

Algo de lo que no se dispone en la actualidad es la gestión y posterior redirección de llamadas en días festivos o en horarios no laborales por ejemplo a la oficina de Elche en caso de ser festivo sólo en el País Vasco o la redirección en horario no laboral de clientes VIP.

Conferencias

En la central actual no es posible la realización de conferencias mientras que con Asterisk la configuración del fichero meetme.conf soluciona este problema.

Sistema de Colas

Por el mal funcionamiento del sistema de colas de la central Cisco no se pudo implantar un IVR, problema solucionado de forma sencilla en la centralita Asterisk con la configuración a medida de las colas en el fichero queues.conf, pudiendo además priorizar la posición de entrada a las colas en función del contrato de mantenimiento.

Grabaciones por defecto

Hay una mayor cantidad de grabaciones castellanizadas en Asterisk que en las centralitas Cisco lo que nos evitará la realización de bastantes grabaciones.

Reporting de llamadas y estadísticas de Colas

Otras funcionalidades necesarias y muy requeridas por el Dpto Contable de la empresa, son la realización de un listado detallado de llamadas y la obtención de estadísticas de las colas como la duración de las llamadas de todo el día o que agente atendió a un

403

mayor número de llamadas. Estas funcionalidades no son satisfechas por la centralita actual y por el contrario en la central Asterisk serán solucionadas con la integración con las aplicaciones Asternic Call Center Stats y Asternic CDR Reports.

Implantación en la empresa

Esquema Conceptual de la centralita para Yet Informática S.L.

404

Tipo de Implantación y Análisis de Riesgos

La implantación de la centralita en la empresa, por su reducido tamaño, será por sustitución, teniendo en cuenta que con las pruebas realizadas en el Demo, una formación adecuada al personal, con una serie de clases prácticas explicando las nuevas funcionalidades, y habiendo hecho un estudio sobre el funcionamiento de la centralita vieja, modificando ligeramente, si así fuera el caso, la configuración de la nueva para que el cambio fuese lo menos brusco posible los problemas pequeños problemas que se pudieran llegar a dar son:

� Problemas de Funcionamiento por fallo de configuración: Posible por falta del

trato en la configuración de algún detalle del funcionamiento requerido.

� Problemas de aprovisionamiento del personal: Posible por la falta de fluidez en

el manejo de las nuevas aplicaciones integradas con la centralita o las nuevas

funcionalidades.

Ambos tipos de problemas son sencillos de detectar y solucionar con un simple periodo de prueba de funcionamiento y corrección de errores.

Hardware y Software necesario para la implantación de la centralita:

Recurso Descripción Precio Unidades

Suma

Hardware

Cisco 7941 Teléfono IP (SCCP) 163,85 € 20 **

3.277,00 €

Cargador Cisco Cargador PA100 12,95 € 20

259,00 €

UPS Suministrador de energía eléctrica.

250,00 € 2

500,00 €

4.036,00 €

Software

Licencia FOP 2 Licencia 27,83 € 1

27,83 €

Licencia Call

Center Stats Licencia 347,87 € 1

347,87 €

Licencia CDR

Reports Licencia 00,00 € 1

00,00 €

405

Licencia Verbio Licencia * - -

-

375,70 €

* - El número de teléfonos Cisco 7941 dependerá de la rapidez por implantar la centralita y de la posibilidad de pasar a SIP otros modelos de teléfono Cisco de la actual centralita. ** -No se ha especificado el precio de la licencia de Verbio ya que finalmente no se adquirá por las dimensiones de la empresa y por la cantidad de llamadas que se reciben a diario. Estos dos apuntes hacen que el presupuesto de implantación sea poco fiable pero si representativo en cuanto a la importancia del Hardware en una centralita teléfonica propietaria.

Líneas Futuras y Conclusión

Una vez realizado lo expuesto hasta ahora lo siguiente a hacer sería un estudio exahustivo sobre el funcionamiento de la central Cisco actual, y es que por las dimensiones de la empresa, como ya he comentado, el tipo de implantación será de sustitución de una centralita por la otra y uno de los factores fundamentales es que el personal que utilice habitualmente dicha centralita no note un peor funcionamiento del que había, se trata de que las funcionalidades que si recoge la centralita actual se lleven a cabo aparentemente igual en la nueva y sólo se noten avances en aquellas funcionalidades nuevas. De esta forma se puede evitar parte del rechazo habitual a lo nuevo.

Concepto Importe (€)

PRESUPUESTO 1.847,28 €

Hw de Implantación 4.036,00 €

Sw de Implantación 375,70 €

PRESUPUESTO DE IMPLANTACIÓN 6.258,98 €

406

A parte de esto y antes de la implantación se debería seguir intentando cambiar al protocolo SIP los teléfonos IP CISCO de la centralita actual para evitarnos hacer una inversión inútil. Una vez establecidos estos dos puntos se elegiría una etapa del año de menos trabajo para realizar la implantación y así poder solucionar cualquier contratiempo con mayor fluidez. Por último algo que también se podría llevar a cabo es un servidor de Fax según los requerimientos y necesidades de la empresa. Como conclusión cabe destacar que está centralita Asterisk es una solución ejemplar para efectuar una mejora en la empresa por su flexibilidad y por el simple hecho de no requerir Hardware propietario especifico y por tanto poder aprovechar este en caso de que se necesite.Y es que en la actualidad Asterisk es considerado el futuro de la telefonía.

407

ANEXO A: Security.txt ==== Security Notes with Asterisk ====

PLEASE READ THE FOLLOWING IMPORTANT SECURITY RELATED INFORMATION.

IMPROPER CONFIGURATION OF ASTERISK COULD ALLOW UNAUTHORIZED USE OF YOUR

FACILITIES, POTENTIALLY INCURRING SUBSTANTIAL CHARGES.

Asterisk security involves both network security (encryption, authentication) as well as dialplan

security (authorization - who can access services in your pbx). If you are setting up Asterisk in

production use, please make sure you understand the issues involved.

* NETWORK SECURITY*

ANEXOS

408

If you install Asterisk and use the "make samples" command to install a demonstration

configuration, Asterisk will open a few ports for accepting VoIP calls. Check the channel

configuration files for the ports and IP addresses.If you enable the manager interface in

manager.conf, please make sure that you access manager in a safe environment or protect it

with SSH or other VPN solutions.

For all TCP/IP connections in Asterisk, you can set ACL lists that will permit or deny network

access to Asterisk services. Please check the "permit" and "deny" configuration options in

manager.conf and the VoIP channel configurations - i.e. sip.conf and iax.conf.

The IAX2 protocol supports strong RSA key authentication as well as AES encryption of voice

and signalling. The SIP channel does not support encryption in this version of Asterisk.

By default, if you have libcap available, Asterisk will try to retain the CAP_NET_ADMIN

capability when running as a non-root user. If you do not need that capability you may want to

configure Asterisk with --without-cap; however, this will prevent Asterisk from being able to

mark high ToS bits under Linux.

More information on CAP_NET_ADMIN is available at:

http://www.lids.org/lids-howto/node48.html

* DIALPLAN SECURITY*

First and foremost remember this:

USE THE EXTENSION CONTEXTS TO ISOLATE OUTGOING OR TOLL SERVICES FROM ANY

INCOMING CONNECTIONS.

You should consider that if any channel, incoming line, etc can enter an extension context that

it has the capability of accessing any extension within that context.

Therefore, you should NOT allow access to outgoing or toll services in contexts that are

accessible (especially without a password) from incoming channels, be they IAX channels, FX or

other trunks, or even untrusted stations within you network. In particular, never ever put

outgoing toll services in the "default" context. To make things easier, you can include the

"default" context within other private contexts by using:

include => default

in the appropriate section. A well designed PBX might look like this:

[longdistance]

exten => _91NXXNXXXXXX,1,Dial(Zap/g2/${EXTEN:1})

include => local

[local]

exten => _9NXXNXXX,1,Dial(Zap/g2/${EXTEN:1})

include => default

[default]

exten => 6123,Dial(Zap/1)

DON'T FORGET TO TAKE THE DEMO CONTEXT OUT OF YOUR DEFAULT CONTEXT.

There isn't really a security reason, it just will keep people from wanting to play with your

Asterisk setup remotely.

* LOG SECURITY*

409

Please note that the Asterisk log files, as well as information printed to the Asterisk CLI, may

contain sensitive information such as passwords and call history. Keep this in mind when

providing access to these resources.

ANEXO B: Aplicaciones de Asterisk

Aplicación Explicación

AbsoluteTimeout(length) Establece el tiempo máximo de una

llamada (en segundos).

AddQueueMember(queue [,interface[,penalty]])

Añade a una Cola de Llamadas la extensión desde la que se llama, o el agente o extensión

determinada por el parámetro Interface. Además es posible "penalizar" la extensión

con un nivel de prioridad.

ADSIProg(script) (script=telcordia-1.adsi)

Script con información que se pasa a la pantalla del terminal ADSI.

AgentCallbackLogin ([AgentNum][,[options][exten]])

Loguea como Agente del sistema. La extensión recibe las llamadas del Agente especificado.

AgentLogin ([AgentNum][,options])

Loguea como Agente del sistema, en modo exclusivo. Es decir, el teléfono siempre está

activo y escuchar un tono de beep cuando se le asigne una llamada.

AgentMonitorOutgoing ([options])

Muestra el Identificador del Agente que

realiza una llamada usar con AgentCallbackLogin.

AGI(program[,arguments])

Ejecuta un script o programa

creado por el usuario.

AlarmReceiver()

Recepción de Señal de Alarma desde un

dispositivo especial.

410

AMD()

Intenta detectar un contestador automático

en el extremo remoto de una llamada.

Answer()

Descuelga inmediatamente.

AppendCDRUserField(value)

Añade el valor especificado en el campo User

del registro de la llamada en el CDR.

Authenticate (password[,options])

Pide al interlocutor que introduzca una clave

válida para continuar.

BackGround

(filename1[&filename2...] [,options[,language]])

Reproduce una melodía o mensaje de audio

mientras se espera la marcación de las teclas.

BackgroundDetect(filename)

Reproduce una melodía o un mensaje

mientras intenta detectar un digito que corresponda con una extension.

Busy([timeout])

Establece el canal como "ocupado".

Callingpres(presentation)

Cambia la representación del CID en una

llamada externa.

ChangeMonitor(filename_base)

Cambia el nombre del archivo de control de

un canal.

ChanIsAvail (technology1/resource1[& technology2/resource2...]

[,option])

Indica si el canal especificado

está disponible.

ChannelRedirect

(channel,[context,] extension, priority)

Redirecciones de un canal a otra extensión y prioridad.

411

ChanSpy([channelprefix

[,options]])

Permite la escucha en un canal.

CheckGroup(max[category])

Controla que no se desborda el tope de las

llamadas en el grupo activo (SetGroup).

Congestion([timeout])

Reproduce el sonido de "Congestion en la

línea" hasta que finalice la llamada o expire el valor de Timeout.

ContinueWhile()

Vuelve al inicio de un bucle while.

ControlPlayback(filename)

Reproduce un archivo, y se controla con

algunas teclas su reproducción siempre que no coincida con una extensión.

DateTime

([time][,timezone[,format]])

Dice la hora actual.

DBdel(family/key)

Elimina un dato de la base de datos interna, la cual se organiza en Familias de datos, y datos

con valores dentro de la familia. De esta manera, para acceder a una variable, hay que especificar su Familia y el Valor determinado.

DBdeltree(family/keytree)

Elimina una Familia de datos de la base de

datos interna. A veces es necesario indicar una clave para realizar esta operación.

DBget(varname=family/key)

Obtiene el valor de un campo de la base de datos interna, especificado por la familia y el

nombre del campo, y lo almacena en la variable especificada.

DBput(family/key=value)

Inserta el valor especificado, dentro de un

campo de la base de datos interna, especificado por la familia y el nombre del

campo.

412

DeadAGI(program,args)

Ejecuta un script o programa creado por el

usuario, al colgar la llamada en curso.

Dial (username /extension,

ring-timeout,flags)

Conecta los canales.

DigitTimeout(seconds)

Número de segundos válidos entre una y otra

pulsación de los dígitos.

Dictate([<filename>])

Máquina de dictado virtual

Directory(vm-context [,dial-context[,options]])

Accede a un servicio de directorio, apoyado en la información almacenada para la gestión de

un contexto de Voicemail, en este caso el Apellido y Nombre de los usuarios. Con ello,

se consigue que un usuario pueda acceder a la extensión "escribiendo el nombre" del usuario

de la extensión a quien llama, de manera similar a como se dan de alta los nombres en

una agenda de un móvil. SOLO FUNCIONA con aquellos usuarios que tengan activado el

buzón de voz.

DISA(password[,context[,callerid[,mailbox[@vmcontext]]]])

Acceso directo al sistema permite a personas que llaman fuera de entrar en el sistema y les

proporciona un tono de marcado interno.

DumpChan ([min_verbose_level])

Muestra información sobre el canal de

llamada en la consola.

DUNDiLookup (number[,context[,options]])

Busca un número de teléfono con DUNDi.

EAGI()

Ejecuta un script o programa creado por el usuario, con la particularidad de que EAGI

permite controlar el flujo de audio.

413

Echo()

Permite escuchar el eco de lo que se está

hablando.

EndWhile()

Fin de un bucle while

EnumLookup(number)

Establece el valor de la variable ENUM de

acuerdo a la extension pasada.

Eval (newvar=string)

Evalúa una variable y se asigna a otra nueva.

Formato: Nueva Variable = Algo (que puede

ser otra variable representada por ${Variable})

Exec (variable (arguments))

Ejecuta una aplicación de las de esta lista, cuando es invocada, de tal manera que no

está establecida en el Dialplan de manera fija.

ExecIf (expression,application,

arguments)

Ejecuta una aplicación de Asterisk en

condiciones específicas.

ExecIfTime (times|daysofweek

|daysofmonth|months? application [,arguments])

Ejecuta una aplicación basada

en la hora actual.

ExitWhile()

Sale de un bucle while, con

independencia de si su condición se ha cumplido.

ExtenSpy (extension[@context][,options])

Escuchar en un canal unido a

una extensión específica.

ExternalIVR (shell-command

[,arg1[,arg2[,...]]])

Inicio de una aplicación IVR externa.

Festival (text[,intkeys])

Reproduce una cadena de texto

usando el software Festival.

414

Flash()

Envía el evento Flash a la línea (es usado

dentro de un AGI normalmente para producir una transferencia).

FollowMe (followMeID,options)

Aplicación Find-Me/Follow-Me.

ForkCDR()

Inserta un nuevo Registro en la tabla CDR

contando a partir de este instante el temporizador.

GetCPEID()

Obtiene de teléfonos ADSI la información

CPE ID, para configurar al canal zaptel adecuadamente en operaciones "on-hook".

GetGroupCount ([group][@category])

Obtiene el número de llamadas al grupo de

llamadas en un momento dado. El valor

obtenido actualiza la variable GROUPCOUNT.

Gosub (named_priority)

Salta a la prioridad especificada, extensión

y contexto, y permite regresar.

GosubIf (condition?labeliftrue:

labeliffalse)

Salta a la prioridad determinada si una

condición se cumple y permite regresar.

Goto ([[context,]extension,]priority)

Salta a una prioridad especificada,

extensión y contexto.

GotoIf (condition?label1:label2)

Salta a una prioridad especificada, extensión y contexto, si se cumple

una condición.

GotoIfTime

(times,days_of_week, days_of_month,months?label)

Salta a la prioridad indicada si se cumple la condición de tiempo.

415

Hangup()

Cuelga inmediatamente.

HasNewVoicemail

(vmbox[@context][:folder] [,varname])

Esta aplicación permite determinar si el usuario del buzón tiene mensajes

almacenados. Si no existen mensajes, el flujo de la llamada salta a la regla siguiente; mientras que el flujo de la

llamada se desvía a la regla con el índice n+101 si existen mensajes en

el buzón especificado.

IAX2Provision ([template])

Dispone de un dispositivo de IAX y llama,

utilizando opcionalmente la plantilla especificada.

ImportVar

(newvar=channel,variable)

Establece una variable con el contenido de una variable del canal de otro canal.

Log (level,message)

Envía un mensaje especificado al nivel

de registro especificado.

LookupBlacklist ([options])

Mira si el CallID de la llamada está dentro

de la lista negra de llamantes. Si está, salta a la regla n+101.

LookupCIDName()

Mira si el CallID de la llamada está dentro de la lista "cidname". Si está, establece la

variable CIDNAME al valor de la lista.

Macro (macroname,arg1,arg2...)

Ejecuta una macro previamente definida.

MacroExclusive (macroname[,arg1[,arg2[,...]]])

Ejecuta una macro definida previamente, pero sólo permite una única instancia de la macro para ejecutar en cualquier punto dado en el

tiempo.

MacroExit()

Interrumpe la ejecución de una macro.

416

MacroIf

(expression?macronameA[, argA1][:macronameB[,argB1]])

Condicional comienzan macros diferentes.

MailboxExists (mailbox[@context])

Es una función que permite un salto

condicional a la regla n+101. Comprueba si existe el Buzón de Voz. En caso de que

exista salta a la regla n+101.

MeetMe ([confno][,[options][,pin])

Coloca la llamada en una conferencia de MeetMe.

MeetMeAdmin

(confno,command[,pin])

Administra una conferencia MeetMe.

MeetMeCount (confno[,variable])

Cuenta el número de participantes en una

conferencia de MeetMe.

Milliwatt()

Genera un tono constante

de 1000Hz a 0dbm (mu-law).

MixMonitor

(fileprefix.format[,options [,command]])

Registra el audio en el canal actual, pero lo

mezcla antes de escribirla en un archivo.

Monitor ([file_format[:urlbase] [, fname_base][,options]])

Graba el canal actual en dos

archivos independientes.

Morsecode (string)

Transmite la condición de cadena

como el código Morse.

MP3Player (location)

Ejecuta a través del programa mpg123

un fichero o un stream de audio (especificar URL).

MusicOnHold (class)

Reproduce música de forma indefinida.

417

NBScat()

Reproduce una corriente NBS locales.

NoCDR()

Suprime la generación de un

Registro de detalle de llamadas para la llamada en el canal actual.

NoOp (text)

No ejecuta nada.

Page (technology/resource[& technology2/resource2[&...]]

[,options])

Páginas de una prórroga.

Park (exten)

Auto Aparca al usuario en el espacio de

"parking" de llamadas, normalmente para poder determinar cómo está ese espacio. Se usa junto a una transferencia supervisada.

Debe existir el contexto "parkedcalls".

ParkAndAnnounce (template,timeout,channel

[,return_context])

Aparca la llamada indicando dónde es

aparcada, y qué hacer si expira un tiempo máximo de segundos en espera

sin ser atendida.

ParkedCall (exten)

Recupera una llamada aparcada.

PauseMonitor()

Detiene la supervisión de un canal.

PauseQueueMember

([queuename],interface)

Se detiene un dispositivo de cola de manera

que no puede recibir llamadas de la cola.

Pickup (extension[@context]

[& extension2@context2[&...]])

Responder a una llamada dirigida

a otra extensión.

Playback (filename[,options])

Reproduce un archivo de sonido a

la persona que llama.

418

PlayTones (tonelist)

Reproduce uno o más tonos.

PrivacyManager()

Pide a la entrada del número de teléfono del

llamante, en caso de identificador de llamadas no se puede obtener.

Progress()

Indica el progreso de la llamada.

Queue (queuename[,options[,

URL [,announceoverride [,timeout]]]])

Envia la llamada en curso a una cola de

llamadas, previamente dada de alta. Además se puede acompañar de diversas acciones.

QueueLog

(queue,uniqueID,agent, event[, additionalInfo])

Escribe una entrada en el registro de cola.

Random

([probability]:[[context,] extension,]priority)

Salto condicional basado en una probabilidad.

Read

(variable[,filename][,maxdigits] [,option][,attempts][,timeout])

Lee un numero de dígitos (que finalizan

con la tecla # o al llegar a un límite marcado) y se asignan a una variable.

ReadFile

(variable=filename,length)

Lee un archivo.

RealTime (family,colmatch,value[,prefix])

Obtiene información de configuración de la base de datos de configuración

en tiempo real.

RealTimeUpdate

(family,colmatch,value, newcol, newval)

Actualizaciones de un valor en la base de datos de configuración en tiempo real

Record (filename:format,

silence[,maxduration][,options])

Graba en un archivo un mensaje de voz

en el formato especificado.

419

RemoveQueueMember

(queuename[,interface])

Elimina los miembros de la cola de forma

dinámica.

ResetCDR ([options])

Pone a Cero el registro con la información de la llamada en curso, que va a ser almacenado

en la tabla CDR. La opción CDR almacena previamente el contenido.

RetryDial

(announce,sleep,loops, technology/resource[&

Technology2/resource2...] [,timeout][,options][,URL])

Intentos para marcar y reintentos

si el intento falla.

Return()

Devoluciones de una subrutina.

Ringing()

Devuelve la señal de RING

SayAlpha (string)

Deletrea la cadena de texto. Esta cadena

puede tener letras, números o los símbolos! @ # $ * - + = / (espacio en blanco).

SayDigits (digits)

Deletrea los dígitos pasados, en el

lenguaje activo en ese canal.

SayNumber (digits[,gender])

Dice el Número pasado, en el lenguaje

activo en ese canal.

SayPhonetic (string)

Deletrea la cadena pasada.

SayUnixTime

([unixtime][,[timezone] [,format]])

Anunciar el tiempo en un formato

personalizado.

SendDTMF (digits[,timeout_ms])

Envía una cadena de dígitos, a través de la

señal DTMF establecida en el canal.

420

SendImage (filename)

Envía una imagen.

SendText (text)

Envía un mensaje de texto al cliente. Si el

cliente no soporta la recepción de texto, el Dialplan continuará en la regla n+101, si

existe.

SendURL (url[,option])

Envía una dirección URL al cliente, siempre que lo soporte. En caso de no soportarlo, se

desvía la ejecución a la regla n+101.

Set (n=value)

Establece una variable para el valor

especificado.

SetAccount (account)

Establece el valor del campo Account en el

CDR, para control de llamada.

SetAMAFlags (flag)

Establece el valor del campo amaflags en el

CDR, para control de llamada.

SetCallerID (clid[,a])

Establece un nuevo valor para el CallerID de la

llamada.

SetCallerPres (presentation)

Juegos de identificación de llamadas banderas

de presentación.

SetCDRUserField (value)

Establece el valor del campo User en el registro CDR para la llamada en curso.

SetCIDName (cname[,a])

Establece un nuevo valor para la parte del

Identificador de Nombre (no el número)

del CallerID de la llamada.

SetCIDNum (cnum[,a])

Establece un nuevo valor para la parte del Número (no el nombre) del CallerID

de la llamada.

421

SetGlobalVar (n=value)

Establece una variable Global, que se puede

usar en otro canal de comunicación al ser de ámbito global a todo el Dialplan.

SetGroup

(groupname[@category])

Especifica la creación de un grupo

para control de acceso.

SetLanguage (language)

Establece el directorio por defecto de dónde

coger los archivos de voz para los mensajes.

SetMusicOnHold (class)

Establece la "clase" musical por defecto,

para MusicOnHold.

SetTransferCapability (transferCapability)

Establece el valor de una variable global.

SetVar (n=value)

Establece el valor de una variable global,

que se puede usar durante la comunicación

de cualquier canal.

SIPAddHeader (header: value)

Agrega un encabezado SIP para el cuadro

de diálogo SIP.

SIPDtmfMode (mode)

Establece el parámetro dtmfmode para

una llamada a través de un canal SIP.

SMS (queue[,options])

Envía o recibe SMS (Short Message System) mensajes.

SoftHangup

(technology/resource,options)

Cuelga el canal especificado.

StopMonitor()

Finaliza la grabación de la llamada en curso.

StopPlayTones()

Finaliza la reproducción de la lista de tonos

especificada en Playtones.

422

System (command)

Ejecuta un comando de shell.

Transfer ([technology/] destination [,options])

Transfiere la llamada en curso a otra

extensión, siempre que esté dentro de su mismo Contexto. En caso de ser fallida, salta a

la regla n+101.

TryExec

(application(arguments))

Intenta ejecutar una aplicación Dialplan.

TrySystem (command)

Ejecuta una aplicación en Linux. Si existe un

error en la ejecución sigue en la regla n+101.

UnpauseMonitor()

Reanudará la grabación de un canal.

UserEvent (eventname[,body])

Envía al subsistema "Manager" un evento que

podrá ser usado por el usuario. Como parámetros se pasa al Manager, un nombre

de evento y opcionalmente un campo con más opciones.

Verbose ([level,]message)

Nivel de detalle de la presentación de

mensajes en consola.

VMAuthenticate ([mailbox][@context])

Autentica la persona que llama con la

contraseña de correo de voz del buzón especificado.

VoiceMail

([s|u|b]mailbox[@context] [&mailbox[@context]][...])

Permite que la persona que llama para dejar un mensaje de correo de voz en el buzón

especificado.

VoiceMailMain

([[s|p]mailbox][@context])

Permite que la persona que llama para

comprobar los mensajes de correo de voz.

Wait (seconds)

Espera un tiempo expresado en segundos

antes de continuar.

423

WaitExten ([seconds])

Espera los segundos expresados, que se marque una nueva extensión antes de

continuar.

WaitForRing (timeout)

Espera los segundos especificados a recibir la señal de Ring.

WaitForSilence (wait[,repeat])

Espera a que el silencio de una duración

determinada.

WaitMusicOnHold (delay)

Durante el tiempo que se especifique se

retiene la llamada con Música, la que esté establecida en la clase "default".

While (expr)

Inicia un bucle while.

Zapateller (options)

Genera un tono que bloquea a los tele-

vendedores que llamen. Opciones: answer (responde después del tono), nocallerid

(genera el tono si no hay CID).

ANEXO C: Funciones de Asterisk

Nombre

Sintaxis

Descripción

AGENT

AGENT(<agentId>[:item])

(item =status, password, name,

channel, mohclass, exten)

Obtiene información

sobre un agente.

ARRAY

ARRAY(var1[|var2[...][|varN]])

Permite establecer múltiples

variables a la vez.

BASE64_

DECODE

BASE64_DECODE(<base64_string>)

Decodifica una

cadena base64.

424

BASE64_

ENCODE

BASE64_ENCODE(<string>)

Codifica una

cadena en base64.

BLACKLIST BLACKLIST()

Comprueba en la base de

datos de Asterisk si el Callerid

está en la lista negra.

CALLERID

CALLERID(<item>) (item=all, num, name)

Obtiene o establece los datos

de identificación de llamada.

CDR

CDR(<name>[|options])

Obtiene o establece una

variable de CDR.

CHANNEL

CHANNEL(item)(item= audioreadformat,

audionativeformat, videonativeformat,

audiowriteformat, callgroup, channeltype,

language, musicclass, …)

Obtiene o establece

información sobre el canal.

CHECKSIP

DOMAIN

CHECKSIPDOMAIN(<domain|IP>)

Comprueba si un dominio

es un dominio local.

CUT

CUT(<varname>,< delimiter> ,<range-s>)

Divide una variable según

un delimitador de nombre.

DB DB(<family>/<key>) Lee o escribe en la base de

datos de Asterisk.

DB_DELETE DB_DELETE(<family>/<key>)

Devuelve un valor de la base

de datos y lo elimina.

DB_EXISTS DB_EXISTS(<family>/<key>)

Comprueba si la clave existe

en la base de datos de

Asterisk.

DUNDI

LOOKUP

DUNDILOOKUP(number[|context[|option)

Realiza una búsqueda DUNDi

de un número de teléfono.

425

ENUM

LOOKUP ENUMLOOKUP(number[|Method-type[|option)

Permite la consulta de un

carácter general o específico

de los registros NAPTR o de los

tipos de NAPTR para ENUM o

de los punteros DNS

ENUMlike.

ENV

ENV(<envname>)

Obtiene o establece la variable

de entorno especificada.

EVAL

EVAL(<variable>)

Evalúa las variables

almacenadas.

EXISTS

EXISTS(<data>)

Prueba de existencia: Retorna

1 si existe, 0 en caso contrario.

FIELDQTY

FIELDQTY(<varname>|<delim>)

Cuenta los campos, con un

delimitador arbitrario.

FILTER

FILTER(<allowed-chars>|<string>)

Filtra la cadena de caracteres

para incluir sólo los caracteres

permitidos.

GLOBAL

GLOBAL(<varname>)

Obtiene o establece la variable

global especificada.

GROUP GROUP([category])

Obtiene o establece el

grupo de canales.

GROUP_

COUNT

GROUP_COUNT([groupname][@category])

Cuenta el número de canales

en el grupo especificado.

GROUP_LIST

GROUP_LIST()

Obtiene una lista de los

grupos creados en un canal.

GROUP_

MATCH_

COUNT

GROUP_MATCH_COUNT

(groupmatch [@category])

Cuenta el número de canales

en los grupos que coinciden

con el patrón especificado.

426

IAXPEER

IAXPEER(<peername|CURRENTCHANNEL>)

(peername=ip,status,mailbox,context,

expire,dynamic,callerid_name,

callerid_num, codecs)

Obtiene información del

usuario IAX.

IF IF(<expr>?[<true>][:<false>])

Condicional: Devuelve los

datos siguientes a ‘?’ si es

cierto sino los datos

siguientes a ‘:’.

IFTIME

IFTIME(<timespec>?[<true>][:<false>])

(timespec=times,day_of_week,

day_of_month,months)

Temporal condicional:

Devuelve los datos siguientes

a ‘?’ si es cierto sino los

datos siguientes a ‘:’.

ISNULL

ISNULL(<data>)

NULL test: Retorna 1 si NULL

ó 0 en caso contrario.

KEYPAD HASH KEYPADHASH(<string>)

Pasa la clave de string a

número.

LEN

LEN(<string>)

Devuelve la longitud del

argumento dado.

MATH

MATH(<number1><op>

<number 2> [,<type>])

Realiza Funciones

matemáticas.

MD5

MD5(<data>)

Calcula el MD5 del dato.

MUSICCLASS

MUSICCLASS()

Lee o define la clase

MusicOnHold.

QUEUE_

MEMBER_

COUNT

QUEUE_MEMBER_COUNT(<queuename>)

Cuenta el número de

miembros de una cola.

QUEUE_

MEMBER_LIST

QUEUE_MEMBER_LIST(<queuename>)

Devuelve una lista con los

miembros de una cola.

427

QUEUE_

WAITING_

COUNT

QUEUE_WAITING_COUNT(<queuename>) Cuenta el número de llamadas

en espera de una cola.

RAND

RAND([min][|max])

Elije un número al azar

en un rango.

REALTIME

REALTIME(family|fieldmatch[value])

En tiempo real lee / escribe

funciones.

REGEX

REGEX (“<regular expression>” <data>…)

Expresiones regulares.

SET

SET(<varname>=[<value>])

Asigna un valor a una

variable de canal.

SHA1

SHA1(<data>)

Calcula un algoritmo SHA1.

SIP_HEADER

SIP_HEADER(<name>[,<number>])

Obtiene el encabezado

SIP especificado.

SIPCHANINFO

SIPCHANINFO(item)(item=peername,

peerip, useragent, peername)

Obtiene el parámetro del

canal SIP especificado.

SIPPEER

SIPPEER(<peername>[|item])(ítem=ip, mailbox,

context, expire, dynamic, callerid_name,

callerid_number, status, language, useragent, …)

Obtiene información del

usuario SIP.

SORT SORT(key1:val1[...][,keyN:valN])

Ordena una lista de

clave/valor en una lista de

claves, basada en los valores.

STAT STAT(<flag>,<filename>) Hace un chequeo del archivo

especificado.

STRFTIME STRFTIME([<epoch>][|[timezone][|for……)

Devuelve la fecha / hora

actual en el formato

especificado.

428

STRPTIME

STRPTIME(<datetime>|<timezone>|<for…)

Devuelve la fecha como se

describe en el formato.

TIMEOUT

TIMEOUT(timeouttype)

Obtiene o establece los

tiempos de espera en el canal.

URIDECODE

URIDECODE(<data>)

Decodifica un string de

acuerdo a RFC 2396.

URIENCODE

URIENCODE(<data>)

Codifica un string de acuerdo

a RFC 2396.

VMCOUNT

VMCOUNT(vmbox[@context][|folder])

Añade el mensaje de voz

en el buzón especificada.

ANEXO D: Ficheros de Configuración de Asterisk

• modules.conf • enum.conf • oss.conf

• amd.conf • extconfig.conf • phone.conf

• telcordia-1.adsi • extensions.conf • privacy.conf

• adsi.conf • extensions.ael • queues.conf

• adtranvofr.conf • features.conf • res_mysql.conf

• agents.conf • festival.conf • res_odbc.conf

• alarmreceiver.conf • followme.conf • res_snmp.conf

• alsa.conf • func_odbc.conf • rpt.conf

• asterisk.conf • gtalk.conf • rtp.conf

• chan_dahdi.conf • http.conf • say.conf

• cdr.conf • iax.conf • sip.conf

• cdr_manager.conf • iaxprov.conf • sip_notify.conf

• cdr_mysql.conf • indications.conf • skinny.conf

• cdr_odbc.conf • jabber.conf • sla.conf

429

• cdr_pgsql.conf • logger.conf • smdi.conf

• cdr_tds.conf • manager.conf • udptl.conf

• codecs.conf • meetme.conf • users.conf

• dahdi_channels.conf • mgcp.conf • voicemail.conf

• dnsmgr.conf • musiconhold.conf • vpb.conf

• dundi.conf • osp.conf

modules.conf

Este archivo controla los módulos que se cargan y los que no al iniciar Asterisk a través de “load=>” o “noload =>”.Este archivo es un componente clave para construir una instalación segura de Asterisk.

El archivo modules.conf empieza con el contexto [modules]. La opción autoload hace que Asterisk al inicio cargue todos los módulos contenidos en el fichero modules que está situado en /usr/lib/asterisk/.Lo recomendable es cargar solo los módulos que se necesiten rellenando este archivo con sentencias “load=>” y evitar que se carguen los no necesarios con sentencias “noload=>”.

Un ejemplo es:

[modules] autoload=no ; set this to yes and Asterisk will load any ; modules it finds in /usr/lib/asterisk/modules load => res_adsi.so load => pbx_config.so ; Requires: N/A load => chan_iax2.so ; Requires: res_crypto.so, res_features.so load => chan_sip.so ; Requires: res_features.so load => codec_alaw.so ; Requires: N/A load => codec_gsm.so ; Requires: N/A load => codec_ulaw.so ; Requires: N/A load => format_gsm.so ; Requires: N/A load => app_dial.so ; Requires: res_features.so, res_musiconhold.so

Puesto que Asterisk se basa en Linux los módulos acaban en .so.

adsi.conf

El ADSI (Analog Display Services Interface) fue diseñado para permitir a las compañías de telefonía ofrecer mejores servicios a través de circuitos analógicos de telefonía. En Asterisk, puedes usar este fichero para enviar comandos ADSI a teléfonos compatibles con esta tecnología. Hay que tener en cuenta que el teléfono debe estar conectado a un canal Zap/Dahdi.

430

Los mensajes ADSI no se envían a través de una conexión VoIP a un teléfono analógico remoto. El modulo res_adsi.so es necesario para la aplicación Voicemail() sin embargo este fichero no hace falta usarlo. El archivo por defecto que tenemos al instalar Asterisk es:

; ; Sample ADSI Configuration file ; [intro] alignment = center greeting => Welcome to the greeting => Asterisk greeting => Open Source PBX

Para obtener una información debemos mirar el script telcordia-1.adsi.

telcordia-1.adsi

; ; Asterisk default ADSI script ; ; ; Begin with the preamble requirements ; DESCRIPTION "Telcordia Demo" ; Name of vendor VERSION 0x02 ; Version of stuff ;SECURITY "_AST" ; Security code SECURITY 0x0000 ; Security code FDN 0x0000000f ; Descriptor number ; ; Predefined strings ; DISPLAY "talkingto" IS "Talking To" "$Call1p" WRAP DISPLAY "titles" IS "20th Century IQ Svc" DISPLAY "newcall" IS "New Call From" "$Call1p" WRAP DISPLAY "ringing" IS "Ringing" ; ; Begin state definitions ; STATE "callup" ; Call is currently up STATE "inactive" ; No active call ; ; Begin soft key definitions ; KEY "CB_OH" IS "Block" OR "Call Block" OFFHOOK VOICEMODE WAITDIALTONE SENDDTMF "*60" SUBSCRIPT "offHook" ENDKEY

431

KEY "CB" IS "Block" OR "Call Block" SENDDTMF "*60" ENDKEY ; ; Begin main subroutine ; SUB "main" IS IFEVENT NEARANSWER THEN CLEAR SHOWDISPLAY "talkingto" AT 1 GOTO "stableCall" ENDIF IFEVENT OFFHOOK THEN CLEAR SHOWDISPLAY "titles" AT 1 SHOWKEYS "CB" GOTO "offHook" ENDIF IFEVENT IDLE THEN CLEAR SHOWDISPLAY "titles" AT 1 SHOWKEYS "CB_OH" ENDIF IFEVENT CALLERID THEN CLEAR SHOWDISPLAY "newcall" AT 1 ENDIF ENDSUB SUB "offHook" IS IFEVENT FARRING THEN CLEAR SHOWDISPLAY "ringing" AT 1 ENDIF IFEVENT FARANSWER THEN CLEAR SHOWDISPLAY "talkingto" AT 1 GOTO "stableCall" ENDIF ENDSUB SUB "stableCall" IS ENDSUB

adtranvofr.conf

Antes de la VoIP, la VoFR gozo de una breve fama por ser un medio de llevar voz empaquetada. El apoyo que lo presto el equipo Adtran, es parte de la historia de Asterisk. A pesar de que esta característica esta es desuso, el archivo ejemplo que nos proporciona Asterisk es: ; ; Voice over Frame Relay (Adtran style)

432

; ; Configuration file

[interfaces] ; ; Default language ; ;language=en ; ; Lines for which we are the user termination. They accept incoming ; and outgoing calls. We use the default context on the first 8 lines ; used by internal phones. ; context=default ;user => voice00 ;user => voice01 ;user => voice02 ;user => voice03 ;user => voice04 ;user => voice05 ;user => voice06 ;user => voice07 ; Calls on 16 and 17 come from the outside world, so they get ; a little bit special treatment context=remote ;user => voice16 ;user => voice17 ; ; Next we have lines which we only accept calls on, and typically ; do not send outgoing calls on (i.e. these are where we are the ; network termination) ; ;network => voice08 ;network => voice09 ;network => voice10 ;network => voice11 ;network => voice12

agents.conf

Para configurar los agentes que atenderán las llamadas entrantes a las colas configuradas tenemos este archivo. El fichero tiene la siguiente estructura:

[general] ; empieza la parte general.

persistentagents=yes ; define si el callbacklogin tiene que ser almacenado en la base de ;datos interna de Asterisk. De esta forma cuando volvemos a arrancar asterisk estos datos serán ;recargados.

multiplelogin=yes ; define si es permitido a una misma extensión conectarse como agente ;múltiple.

[agents] ; desde aquí comienza la configuración de los agentes.

maxlogintries=3 ; numero máximo de intentos que tiene un agente para conectarse.

433

autologoff=15 ; si un agente no contesta una llamada dentro de 15 segundos será ;automáticamente desconectado.

autologoffunavail=yes ; si la extensión desde la cual el agente se conecta se vuelve no ;disponible, automáticamente el agente será desconectado.

endcall=yes ; un agente puede terminar una llamada hundiendo la tecla *.

musiconhold => default ; la clase de música en espera que escuchará el agente cuando esté ;conectado.

;Definimos un grupo para los agentes que vamos a configurar:

group=1

;La ultima parte es dedicada a la configuración de los agentes siguiendo la sintaxis:

;agent => IDagente,contraseñaagente,nombre

;Ponemos dos ejemplos:

agent => 2000,1234,Fulano

agent => 2001,2345,Sutano

;Para que un agente se pueda loguer tenemos que escribir estas líneas en el plan de llamadas ;(extensions.conf):

exten => _200[01],1,Agentlogin(${EXTEN})

exten => _200[01],n,Hangup

alarmreceiver.conf

El archivo ALARMRECEIVER.CONF es utilizado por la aplicación AlarmReceiver(), que permite a Asterisk aceptar las alarmas con el protocolo SIA (Ademco Contact ID protocol). Cuando se recibe una llamada de un panel de alarma, es redirigida a un contexto que llama a la aplicación AlarmReceiver() que a su vez lee el archivo de configuración ALARMRECEIVER.CONF y realiza las acciones configuradas según las necesidades.

El fichero de ejemplo es el siguiente: [general] ;Especifica el formato de fecha y hora timestampformat = %a %b %d, %Y @ %H:%M:%S %Z ; Especifica el comando que se ejecutará cuando la persona que llama cuelga ;eventcmd = yourprogram -yourargs ;Especifica el directorio de impresión para los archivos de eventos. eventspooldir = /tmp ;Almacena los eventos hasta que la persona se conecta ,entonces los guarda en un archivo. logindividualevents = no ;El tiempo de espera para recibir el primer dígito DTMF. fdtimeout = 2000 ;El tiempo de espera para la recepción de dígitos DTMF posterior al primero sdtimeout = 200

alsa.conf

La alsa.conf archivo de configuración de Asterisk permite la configuración de los canales de ALSA (Advanced Linux Sound Architecture) dentro de Asterisk.

434

Los canales de ALSA permiten las llamadas a / desde dispositivos ALSA, usando dispositivos de entrada / salida. Esto permite que unos auriculares y un micrófono conectado a una tarjeta de sonido, por ejemplo, sean utilizados como un SoftPhone. El fichero de ejemplo es el siguiente: [general] autoanswer=yes ;Contestar automáticamente a llamadas a canales ALSA context=local ;contexto en el que están las extensiones que utilizan ALSA extension=s ;Extensión a marcar ;language=en ;input_device=hw:0,0 ;Indica el nombre del dispositivo ALSA a utilizar para la captura ;de sonido, es decir, para hablar ;output_device=hw:0,0 ;Indica el nombre del dispositivo ALSA a usar para reproducir ;sonido, es decir, para escuchar.

Un archivo similar a este pero para el servicio OSS es el oss.conf, sólo uno de los dos canales pueden ser cargados al mismo tiempo, por lo que si queremos utilizar ALSA hay que modificar el archivo modules.conf:

noload => chan_oss.so load => chan_alsa.so

amd.conf

Este es el fichero de configuración de la aplicación AMD(Answering Machine Detection) que detecta la existencia de un contestador automático. El fichero ejemplo es el siguiente:

[general] initial_silence = 2500; máximo tiempo en silencio antes del saludo(greeting).Si se pasa la ;variable AMDSTATUS=MACHINE. greeting = 1500 ;longitud máxima de un saludo. Si se pasa la variable AMDSTATUS=MACHINE. after_greeting_silence = 800; silencio después de detectar un saludo. Si se pasa la variable ;AMDSTATUS=HUMANOS. total_analysis_time = 5000 ; tiempo máximo permitido para el algoritmo para decidir si es ;HUMAN o MACHINE min_word_length = 100 ;la duración mínima de la voz a considerarse como una palabra. between_words_silence = 50 ; duración mínima de silencio después de una palabra. maximum_number_of_words = 3 ; el número máximo de palabras en el saludo. Si se pasa la ;variable AMDSTATUS=MACHINE.

asterisk.conf

El archivo asterisk.conf define las ubicaciones de los ficheros de configuración, el fichero de cola(spool), y un lugar para escribir los ficheros de log. Se recomienda que se entienda configuración predeterminada y las consecuencias de cambiarla. El asterisk.conf se genera automáticamente cuando se ejecuta make samples en la instalación de Asterisk basándose en la información que recopila sobre su sistema. El fichero consta de dos/tres contextos:

435

•••• El contexto de directorios [directories]:

[directories] astetcdir => /etc/asterisk ;Todos los archivos (*. conf) serán almacenados en el ;directorio anterior (/ etc / asterisk /). astmoddir => /usr/lib/asterisk/modules ;Fichero donde se encuentran los módulos de ;Asterisk. astvarlibdir => /var/lib/asterisk ;Fichero de librerías ,en su interior se pueden encontrar ;los sonidos de Asterisk (*. GSM). astdatadir => /var/lib/asterisk astagidir => /var/lib/asterisk/agi-bin ;Fichero donde están los scripts agi. astspooldir => /var/spool/asterisk ;Fichero donde se guardan los voicemail y las ;grabaciones de llamadas entre otras cosas. astrundir => /var/run ;Fichero donde Asterisk almacena su archivo PID. astlogdir => /var/log/asterisk ;Fichero que indica donde están los archivos de log que ;se generan.

• El contexto [files]: Indica la configuración y permisos del archivo asterisk.ctl que

se utliza para conectar el CLI remoto.

;[files] ;astctlpermissions = 0660 ;astctlowner = root ;astctlgroup = apache ;astctl = asterisk.ctl

• El contexto de opciones que le permite definir las opciones de inicio [options]:

[options] languageprefix = yes ; Use the new sound prefix path syntax ;verbose = 3 ;debug = 3 ;alwaysfork = yes ; same as -F at startup ;nofork = yes ; same as -f at startup ;quiet = yes ; same as -q at startup ;timestamp = yes ; same as -T at startup ;execincludes = yes ; support #exec in config files ;console = yes ; Run as console (same as -c at startup) ;highpriority = yes ; Run realtime priority (same as -p at startup) ;initcrypto = yes ; Initialize crypto keys (same as -i at startup) ;nocolor = yes ; Disable console colors ;dontwarn = yes ; Disable some warnings ;dumpcore = yes ; Dump core on crash (same as -g at startup) ;internal_timing = yes ;systemname = my_system_name ; prefix uniqueid with a system name for global ;uniqueness issues ;maxcalls = 10 ; Maximum amount of calls allowed ;maxload = 0.9 ;Asterisk stops accepting new calls if the load average exceed this ;limit ;cache_record_files = yes ;Cache recorded sound files to another directory during ;recording ;record_cache_dir = /tmp ; Specify cache directory (used in cnjunction with ;cache_record_files) ;transmit_silence_during_record = yes ; Transmit SLINEAR silence while a channel is ;being recorded

436

;transmit_silence = yes ; Transmit SLINEAR silence while a channel is being recorded ;or DTMF is being generated ;transcode_via_sln = yes ; Build transcode paths via SLINEAR, instead of directly ;runuser = asterisk ; The user to run as ;rungroup = asterisk ; The group to run as ;dahdichanname = yes ; Channels created by chan_dahdi will be called 'DAHDI', ;otherwise 'Zap'

chan_dahdi.conf

Asterisk interpreta los canales definidos en dahdi-channels.conf a través de este fichero de configuración.

Como mínimo su contenido debe ser:

[channels] #include dahdi-channels.conf

cdr.conf

El archivo cdr.conf se utiliza para habilitar el registro de llamadas en una base de datos. El almacenamiento de los registros de llamadas es útil para todo tipo de propósitos, incluyendo la facturación, la prevención del fraude, las evaluaciones de calidad de servicio. Este fichero contiene algunos parámetros generales que no están especificados para cualquier base de datos, sino que indican cómo se deben manejar Asterisk en el paso de información a la base de datos. Todas estas opciones están en el contexto [general]:

batch : Acepta sí o no. Permite escribir datos en un buffer en lugar de escribir a la base de datos al final de cada llamada, para reducir la carga en el sistema. enable : Acepta sí o no. Especifica si utilizar o no el registro CDR. El valor por defecto es sí. safeshutdown :Acepta sí o no. Si safeshutdown = sí evitará queAsterisk se cierre por completo hasta que el buffer se vacíe y toda la información se escriba en la base de datos. Si este parámetro es No y se apaga Asterisk la información que aún residía en los buffers se perderá. scheduleronly :Acepta sí o no. Si está generando un gran volumen de CDR en un sistema que están guardándose en una base de datos remota, scheduleronly =sí puede beneficiarnos.

Dado que el scheduler no inicia una nueva tarea hasta que no finaliza la anterior y que el CDR escribe lentamente esto puede ser negativo para otros procesos que requieren dicho scheduler.

size :Acepta un entero .Define el número de CDRs a acumularse en el búfer antes de escribir en la base de datos. El valor por defecto es 100.

time :Accepts an integer (in seconds) as its argument. Sets the number of seconds before Asterisk flushes the buffer and writes the CDRs to the database, regardless of the number of records in the buffer (as defined by size ). Acepta un número entero (en segundos). Establece el número de segundos antes de que Asterisk vacíe el buffer y

437

escriba los CDRś en la base de datos. El valor por defecto es 300 segundos (5 minutos).

[general] ;batch=no ;enable=yes ;safeshutdown=yes ;scheduleronly=no ;size=100 ;time=300

cdr_manager.conf

El archivo cdr_manager.conf sólo contiene un contexto [general] y una única opción, activada, que se puede utilizar para especificar si la API de Asterisk Manager genera Eventos CDR.

[general] enabled = sí

Los eventos CDR contienen los campos siguientes: Event: Cdr AccountCode: Source: Destination: DestinationContext: CallerID: Channel: DestinationChannel: LastApplication: LastData: StartTime: AnswerTime: EndTime: Duration: BillableSeconds: Disposition: AMAFlags: UniqueID: UserField:

cdr_mysql.conf

Asterisk puede almacenar los datos de CDR en una base de datos MySQL configurando aquí los datos de dicha base de datos.De esta manera:

[global] hostname=127.0.0.1 dbname=nombredatabase table=cdr password=passdemysql user=mysqluser port=3306 sock=/tmp/mysql/mysql.sock

438

cdr_odbc.conf

Asterisk puede almacenar los datos de CDR en una base de datos local o remota a través de la interfaz ODBC. El archivo cdr_odbc.conf contiene la información que necesita Asterisk para conectarse a la base de datos. El módulo de cdr_odbc.so intentará cargar el archivo cdr_odbc.conf, y si esta la información para conectarse a la base de datos, los datos del CDR se registrarán allí. El archivo que se genera al hacer make samples en la instalación de Asterisk es:

;[global] ;dsn=MySQL-test ;username=username ;password=password ;loguniqueid=yes ;dispositionstring=yes ;table=cdr ;usegmtime=no

cdr_pgsql.conf

Asterisk puede almacenar los datos de CDR en una base de datos PostgreSQL a través del módulo cdr_pgsql.so. Cuando el módulo se carga la información necesaria se puede leer en el archivo cdr_pgsql.conf, y Asterisk se conectará a la base de datos PostgreSQL. El archivo que se genera al hacer make samples en la instalación de Asterisk es:

[global] ;hostname=localhost ;port=5432 ;dbname=asterisk ;password=password ;user=postgres ;table=cdr ;SQL table where CDRs will be inserted

cdr_tds.conf

Asterisk puede también almacenar los datos de los CDR en una base de datos FreeTDS (incluidos los de MS SQL) usando el módulo de cdr_tds.so. El archivo cdr_tds.conf se lee tras cargar el módulo y tras establecerse la conexión, los datos de CDR se escribirán en la base de datos. ;[global] ;hostname=fs.malico.loc ;port=1433 ;dbname=MalicoHN ;user=mangUsr ;password= ;charset=BIG5 ;table=cdr

439

codecs.conf

La mayoría de los códecs no tienen parámetros configurables. Sin embargo algunos códecs son capaces de comportarse de maneras diferentes. Esto significa principalmente que pueden ser optimizados para un objetivo particular. El archivo codecs.conf es bastante nuevo en Asterisk, y permite solamente la configuración de los parámetros de Speex . La configuración se explica por sí misma, mientras usted esté familiarizado con el protocolo Speex. Este fichero también le permite configurar el PLC (Packet Loss Ocultación). Es necesario definir un contexto [PLC] en la sección e indicar “genericplc => true”. Un ejemplo de este archivo es: [speex] ; CBR encoding quality [0..10] used only when vbr = false quality => 3 ; codec complexity [0..10] tradeoff between cpu/quality complexity => 2 ; perceptual enhancement [true / false] improves clarity of decoded speech enhancement => true ; voice activity detection [true / false] reduces bitrate when no voice detected, used ;only for CBR (implicit in VBR/ABR) vad => true ; variable bit rate [true / false] uses bit rate proportionate to voice complexity vbr => true ; available bit rate [bps, 0 = off] encoding quality modulated to match this target bit ;rate not recommended with dtx or pp_vad - may cause bandwidth spikes abr => 0 ; VBR encoding quality [0-10] floating-point values allowed vbr_quality => 4 ; discontinuous transmission [true / false] stops transmitting completely when silence ; is detected pp_vad is far more effective but more CPU intensive dtx => false ; preprocessor configuration these options only affect Speex v1.1.8 or newer enable ;preprocessor [true / false] allows dsp functionality below but incurs CPU overhead

preprocess => false ; preproc voice activity detection [true / false] more advanced equivalent of DTX, ;based on voice frequencies pp_vad => false ; preproc automatic gain control [true / false] pp_agc => false pp_agc_level => 8000 ; preproc denoiser [true / false] pp_denoise => false ; preproc dereverb [true / false] pp_dereverb => false pp_dereverb_decay => 0.4 pp_dereverb_level => 0.3 [plc]

; for all codecs which do not support native PLC this determines whether to perform ;generic PLC there is a minor performance penalty for this genericplc => true

440

dahdi_channels.conf

Este archivo se genera durante la configuración de DAHDI y contiene los datos de las tarjetas de las que disponemos, bien sean de RDSI/Primarios como de telefonía con varios puertos FXS y FXO. Podremos configurar el canal de cada una de estas.

dnsmgr.conf

Este archivo se utiliza para configurar Asterisk si se deben realizar búsquedas de DNS de forma regular, y para saber con qué frecuencia se deben realizar las operaciones de búsqueda.

[general] ;enable=yes ; enable creation of managed DNS lookups default is 'no' ;refreshinterval=1200 ; refresh managed DNS lookups every <n> seconds default is ; 300 (5 minutes)

dundi.conf

El protocolo de DUNDi se utiliza para buscar de forma dinámica direcciones de teléfonos VoIP y conectarse a ellas. A diferencia de ENUM, DUNDi no tiene autoridad central.

El [general] de dundi.conf contiene los parámetros relacionados con el funcionamiento global del cliente y el servidor de DUNDi:

[general] department=IT organization= toronto.example.com locality=Toronto stateprov=ON country=CA [email protected] phone=+19055551212 ; Specify bind address and port number.Default is 4520 El valor predeterminado ;es 4520 ;bindaddr=0.0.0.0 port=4520 entityid=FF:FF:FF:FF:FF:FF ttl=32 autokill=yes ;secretpath=dundi

enum.conf

El sistema ENUM (Electronic Numbering) se usa junto con el DNS para asignar E.164 a direcciones de correo electrónico, sitios web, direcciones de VoIP, etc.

Un número ENUM se crea en DNS invirtiendo el número de teléfono, la separación de cada dos dígitos con un punto, y anexar e164.arpa (la zona principal DNS). Si desea Asterisk para realizar búsquedas ENUM, es necesario configurar el dominio (s) en el que se van a realizar las búsquedas dentro del archivo enum.conf.

441

El fichero de ejemplo de enum.conf es:

[general] search => e164.arpa

extconfig.conf

Asterisk puede escribir los datos de configuración y cargar los datos de configuración en una base de datos utilizando el motor de configuración externa (también conocido como de tiempo real). Esto nos permite asignar entradas especiales en tiempo de ejecución que permiten la creación dinámica y la carga de objetos, entidades y peers. Estos mappings se asignan y se configuran en el archivo extconfig.conf, siendo utilizados tanto por res_odbc como en tiempo real.

extensions.conf

El archivo de configuración extensions.conf es seguramente el fichero más importante para la puesta en marcha de nuestra centralita. En él se define todo lo relacionado con el plan de llamadas. Cualquier número marcado desde una extensión será procesado dentro de este archivo. Está dividido en tres bloques:

• El contexto general donde se configuran algunos parámetros generales

• El contexto globals donde se definen las variables globales que se van a utilizar

en la centralita

• El resto donde queda toda la configuración de las llamadas

Aquí vamos a ver los dos primeros bloques:

[general] static=yes ; static = yes y writeprotect =no,hace que para guardar los cambios hechos ;desde la consola de Asterisk tendremos que escribir el comando dialplan reload. writeprotect=no ; En caso contrario se actualizará automáticamente pero ;perderemos todos los comentarios presentes en el archivo . autofallthrough=yes ; si es yes cuando alguna llamada, por algún motivo se sale del ;plan se terminará . priorityjumping=yes ; Algunas aplicaciones y/o funciones tienen la capacidad, bajo ;algunas circunstancias de "saltar" desde la prioridad donde se encuentran a otra ;prioridad . Si está en yes hará ese salto sino no.

[globals] DAVID = SIP/2100

En Globals configuramos las variables que queremos usar en el Dialplan, por ejemplo si llamamos a menudo un número y queremos configurarlo con una sigla o un nombre es en esta parte del archivo donde lo podemos hacer.

442

extensions.ael

La equivalencia del extensions.conf en AEL2.

features.conf

El archivo features.conf es donde vamos a configurar el parqueo de las llamadas y asignar una función a una determinada combinación de teclas. Es aquí, por ejemplo, donde definimos cuales son las teclas que tenemos que hundir para transferir una llamada, grabarla, iniciar una aplicación, y muchas más.

[general] parkext => 700 ; La extensión donde transferir la llamada a parquear parkpos => 701-710 ; el numero de extensiones reservadas para parquear las llamadas . context => parkedcalls ; el contexto usado para parquear las llamadas (luego hay que ; definirlo en extension.conf). parkinghints = yes ; si está en yes podemos monitorear las extensiones para ver el ; parking. parkingtime => 45 ; Numero de segundos después de los cuales la llamada parqueada es ; transferida a la extensión definida por el próximo parámetro. comebacktoorigin = yes ; si está en yes la llamada parqueda, después del parkingtime, ; vuelve a la extensión que la parqueó, si está en no la llamada ; será transferida al contexto parkedcallcallstimeout a la ; extensión 's' y la prioridad '1' que tendremos que crear en ; extensions.conf. courtesytone = beep ; El sonido que será enviado a la llamada parqueada cuando alguien ; la llama o cuando empieza y termina la grabación de la llamada . parkedplay = caller ; A quien enviar el beep cuando se llama la extensión parqueada. ; Puede ser: parked(canal parqueado), caller(llamante) o both(ambos) . parkedcalltransfers = caller ; Habilita o deshabilita la secuencia de tonos para transferir ; la llamada cuando es una llamada parqueada. Puede ser: ; habilitar para: callee(llamado), caller (llamante)o both ; (ambos). Si se quiere deshabilitar hay que poner no. parkedcallreparking = caller ; Habilita o deshabilita la secuencia de tonos para parquear ; una llamada cuando era ya una llamada parqueada. Puede ; ser: habilitar para: callee(llamado), caller (llamante)o ; both(ambos). Si se quieres deshabilitar hay que poner no. parkedmusicclass=default ; La clase de música en espera que escuchará la extensión que ; ha sido parqueada. transferdigittimeout => 5 ; Numero de segundos de espera entre cada dígito cuando se ; esta transfiriendo una llamada. xfersound = beep ; El sonido que indicará que la transferencia de la llamada "asistida" se ; completó. xferfailsound = beeperr ; El sonido que indicará que la transferencia de la llamada fracasó pickupexten = *8 ; Secuencia a marcar para poder recibir una llamada de un usuario de tu ; mismo grupo. featuredigittimeout = 2000 ;numero de milisegundos entre cada dígito cuando se activan ; le funcionalidades que veremos más adelante. atxfernoanswertimeout = 15 ; Tiempo máximo para contestar una llamada transferida . atxferdropcall = no ; Si quien transfiere una llamada con el método "asistido" (indicando a ; quien trasfiere) cuelga antes que la llamada sea transferida ; completamente, Asterisk devuelve la llamada a quien la estaba ; transfiriendo. Si está en yes la llamada no se devuelve y se ; considera terminada. atxferloopdelay = 10 ; Numero de segundos de espera antes de devolver la llamada (si

443

; atxferdropcall = no) atxfercallbackretries = 2 ; Las veces que se intentará devolver la llamada. ;Si en sip.conf tenemos el parámetro careinvite igual a yes es probable que las funcionalidades ; que veremos en el contexto siguiente no resulten. [featuremap] blindxfer => # ; la tecla que hay que marcar para empezar la transferencia de una llamada .Tras ; marcar esta secuencia marcamos la extensión a transferir. disconnect => * ; la tecla que hay que marcar para terminar la llamada . automon => *1 ; La secuencia de teclas que hay que hundir para grabar la llamada (en dos ; archivo, uno para cada interlocutor) . atxfer => *2 ; La secuencia de teclas para una transferencia de llamada "asistida". Tras marcar ; esta secuencia marcamos la extensión a transferir. La diferencia con blindxfer es ; que nos permite hablar con el interlocutor al que le transferiremos la llamada . parkcall => *7 ; La secuencia de teclas para parquear la llamada. Podemos usar esta secuencia ;o transferir directamente la llamada a la extensión 700. automixmon => *3 ; La secuencia de teclas que hay que marcar para grabar la llamada en un ; único archivo mezclando las voces de los dos interlocutores. ; En el siguiente contexto del archivo podemos añadir funcionalidades particulares que luego ; podremos usar a lo largo de una llamada.

[applicationmap] ; la sintaxis para estas funcionalidades es: ;<FeatureName> => <DTMF_sequence>,<ActivateOn>[/<ActivatedBy>], <Application> ;[,<AppArguments>[,MOH_Class]] ; FeatureName -> El nombre de la funcionalidad; ; DTMF_sequence -> la secuencia de teclas para activar la funcionalidad. ; ActivateOn -> Aquí se define para quien activar la funcionalidad. Los valores son self y peer. ; Con self la funcionalidad se activa para quien la requiere, con peer para el otro canal. ; ActivatedBy -> Este parámetro define quien tiene acceso a la funcionalidad. Las opciones son: ; caller (llamante), callee (llamado) o both (ambos). ;Predefinido es both. ;Application -> La aplicación que se va a ejecutar. ;AppArguments -> Las opciones que queremos usar con la aplicación. ; MOH_Class -> la clase de música en espera que escuchará el canal libre mientras se ejecuta la ; funcionalidad.

festival.conf

La aplicación Festival permite a Asterisk pasar de texto a voz .Tras la instalación de la aplicación la configuración del fichero festival.conf es sencilla, estas son la líneas que hay que modificar/activar: [general] host=localhost port=1314 festivalcommand=(tts_textasterisk "%s" 'file)(quit)\N

followme.conf

El archivo followme.conf se utiliza para configurar La aplicación FollowMe ().Este archivo nos permite hacer una cosa muy sencilla: definir una serie de números (extensiones) donde desviar la llamada si a la extensión predefinida nadie contesta o si ha sido activada esta opción. Claramente si el desvío es hacia otras extensiones internas no tendrá ningún costo, si lo hacemos hacia números fijos y/o móviles para

444

hacer la llamada tendremos que utilizar proveedores VoIP o la línea de telefonía tradicional (PSTN). [general] featuredigittimeout=>5000 ; numero de milisegundos que tiene el llamado para aceptar o ; rechazar la llamada . takecall=>1 ; para aceptar la llamada, el llamado, después de descolgar, tendrá que hundir la ; tecla 1 del teléfono. declinecall=>2 ; para rechazarla la tecla 2 . call-from-prompt=>followme/call-from ; esta es la voz predefinida que escuchará el llamado ; anunciándole quien lo está llamando norecording-prompt=>followme/no-recording ; la voz predefinida si el llamante no ha ; registrado el propio nombre o si la opción ; para registrarlo no ha sido activada . ;options-prompt=>followme/options ; esta voz anunciará al llamado que tendrá que pulsar 1 ; para aceptar la llamada y dos para rechazarla. pls-hold-prompt=>followme/pls-hold-while-try ; El llamante escuchará esta voz que le dirá ;que espere mientras se intentará localizar el llamado . status-prompt=>followme/status ; Esta voz anunciará al llamante que la persona llamada no ;se encuentra en ese momento en su oficina/casa/etc. sorry-prompt=>followme/sorry ; si al final de todos los desvíos nadie contestará la llamada, ; esta voz anunciará al llamante que no se ha podido localizar ; la persona buscada. ;Ahora empieza la configuración específica de cada extensión. En este ejemplo definiremos a ; que números llamaremos si la extensión 1000 no contesta. [1000] ; numero de la extensión que queremos configurar. musicclass=>default ; tipo de música en espera que escuchará el llamante mientras se ; intentará localizar el destinatario de la llamada. context=>default ; el contexto que usará la aplicación followme para localizar el llamado. Si ; hemos incluido (como veremos más abajo) números fijos y moviles este ; contexto tiene que tener acceso a las llamadas externas. number=>1100,15 ; Aquí empieza la lista de números que se intentará llamar para localizar el ; destinatario de la llamada. En este ejemplo si el destinatario no contesta a ; la extensión 1000 llamaremos como segunda opción la extensión 1100 en ; 15 segundos. number=> 945000000,15;si a la extensión 1100 nadie contesta intentaremos llamar el número ; fijo que aparece en esta línea en otros 15 segundos. takecall=>1 ; ahora sigue los mismo parámetros que hemos visto en la parte general. Por si ; queremos personalizarlos para esta extension. declinecall=>2 call-from-prompt=>followme/call-from followme-norecording-prompt=>followme/no-recording followme-options-prompt=>followme/options followme-pls-hold-prompt=>followme/pls-hold-while-try followme-status-prompt=>followme/status followme-sorry-prompt=>followme/sorry

func_odbc.conf

La función func_odbc proporciona un mecanismo sencillo para conectarse a bases de datos ODBC mediante el Dialplan. Las consultas SQL se definen en el presente archivo de configuración, y una función Dialplan se crea automáticamente. El fichero de configuración que genera Asterisk al hacer make samples en su instalación es:

445

; ODBC_SQL - Allow an SQL statement to be built entirely in the dialplan [SQL] dsn=mysql1 read=${ARG1} ; ODBC_ANTIGF - A blacklist. [ANTIGF] dsn=mysql1 read=SELECT COUNT(*) FROM exgirlfriends WHERE callerid='${SQL_ESC(${ARG1})}' ; ODBC_PRESENCE - Retrieve and update presence [PRESENCE] dsn=mysql1 read=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}' write=UPDATE presence SET location='${SQL_ESC(${VAL1})}' WHERE id='${SQL_ESC(${ARG1})} ;prefix=OFFICE ; Changes this function from ODBC_PRESENCE to OFFICE_PRESENCE ;escapecommas=no ; Normally, commas within a field are escaped such that each ;field may be separated into individual variables with ARRAY. ;This option turns that behavior off [default=yes].

gtalk.conf

Este archivo es utilizado para especificar los parámetros para la conexión con Google Talk. El fichero de configuración que genera Asterisk al hacer make samples en su instalación es: ;[general] ;context=default ;allowguest=yes ;[guest] ;disallow=all ;allow=ulaw ;context=guest ;[ogorman] ;[email protected] ;disallow=all ;allow=ulaw ;context=default ;connection=asterisk

http.conf

Como ya se explico en el apartado AMI y AJAM Asterisk posee un demonio HTTP muy sencillo, que es utilizado por el Asterisk GUI y AJAM. El fichero de configuración que genera Asterisk al hacer make samples en su instalación es: [general] ;enabled=yes ;enablestatic=yes bindaddr=127.0.0.1 bindport=8088 ;prefix=asterisk ; Prefix allows you to specify a prefix for all requests to the server. ;The default is "asterisk" so that all requests must begin with /asterisk.

446

;[post_mappings] ;uploads = /var/lib/asterisk/uploads/

iax.conf

Similar a sip.conf, el archivo iax.conf es donde se configuran las opciones relacionadas con el protocolo IAX. [general] bindport=4569 ; el puerto UDP usado por este protocolo. Este parámetro va configurado antes ; del bindaddr. bindaddr=192.168.1.200 ; la IP que Asterisk usará para "escuchar" los pedidos de conexiones. ;0.0.0.0 para todas las IP del computador. delayreject=yes ; Mejora la seguridad contra "brute force password attacks" retrasando el ; envío de los rechazos de autenticación. srvlookup=yes ; permite una gestión optimizada de los DNS . accountcode=lss0101 ;genera una cuenta general con la cual grabar las llamadas. language=en ; lenguaje predefinido de la voces (ingles). disallow=all ; desactivamos todos los codecs (audio y video). allow=ulaw ; definimos unos cuantos codecs de audio predefinido's para todas las extensiones. allow=alaw allow=gsm

;Ahora empezamos con la configuración de las extensiones iax2.

[guest] ; dejamos esta parte si queremos configurar un usuario huésped (sin contraseña) type=user ; puede solo recibir llamadas . context=default ; el contexto que usará en extensions.conf . callerid="Guest IAX User" ; el identificativo del usuario huésped.

;Ahora configuramos una extensión de prueba

[david] type=friend ; tipo friend es peer y user a la vez . host=dynamic ; si el cliente no se conecta siempre desde un IP ;determinado hay que indicar dynamic . secret=password ;contraseña . context=default ; contexto asociado a este usuario en extensions.conf mailbox= 1234@default ; casilla del correo de voz del usuario. qualify=yes; para averiguar periódicamente con un ping si el usuario está conectado al ;servidor. callerid = "marko" ; identificativo de llamada del usuario.

iaxprov.conf

Este archivo es utilizado por Asterisk para la actualización del firmware del dispositivo IAXy.

indications.conf

El archivo de indications.conf se usa para indicarle a Asterisk cómo generar los distintos tonos característicos de diferentes partes del mundo, ya que un tono de llamada en Inglaterra es diferente de un tono de marcado en Canadá. Este archivo consta de una lista de sonidos de un sistema de teléfono que pueden ser necesitados (tono de llamada, señales de ocupado, y así sucesivamente), seguida por las

447

frecuencias utilizadas para generar esos sonidos. Por defecto Asterisk utiliza los tonos comunes de Estados Unidos. Como ejemplo aquí tenemos los tonos de España y los de Estados Unidos: [general] country=es ; default location [es] description = Spain ringcadence = 1500,3000 dial = 425 busy = 425/200,0/200 ring = 425/1500,0/3000 congestion = 425/200,0/200,425/200,0/200,425/200,0/600 callwaiting = 425/175,0/175,425/175,0/3500 dialrecall = !425/200,!0/200,!425/200,!0/200,!425/200,!0/200,425 record = 1400/500,0/15000 info = 950/330,0/1000 dialout = 500 [us] description = United States / North America ringcadence = 2000,4000 dial = 350+440 busy = 480+620/500,0/500 ring = 440+480/2000,0/4000 congestion = 480+620/250,0/25 callwaiting = 440/300,0/10000 dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 record = 1400/500,0/15000 info = !950/330,!1400/330,!1800/330,0 stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,! 350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440

jabber.conf

El archivo jabber.conf especifica la información necesaria para permitir que Asterisk interactue con un servidor XMPP (Jabber). El fichero que Asterisk genera durante su instalación al hacer make samples es: [general] ;debug=yes ;;Turn on debugging by default. ;autoprune=yes ;;Auto remove users from buddy list. ;autoregister=yes ;;Auto register users from buddy list. ;[asterisk] ;type=client ;;Client or Component connection ;serverhost=astjab.org ;;Route to server for example, talk.google.com ;[email protected]/asterisk ;;Username with optional roster. ;secret=blah ;;Password ;port=5222 ;;Port to use defaults to 5222 ;usetls=yes ;;Use tls or not ;usesasl=yes ;;Use sasl or not ;[email protected] ;;Manual addition of buddy to list. ;statusmessage="I am available" ;;Have custom status message for ;;Asterisk. ;timeout=100 ;;Timeout on the message stack.

448

logger.conf

En el archivo logger.conf es donde vamos a configurar todos los registros (/var/log/asterisk/) de las actividades de Asterisk. Tiene dos secciones, [general] y [logfile]. [general] ; si queremos que cada archivo de registro termine con el nombre de nuestro dominio tenemos ; que activar el parámetro que siguiente. appendhostname = yes ; con queue_log decidimos si queremos tener un registro de las colas de espera (predefinido es ;yes). queue_log = yes ; El nombre del archivo donde guardamos los registros de las colas en ;espera (predefinido queue_log) queue_log_name = queue_log ; Los archivos de registro se pueden volver de un tamaño ;bastante grande volviendo poco cómoda su consulta. Para evitar esto podemos usar el ; programa logrotate. En esta parte del archivo decidimos como queremos "rotar" los archivos. ; de este modo el archivo más viejo tendrá el numero secuencial más alto. rotatestrategy = rotate ; De manera predefinida Asterisk registra en un archivo los eventos genéricos . event_log = yes

[logfiles] ;El [logfiles] define los tipos de información que desea registrar. Hay filas múltiples ; para la varios bits de información que se registran y se fuera necesario para las ; entradas de registro por separado en archivos diferentes. El formato general para las ; líneas en el [logfiles] es : filename=> nivels, donde filename es el nombre del archivo ; donde se guarda la información registrada y los niveles son los tipos de información ;que se desea guardar. ; Podemos registrar en cada archivo y consola los siguientes eventos: debug ,notice ,warning ; error,verbose ,dtmf console => notice,warning,error,debug,dtmf messages => notice,warning,debug full => error

manager.conf

La interfaz de Asterisk Manager es una API que los programas externos pueden utilizar para comunicarse y controlar Asterisk igual que si lo haría desde la consola de Asterisk. El Manager le da a los programas la capacidad de ejecutar comandos y solicitar información desde el servidor de Asterisk. Sin embargo, no es muy seguro y por esto sólo debe utilizarse en una red de área local de confianza y negar el permiso de construcciones permitiendo restringir el acceso a determinadas extensiones o subredes. Un ejemplo del manager.conf es:

[general] enabled = yes port = 5038 bindaddr = 127.0.0.1

449

[admin] secret = amp111 deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.0 read = system,call,command,agent,user,originate write = system,call,command,agent,user,originate

meetme.conf

MeetMe() es una de las aplicaciones más notables de Asterisk. Le permite crear salas de conferencias de audio. Este concepto bastante simple ha demostrado ser extremadamente costoso de implementar en todas las PBX de otros, pero lo que parece ser un gran negocio para ellos es fácil en Asterisk. Ya sea mediante el uso de un servidor dedicado, o mediante el uso de un servicio, Asterisk ofrece esta funcionalidad como una aplicación estándar. El meetme.conf sirve para crear estáticamente conferencias: [general] audiobuffers=32 ; Numero de paquetes audio de 20ms que serán guardados en un buffer de ; memoria cuando pertenecen a canales que no son DADHI. Esto permite sincronizar el audio de ; los distintos participantes y evitar retrasos. Puede ser un valor entre 2 y 32 . schedule=yes ; con este parámetro le decimos a Asterisk que las conferencias pueden ser ; programadas (solamente en realtime). logmembercount=yes ; este parámetro sirve para actualizar el realtime cada vez que un ; usuario entra/sale de una conferencia. fuzzystart=300 ; Tenemos una conferencia programada a las 8 de la mañana. Este parámetro ; sirve para definir si un usuario puede o no entrar a la conferencia si esta no ha empezado. 300 ; es el numero de segundos. Ejemplo. Si el usuario entra a la 7:55 será aceptado porque puede ; entrar hasta 5 minutos (300 segundos) antes del comienzo de la conferencia. Si entra a las ; 7:50 será rechazado. earlyalert=3600 ; Este valor (siempre en segundos) define si al usuario que intenta entrar en ; una conferencia programada le será anunciado o no que la conferencia todavía no ha ; empezado. Si entra cuando falta menos de una hora recibirá este aviso. Si entra más de ;una hora antes se le anunciará que la conferencia no existe. endalert=120 ; cuando faltarán 120 segundos para terminar la conferencia programada, se le ; anunciará a todos los participantes.

[rooms] ; desde esta etiqueta empieza la configuración de las conferencias . ; la sintaxis es conf => confno[,pin][,adminpin] ;un cuarto de conferencias cuya extensión es 3500 y a todos los usuarios es permitido entrar. conf => 3500 ;Un cuarto de conferencias cuya extensión es la 3501 y para entrar los usuarios tendrán ; que marcar el PIN 1234. conf => 3501,1234 . ;En esta conferencia los usuarios tendrán que usar el PIN 1234 y los ;administradores el PIN 5678. conf => 3502,1234,5678

mgcp.conf

El protocolo MGCP (Media Gateway Control Protocol ) está prácticamente obsoleto probablemente debido al hecho de que la SIP ha robado la atención a los demás

450

protocolos VoIP (excepto al IAX, por supuesto). Debido a esto, para utilizar en Asterisk un canal de MCGP en un entorno de producción debe estar preparado para llevar a cabo extensas pruebas, estar dispuestos a pagar por tener características y parches y si tienen conocimientos altos sobre el protocolo. Dicho esto, no estamos dispuestos a pronunciar que MGCP ha muerto y es que muchos creen que MGCP va a llenar un hueco o vacío que todavía no ha sido descubierto...

musiconhold.conf

El archivo de musiconhold.conf se utiliza para configurar las diferentes clases de música y sus ubicaciones para su uso en aplicaciones de música en espera.

osp.conf

El OSP (Open Settlement Protocol) está un documentado oficialmente en ETSI TS 101 321 un Instituto Europeo de Normas de Telecomunicación (ETSI), que salió de la labor de la TIPHON grupo de trabajo. oss.conf

El archivo de oss.conf se utiliza para usar el OSS (Open Sound System) y permitir la comunicación con una tarjeta de sonido compatible. Es similar a ALSA pero es este último el preferido.

phone.conf

El archivo phone.conf se utiliza para configurar una tarjeta de QuickNet PHONEJACK. La tarjeta de PHONEJACK parece proporcionar algo así como una interfaz FXS, en la que puede conectar un teléfono analógico y pasar las llamadas a través de Asterisk. El fichero de ejemplo de Asterisk es: [interfaces] mode=immediate ;mode=dialtone ;mode=fxo ;mode=sig format=slinear ;format=g723.1 echocancel=medium ;silencesupression=yes ;context=local ;txgain=100% ;rxgain=1.0 ;device => /dev/phone0

451

privacy.conf

El archivo de privacy.conf se utiliza para controlar el número máximo de intentos que un usuario tiene de introducir su número telefónico. La aplicacion PrivacyManager () es la que determina si un identificador de llamadas se establece para la llamada entrante. [general] maxretries = 2

queues.conf

Asterisk proporciona como funcionalidad básica un sistema de colas. Usted puede hacer esto en el archivo de personalización queues.conf.

[general] persistentmembers = yes ; si usamos agentes dinámicos su configuración se guardará ; en la base de datos de Asterisk. De esta forma si Asterisk se vuelve a arrancar, cada ; agente será enrutado a su correspondiente cola. keepstats = no ; mantiene las estadísticas de la cola durante un “reload” de Asterisk autofill = yes ; normalmente una cola funciona de la siguiente manera. Hay unos ; cuantos usuarios esperando por ser atendidos por los agentes. Cuando el usuario que ; está de primero en la cola es atendido el segundo se vuelve primero y será atendido ; por el primer agente disponible. Este comportamiento no tiene en cuenta del hecho ; de que pueden haber muchos agentes disponibles pero que cada usuario tendrá que ; esperar a estar el primero de la lista para ser atendido. Con este parámetro definimos ; otro tipo de comportamiento. Los usuarios serán atendidos como se ha explicado ; hasta que haya agentes disponibles . monitor-type = MixMonitor ; si vamos a grabar las conversaciones, con este parámetro ; los archivos audios de los dos canales serán mesclados en uno solo. shared_lastcall=yes ; en el caso de agentes que pertenecen a más de una cola ; poniendo a yes este parámetro se respetarán los tiempos de espera entre las distintas ; colas.

res_mysql.conf

Este archivo funciona igual al cdr_mysql.conf pero a tiempo real y por tanto la configuración es muy similar:

[general] dbhost=127.0.0.1 dbname=nombredatabase dbuser=mysqluser dbpass=passmysql dbport=3306 dbsock=/tmp/mysql/mysql.sock

res_odbc.conf

El propósito del módulo de res_odbc.so es almacenar información en la base de datos y recuperar esa información. El archivo res_odbc.conf específica cómo hay que acceder a la tabla en la base de datos. El archivo extconfig.conf, ya explicado, se utiliza para

452

determinar la forma de conectarse a la base de datos.

res_snmp.conf

El archivo res_snmp.conf se utiliza para configurar el soporte de SNMP en Asterisk. Hay dos opciones en el contexto general. La opción de subagente res_snmp especifica si debe ejecutar como un sub-agente o como un agente SNMP completo. Asterisk por como un sub-agente. La otra opción es la enabled que especifica si está habilitado el soporte SNMP en Asterisk.El valor por defecto es no. Este es un ejemplo del archivo:

[general] subagent = yes enabled = yes

rpt.conf

El archivo rpt.conf se utiliza para configurar el proyecto más reciente de Jim Dixon, Jim’s Radio Repeater Application (app_rpt), Asterisk permite comunicarse usando VoIP a través de un repetidor de radio .Esto permite a la gente tener una gran área de cobertura inalámbrica.

rtp.conf

El archivo rtp.conf controla el protocolo RTP (Real-time Transport Protocol). El protocolo RTP es utilizado por SIP, H.323, MGCP, y posiblemente otros protocolos para el transporte de datos entre los extremos. El archivo rtp.conf por defecto usa el rango de puertos RTP entre 10.000 y 20.000. Sin embargo, puede que la apertura de un rango tal alto puertos no se cómoda por esto usted puede limitar el rango de puertos RTP cambiando los límites superior e inferior en el archivo de rtp.conf. Por cada llamada SIP bidireccional entre dos extremos, cinco puertos se utilizan generalmente:

• Puerto 5060 para la señalización SIP.

• 2 Puertos RTP: Un puerto para el flujo de datos y un puerto para el Real-Time

Control Protocol (RTCP) en una dirección, y otros dos en la dirección opuesta.

El fichero de rtp.conf tiene este aspecto: [general] rtpstart = 10000 rtpend = 20000 rtpchecksums = no ;Control de las cuentas RTP

453

say.conf

El archivo say.conf se utiliza para configurar reglas de gramática de la lengua hablada de aplicaciones, tales como SayNumber (). Si usted está buscando usar Asterisk en un idioma que actualmente no se admite, puede solucionarlo en la configuración de este archivo.

sip.conf

El archivo sip.conf define todas las opciones de protocolo SIP para Asterisk. La autenticación para los puntos finales, tales como teléfonos SIP y proveedores de servicios, también se configuran en este archivo.

sip_notify.conf

Asterisk tiene la capacidad de reiniciar un teléfono SIP de forma remota mediante el envío de un mensaje especial.El teléfono recibe este evento, que se interpreta como una solicitud de reinicio. Varios fabricantes permiten esto pero solamente se ha testeado para los teléfonos Polycom. Un ejemplo: [polycom-check-cfg] Event=>check-sync Content-Length=>0

skinny.conf

Si desea conectar teléfonos que utilizan la patente de Cisco puede utilizar este archivo para definir los parámetros y los canales de que va a usar.

sla.conf

A pesar de que Asterisk es una centralita moderna, mucha gente todavía quiere que se comporte como un viejo sistema de claves con las líneas compartidas. Asterisk puede emular un sistema de claves compartidas mediante la configuración del sla.conf.

smdi.conf

Este archivo configura SMDI (Station Message Desk Interface). SMDI es una opción muy útil a Asterisk, ya que le permitirá actuar como un sistema de correo de voz. El archivo de ejemplo que proporciona Asterisk es: [interfaces] ;twostopbits = no ;charsize = 7 ;paritybit = even ;baudrate = 1200 ;msdstrip = 0 ;msgexpirytime = 30000 ;smdiport => /dev/ttyS0

454

[mailboxes] ;pollinginterval=10 ; Syntax: ; <SMDI mailbox ID>=<Asterisk Mailbox Name>[@Asterisk Voicemail Context] ;smdiport=/dev/ttyS0 ;2565551234=1234@vmcontext1 ;2565555678=5678@vmcontext2 ;smdiport=/dev/ttyS1 ;2565559999=9999

udptl.conf

Este archivo se usa para la configuración los paquetes de UDPTL, uno de los transportes utilizados por T.38 (fax)a través de conexiones IP. El fichero por defecto es: [general] udptlstart=4000 udptlend=4999 ;udptlchecksums=no T38FaxUdpEC = t38UDPFEC ;T38FaxUdpEC = t38UDPRedundancy T38FaxMaxDatagram = 400 udptlfecentries = 3 udptlfecspan = 3

users.conf

Con la aparición de la GUI de Asterisk, sus desarrolladores encontraron que sería útil para crear un archivo de configuración donde las cuentas de usuario se pudieran especificar, en lugar de tener las diferentes piezas que se reparten entre el extensions.conf , sip.conf y voicemail.conf , entre otros. Este archivo se actualiza por la GUI de Asterisk, cuando se añaden los nuevos usuarios o cuando se modifica la configuración de un usuario. El archivo de ejemplo es el siguiente: [general] ; Full name of a user fullname = New User ; Starting point of allocation of extensions userbase = 6000 ; Create voicemail mailbox and use use macro-stdexten hasvoicemail = yes ; Set voicemail mailbox 6000 password to 1234 vmsecret = 1234 ; Create SIP Peer hassip = yes ; Create IAX friend hasiax = yes ; Create H.323 friend

455

;hash323 = yes ; Create manager entry hasmanager = no ; Set permissions for manager entry (see manager.conf.sample for ; documentation) (defaults to *all* permissions) ;managerread = system,call,log,verbose,command,agent,user,config ;managerwrite = system,call,log,verbose,command,agent,user,config ; Remaining options are not specific to users.conf entries but are general. callwaiting = yes threewaycalling = yes callwaitingcallerid = yes transfer = yes canpark = yes cancallforward = yes callreturn = yes callgroup = 1 pickupgroup = 1 ;[6000] ;fullname = Joe User ;email = [email protected] secret = 1234 ;zapchan = 1 ;hasvoicemail = yes ;vmsecret = 1234 ;hassip = yes ;hasiax = no ;hash323 = no ;hasmanager = no ;callwaiting = no ;context = international

voicemail.conf

En el archivo voicemail.conf es donde se configura todo lo relacionado con el buzón de voz. Si recibimos una llamada y no contestamos o la línea está ocupada, entrará en función el contestador, grabará el mensaje de voz dejado por quien llama y nos enviará un correo electrónico para avisarnos. Además podemos anexar el mensaje de voz al correo electrónico en el formato audio que nos más guste.

[general] format=gsm|wav ; el codec audio utilizado para grabar los mensajes ; de voz dejados en el contestador . [email protected] ; el remitente del correo electrónico ; que nos avisa de un nuevo mensaje de voz. attach=yes ; Si attach está en yes el mensaje de voz se enviará como anexo al ; correo maxmsg=100 ; numero máximo de mensajes de voz para cada casilla ; configurada . maxsecs=300 ; numero máximo de segundos por cada mensaje de voz. minsecs=3 ; numero mínimo de segundos para que un mensaje de voz sea ; reconocido como tal y enviado a la casilla del destinatario. maxgreet=60 ; podemos grabar un mensaje de bienvenida para nuestro ; buzon de voz personal. Este parámetro define la duración máxima ; del mensaje .

456

skipms=3000 ; cuando escuchamos los mensaje de voz, si esta configurado, ; podemos usar el teclado para adelantar o atrasar el mensaje ; mismo. Por ejemplo: hundiendo el numero 8 nos ; adelantamos 3000 milisegundos, es decir 3 segundos, con el 9 ; nos devolvemos de 3 segundos. maxsilence=10 ; si mientras se graba un mensaje de voz hay un silencio de 10 ; segundos, la llamada se termina y también la grabación. silencethreshold=128 ; este numero representa el nivel de audio y sirve para ; definir que se considera silencio. Más bajo el numero, ; más sensible al ruido. maxlogins=3 ; numero máximo de veces que nos podemos equivocar ; insertando la contraseña para entrar a nuestra buzon de voz . moveheard=yes ; Una vez escuchados los mensajes de voz podemos pasarlos ; a la carpeta OLD (viejos) automáticamente sino tenemos ; que hacerlo desde el menú del contestador. userscontext=default ; el contexto predefinido para los usuarios de las ; casillas de voz . ;externnotify=/usr/bin/myapp ; si cada vez que recibimos un mensaje de ; voz queremos arrancar un programa tenemos que ; configurarlo aquí. ;smdienable=yes ; esto es para configurar SMDI (Simple Message Desk ; Interface). ;smdiport=/dev/ttyS0 ;externpass=/usr/bin/myapp ; Si queremos que un programa arranque cada ; vez que cambiamos la contraseña de nuestro ; buzon de voz tenemos que configurarlo aquí. ;externpassnotify=/usr/bin/myapp ; si externpass está configurado ; queremos que la contraseña se actualice también ; en voicemail.conf tenemos que configurar este ; parámetro. directoryintro=dir-intro ; el mensaje de introducción de la aplicación ; directory (para buscar las extensiones en la ; centralita). charset=ISO-8859-1 ; el estándar ISO para los mensajes de texto que ; se enviaran para notificar la llegada de un nuevo ; mensaje de voz. pbxskip=yes ; quitar la abreviación [PBX] en el remitente del mensaje . fromstring=David ; el nombre que aparecerá como remitente del correo ; electrónico. usedirectory=yes ; Los mensajes de voz que recibimos podemos reenviarlos a ; otro usuario/extension del servidor Asterisk. También ; podemos dejar directamente mensajes de voz en ; determinados buzones. Esta opción permite buscar en el ; directorio la persona a la que queremos dejar o reenviar el ; correo de voz. ;odbcstorage=asterisk ;podemos guardar los mensajes de voz en un base de ; datos usando el driver ODBC. Aquí es donde hay que ; configurar esta opción. ;odbctable=voicemessages; el nombre de la tabla de la base de datos donde ; guardar los mensajes de voz

; Change the from, body and/or subject, variables: ; VM_NAME, VM_DUR, VM_MSGNUM, VM_MAILBOX, VM_CALLERID, ;VM_CIDNUM, VM_CIDNAME, VM_DATE ;Todo el bloque de arriba son las variables y el texto del correo electrónico que ; enviaremos para notificar la llegada de un nuevo mensaje de voz. Lo ; podemos modificar y adaptarlo a nuestras exigencias.

457

pagerfromstring= ; si enviamos un aviso también a un Pager esta línea define ; el remitente del mensaje. pagersubject=Nuevo VM ; el objeto del mensaje al Pager. pagerbody=Nuevo mensaje de ${VM_DUR} de duración en la casilla ${VM_MAILBOX}\nde ;${VM_CALLERID}, en ${VM_DATE} ; el cuerpo del ; mensaje. mailcmd=/usr/sbin/sendmail -t ; sendmail es el programa predefinido para ; enviar los correos electrónicos.

; Si en lugar ODBC queremos usar el protocolo IMAP para guardar nuestros ; mensajes de voz, aquí va indicada la ;configuración.

;imapgreetings=no; para guardar el mensaje de bienvenida en la carpeta de ; IMAP. Igual a no si no usamos IMAP .

;greetingsfolder=INBOX ; Si imapgreetings es igual a yes aquí es donde ; definimos la carpeta donde guardar el mensaje audio de bienvenida .

;imapparentfolder=INBOX ; si queremos crear una carpeta dentro de la ; carpeta INBOX para cada buzon de voz.

tz=central ; huso horario predefinido para indicar la fecha y la hora del correo ; de voz recibido.

attach=yes; Si es igual a yes el mensaje de voz se anexará al correo ; electrónico de notifica.

attachfmt=wav El formato audio con que se enviará el mensaje audio anexo ; al correo electrónico. saycid=yes; Si es igual a yes antes de escuchar el correo de voz se escuchará el identificativo (numero de teléfono o extensión) de quien lo dejó. sayduration=no; Anunciar o no la duración del correo de voz saydurationm=2; Definir la duración mínima del correo de voz para que sea ; anunciada (en minutos). dialout=phones; Contexto de utilizar para efectuar llamadas desde el menú ; del contestador [opción 4 del menú avanzado]. sendvoicemail=yes ; permitir o no de enviar un correo de voz a otra ; extensión [opción 5 del menú avanzado]. ; callback=fromvm; Contexto para llamar desde el menú del buzón de voz al ; remitente de un mensaje de voz. ; exitcontext=fromvm ; Contexto donde enviar el usuario si mientras ; usa los menú del buzon oprime el tecla * o 0. review=yes; Si es igual a yes permite a quien está dejando un correo de voz ; de escucharlo antes de enviarlo. ; operator=yes; permite a quien llama de presionar 0 ; antes/después/mientras está dejando un correo de voz para buscar una ; operadora. ; envelope=no ; antes de reproducir el mensaje audio, reproduce los datos ; del mensaje. ; delete=yes; Si es igual a yes y activado una vez que se notifique la llegada de ; un correo de voz, éste se borrará del servidor. ; volgain=0.0; si el correo de voz se grabó con un volumen muy bajo con esta ; opción podemos mejorar su calidad. Para que se pueda utilizar debemos ; tener instalado sox. ; nextaftercmd=yes; ir al correo de voz que sigue si presionamos las teclas 7 ; o 9 (borrar/ guardar el mensaje corriente). forcename=yes; Obligar a cada usuario con buzon de voz a grabar su ; nombre la primera vez que accede. Un usuario se considerará nuevo si su ; contraseña coincide con el numero de su extensión. forcegreetings=no; parecido al de arriba. Obliga al nuevo usuario a grabar un

458

; mensaje de bienvenida. hidefromdir=no; el usuario no aparecerá en el directorio. tempgreetwarn=yes; recordar al usuario que el mensaje de bienvenida ; temporáneo es él que se está usando. ;vm-password=custom_sound ; configurar un archivo de voz distinto para ; pedir la contraseña de la casilla. ; vm-newpassword=custom_sound ; como arriba para cuando se avisa de ; insertar una nueva contraseña para el buzon. ; vm-passchanged=custom_sound ; Voz personalizada para decir : "Tu ; contraseña ha sido cambiada". ; vm-reenterpassword=custom_sound ; Voz personalizada para decir ; "Introduce nuevamente tu contraseña seguida del botón numeral. ; vm-mismatch=custom_sound; Voz personalizada de "la contraseña ; insertada y repetida no son iguales". listen-control-forward-key=# ; tecla numérica para adelantar el mensaje que ; se está escuchando. listen-control-reverse-key=*; tecla numérica para ir atrás en el mensaje que ; se está escuchando. listen-control-pause-key=0; tecla numérica para poner en pausa el mensaje. listen-control-restart-key=2; tecla numérica para volver a escuchar el ; mensaje desde el inicio. listen-control-stop-key=13456789; teclas numéricas para parar el mensaje y ; volver al menú del contestador. backupdeleted=100; numero máximo de mensajes en la carpeta "borrados".

[zonemessages] colombia=America/Bogota|'vm-received' aebY 'digits/at' HM eastern=America/New_York|'vm-received' Q 'digits/at' IMp central=America/Chicago|'vm-received' Q 'digits/at' IMp central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours' military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p' european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM

[default]

100 => 1234,100,[email protected] 101 => 1234,101,[email protected]

vpb.conf

Este archivo se utiliza para configurar las tarjetas de Voicetronix con Asterisk.

459

ANEXO E: Instalación de CentOs 5

Arrancamos la instalación desde el DVD.

Seleccionamos idioma de sistema y de teclado. Pasamos a la parte de selección de destino de instalación.

** Atención. Si dónde vas a instalar tenías datos, con esta opción los pierdes.

460

Configuramos la red.

Pulsamos en modificar. Desactivamos IPV6 (a no ser que se vaya a usar). Lo que no está en marcha, no da problemas. Colocamos la dirección IP y la máscara de red que le otorgamos a nuestra máquina.

Y a continuación el nombre del equipo, del servidor DNS y de la puerta de enlace.

461

Seleccionamos nuestra zona horaria y colocamos nuestra contraseña de “root”.

Ahora pasamos a la configuración de paquetes que vamos a instalar.

Pulsamos en “personalizar ahora” y en “Siguiente”.

462

Opciones a añadir además de las que ya están seleccionadas por defecto. Seleccionamos Servidor de Nombres (DNS), Servidor Web, Servidor de Correo y Base de Datos MySQL en la opción de Servidores. En Desarrollo seleccionamos Bibliotecas de Desarrollo y Herramientas de Desarrollo. En Sistema Base seleccionamos Herramientas del Sistema y pulsamos Paquetes Opcionales. Aquí agregamos “mc” si queremos tener un gestor de archivos en consola al estilo “Norton Conmmander”, y podemos continuar pulsando siguiente.

463

Esperamos mientras se instala.

Proceso de post-instalación (si seleccionamos el Gnome/KDE Desktop y si elegimos server habrá que desactivarlo manualmente tras la instalación).

Desactivamos el firewall.

Desactivamos SE Linux.

464

Y creamos un usuario (si sólo queremos tener el usuario administrador, root, pulsamos “Adelante”).

El sistema se reiniciará.

Post-instalación si no seleccionamos entorno gráfico.

Seleccionamos Configuración de la red. Aquí deshabilitamos Iptables (Nivel de Seguridad-> Deshabilitado) y SE Linux.

465

Reiniciamos el equipo.

Actualizamos el sistema con el comando:

yum –y update

Reiniciamos el equipo de nuevo.

466

ANEXO E: Guía de Google Calendar

Inicio de Sesión

Para hacer uso de Google Calendar es necesario disponer de una cuenta Gmail.

� Primero abra la página: http://calendar.google.com

� En el campo nombre de usuario escriba el correo electrónico que tiene asociado a la cuenta de Google. Y en el campo “Password” escriba la contraseña y luego pulse el botón “Acceder”.

467

El calendario

Cambiar el idioma

• Para cambiar el idioma de un calendario primero debemos hacer clic en el botón “Configuración”, el cual está ubicado en la esquina superior derecha de la pagina.

• Luego debe seleccionar el Idioma deseado en el campo “Idioma” como se muestra en la figura.

• Finalmente debe guardar los cambios pulsando el botón “Guardar”.

468

Crear un Calendario

� Para crear un calendario, primero debe hacer clic sobre el botón “Añadir”. � Seleccione la opción “ Crear un calendario nuevo ”. � En el Campo “ Nombre del calendario ”, se debe escribir el nombre del

calendario, por ejemplo “Itinerario Grupo 3”. � En el campo “ Descripción ” se escribe la describe el calendario. Por ejemplo:

“Este es el calendario de las actividades a realizar en el Grupo 3”. � En el campo “ Ubicación ” se escribe el lugar donde se van a realizar las

actividades. Por ejemplo: “Medellín”. � Pulse el botón “ Crear calendario ”.

Crear eventos en un calendario

� Para crear un evento en Google Calendar existen dos métodos. El primero es haciendo clic sobre la opción “ Crear evento ” que se encuentra debajo del logo de Google Calendar, la otra opción es hacer clic sobre el calendario y aparecerá un cuadro con los datos básicos del evento.

� Si escogemos la segunda opción; en el campo “ evento ” debemos escribir el nombre del evento, y se debe seleccionar el calendario al que pertenece el evento de la lista desplegable “ Qué calendario ”.

� Para agregar más detalles al evento debemos hacer clic sobre “ Editar detalles del evento ”, si no se desea agregar otros detalles pulsamos el botón “ Crear evento ”

469

� Si pulsamos el botón “ Crear evento ”, aparecerá de inmediato la imagen siguiente, que es donde se crea un evento de forma detallada.

� Esta pantalla también aparece cuando se pulsa “Editar el evento”.

� Aquí no solo se ponen datos generales sino que también se puede especificar la fecha y hora de inicio y finalización de cada evento. La opción todo el día se puede utilizar por ejemplo para un cumpleaños.

� En el campo “ se repite ”, se escoge la frecuencia de repetición de un evento.

� En el cuadro “ Opciones ” se configura la privacidad del evento, el recordatorio y el estado cuando este evento está ocurriendo.

470

Eliminar un calendario

Para eliminar de forma permanente los calendarios de la lista de calendarios, se deben seguir los pasos siguientes:

� Clic en “Configuración” en la parte inferior de la lista de calendarios de la izquierda. Si lo prefieres, puedes hacer clic en la ficha “Calendarios”.

� Clic en el icono “Suprimir” situado junto al calendario que desees eliminar.

� Clic en “Aceptar”.

� Es de anotar que no es posible eliminar el calendario principal. Sin embargo, puedes borrar los eventos del calendario principal, cambiar su nombre o planificar eventos nuevos, lo que, a efectos prácticos, equivale a eliminar el calendario principal.

Configuración para móviles

Para poder recibir recordatorios de evento en forma de mensaje de texto hay que seguir los pasos siguientes:

� Clic en “Configuración” en la parte inferior de la lista de calendarios de la izquierda. Si lo prefieres, puedes hacer clic en la ficha “Calendarios”.

� Clic en “Configuración para móviles”.

471

� Rellenar el formulario:

o Seleccionar el País.

o Introducir el número de teléfono dónde llegarán las notificaciones.

o Pulsamos el botón “Enviar código de verificación” y si hemos ingresado

correctamente el número de teléfono nos llegará un SMS con el código

de verificación que tendremos que ingresar en la casilla siguiente.

o Pulsamos en “Finalizar configuración” y la configuración del móvil en

Google Calendar estará hecha.

� Ahora para configurar que un recordatorio o cita sea notificado en nuestro

teléfono móvil, crearemos una cita nueva o haremos clic en una ya existente

para entrar en sus configuraciones.

� Seleccionamos SMS en el apartado “Recordatorio” y al lado elegiremos cuanto

tiempo antes de la hora del evento queremos que nos sea notificado.

� De esta manera 10 minutos antes de la hora del evento recibiremos un SMS

con el contenido en el formato siguiente:

“Recordatorio: Contenido del evento – Fecha y Hora (Nombre del calendario)”

472

ANEXO F: Manual de Usuario de FOP 2

Inicio de Sesión

Abra su navegador y escriba la dirección web para acceder al panel:

http://IPservidor/fop2

Si todo está en su lugar y el servidor fop2 se está ejecutando, aparecerá este cuadro:

Utilice su extensión y la contraseña del buzón de dicha extensión, tal como están definidas en /usr/local/fop2/fop2.cfg para iniciar sesión.

Panel Principal

Después de la conexión con éxito, aparecerá el panel principal:

Hay una barra de herramientas que está siempre visible en la parte superior, y cuatro secciones en el área de contenido: una para cada tipo de botón.

El botón correspondiente a siempre está en la parte superior izquierda de la sección de Extensión, con la etiqueta en negrita.

Si usted no está interesado en los trunks, puede ocultar la sección y qestando minimizada hasta que haga clic en el signo de nuevo.

Barra de herramientas

En la parte superior del panel hay una barra de herramientas. Desde aquí podrás realizar la mayoría de las acciones que se pueden hacer con FOP2.

Podemos dividir la barra en diferentes secciones:

La barra de acción

La barra de acción consiste en una fila de botones que representan las acciones que deben adoptarse para las llamadas activas. Dependiendusuario tiene los botones se mostrarán o no. Para estas acciones a trabajar, primero debe seleccionar el destino o el botón de destino con un clic de ratón. Cuando lo hagas, el contorno del botón pasa a color rojo.

Después de seleccionar una extensión de destino, puede efectuar la acción haciendo clic en el botón apropiado.

Las acciones posibles son:

Dial (Requiere el permiso:

Cuando se hace clic se originó una llamada a la tecla seleccionada anteriormente en la lista de extensiones. Su teléfono sonará y cuando descuelgues se marcará la extensión de destino.

Transfer (Requiere el permiso:

Cuando se hace clic, iniciará una transferencia de llamada al botón previamente seleccionado en la lista de extensiones.

Hay una barra de herramientas que está siempre visible en la parte superior, y cuatro secciones en el área de contenido: una para cada tipo de botón.

El botón correspondiente a su extensión (la misma que utilizó para iniciar sesión), siempre está en la parte superior izquierda de la sección de Extensión, con la etiqueta

Si usted no está interesado en los trunks, puede ocultar la sección y que seguirá hasta que haga clic en el signo de nuevo.

En la parte superior del panel hay una barra de herramientas. Desde aquí podrás

de las acciones que se pueden hacer con FOP2.

Podemos dividir la barra en diferentes secciones:

La barra de acción consiste en una fila de botones que representan las acciones que deben adoptarse para las llamadas activas. Dependiendo de los permisos que el usuario tiene los botones se mostrarán o no. Para estas acciones a trabajar, primero debe seleccionar el destino o el botón de destino con un clic de ratón. Cuando lo hagas, el contorno del botón pasa a color rojo.

ccionar una extensión de destino, puede efectuar la acción haciendo clic en el botón apropiado.

(Requiere el permiso: dial)

Cuando se hace clic se originó una llamada a la tecla seleccionada anteriormente en la lista de extensiones. Su teléfono sonará y cuando descuelgues se marcará la extensión

(Requiere el permiso: transfer)

ciará una transferencia de llamada al botón previamente seleccionado en la lista de extensiones.

473

Hay una barra de herramientas que está siempre visible en la parte superior, y cuatro

extensión (la misma que utilizó para iniciar sesión), siempre está en la parte superior izquierda de la sección de Extensión, con la etiqueta

ue seguirá

En la parte superior del panel hay una barra de herramientas. Desde aquí podrás

La barra de acción consiste en una fila de botones que representan las acciones que o de los permisos que el

usuario tiene los botones se mostrarán o no. Para estas acciones a trabajar, primero debe seleccionar el destino o el botón de destino con un clic de ratón. Cuando lo

ccionar una extensión de destino, puede efectuar la acción haciendo

Cuando se hace clic se originó una llamada a la tecla seleccionada anteriormente en la lista de extensiones. Su teléfono sonará y cuando descuelgues se marcará la extensión

ciará una transferencia de llamada al botón previamente

Transfer to voicemail(Requiere el permiso:

Cuando se hace clic, iniciará una transferencia a la extensión de correo de voz tal como se define en el dialplan y en la configuración del botón con el parámetro voicemailexten.

Pickup (Requiere el permiso:

Cuando se hace clic se contexta a

Listen (Requiere el permiso:

Cuando se hace clic se iniciará un espionaje en la llamada que se esta realizando en el botón pulsado.

Whisper (Requiere el permiso:

Cuando se hace clic se iniciará un espionaje con voz baja habilitada, permitiendo poder hablar con la extensión de destino sin que la otra parte pueda oírte.

Hangup (Requiere el permiso:

Cuando se hace clic se cuelga la llamada activa en el botón pulsado.

Record (Requiere el permiso:

Cuando se hace clic se pondrá en marcha la grabación de la llamada en el botón pulsado. Una llamada que se está grabando será señalada con un ic La caja del filtro

La caja de llamada

Transfer to voicemail (Requiere el permiso: transfer)

Cuando se hace clic, iniciará una transferencia a la extensión de correo de voz tal como se define en el dialplan y en la configuración del botón con el parámetro

(Requiere el permiso: pickup)

Cuando se hace clic se contexta a la llamada del botón pulsado.

(Requiere el permiso: spy)

Cuando se hace clic se iniciará un espionaje en la llamada que se esta realizando en el

(Requiere el permiso: whisper)

se hace clic se iniciará un espionaje con voz baja habilitada, permitiendo poder hablar con la extensión de destino sin que la otra parte pueda oírte.

(Requiere el permiso: hangup)

Cuando se hace clic se cuelga la llamada activa en el botón pulsado.

(Requiere el permiso: record)

Cuando se hace clic se pondrá en marcha la grabación de la llamada en el botón pulsado. Una llamada que se está grabando será señalada con un icono de casette.

Permite ver el estado del boton escrito en la caja.usted tiene un panel con 100 botones esta búsqueda es beneficiosa.

Utilizando este elemento de la interfaz puede realizar varias búsquedas:

474

Cuando se hace clic, iniciará una transferencia a la extensión de correo de voz tal como se define en el dialplan y en la configuración del botón con el parámetro

Cuando se hace clic se iniciará un espionaje en la llamada que se esta realizando en el

se hace clic se iniciará un espionaje con voz baja habilitada, permitiendo poder

Cuando se hace clic se pondrá en marcha la grabación de la llamada en el botón ono de casette.

Permite ver el estado del boton escrito en la caja. Si usted tiene un panel con 100 botones esta búsqueda es

Utilizando este elemento de la interfaz puede realizar

475

Llamar a un número de teléfono: basta con escribir el número y pulsar ENTER, su teléfono sonará y se originará una llamada a ese número.

Llamada de línea directa VOIP: Usted puede escribir una dirección SIP con este formato: SIP / $ (exten) @ $ (dominio) y se originará una llamada a la extensión SIP @ servidor.

Búsqueda por Agenda: Todo lo que escriba aquí será buscado en la agenda a medida que se escribe, y los resultados aparecerán en una lista de selección en la parte inferior de la caja. Usted puede utilizar las teclas de flecha para seleccionar el resultado correcto, y ENTER para originar la llamada.

Búsqueda por el dominio tel: Si escribe un dominio. tel, se activará el sistema de búsqueda a través de DNS del dominio y dará resultados si encuentra algún número asociado al dominio. Puede obtener los números de voz, marcación directa de VoIP y sitios web. Si selecciona un resultado y pulse ENTER se origina la llamada. Cuadro de presencia

Aquí usted puede configurar su información de presencia, tal como está configurada en el archivo de presence.js. La información es almacenada en la base de datos inmediatamente y presentada en tiempo real. Esto no afectará al comportamiento de marcación, sólo mostrar a los demás usuarios FOP2 su disponibilidad actual.

El botón reflejará su estado con un icono de poca presencia, al pasar el ratón sobre el icono de presencia de cualquier extensión, se verá una descripción textual con el estado (además del color).

La última opción en el cuadro de selección, llamado "other", le permite especificar cualquier texto para su estado de presencia, si las predefinidas no son suficientemente buenas para usted.

Extensiones

Los botones de Extensión muestran gran cantidad de información envasada en un pequeño rectángulo. Hay dos colores para el botón ,verde cuando la extensión no está involucrada en una llamada, o rojo cuando lo está. Cuandseguirá siendo verde, pero el icono de la línea indica el estado de llamada.

Esta imagen muestra un botón sonando:

Hay varios elementos a explicar:

1. Icono de Presencia:

Este icono indica el estado de presencia de la Un círculo verde indica que la extensión no está involucrada en una llamada. Un círculo rojo indica que la extensión está ocupada o en una llamada. Por último, si alguien inició una grabación de llamadun icono de una cinta indica que la llamada está siendo grabada.

2. Botón de etiqueta:

Esta es la etiqueta de texto para la extensión. Se muestra el número de extensión, seguido de la etiqueta de texto que se confibotón.

3. Icono de Información:

Este icono muestra si la extensión está en pausa a través de un reloj. Si la extensión se está involucrada en una llamada que provenía de una cola, se mostrará un icono de información que se mostrará en la colalas llamadas cuando se pase sobre ella el ratón.

4. Icono de voicemail:

Si hay voicemail almacenados en espera, aparecerá un sobre. El número de mensajes se puede leer al pasar el ratón sobre él.

5. Icono de actividad en línea

Los botones de Extensión muestran gran cantidad de información envasada en un pequeño rectángulo. Hay dos colores para el botón ,verde cuando la extensión no está involucrada en una llamada, o rojo cuando lo está. Cuando el teléfono está sonando, seguirá siendo verde, pero el icono de la línea indica el estado de llamada.

Esta imagen muestra un botón sonando:

Hay varios elementos a explicar:

Icono de Presencia:

Este icono indica el estado de presencia de la extensión. Un círculo verde indica que la extensión no está involucrada en una llamada. Un círculo rojo indica que la extensión está ocupada o en una llamada.

Por último, si alguien inició una grabación de llamadas desde el interior FOP2, un icono de una cinta indica que la llamada está siendo grabada.

Esta es la etiqueta de texto para la extensión. Se muestra el número de extensión, seguido de la etiqueta de texto que se configuró en la

Icono de Información:

Este icono muestra si la extensión está en pausa a través de un reloj. Si la extensión se está involucrada en una llamada que provenía de una cola, se mostrará un icono de información que se mostrará en la cola de dónde vienen las llamadas cuando se pase sobre ella el ratón.

:

Si hay voicemail almacenados en espera, aparecerá un sobre. El número de mensajes se puede leer al pasar el ratón sobre él. Icono de actividad en línea:

476

Los botones de Extensión muestran gran cantidad de información envasada en un pequeño rectángulo. Hay dos colores para el botón ,verde cuando la extensión no está

o el teléfono está sonando, seguirá siendo verde, pero el icono de la línea indica el estado de llamada.

extensión. Un círculo verde indica que la extensión no está involucrada en una llamada. Un círculo rojo indica que la extensión está ocupada o en una llamada.

as desde el interior FOP2, un icono de una cinta indica que la llamada está siendo grabada.

Esta es la etiqueta de texto para la extensión. Se muestra el número de guró en la definición del

Este icono muestra si la extensión está en pausa a través de un reloj. Si la extensión se está involucrada en una llamada que provenía de una cola, se

de dónde vienen

Si hay voicemail almacenados en espera, aparecerá un sobre. El número de

The handset icon will indicate if the line is ringing, it is engaged in an outgoing call (right arrow), and incoming call (left arrow), or held (hourglass)teléfono indicará si la línea está sonando, está involucrado en una llamada saliente (flecha derechade arena)

6. Linea de callerid

Si está disponible, se mostrará el nombre y el número de callerid.

7. Linea de temporizador

El temporizador de la llamada actual.

Visual Phonebook

En la parte superior izquierda de la ventana del panel principal, hay un icono de agenda. Al hacer clic se le presentará una aplicación de libreta de teléfonos donde se puede agregar, editar o borrar usuarios.

El uso es sencillo. Puede hacer clic en el o haga clic en los botones de acción para ver, editar o borrar cada registro. Hay un cuadro de búsqueda que le permite buscar cualquier cadena o número. Y un botón de exportación que le permite exportar a CSV s

icon will indicate if the line is ringing, it is engaged in an outgoing call (right arrow), and incoming call (left arrow), or held (hourglass)teléfono indicará si la línea está sonando, está involucrado en una llamada saliente (flecha derecha), y la llamada entrante (flecha izquierda), o lugar (reloj

Si está disponible, se mostrará el nombre y el número de callerid.

Linea de temporizador

El temporizador de la llamada actual.

En la parte superior izquierda de la ventana del panel principal, hay un icono de agenda. Al hacer clic se le presentará una aplicación de libreta de teléfonos donde se puede agregar, editar o borrar usuarios.

El uso es sencillo. Puede hacer clic en el botón Agregar para insertar nuevos registros, o haga clic en los botones de acción para ver, editar o borrar cada registro. Hay un cuadro de búsqueda que le permite buscar cualquier cadena o número. Y un botón de exportación que le permite exportar a CSV su agenda.

477

icon will indicate if the line is ringing, it is engaged in an outgoing call (right arrow), and incoming call (left arrow), or held (hourglass) El icono de teléfono indicará si la línea está sonando, está involucrado en una llamada

), y la llamada entrante (flecha izquierda), o lugar (reloj

Si está disponible, se mostrará el nombre y el número de callerid.

En la parte superior izquierda de la ventana del panel principal, hay un icono de agenda. Al hacer clic se le presentará una aplicación de libreta de teléfonos donde se

botón Agregar para insertar nuevos registros, o haga clic en los botones de acción para ver, editar o borrar cada registro. Hay un cuadro de búsqueda que le permite buscar cualquier cadena o número. Y un botón de

Las entradas del directorio serán buscadas a tiempo real, cuando se escribe algo en el cuadro de marcación, por lo que se puede utilizar como un directorio de la empresa. También buscará al recibir una llamada entrante. Si el identificador de lcoincide con una de las entradas, usará el nombre y la imagen del contacto dando un aviso de llamada aparecerá en la parte inferior derecha de la pantalla del FOP2 como se muestra en la imagen siguiente.

Colas

Los botones de cola tienen algunas particularidades. Además del nombre de la cola, se le mostrará la lista de miembros o agentes de la cola, con un pequeño icono que representa el estado del miembro, y también la lista de llamadas en espera en la cola con sus extensiones de llamada y su temporizador, como se muestra a continuación:

También se pueden utilizar para filtrar los botones de extensión. Cuando se selecciona un botón de cola, sólo las extensiones que forman parte de la cola se mostrarán. Eses particularmente útil para los administradores de centros de llamada, usted puede centrarse en una actividad de determinada cola, eliminandcolas.

Las entradas del directorio serán buscadas a tiempo real, cuando se escribe algo en el cuadro de marcación, por lo que se puede utilizar como un directorio de la empresa. También buscará al recibir una llamada entrante. Si el identificador de lcoincide con una de las entradas, usará el nombre y la imagen del contacto dando un aviso de llamada aparecerá en la parte inferior derecha de la pantalla del FOP2 como se muestra en la imagen siguiente.

Los botones de cola tienen algunas particularidades. Además del nombre de la cola, se le mostrará la lista de miembros o agentes de la cola, con un pequeño icono que representa el estado del miembro, y también la lista de llamadas en espera en la cola

sus extensiones de llamada y su temporizador, como se muestra a continuación:

También se pueden utilizar para filtrar los botones de extensión. Cuando se selecciona un botón de cola, sólo las extensiones que forman parte de la cola se mostrarán. Eses particularmente útil para los administradores de centros de llamada, usted puede centrarse en una actividad de determinada cola, eliminando el "ruido" de las otras

478

Las entradas del directorio serán buscadas a tiempo real, cuando se escribe algo en el cuadro de marcación, por lo que se puede utilizar como un directorio de la empresa. También buscará al recibir una llamada entrante. Si el identificador de llamadas coincide con una de las entradas, usará el nombre y la imagen del contacto dando un aviso de llamada aparecerá en la parte inferior derecha de la pantalla del FOP2 como

Los botones de cola tienen algunas particularidades. Además del nombre de la cola, se le mostrará la lista de miembros o agentes de la cola, con un pequeño icono que representa el estado del miembro, y también la lista de llamadas en espera en la cola

sus extensiones de llamada y su temporizador, como se muestra a continuación:

También se pueden utilizar para filtrar los botones de extensión. Cuando se selecciona un botón de cola, sólo las extensiones que forman parte de la cola se mostrarán. Esto es particularmente útil para los administradores de centros de llamada, usted puede

o el "ruido" de las otras

El icono de estado de los miembros de la cola puede ser:

= ready

FOP2 también supervisará el agente o los nombres de dispositivo y cambiará el nombre de los botones de extensión en consecuencia.

Conferencias

Los botones de Conferencia mostrarán a todos los participantes de la conferencia. También se incluyen acciones especiales que se realizarán en la propia conferencia o de un participante en particular.

Hay un pequeño icono a la izquierda de la etiquepresentará un menú especial de acción que le permitirá bloquear o desbloquear una conferencia, o de activación/desactivación de todos los participantes de la conferencia

A la izquierda de todos los participanusuario verde para que los participantes regulares, o azul cuando el participante es administrador o el usuario marcado.

ANEXO G: Código de las pruebas de envio de SMS

sms_send.php

#!/usr/bin/php -q <?php

// ------------

// Configuracion de Google Calendar // ------------ $usr="[email protected]"; // Usuario $pwd="XXXXXXXX"; // Password $min="30"; //empieza 30 min de la hora actual $dur="10";//la duracion del evento es de 10 min

El icono de estado de los miembros de la cola puede ser:

= busy = unavailable /invalid

FOP2 también supervisará el agente o los nombres de dispositivo y cambiará el nombre de los botones de extensión en consecuencia.

Los botones de Conferencia mostrarán a todos los participantes de la conferencia. También se incluyen acciones especiales que se realizarán en la propia conferencia o de un participante en particular.

Hay un pequeño icono a la izquierda de la etiqueta de la conferencia, al hacer clic se le presentará un menú especial de acción que le permitirá bloquear o desbloquear una conferencia, o de activación/desactivación de todos los participantes de la conferencia

A la izquierda de todos los participantes también hay un icono de miembro, será un usuario verde para que los participantes regulares, o azul cuando el participante es administrador o el usuario marcado.

Código de las pruebas de envio de SMS

// Configuracion de Google Calendar

$usr="[email protected]"; // Usuario "; // Password

$min="30"; //empieza 30 min de la hora actual duracion del evento es de 10 min

479

= paused.

FOP2 también supervisará el agente o los nombres de dispositivo y cambiará el

Los botones de Conferencia mostrarán a todos los participantes de la conferencia. También se incluyen acciones especiales que se realizarán en la propia conferencia o

ta de la conferencia, al hacer clic se le presentará un menú especial de acción que le permitirá bloquear o desbloquear una conferencia, o de activación/desactivación de todos los participantes de la conferencia

tes también hay un icono de miembro, será un usuario verde para que los participantes regulares, o azul cuando el participante es

480

// Cambiar por el directorio de instalación $sms_tool_path="/usr/src/SMSGoogle";

// Opciones de depuracion: // Si tienes problemas revisa el archivo de log $parm_error_log = '/usr/src/SMSGoogle/wakeup.log';

// Poner a true si queremos habilitar la depuración $parm_debug_on = true;

GLOBAL $stdin, $stdout, $stdlog, $result, $parm_debug_on, $parm_test_mode;

// Settings de la WIKI http://www.voip-info.org ob_implicit_flush(false); set_time_limit(30); error_reporting(0);

$stdin = fopen( 'php://stdin', 'r' ); $stdout = fopen( 'php://stdout', 'w' );

// Se escribe log en modo depuracion if ($parm_debug_on) { $stdlog = fopen( $parm_error_log, 'w' ); fputs( $stdlog, "---Start---\n" );

fputs($stdlog."---------------\n"); }

// Poner en un array todas las variables que manda Asterisk // http://www.voip-info.org/tiki-index.php?page=Asterisk%20AGI%20php $agivars = array(); while (!feof(STDIN))

{ $agivar = trim(fgets(STDIN)); if ($agivar === '') { break; } $agivar = explode(':', $agivar); $agivars[$agivar[0]] = trim($agivar[1]);

} extract($agivars);

// Obtenemos el Caller ID $callerid = $agi_callerid; // Mandamos el mensaje usando el API de Google $msg="'Asterisk: Tiene una llamada perdida de: $callerid'"; $cmd = "$sms_tool_path/enviaSMS.sh $usr $pwd $min $dur $msg &"; $p = popen($cmd, 'r'); if ($parm_debug_on) { $stdlog = fopen( $parm_error_log, 'w' );

fputs( $stdlog, "UserName=".$usr."\n"); fputs( $stdlog, "Password=".$pwd."\n"); fputs( $stdlog, "Minutos despues de la hora actual en la que empieza el evento=".$min."\n"); fputs( $stdlog, "Duracion del Evento=".$dur."\n");

481

fputs( $stdlog, "Mensaje enviado: ".$msg."\n"); fputs( $stdlog, "Enviado: ".$p ); } ?>

enviaSMS.sh

#!/bin/sh SMS_HOME=/usr/src/SMSGoogle CLASSPATH=$SMS_HOME/lib/activation.jar:$SMS_HOME/lib/gdata-calendar-1.0.jar:$SMS_HOME/lib/gdata-client-1.0.jar:$SMS_HOME/lib/mail.jar:$SMS_HOME java -classpath $CLASSPATH EnviaSMS $@

EnviaSMS.java

import java.net.URL; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import com.google.gdata.client.calendar.CalendarService; import com.google.gdata.data.DateTime; import com.google.gdata.data.Person; import com.google.gdata.data.PlainTextConstruct; import com.google.gdata.data.extensions.EventEntry; import com.google.gdata.data.extensions.Reminder; import com.google.gdata.data.extensions.When; public class EnviaSMS { public static void main(String[] args) { // Comprobamos los argumentos necesarios: usuario, password y texto del mensaje if (args.length < 5) { System.err.println("Uso: EnviaSMS <usuario> <password> <minInit> <duracion> <texto> "); return; } String userName = args[0]; String userPassword = args[1]; String min1 = args[2]; int min = Integer.parseInt(min1); String duracion = args[3]; int dur = Integer.parseInt(duracion); String sms = ""; // El máximo son 57 caracteres for(int i=4; i<args.length; i++) { sms = sms + args[i] + " "; } sms = sms.trim(); try {

482

URL feedUrl = new URL("http://www.google.com/calendar/feeds/" + userName + "/private/full"); CalendarService myService = new CalendarService("EnviaSMS"); // Nos autenticamos en google Calendar myService.setUserCredentials(userName, userPassword); // Creamos el evento EventEntry myEntry = new EventEntry(); myEntry.setTitle(new PlainTextConstruct(sms)); Person author = new Person(userName, null, userName); myEntry.getAuthors().add(author); // Definimos la zona horaria TimeZone tz = TimeZone.getTimeZone("Europe/Madrid"); Calendar cal = GregorianCalendar.getInstance(); cal.add(Calendar.MINUTE, min); DateTime startTime = new DateTime(cal.getTime(), tz); //7m cal.add(Calendar.MINUTE, dur); DateTime endTime = new DateTime(cal.getTime(), tz); //11m // Definimos la hora de comienzo y de fin del evento When eventTimes = new When(); eventTimes.setStartTime(startTime); eventTimes.setEndTime(endTime); myEntry.addTime(eventTimes); // Añadimos el recordatorio sólo como SMS y que avise 10 minutos antes Reminder reminder = new Reminder(); reminder.setMinutes(new Integer(10)); reminder.setMethod(Reminder.Method.SMS); myEntry.getReminder().add(reminder); // Enviamos la petición para insertar el evento en el calendario EventEntry insertedEntry = (EventEntry)myService.insert(feedUrl, myEntry); } catch (Exception e) { e.printStackTrace(); } } }

ANEXO H: Dialplan de la aplicación (extensions.conf, sip.conf, iax.conf)

extensions.conf

[general] static=yes writeprotect=yes clearglobalvars=no

483

autofallthrough=yes language=es

[globals] ;TELEFONOS Y MOVILES MOVIL2=945003910 MOVIL1=650664616 PHONE1=902147424

PHONE2=902147423 PHONE3=945003903

;CALENDARIOS CALR=calendariorecepcion.py CALC=calendariocomercial.py ;CALS=calendariosoporte.py CALT=calendariotwister.py CALS=pyastcal.py

;QUEUES QR=recepcionqueue QC=comercialqueue QS=soportequeue QT=twisterqueue

;BUZONES BR=1111 BC=2222 BS=3333 BT=4444

[incoming] include =>administración include =>chansebi include =>spe

[administracion] include =>acceso

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;MENU:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;---->0)Pasar con una operadora ;;;---->1)Duda en la utilizacion del programa :Comerciales ;;;---->2)Pasar con el Departamento de Soporte ;;;---->3)Pasar con el Departamento de Desarrollo :Twister ;;;---->t)Volver al menu: Excesivo tiempo en contestar ;;;---->i)Volver al menu: Se ha pulsado una tecla errónea ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; exten => 902147424,1,Answer exten => 902147424,n,Background(menu) exten => 0,1,Goto(recepcion,${PHONE1},1) exten => 1,1,Goto(comercial,${PHONE1},1) exten => 2,1,Goto(soporte,${PHONE2},1) exten => 3,1,Goto(twister,${PHONE3},1)

484

exten => 1000,1,Goto(acceso,${EXTEN},1) exten => 1001,1,Goto(acceso,${EXTEN},1) exten => 1002,1,Goto(acceso,${EXTEN},1) exten => 1003,1,Goto(acceso,${EXTEN},1) exten => 1004,1,Goto(acceso,${EXTEN},1) exten => 1005,1,Goto(acceso,${EXTEN},1) exten => 1006,1,Goto(acceso,${EXTEN},1) exten => 2000,1,Goto(acceso,${EXTEN},1)

exten => 2001,1,Goto(acceso,${EXTEN},1) exten => 2002,1,Goto(acceso,${EXTEN},1) exten => 2003,1,Goto(acceso,${EXTEN},1) exten => 2004,1,Goto(acceso,${EXTEN},1) exten => 2005,1,Goto(acceso,${EXTEN},1) exten => 2006,1,Goto(acceso,${EXTEN},1) exten => 3000,1,Goto(acceso,${EXTEN},1) exten => 3001,1,Goto(acceso,${EXTEN},1) exten => 3002,1,Goto(acceso,${EXTEN},1) exten => 3003,1,Goto(acceso,${EXTEN},1) exten => 3004,1,Goto(acceso,${EXTEN},1) exten => 3005,1,Goto(acceso,${EXTEN},1) exten => 3006,1,Goto(acceso,${EXTEN},1) exten => 3007,1,Goto(acceso,${EXTEN},1) exten => 4000,1,Goto(acceso,${EXTEN},1) exten => 5000,1,Goto(cisco,${EXTEN},1) ;Usuario Remoto exten => 6000,1,Goto(acceso,,${EXTEN},1) exten => t,1,Goto(${PHONE1},1) exten => i,1,Goto(${PHONE1},1)

exten => 902147423,1,Goto(soporte,${PHONE2},1) exten => 945003903,1,Goto(twister,${PHONE3},1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;PRUEBAS CHAN_SEBI;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [chansebi] include => acceso

; Incomming SMS exten => sms,1,NoOp(Incoming SMS from ${SMSSRC}) exten => sms,n,System(/usr/src/recvSMS.sh "${SMSSRC}" "${SMSTXT}") exten => sms,n,Hangup

;Envio SMS exten => 1111,1,NoOp(Envio de Sms) exten => 1111,n,SebiSendSMS(huawei1,650664616,"sms prueba") exten => 1111,n,Hangup

;LLamadas con Chan_Sebi exten => 650664616,1,NoOp(Outgoing call through the SEBI device to ${EXTEN}) exten => 650664616,n,Dial(Sebi/g1/${EXTEN},60) exten => 650664616,n,Hangup

[macro-general] ;1)COMPROBACION CON EL CALENDARIO

485

exten => s,1,Answer exten => s,n,Set(SALTO=${ARG1}) exten => s,n,AGI(${ARG2}) exten => s,n,Goto(${SALTO},${ARG3},1)

[recepcion] exten => 902147424,1,Set(NUM=${EXTEN}) exten => 902147424,n,Macro(general,recepcionlaboral,${CALR},${NUM})

[comercial] exten => 902147424,1,Set(NUM=${EXTEN}) exten => 902147424,n,Macro(general,comerciallaboral,${CALC},${NUM})

[soporte] exten => 902147423,1,Set(NUM=${EXTEN}) exten => 902147423,n,Macro(general,soportelaboral,${CALS},${NUM})

[twister]

exten => 945003903,1,Set(NUM=${EXTEN}) exten => 945003903,n,Macro(general,twisterlaboral,${CALT},${NUM})

[macro-laboral]

exten => s,1,Answer exten => s,n,Wait(2) exten => s,n,SetMusicOnHold(default) ;Consultar con la base de datos si es VIP para pasar a la primera posicion de la cola exten => s,n,MYSQL(Connect connid localhost root root agenda) exten => s,n,MYSQL(Query resultid ${connid SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp WHERE\ telefono="NUM2"}) exten => s,n,NoOp(resultid = ${resultid}) ;Si es VIP --> POSICIONAR DELANTE EN LA COLA exten => s,n,MYSQL(Fetch fetchid ${resultid} PRIO) exten => s,n,NoOp( ${PRIO}) exten => s,n,GotoIf($["${PRIO}"="VIP"]?prio:no) exten => s,n(prio),MYSQL(Disconnect ${connid}) exten => s,n,Set(QUEUE_PRIO=10) exten => s,n,Queue(${ARG1}|r) exten => s,n,Hangup exten => s,n(no),MYSQL(Disconnect ${connid}) exten => s,n,Queue(${ARG1}|r) exten => s,n,Hangup

[recepcionlaboral] exten => 902147424,1,Macro(laboral,${QR})

[comerciallaboral] exten => 902147424,1,Macro(laboral,${QC})

[soportelaboral] exten => 902147423,1,Macro(laboral,${QS})

[twisterlaboral] exten => 945003903,1,Macro(laboral,${QT})

486

[macro-nodisponible]

exten => s,1,PLayBack(grabacion2) exten => s,n,Voicemail(${ARG1}) exten => S,n,Hangup

[No Disponible Recepcion] exten => 902147424,1,Macro(nodisponible,${BR})

[No Disponible Comercial] exten => 902147424,1,Macro(nodisponible,${BC})

[No Disponible Soporte] ;Comprobar en la base de datos si el cliente es VIP(contrato de mantenimiento de 24h).Si lo es se le envia a la prioridad 100 sino lo es a la 90. exten => 902147423,1,MYSQL(Connect connid localhost root root agenda) exten => 902147423,n,NoOp(connid = ${connid}) exten => 902147423,n,Set(NUM = ${CALLERID(num)}) exten => 902147423,n,MYSQL(Query resultid ${connid SELECT\ mant FROM\ clientes\ INNER\ JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono="${NUM}"}) exten => 902147423,n,NoOp(resultid = ${resultid}) exten => 902147423,n,MYSQL(Fetch fetchid ${resultid} MANT) exten => 902147423,n,MYSQL(Disconnect ${connid}) exten => 902147423,n,GotoIf($["${MANT}"="VIP"]?100:90) exten => 902147423,90,Macro(nodisponible,${BS}) exten => 902147423,100,NoOp(${NUM}) exten => 902147423,n,Gotoif($["${NUM:0:1}" = "6"]?200:300) exten => 902147423,200,Dial(SIP/+34${MOVIL1}@proxy01.sipphone.com,20,r) exten => 902147423,n,Dial(Sebi/g1/${MOVIL1},30) exten => 902147423,n,Dial(SIP/+34${MOVIL2}@proxy01.sipphone.com,20,r) exten => 902147423,n,Dial(Sebi/g1/${MOVIL2},30) exten => 902147423,n,AGI(sms_send.php) exten => 902147423,n,Voicemail(${ARG1}) exten => 902147423,n,Hangup exten => 902147423,300,Dial(DAHDI/${MOVIL1},20,r) exten => 902147423,n,Dial(DAHDI/${MOVIL2},20,r) exten => 902147423,n,AGI(sms_send.php) exten => 902147423,n,Voicemail(3333) exten => 902147423,n,Hangup

[No Dispnible Twister] exten => 945003903,1,Macro(nodisponible,${BT})

[macro-acceso] exten => s,1,Dial(SIP/${ARG1},30,Ttm) exten => s,n,Voicemail(${ARG1}) exten => s,n,Hangup

[acceso] include => skype include => cisco include => meetme include => verbio include => administracion include => soportelaboral

487

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;PRUEBAS TRUNK IAX2;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 100,1,Dial(IAX2/portatil/${EXTEN},90,tr) exten => 100,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;VERBIO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 802,1,Goto(VERBIO_TEST,s,1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;VOICEMAIL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => _XXXX8,1,VoiceMail(${EXTEN:0:4}) exten => _XXXX9,1,VoiceMailMain(${EXTEN:0:4}@default)

;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;RECEPCION;; ;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 1000,1,Macro(acceso,${EXTEN}) exten => 1001,1,Macro(acceso,${EXTEN})

;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;COMERCIALES;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 1002,1,Macro(acceso,${EXTEN}) exten => 1003,1,Macro(acceso,${EXTEN}) exten => 1004,1,Macro(acceso,${EXTEN}) exten => 1005,1,Macro(acceso,${EXTEN}) exten => 1006,1,Macro(acceso,${EXTEN})

;;;;;;;;;;;;;;;;;;;;; ;;;;SOPORTE;; ;;;;;;;;;;;;;;;;;;;;;

exten => 2000,1,Macro(acceso,${EXTEN}) exten => 2001,1,Macro(acceso,${EXTEN}) exten => 2002,1,Macro(acceso,${EXTEN}) exten => 2003,1,Macro(acceso,${EXTEN}) exten => 2004,1,Macro(acceso,${EXTEN}) exten => 2005,1,Macro(acceso,${EXTEN}) exten => 2006,1,Macro(acceso,${EXTEN})

;;;;;;;;;;;;;;;;;;;; ;;;;TWISTER;; ;;;;;;;;;;;;;;;;;;;;

exten => 3000,1,Macro(acceso,${EXTEN}) exten => 3001,1,Macro(acceso,${EXTEN})

488

exten => 3002,1,Macro(acceso,${EXTEN}) exten => 3003,1,Macro(acceso,${EXTEN}) exten => 3004,1,Macro(acceso,${EXTEN}) exten => 3005,1,Macro(acceso,${EXTEN}) exten => 3006,1,Macro(acceso,${EXTEN}) exten => 3007,1,Macro(acceso,${EXTEN})

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;DIRECTOR Y CONTABLE;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 4000,1,Macro(acceso,${EXTEN})

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;Usuario Remoto;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 6000,1,Dial(IAX2/${EXTEN},90,tr) exten => 6000,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Para permitir agregarnos/eliminarnos a/de cualquier cola : ;;;;;;;;;;COLAS:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;--->0: Recepcion ;--->1: Comercial ;--->2: Soporte ;--->3: Twister ;Para agregar: exten+0+numCola ;Para eliminar: exten+1+numCola ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => _XXXX00,1,AddQueueMember(${QR}|SIP/${EXTEN:0:4}) exten => _XXXX00,n,Hangup

exten => _XXXX01,1,AddQueueMember(${QC}|SIP/${EXTEN:0:4}) exten => _XXXX01,n,Hangup

exten => _XXXX02,1,AddQueueMember(${QS}|SIP/${EXTEN:0:4}) exten => _XXXX02,n,Hangup

exten => _XXXX03,1,AddQueueMember(${QT}|SIP/${EXTEN:0:4}) exten => _XXXX03,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => _XXXX10,1,RemoveQueueMember(${QR}|SIP/${EXTEN:0:4}) exten => _XXXX10,n,Hangup

exten => _XXXX11,1,RemoveQueueMember(${QC}|SIP/${EXTEN:0:4}) exten => _XXXX11,n,Hangup

exten => _XXXX12,1,RemoveQueueMember(${QS}|SIP/${EXTEN:0:4}) exten => _XXXX12,n,Hangup

489

exten => _XXXX13,1,RemoveQueueMember(${QT}|SIP/${EXTEN:0:4}) exten => _XXXX13,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => _XXXX20,1,PauseQueueMember(${QR}|SIP/${EXTEN:0:4}) exten => _XXXX20,n,Hangup

exten => _XXXX21,1,PauseQueueMember(${QC}|SIP/${EXTEN:0:4}) exten => _XXXX21,n,Hangup

exten => _XXXX22,1,PauseQueueMember(${QS}|SIP/${EXTEN:0:4}) exten => _XXXX22,n,Hangup

exten => _XXXX23,1,PauseQueueMember(${QT}|SIP/${EXTEN:0:4}) exten => _XXXX23,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => _XXXX30,1,UnpauseQueueMember(${QR}|SIP/${EXTEN:0:4}) exten => _XXXX30,n,Hangup

exten => _XXXX31,1,UnpauseQueueMember(${QC}|SIP/${EXTEN:0:4}) exten => _XXXX31,n,Hangup

exten => _XXXX32,1,UnpauseQueueMember(${QS}|SIP/${EXTEN:0:4}) exten => _XXXX32,n,Hangup

exten => _XXXX33,1,UnpauseQueueMember(${QT}|SIP/${EXTEN:0:4}) exten => _XXXX33,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;CALLBACK;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 900,1,Answer exten => 900,n,Wait(1)

;Asigna a la variable id el numero del llamante exten => 900,n(inicio),Set(id=${CALLERID(num)})

;Tenemos que indicar el numero de telefono que llamaremos ;(ej: el numero de un cliente). exten => 900,n,Playback(telephone-number&astcc-followed-by-the-pound-key)

;Asterisk se pondra a la espera de recibir el numero de telefono. ;La aplicacion Read lee literalmente los digitos que presionaremos y los asignara a la variable appunt. exten => 900,n,Read(appunt,,15,,2,10) exten => 900,n,SayDigits(${appunt}) exten => 900,n,Wait(1) exten => 900,n,Playback(year&month&day)

;Asterisk se pondra a la espera de recibir año, mes y dia de esta forma: ; 4 digitos para el año,

490

; 2 digitos para el mes y ; 2 digitos para el d�a. ;La aplicacion Read asignara esta fecha a la variable fecha. ;Esta sera la fecha en que se efectuara la llamada exten => 900,n,Read(fecha,,8,,2,10) exten => 900,n,SayDigits(${fecha}) exten => 900,n,Playback(hours)

;Asterisk se pondrá a la espera de recibir la hora de esta forma: ; 2 digitos para las hora y ; 2 digitos para los minutos ;(ej 1130 para las once y treinta, 20:10 para las veinte y diez). ;La aplicacion Read asignara esta hora a la variable hora. ;Esta es la hora programada para la llamada. exten => 900,n,Read(hora,,4,,2,10) exten => 900,n,Saydigits(${hora}) exten => 900,n,Playback(if-this-is-correct-press&digits/1&if-this-is-not- correct&digits/2)

;Asterisk se pondra a la espera de recibir nuestra respuesta (digito 1 o digito 2). ; La variable Read asignara nuestra respuesta a la variable sino. exten => 900,n,Read(sino,,1,,,5)

;Si la variable sino es igual a 1 iremos directamente a la prioridad marcada con la etiqueta (cita). ;sino a la prioridad con la etiqueta (inicio). exten => 900,n,GotoIf($["${sino}" = "1"]?cita:inicio)

;Si confirmamos los datos seguiremos desde esta linea. ;Aqui empieza la creacion del archivo de texto callback ;en la carpeta /tmp que tendra la sintaxis requerida para los callfiles.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;La estructura de un callfiles es la siguiente:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Channel: <channel> ; La extension que queremos llamar exten => 900,n(cita),System(echo Channel:SIP/${id} >> /tmp/callback) ; Callerid: <callerid> ; El identificativo de llamada que queremos enviar a la ;extension llamada exten => 900,n,System(echo Callerid:CallBackCita >> /tmp/callback) ; WaitTime: <number> ; Cuantos segundos esperamos antes de considerar la ;llamada sin éxito exten => 900,n,System(echo WaitTime:30 >> /tmp/callback) ; Maxretries: <number> ; Numero de veces que intentaremos llamar la extensión exten => 900,n,System(echo Maxretries:3 >> /tmp/callback) ; RetryTime: <number> ; Cuantos segundos debe esperar asterisk para volver a ;marcar exten => 900,n,System(echo RetryTime:300 >> /tmp/callback) ; Account: <account> ; El nombre de la cuenta con la cual queremos grabar esta ;llamada (CDR) exten => 900,n,System(echo Account:${id} >> /tmp/callback)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

491

;Una vez que la extension llamada conteste tenemos que decirle a asterisk lo que tiene ;que hacer. ;Esto tambien se define en el mismo archivo. Hay dos opciones: ; * Ejecutar una aplicacion: ; Application: <appname> ; la aplicacion que queremos utilizar ; Data: <args> ; aqui podemos definir las opciones de la aplicacion ; * Ejecutar un punto exacto del plan de llamadas (dial plan) ; Context: <context> ; El contexto en el dial plan ; Extension: <exten> ; La extension que queremos usar en el contexto especificado ; Priority: <priority> ; El numero de la prioridad o la etiqueta si definir ; Setvar: <var=value> ; Variables que se pueden necesitar en el contexto, ;extension y prioridad que definimos. ;Elegimos la primera opcion. exten => 900,n,System(echo Application:Dial >> /tmp/callback)

;Ahora podemos tener dos situaciones: ; a) el numero de destinacion es una extension interna de la centralita, ; b) el numero es externo (por ejemplo un celular). ;Si el numero es externo el dialplan seguira desde la etiqueta (gizmo), ;es decir que utilizaremos el proveedor VoIP gizmo5 para hacer la llamada, sino desde ;la etiqueta (local). exten => 900,n,Gotoif($["${appunt:0:1}" = "6"]?gizmo:local)

;Representa las opciones con las cuales la aplicacion Dial sera ejecutada por ;Asterisk. exten => 900,n(local),System(echo Data:SIP/${appunt},45,m >> /tmp/callback)

;Con el comando touch cambiamos la fecha y la hora del archivo callback segun ;fecha y hora escogidas. ;Esta sera la fecha y la hora a la que se ejecutara la llamada programada. exten => 900,n,System(touch -t ${fecha}${hora} /tmp/callback)

;Movemos el archivo callback en la carpeta usada por asterisk para buscar los callfiles ; ;y, para que no hayan duplicados le cambiamos el nombre usando la fecha y la hora de ;la llamada programada. exten => 900,n,System(mv /tmp/callback/var/spool/asterisk/outgoing /${fecha} ${hora}) exten => 900,n,Hangup exten => 900,n(gizmo),System(echo Data:SIP/+34${appunt}@proxy01.sipphone.com >> /tmp/callback) exten => 900,n,System(touch -t ${fecha}${hora} /tmp/callback) exten => 900,n,System(mv /tmp/callback /var/spool/asterisk/outgoing/${fecha} ${hora}) exten => 900,n,Hangup

;Ahora a la fecha y hora programadas, asterisk llamara la extension que reservo ;la llamada, una vez que conteste, ejecutara la aplicacion Dial y llamara el numero de ;telefono escogido para la llamada programada y podremos hablar, por ejemplo, con ;nuestro cliente.

;Limites: ;;;;;;;;;;;;;;--------->las llamadas pueden ser programadas solamente desde una extension ;interna de nuestra centralita. ;;;;;;;;;;;;;;--------->Una vez programadas, las llamadas no se pueden borrar. ;Estos archivos se guardan en la carpeta : /var/spool/asterisk/outgoing.

492

[meetme] ;Agregarse a la conferencia 600 exten => 600,1,Meetme(600,i,1234) ;Saber cuantas personas hay en la conferencia exten => 601,1,Playback(conf-thereare) exten => 601,n,MeetMeCount(600) exten => 601,n,Playback(conf-peopleinconf)

;Retringir Numero de personas en la conferencia exten => 610,1,Set(confmax=2) exten => 610,n,Macro(meetme)

exten => 602,1,Playback(conf-thereare) exten => 602,n,MeetMeCount(610) exten => 602,n,Playback(conf-peopleinconf)

;Crear una conferencia dinamica exten => 620,1,Meetme(,scDM(default)) exten => 620,n,Hangup

exten => 621,1,Meetme() exten => 621,n,Hangup

[macro-meetme] exten => s,1,MeetMeCount(${MACRO_EXTEN},count) exten => s,n,Gotoif($[${count} >= ${confmax}]?103) exten => s,n,MeetMe(${MACRO_EXTEN}) exten => s,n,Hangup exten => s,103,Playback(conf-invalid) exten => s,104,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;VERBIO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[verbio] include => acceso

exten => 8000,1,Answer() exten => 8000,n,Set(UMBRAL=90) exten => 8000,n,VerbioLoadVcb(david.txt,connected,,,v) exten => 8000,n,VerbioLoadVcb(david2.txt,connected,,,v) exten => 8000,n,Goto(8090,1) exten => 8090,1,VerbioPromptAndRec(Indique el numero de incidencia para consultar su estado.Recuerde que tiene cuatro digitos.) exten => 8090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT0} ${VASR_RESULT1} ${VASR_RESULT2} ${VASR_RESULT3}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v) exten => 8090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si:no) exten => 8090,n(si),VerbioPromptAndRec(Su numero de incidencia es: ${VASR_RESULT0} ${VASR_RESULT1} ${VASR_RESULT2} ${VASR_RESULT3}\, no?) exten => 8090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v) exten => 8090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si2:no2)

493

exten => 8090,n(si2),VerbioPrompt(Gracias.) exten => 8090,n,Hangup exten => 8090,n,VerbioFreeChannel() exten => 8090,n(no),VerbioPrompt(Repita por favor.) exten => 8090,n,Goto(8090,1) exten => 8090,n(no2),VerbioPrompt(Repita por favor.) exten => 8090,n,Goto(8090,1) exten => 8091,1,VerbioFreeChannel()

exten => 7000,1,Answer() exten => 7000,n,Set(UMBRAL=20) exten => 7000,n,VerbioLoadVcb(datos.txt,isolated,,,v) exten => 7000,n,Goto(7090,1) exten => 7090,1,VerbioPromptAndRec(Bienvenido a Yet Informatica \, de los siguientes departamentos indiquenos con cual desea hablar\, Soporte\, Administracion\, Twister\, Comercial.) exten => 7090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v) exten => 7090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si:no) exten => 7090,n,VerbioFreeChannel() exten => 7090,n(si),VerbioLoadVcb(sino.txt,isolated,,,v) exten => 7090,n,Set(DPTO= ${VASR_RESULT}) exten => 7090,n,VerbioPromptAndRec(El departamento elegido es: ${VASR_RESULT} \, no?) exten => 7090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score: ${VASR_SCORE} Umbral: ${UMBRAL}",,,v) exten => 7090,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?si2:no2) exten => 7090,n(si2),NoOp(" Vamos a llamar: ${DPTO}") exten => 7090,n,GotoIf($[${DPTO} = SOPORTE ]?soporte:otro) exten => 7090,n(soporte),Dial(SIP/2000,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(otro),GotoIf($[${DPTO} = TWISTER ]?twister:otro1) exten => 7090,n(twister),Dial(SIP/2003,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(otro1),GotoIf($[${DPTO} = COMERCIAL ]?comercial:otro2) exten => 7090,n(comercial),Dial(SIP/4000,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(otro2),Dial(SIP/5000,30,Ttm) exten => 7090,n,Hangup exten => 7090,n,VerbioFreeChannel() exten => 7090,n(no),VerbioPrompt(Repita por favor.) exten => 7090,n,Goto(7090,1) exten => 7090,n(no2),VerbioPrompt(Repita por favor.) exten => 7090,n,Goto(7090,si)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;Ultimas llamadas recibidas;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 76,1,MYSQL(Connect connid localhost root root cdr) exten => 76,n,NoOp(connid = ${connid})

494

;Con LIMIT 1 indicamos que queremos solo el ultimo registro de esa columna. ;La variable resultid contendra el numero de resultados de la busqueda. exten => 76,n,MYSQL(Query resultid ${connid} SELECT src FROM cdr WHERE dst="${CALLERID(num)}" ORDER BY calldate DESC LIMIT 1) exten => 76,n,NoOp(resultid = ${resultid}) exten => 76,n,MYSQL(Fetch fetchid ${resultid} var1) exten => 76,n,NoOp(Variable = ${fetchid},${var1}) exten => 76,n,MYSQL(Clear ${resultid}) exten => 76,n,MYSQL(Disconnect ${connid}) exten => 76,n,GotoIf($[ ${fetchid} != 0 ]?bien:mal) exten => 76,n,NoOp(La ultima llamada recibida ha sido del numero ${var1}.) ;Para llamar a ese numero: exten => 76,n(bien),Dial(SIP/${var1},30,Ttm) ;Se podria tener en cuenta si el numero es externo o interno para sacarlo por un ;Operador VoIP o no. exten => 76,n,Hangup exten => 76,n(mal),NoOp(No hay ninguna llamada recibida.) exten => 76,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;Ultima llamada realizada;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 75,1,MYSQL(Connect connid localhost root root cdr) exten => 75,n,NoOp(connid = ${connid}) ;Con LIMIT 1 indicamos que queremos solo el ultimo registro de esa columna). ;La variable resulid contendra numero de resultados de la busqueda. exten => 75,n,MYSQL(Query resultid ${connid} SELECT dst FROM cdr WHERE src="${CALLERID(num)}" ORDER BY calldate DESC LIMIT 1) exten => 75,n,NoOp(resultid = ${resultid}) exten => 75,n,MYSQL(Fetch fetchid ${resultid} var1) exten => 75,n,NoOp(Variable = ${fetchid},${var1}) exten => 75,n,MYSQL(Clear ${resultid}) exten => 75,n,MYSQL(Disconnect ${connid}) ;exten => 76,n,VerbioPrompt(La ultima llamada realizada ha sido al numero ${var1}) ;Para llamar a ese numero de nuevo: exten => 75,n,Dial(SIP/${var1},30,Ttm) exten => 75,n,GotoIf($[${DIALSTATUS} = UNKNOW]?uno) ;Se podria tenern en cuenta si el numero es externo o interno para sacarlo por un ;Operador VoIP o no. exten => 75,n(uno),NoOp(No se puede llamar a este numero, posiblemente sea una extension del dialplan.Si quiere llamar a la extension anterior pulse 1.) exten => 75,n,Set(${DIALSTATUS}=CHANUNAVAIL) exten => 75,n,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?dos) exten => 75,n(dos),MYSQL(Connect connid localhost root root cdr) exten => 75,n,NoOp(connid = ${connid}) ;Con LIMIT 1 indicamos que queremos solo el ultimo registro de esa columna). ;La variable resulid contendra numero de resultados de la busqueda. exten => 75,n,MYSQL(Query resultid ${connid} SELECT dst FROM cdr WHERE src="${CALLERID(num)}" ORDER BY calldate DESC LIMIT 2) exten => 75,n,NoOp(resultid = ${resultid}) exten => 75,n,MYSQL(Fetch fetchid ${resultid} var2) exten => 75,n,NoOp(Variable = ${fetchid},${var2}) exten => 75,n,MYSQL(Clear ${resultid}) exten => 75,n,MYSQL(Disconnect ${connid}) ;Para llamar a ese numero de nuevo: exten => 75,n,Dial(SIP/${var2},30,Ttm)

495

exten => 75,n,GotoIf($[${DIALSTATUS} = UNKNOW]?uno) ;Se podria tenern en cuenta si el numero es externo o interno para sacarlo por un ;Operador VoIP o no. exten => 75,n(uno),NoOp(No se puede llamar tampoco este numero.Lo sentimos.) exten => 75,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;DISA;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;1) ;;;;;;;;;;DESCRIPCION:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;sI LLAMO DESDE MI MOVIL COMPRUEBA QUE ES MI NUMERO Y ;; ;GENERA UN CALL FILE , ESTE ME LLAMA Y ME DA TONO PARA;; ;QUE YO LLAME A TRAVES DE LA CENTRALITA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;exten => _6XXXXXXXX,1,Answer() ; ;Le asignamos a la variable ID el CALLERID ;exten => _6XXXXXXXX,n,Set(ID=${CALLERID(num)}) ; ;Si quiero que sea un servicio privado para mi movil hace falta el GotoIf ;Si quiero que sea un servicio accesible desde cualquier móvil ;Si estoy llamando yo desde mi movil va a la etiqueta llamada, sino cuelga ;exten => _6XXXXXXXX,n,GotoIf($[${ID}=650664616]?llamada:normal) ;;;;;;;;;;;;;;;;;;;Creamos un archivo de texto llamado callback;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;exten => _6XXXXXXXX,n(llamada),System(echo Channel:SIP/+34${ID}@proxy01.sipphone.com >> /tmp/disa) ; ;exten => _6XXXXXXXX,n,System(echo Callerid:RECALL >> /tmp/disa) ; ;exten => _6XXXXXXXX,n,System(echo WaitTime:30 >> /tmp/disa) ; ;exten => _6XXXXXXXX,n,System(echo Maxretries:2 >> /tmp/disa); ;exten => _6XXXXXXXX,n,System(echo RetryTime:300 >> /tmp/disa); ;exten => _6XXXXXXXX,n,System(echo Account:2000 >> /tmp/disa); ;exten => _6XXXXXXXX,n,System(echo Application:Disa >> /tmp/disa); ;exten => _6XXXXXXXX,n,System(echo Data:no-password|acceso >> /tmp/disa); ;exten => _6XXXXXXXX,n,Wait(1) ;La llamada se ha terminado ;exten => _6XXXXXXXX,n,Playback(call-terminated) ; ;exten => _6XXXXXXXX,n,System(mv /tmp/disa /var/spool/asterisk/outgoing); ;exten => _6XXXXXXXX,n(normal),Hangup() ;

;2) ;;;;;;;;;;DESCRIPCION:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AL MARCAR LA EXTENSION 333 DEBE LLAMARME AL MOVIL Y DARME TONO PARA ;PODER LLMAR A TRAVES DE LA CENTRALITA;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 333,1,Answer() ; ;Le asignamos a la variable ID el CALLERID exten => 333,n,Set(ID=${CALLERID(num)}) ; exten => 333,n,GotoIf($[${ID}=2003]?llamada:normal) ;

;;;;;;;;;;;;;;;;;;Creamos un archivo de texto llamado disa;;;;;;;;;;;;;;;;;;;;;;;;;;;; exten => 333,n(llamada),System(echo Channel:SIP/+34650664616 @proxy01.sipphone.com >> /tmp/disa) exten => 333,n,System(echo Callerid:RECALL >> /tmp/disa) exten => 333,n,System(echo WaitTime:30 >> /tmp/disa)

496

exten => 333,n,System(echo Maxretries:2 >> /tmp/disa) exten => 333,n,System(echo RetryTime:300 >> /tmp/disa) exten => 333,n,System(echo Account:2000 >> /tmp/disa) exten => 333,n,System(echo Application:Disa >> /tmp/disa) exten => 333,n,System(echo Data:1234 >> /tmp/disa) exten => 333,n,Wait(1)

;La llamada se ha terminado exten => 333,n,Playback(call-terminated) exten => 333,n,System(mv /tmp/disa /var/spool/asterisk/outgoing/disa) exten => 333,n(normal),Hangup()

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;Uso de DISA: LLAMAR 9999,MARCAR 1234#,SEGUN DE TONO MARCAR CUALQUIER ;EXTENSION DEL CONTEXTO ACCESO;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 9999,1,Answer exten => 9999,n,DISA(1234|acceso)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;DESVIO DE LLAMADAS AL EXTERIOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

exten => 71,1,Goto(callfwd-add,s,1) exten => 72,1,Goto(callfwd-remove,s,1)

;exten => 5000,1,Answer() ; contestamos la llamada ;exten => 5000,n,Set(NUM=${DB(${EXTEN}/FORW)}) ; Leemos la base de datos ;exten => 5000,n,GotoIf($["${NUM}" != ""]?forw) ;exten => 5000,n,Hangup() ;exten => 5000,n(forw),Dial(SIP/+34${NUM}@proxy01.sipphone.com,20,r) ;exten => 5000,n,Hangup()

[callfwd-add] exten => s,1,Answer() exten => s,n,Set(NUM=${CALLERID(num)}) exten => s,n,Set(COUNT=1) exten => s,n(inicio),Playback(please-enter-the&telephone-number&for&your&call-forwarding&astcc-followed-by-the-pound-key) ; digitar el numero al cual queremos desviar todas las llamadas exten => s,n,Read(forw,,15,,2,10) exten => s,n,Playback(call-forwarding) : La voz de asterisk dirá que el desvío de la ;llamada ha sido configurado para el numero exten => s,n,Playback(has-been-set-to) exten => s,n,SayDigits(${forw}) exten => s,n,Playback(if-this-is-correct-press&digits/1&if-this-is-not-correct&digits/2) ; ;Si el numero que escuchamos es exacto presionamos 1 sino 2 exten => s,n,Read(sino,,1,,,5) exten => s,n,GotoIf($["${sino}" = "1"]?setf:conta) exten => s,n(conta),Set(COUNT=$[${COUNT} + 1]) exten => s,n,Gotoif($["${COUNT}" < "4"]?inicio:bye) ; si la variable COUNT es menor ;que 4 vamos a etiqueta inicio sino a la etiqueta bye. Esto sirve para permitir tres ;intentos de configuración antes de colgar la llamada. exten => s,n(setf),Set(DB(${NUM}/FORW)=${forw}) ; etiqueta setf, guardamos en ;numero en la base de datos interna de Asterisk

497

exten => s,n,Wait(1) exten => s,n(bye),Playback(goodbye) exten => s,n,Hangup

[callfwd-remove] exten => s,1,Answer exten => s,n,Set(NUM=${CALLERID(num)}) exten => s,n,Wait(1) exten => s,n,Set(forw=${DB_DELETE(${NUM}/FORW)}) exten => s,n,Playback(call-fwd-cancelled) exten => s,n,Playback(goodbye) exten => s,n,Hangup

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;SKYPE FOR ASTERISK;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Context for our users [skype] include => acceso

exten => 7000,1,Goto(acceso,3000,1) exten => 8000,1,Dial(Skype/davidin99,30,tT)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;CISCO 7941;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[cisco] include => acceso

exten => 5000,1,Dial(SIP/5000) exten => 5000,n,Hangup()

sip.conf

[general]

context=default allowoverlap=no bindport=5060 bindaddr=0.0.0.0 srvlookup=yes language=es callevents=yes register => 17473702523:Yet100:[email protected]/17473702523

[plantillasip](!) type=friend secret=1234 host=dynamic context=acceso canreinvite=yes dtmfmode=rfc2833 nat=no

498

[1000](plantillasip) username=1000 mailbox=1000 callgroup=1 pickupgroup=1-4

[1001](plantillasip) username=1001 mailbox=1001 callgroup=1 pickupgroup=1-4

[1002](plantillasip) username=1002 mailbox=1002 callgroup=1 pickupgroup=1-4

[1003](plantillasip) username=1003 mailbox=1003 callgroup=1 pickupgroup=1-4

[1004](plantillasip) username=1004 mailbox=1004 callgroup=1 pickupgroup=1-4

[1005](plantillasip) username=1005 mailbox=1005 callgroup=1 pickupgroup=1-4

[1006](plantillasip) username=1006 mailbox=1006 callgroup=1 pickupgroup=1-4

[2000](plantillasip) username=2000 mailbox=2000 callgroup=2 pickupgroup=1-4

[2001](plantillasip) username=2001 mailbox=2001 callgroup=2 pickupgroup=2

[2002](plantillasip) username=2002

499

mailbox=2002 callgroup=2 pickupgroup=2

[2003](plantillasip) username=2003 mailbox=2003 callgroup=2 pickupgroup=2 [2004](plantillasip) username=2004 mailbox=2004 callgroup=2 pickupgroup=2 [2005](plantillasip) username=2005 mailbox=2005 callgroup=2 pickupgroup=2 [2006](plantillasip) username=2006 mailbox=2006 callgroup=2 pickupgroup=2 [3000](plantillasip) username=3000 mailbox=3000 callgroup=3 pickupgroup=1-4 [3001](plantillasip) username=3001 mailbox=3001 callgroup=3 pickupgroup=3 [3002](plantillasip) username=3002 mailbox=3002 callgroup=3 pickupgroup=3 [3003](plantillasip) username=3003 mailbox=3003 callgroup=3 pickupgroup=3 [3004](plantillasip) username=3004 mailbox=3004 callgroup=3 pickupgroup=3

500

[3005](plantillasip) username=3005 mailbox=3005 callgroup=3 pickupgroup=3 [3006](plantillasip) username=3006 mailbox=3006 callgroup=3 pickupgroup=3 [3007](plantillasip) username=3007 mailbox=3007 callgroup=3 pickupgroup=3 [4000](plantillasip) username=4000 mailbox=4000 callgroup=4 pickupgroup=1-4 [5000] username=5000 mailbox=5000 type=friend secret=1234 host=dynamic context=acceso canreinvite=yes dtmfmode=rfc2833 callgroup=4 pickupgroup=1-4 [proxy01.sipphone.com] type=peer context=from-external disallow=all allow=ulaw allow=alaw allow=ilbc dtmfmode=rfc2833 host=proxy01.sipphone.com fromdomain=proxy01.sipphone.com insecure=very qualify=yes username=17473702523 fromuser=17473702523 authuser=17473702523 secret=Yet100 canreinvite=no

501

iax.conf

[general] bindport=4569 bindaddr=0.0.0.0 srvlookup=yes accountcode=lss0101 delayreject=yes language=es disallow=all allow=gsm allow=ulaw allow=alaw [portatil] type=friend username=centralyet auth=plaintext context=acceso peercontext=acceso2 secret=123 host=192.168.1.207 callerid='portatil' trunk=yes requirecalltoken=no

502

ACD: Sistema Automático de Distribución de Llamadas Entrantes AEL: Asterisk Exchange Language AGI: Asterisk Gateway Interface AJAM: Asyncronous Javascript Asterisk Manager AMI: Asterisk Management Interface ARA: Asterisk Realtime Architecture ATA: Analog Telephone Adapter

Glosario

503

CDR: Call Detail Record CTI: Computer Telephony Integration DID: Direct In Dial DISA: Direct Inward System Adress DND: Do Not Disturb DUNDI: Dsitribud Universal Number Discovery FXO: Foreign Exchange Office FXS: Foreign Exchange Station IAX: Inter-Asterisk Exchange IETF: Internet Engineering Task Force ITU: International Telecomunication Union IVR: Interactive Voice Response LCR: Least Cost Routing MGCP: Media Gateway Control Protocol NAT: Network Adress Translators NT: Network Termination NTP: Network Transport Protocol PBX: Private Branch Exchange QoS: Quality of Service RDSI: Red Digital de Servicios Integrados RTCP: RealTime Transport Control Protocol RTP: RealTime Transport Protocol SIP: Session Initiation Protocol SCCP: Skinny Client Control Protocol

504

STUN: Simple Transversal of UDP through NATs TE: Terminal Equipment

505

FOROS: <http://groups.google.es/group/asterisk-es> <http://perlenespanol.com/foro/>

LIBROS Y TUTORIALES: <http://cdn.oreilly.com/books/9780596510480.pdf> <http://asterio.com.ar/resources/downloads/Asterisk_desconsolado.pdf> <http://lax.franhp.net/Asterisk/Curs_asterisk_tecnoba_3.pdf> VOIP: <http://www.voipnovatos.es> <http://blog.voipminic.com/> <http://www.voip-info.org/>

Bibliografía

506

ASTERISK: <http://www.sinologic.net/> <http://www.asteriskdocs.org> <http://www.the-asterisk-book.com/unstable/>

PRACTICAS Y APLICACION: <http://www.linux-es.org/distribuciones>

Instalacion y configuracion de Asterisk: <http://www.asterisk.org/> <http://www.asteriskclub.org/> <http://www.loligo.com/asterisk/example-configs.2003-04-24/> <http://www.asteriskguru.com> <http://www.voztovoice.org/?q=node/199>

Preparación del servidor: <http://zeuz-dc.blogspot.com/2008/06/servidor-dhcp.html> <http://www.davidstclair.co.uk/node/18> <http://r3xet.blogspot.com/2008/11/instalar-mysql-5-sobre-linux-centos-5.html> <http://cjaraba.blogspot.com/2008/03/instalar-apache-y-tomcat-en-centos.html> <http://foro.portalhacker.net/index.php/topic,10896.0.html> <http://www.aoddy.com/2007/12/12/how-to-install-phpmyadmin-2113-on-centos-5/> <http://spot-myblog.blogspot.com/2009/09/glibc-svn-and-qt.html>

Funcionalidades: <http://www.verbio.com/> <http://www.fop2.com/> <http://www.asternic.biz/> <http://blog.voz-ip.com/> <http://www.saghul.net/blog/> <http://www.voipnovatos.es/item/2009/12/cmo-instalar-chan_skype-para-asterisk-14-o-16> <http://www.asterisk-peru.org/node/25> <http://www.ecualug.org/?q=2007/03/19/comos/conectar_dos_localidades_usandoasterisk> <http://www.vicosoft.org/blog/%C2%BFque-es-nagios/> <http://www.bulma.net/body.phtml?nIdNoticia=2075> <http://bargues.info/?cat=35> <http://ualtech.wordpress.com/2009/02/05/tutorial-sobre-monitorizacion-de-asterisk-usando-nagios/> <http://www.mitelefoniaip.com/item/72> <http://wiki.centos.org/es/HowTos/Nagios>

Precios: <http://www.amazon.com/ProCurve-Switch-1400-8G-Gigabit-Network/dp/B000P22S2Q> <http://sanisidro-buenosaires.olx.com.ar/sipura-spa-3000-ata-adaptador-telefonico-analogico-iid-14097216> <http://www.ciao.es/Cisco_IP_Phone_7941__1114209>