1
INSTITUTO POLITECNICO NACIONAL ESCUELA SUPERIOR DE INGENIERIA
MECANICA Y ELECTRICA
ldquoUnidad Zacatencordquo
INGENIERIA EN COMUNICACIONES Y ELECTRONICA
Desarrollo de un Software Proxy PBX de VoIP
con funciones de reporte de llamadas
TESIS
Que para obtener el tiacutetulo de
Ingeniero en Comunicaciones y Electroacutenica
Presentan
Liliana Aguilar Hernaacutendez
Agustiacuten Moreno Naacutejera
Asesores
M en C Genaro Zavala Mejiacutea
M en C Fernando Noya Chaacutevez
Diciembre 2011
2
Iacutendice General
Iacutendice de figurashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 4 Iacutendice de tablashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 6 Introduccioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 7 Descripcioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 9 Justificacioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 10 Objetivoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 10 Diagrama a bloqueshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 11 Capiacutetulo I Estado del arte helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12
11 PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12 111 Antecedenteshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12 112 Estado actual de los PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 13
12 VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 15 121 Antecedentes de telefoniacutea convencionalhelliphelliphelliphelliphelliphelliphelliphellip 15 122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIPhellip 17
Capiacutetulo II Marco teoacuterico helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 20 21 PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 20
211 Definicioacuten 212 IP PBX
2121 Caracteriacutesticas helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 21 2122 Componentes y funcionamientohelliphelliphelliphelliphelliphelliphelliphellip 21
22 Proxy PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 22
221 Definicioacuten Sistema Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 22 222 Funcionamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 23 223 Ventajas y desventajas del uso de un Proxyhelliphelliphelliphelliphelliphellip 23 224 Proxy a nivel aplicacioacuten Protocolo SIPhelliphelliphelliphelliphelliphelliphellip 24
23 VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
231 Introduccioacuten a la VoIP helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26 232 Definicioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26 233 Implementacioacuten y funcionamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 27 234 Control de la comunicacioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 27 235 Paraacutemetros VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 28
1251 Coacutedechelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 28 1252 Protocolos de sentildealizacioacuten helliphelliphelliphelliphelliphelliphelliphelliphelliphellip 28 1253 Protocolos de transporte de voz y ancho de banda de la voz helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 29
236 Ventajashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 29
24 Protocolo SIP helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 32 241 Definicioacuten helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 32 242 Conceptos baacutesicos helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33 243 Mensajes SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36 244 Cabecera SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 38
25 Protocolo RTPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 39
3
251 Definicioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 39 252 Encapsulamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 40
Capiacutetulo III Herramientashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42
31 Sockets helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42
311 Sockets en C helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42 312 Meacutetodos de la clase sockethelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 43
32 Desarrollo NET C 44 33 SDK SIP NEThelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 47
331Descripcionhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 47 34 Configuracioacuten objeto SIP Corehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 53 35 Servidor TrixBoXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54 36 Cliente Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54
361 Descripcioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54 362 X-litehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 55
Capiacutetulo IV Desarrollohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 59
41 Desarrollo de software de comunicacioacuten IP usando sockethelliphelliphellip 59 42 Captura y anaacutelisis de Mensajes SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 64
421 Autentificacioacuten de Softphone en el PBX VoIPhelliphellip 64 422 Inicio y fin de una llamada VoIPhelliphelliphelliphelliphelliphelliphelliphellip 64
43 Desarrollo de Software Proxy basado en transacciones SIPhelliphelliphellip 67 44 Desarrollo de Software Proxy para autentificar Softphonehelliphelliphellip 70 45 Desarrollo de Software Proxy para iniciar y finalizar una llamadahellip 73 46 Desarrollo de Software Proxy para generar reportes de llamadashellip 75
Capiacutetulo V Pruebashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
51 Registro de teleacutefono SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76 511 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 77
52 Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphelliphelliphelliphellip 78
521 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
53 Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81 531 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
54 Resultados finaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Conclusioneshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 84 Glosariohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 85 Anexos helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 86 Bibliografiacuteahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 122
4
Iacutendice de figuras
Figura 1 ERICSSON PMBX 1A helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12
Figura 2 Telefoniacutea punto a punto mediante cableshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 15
Figura 3 Telefoniacutea conectada a centralhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 16
Figura 4 Esquema de enrutado en un entorno SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 25
Figura 5 Esquema protocoloshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 6 Trama VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 7 Ejemplo de llamada SIP (200 llama a 201)helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 34
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)helliphelliphellip 34
Figura 9 Proceso de registro 35
Figura 10 Registro completado 36
Figura 11 Encapsulamiento RTP 40
Figura 12 Proceso ClienteServidor 42
Figura 13 Arquitectura general de la Unidad SIPNET API 55
Figura 14 SIP Account Settingshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 56
Figura 15 Propiedades de configuracioacuten de una cuenta SIPhelliphelliphelliphelliphelliphelliphelliphellip 57
Figura 16 Configuracioacuten de cliente SIP 57
Figura 17 SIP Accounts cuenta configuradahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 58
Figura 18 Teleacutefono registrado y autenticadohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 19 Interfaz de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 20 Interfaz de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 63
Figura 21 Analizador de traacutefico en red captura de mensajes SIPhelliphelliphelliphelliphelliphellip 64
Figura 22 Trama de una peticioacuten REGISTERhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 65
5
Figura 23 Proceso de autenticacioacuten y registro de un UAChelliphelliphelliphelliphelliphelliphelliphelliphellip 66
Figura 24 Transacciones SIP mediante un Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 67
Figura 25 Diagrama de transacciones incluidas en el Proxy PBXhelliphelliphelliphelliphelliphellip 68
Figura 26 Nodo perteneciente a la clase NodoListaSoftphonehelliphelliphelliphelliphelliphelliphellip 71
Figura 27 Proceso de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 73
Figura 28 Base de datos Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 75
Figura 29 Diagrama de registro de Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphonehelliphelliphelliphelliphelliphellip 77
Figura 31 Softphone registrado 77
Figura 32 Log de Tramas Register 78
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphellip 79
Figura 34 Esquema SIP de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 79
Figura 35 Log de tramas inicio y fin de sesioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 36 Softphone2helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 37 Llamada establecidahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 38 Esquema PROXY PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 39Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 40 Aplicacioacuten PROXY PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 41 Creacuteditoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 83
6
Iacutendice de tablas
Tabla 1 Ejemplos de direcciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33
Tabla 2 Peticiones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36
Tabla 3 Respuestas SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 37
Tabla 4 Conceptos generaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 51
Iacutendice Seccioacuten de Coacutedigo
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Seccioacuten de Coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 62
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 69
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro
de la redhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 71
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario finalhelliphelliphellip 74
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
2
Iacutendice General
Iacutendice de figurashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 4 Iacutendice de tablashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 6 Introduccioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 7 Descripcioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 9 Justificacioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 10 Objetivoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 10 Diagrama a bloqueshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 11 Capiacutetulo I Estado del arte helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12
11 PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12 111 Antecedenteshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12 112 Estado actual de los PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 13
12 VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 15 121 Antecedentes de telefoniacutea convencionalhelliphelliphelliphelliphelliphelliphelliphellip 15 122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIPhellip 17
Capiacutetulo II Marco teoacuterico helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 20 21 PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 20
211 Definicioacuten 212 IP PBX
2121 Caracteriacutesticas helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 21 2122 Componentes y funcionamientohelliphelliphelliphelliphelliphelliphelliphellip 21
22 Proxy PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 22
221 Definicioacuten Sistema Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 22 222 Funcionamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 23 223 Ventajas y desventajas del uso de un Proxyhelliphelliphelliphelliphelliphellip 23 224 Proxy a nivel aplicacioacuten Protocolo SIPhelliphelliphelliphelliphelliphelliphellip 24
23 VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
231 Introduccioacuten a la VoIP helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26 232 Definicioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26 233 Implementacioacuten y funcionamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 27 234 Control de la comunicacioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 27 235 Paraacutemetros VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 28
1251 Coacutedechelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 28 1252 Protocolos de sentildealizacioacuten helliphelliphelliphelliphelliphelliphelliphelliphelliphellip 28 1253 Protocolos de transporte de voz y ancho de banda de la voz helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 29
236 Ventajashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 29
24 Protocolo SIP helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 32 241 Definicioacuten helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 32 242 Conceptos baacutesicos helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33 243 Mensajes SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36 244 Cabecera SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 38
25 Protocolo RTPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 39
3
251 Definicioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 39 252 Encapsulamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 40
Capiacutetulo III Herramientashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42
31 Sockets helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42
311 Sockets en C helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42 312 Meacutetodos de la clase sockethelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 43
32 Desarrollo NET C 44 33 SDK SIP NEThelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 47
331Descripcionhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 47 34 Configuracioacuten objeto SIP Corehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 53 35 Servidor TrixBoXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54 36 Cliente Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54
361 Descripcioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54 362 X-litehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 55
Capiacutetulo IV Desarrollohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 59
41 Desarrollo de software de comunicacioacuten IP usando sockethelliphelliphellip 59 42 Captura y anaacutelisis de Mensajes SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 64
421 Autentificacioacuten de Softphone en el PBX VoIPhelliphellip 64 422 Inicio y fin de una llamada VoIPhelliphelliphelliphelliphelliphelliphelliphellip 64
43 Desarrollo de Software Proxy basado en transacciones SIPhelliphelliphellip 67 44 Desarrollo de Software Proxy para autentificar Softphonehelliphelliphellip 70 45 Desarrollo de Software Proxy para iniciar y finalizar una llamadahellip 73 46 Desarrollo de Software Proxy para generar reportes de llamadashellip 75
Capiacutetulo V Pruebashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
51 Registro de teleacutefono SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76 511 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 77
52 Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphelliphelliphelliphellip 78
521 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
53 Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81 531 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
54 Resultados finaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Conclusioneshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 84 Glosariohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 85 Anexos helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 86 Bibliografiacuteahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 122
4
Iacutendice de figuras
Figura 1 ERICSSON PMBX 1A helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12
Figura 2 Telefoniacutea punto a punto mediante cableshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 15
Figura 3 Telefoniacutea conectada a centralhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 16
Figura 4 Esquema de enrutado en un entorno SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 25
Figura 5 Esquema protocoloshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 6 Trama VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 7 Ejemplo de llamada SIP (200 llama a 201)helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 34
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)helliphelliphellip 34
Figura 9 Proceso de registro 35
Figura 10 Registro completado 36
Figura 11 Encapsulamiento RTP 40
Figura 12 Proceso ClienteServidor 42
Figura 13 Arquitectura general de la Unidad SIPNET API 55
Figura 14 SIP Account Settingshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 56
Figura 15 Propiedades de configuracioacuten de una cuenta SIPhelliphelliphelliphelliphelliphelliphelliphellip 57
Figura 16 Configuracioacuten de cliente SIP 57
Figura 17 SIP Accounts cuenta configuradahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 58
Figura 18 Teleacutefono registrado y autenticadohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 19 Interfaz de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 20 Interfaz de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 63
Figura 21 Analizador de traacutefico en red captura de mensajes SIPhelliphelliphelliphelliphelliphellip 64
Figura 22 Trama de una peticioacuten REGISTERhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 65
5
Figura 23 Proceso de autenticacioacuten y registro de un UAChelliphelliphelliphelliphelliphelliphelliphelliphellip 66
Figura 24 Transacciones SIP mediante un Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 67
Figura 25 Diagrama de transacciones incluidas en el Proxy PBXhelliphelliphelliphelliphelliphellip 68
Figura 26 Nodo perteneciente a la clase NodoListaSoftphonehelliphelliphelliphelliphelliphelliphellip 71
Figura 27 Proceso de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 73
Figura 28 Base de datos Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 75
Figura 29 Diagrama de registro de Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphonehelliphelliphelliphelliphelliphellip 77
Figura 31 Softphone registrado 77
Figura 32 Log de Tramas Register 78
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphellip 79
Figura 34 Esquema SIP de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 79
Figura 35 Log de tramas inicio y fin de sesioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 36 Softphone2helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 37 Llamada establecidahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 38 Esquema PROXY PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 39Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 40 Aplicacioacuten PROXY PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 41 Creacuteditoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 83
6
Iacutendice de tablas
Tabla 1 Ejemplos de direcciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33
Tabla 2 Peticiones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36
Tabla 3 Respuestas SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 37
Tabla 4 Conceptos generaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 51
Iacutendice Seccioacuten de Coacutedigo
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Seccioacuten de Coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 62
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 69
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro
de la redhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 71
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario finalhelliphelliphellip 74
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
3
251 Definicioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 39 252 Encapsulamientohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 40
Capiacutetulo III Herramientashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42
31 Sockets helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42
311 Sockets en C helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 42 312 Meacutetodos de la clase sockethelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 43
32 Desarrollo NET C 44 33 SDK SIP NEThelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 47
331Descripcionhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 47 34 Configuracioacuten objeto SIP Corehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 53 35 Servidor TrixBoXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54 36 Cliente Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54
361 Descripcioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 54 362 X-litehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 55
Capiacutetulo IV Desarrollohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 59
41 Desarrollo de software de comunicacioacuten IP usando sockethelliphelliphellip 59 42 Captura y anaacutelisis de Mensajes SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 64
421 Autentificacioacuten de Softphone en el PBX VoIPhelliphellip 64 422 Inicio y fin de una llamada VoIPhelliphelliphelliphelliphelliphelliphelliphellip 64
43 Desarrollo de Software Proxy basado en transacciones SIPhelliphelliphellip 67 44 Desarrollo de Software Proxy para autentificar Softphonehelliphelliphellip 70 45 Desarrollo de Software Proxy para iniciar y finalizar una llamadahellip 73 46 Desarrollo de Software Proxy para generar reportes de llamadashellip 75
Capiacutetulo V Pruebashelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
51 Registro de teleacutefono SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76 511 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 77
52 Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphelliphelliphelliphellip 78
521 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
53 Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81 531 Resultadoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
54 Resultados finaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Conclusioneshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 84 Glosariohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 85 Anexos helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 86 Bibliografiacuteahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 122
4
Iacutendice de figuras
Figura 1 ERICSSON PMBX 1A helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12
Figura 2 Telefoniacutea punto a punto mediante cableshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 15
Figura 3 Telefoniacutea conectada a centralhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 16
Figura 4 Esquema de enrutado en un entorno SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 25
Figura 5 Esquema protocoloshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 6 Trama VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 7 Ejemplo de llamada SIP (200 llama a 201)helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 34
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)helliphelliphellip 34
Figura 9 Proceso de registro 35
Figura 10 Registro completado 36
Figura 11 Encapsulamiento RTP 40
Figura 12 Proceso ClienteServidor 42
Figura 13 Arquitectura general de la Unidad SIPNET API 55
Figura 14 SIP Account Settingshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 56
Figura 15 Propiedades de configuracioacuten de una cuenta SIPhelliphelliphelliphelliphelliphelliphelliphellip 57
Figura 16 Configuracioacuten de cliente SIP 57
Figura 17 SIP Accounts cuenta configuradahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 58
Figura 18 Teleacutefono registrado y autenticadohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 19 Interfaz de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 20 Interfaz de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 63
Figura 21 Analizador de traacutefico en red captura de mensajes SIPhelliphelliphelliphelliphelliphellip 64
Figura 22 Trama de una peticioacuten REGISTERhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 65
5
Figura 23 Proceso de autenticacioacuten y registro de un UAChelliphelliphelliphelliphelliphelliphelliphelliphellip 66
Figura 24 Transacciones SIP mediante un Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 67
Figura 25 Diagrama de transacciones incluidas en el Proxy PBXhelliphelliphelliphelliphelliphellip 68
Figura 26 Nodo perteneciente a la clase NodoListaSoftphonehelliphelliphelliphelliphelliphelliphellip 71
Figura 27 Proceso de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 73
Figura 28 Base de datos Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 75
Figura 29 Diagrama de registro de Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphonehelliphelliphelliphelliphelliphellip 77
Figura 31 Softphone registrado 77
Figura 32 Log de Tramas Register 78
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphellip 79
Figura 34 Esquema SIP de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 79
Figura 35 Log de tramas inicio y fin de sesioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 36 Softphone2helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 37 Llamada establecidahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 38 Esquema PROXY PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 39Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 40 Aplicacioacuten PROXY PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 41 Creacuteditoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 83
6
Iacutendice de tablas
Tabla 1 Ejemplos de direcciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33
Tabla 2 Peticiones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36
Tabla 3 Respuestas SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 37
Tabla 4 Conceptos generaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 51
Iacutendice Seccioacuten de Coacutedigo
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Seccioacuten de Coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 62
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 69
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro
de la redhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 71
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario finalhelliphelliphellip 74
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
4
Iacutendice de figuras
Figura 1 ERICSSON PMBX 1A helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 12
Figura 2 Telefoniacutea punto a punto mediante cableshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 15
Figura 3 Telefoniacutea conectada a centralhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 16
Figura 4 Esquema de enrutado en un entorno SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 25
Figura 5 Esquema protocoloshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 6 Trama VoIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 26
Figura 7 Ejemplo de llamada SIP (200 llama a 201)helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 34
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)helliphelliphellip 34
Figura 9 Proceso de registro 35
Figura 10 Registro completado 36
Figura 11 Encapsulamiento RTP 40
Figura 12 Proceso ClienteServidor 42
Figura 13 Arquitectura general de la Unidad SIPNET API 55
Figura 14 SIP Account Settingshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 56
Figura 15 Propiedades de configuracioacuten de una cuenta SIPhelliphelliphelliphelliphelliphelliphelliphellip 57
Figura 16 Configuracioacuten de cliente SIP 57
Figura 17 SIP Accounts cuenta configuradahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 58
Figura 18 Teleacutefono registrado y autenticadohelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 19 Interfaz de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Figura 20 Interfaz de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 63
Figura 21 Analizador de traacutefico en red captura de mensajes SIPhelliphelliphelliphelliphelliphellip 64
Figura 22 Trama de una peticioacuten REGISTERhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 65
5
Figura 23 Proceso de autenticacioacuten y registro de un UAChelliphelliphelliphelliphelliphelliphelliphelliphellip 66
Figura 24 Transacciones SIP mediante un Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 67
Figura 25 Diagrama de transacciones incluidas en el Proxy PBXhelliphelliphelliphelliphelliphellip 68
Figura 26 Nodo perteneciente a la clase NodoListaSoftphonehelliphelliphelliphelliphelliphelliphellip 71
Figura 27 Proceso de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 73
Figura 28 Base de datos Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 75
Figura 29 Diagrama de registro de Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphonehelliphelliphelliphelliphelliphellip 77
Figura 31 Softphone registrado 77
Figura 32 Log de Tramas Register 78
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphellip 79
Figura 34 Esquema SIP de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 79
Figura 35 Log de tramas inicio y fin de sesioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 36 Softphone2helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 37 Llamada establecidahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 38 Esquema PROXY PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 39Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 40 Aplicacioacuten PROXY PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 41 Creacuteditoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 83
6
Iacutendice de tablas
Tabla 1 Ejemplos de direcciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33
Tabla 2 Peticiones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36
Tabla 3 Respuestas SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 37
Tabla 4 Conceptos generaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 51
Iacutendice Seccioacuten de Coacutedigo
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Seccioacuten de Coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 62
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 69
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro
de la redhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 71
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario finalhelliphelliphellip 74
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
5
Figura 23 Proceso de autenticacioacuten y registro de un UAChelliphelliphelliphelliphelliphelliphelliphelliphellip 66
Figura 24 Transacciones SIP mediante un Proxyhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 67
Figura 25 Diagrama de transacciones incluidas en el Proxy PBXhelliphelliphelliphelliphelliphellip 68
Figura 26 Nodo perteneciente a la clase NodoListaSoftphonehelliphelliphelliphelliphelliphelliphellip 71
Figura 27 Proceso de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 73
Figura 28 Base de datos Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 75
Figura 29 Diagrama de registro de Softphonehelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 76
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphonehelliphelliphelliphelliphelliphellip 77
Figura 31 Softphone registrado 77
Figura 32 Log de Tramas Register 78
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIPhelliphelliphelliphelliphelliphellip 79
Figura 34 Esquema SIP de inicio y fin de llamadahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 79
Figura 35 Log de tramas inicio y fin de sesioacutenhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 36 Softphone2helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 80
Figura 37 Llamada establecidahelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 38 Esquema PROXY PBXhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 81
Figura 39Prueba Reporteadorhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 40 Aplicacioacuten PROXY PBX helliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 82
Figura 41 Creacuteditoshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 83
6
Iacutendice de tablas
Tabla 1 Ejemplos de direcciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33
Tabla 2 Peticiones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36
Tabla 3 Respuestas SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 37
Tabla 4 Conceptos generaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 51
Iacutendice Seccioacuten de Coacutedigo
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Seccioacuten de Coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 62
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 69
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro
de la redhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 71
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario finalhelliphelliphellip 74
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
6
Iacutendice de tablas
Tabla 1 Ejemplos de direcciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 33
Tabla 2 Peticiones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 36
Tabla 3 Respuestas SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 37
Tabla 4 Conceptos generaleshelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 51
Iacutendice Seccioacuten de Coacutedigo
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCPhelliphelliphelliphelliphelliphelliphelliphelliphellip 61
Seccioacuten de Coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCPhelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 62
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIPhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 69
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro
de la redhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellip 71
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario finalhelliphelliphellip 74
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
7
Introduccioacuten
La telefoniacutea de hoy en diacutea tal y como la hemos conocido siempre estaacute llegando a
su fin La era de las nuevas tecnologiacuteas con Internet a la cabeza le estaacuten ganando terreno a
grandes consorcios tecnoloacutegicos que han permanecido invariables e intocables durante
mucho tiempo El mundo de las comunicaciones por voz es uno de ellos
Desde la invencioacuten del primer teleacutefono se han venido produciendo cambios y
mejoras en los sistemas de telefoniacutea que han permitido su expansioacuten llegando
praacutecticamente a todos los hogares y rincones del mundo
No obstante en la actualidad estos sistemas siguen basaacutendose en tecnologiacuteas de
hace varias deacutecadas obsoletas y que no son oacuteptimas en muchos sentidos Por ejemplo en el
uso de la liacutenea telefoacutenica cuando se establece una comunicacioacuten se necesita que exista un
canal constantemente abierto o dedicado con el consiguiente desperdicio de recursos que
pudieran ser mejor aprovechados Hoy en diacutea ya no es necesario dedicar un recurso por
completo para mantener una conversacioacuten En la era de Internet es posible que una
conversacioacuten telefoacutenica se pueda mantener entre dos puntos cualesquiera ocupando una
simple porcioacuten del espectro o ancho de banda de la conexioacuten de aacuterea local o hacia Internet
La voz se convierte en paquetes y pasa a denominarse Voz sobre IP o VoIP por sus siglas
en ingleacutes (Voice over Internet Protocol)
Si la voz ya no viaja por un circuito dedicado y exclusivo si no que ahora forma
parte de nuestras comunicaciones de datos se consiguen otro de los beneficios de las
grandes tecnologiacuteas la unificacioacuten La voz y los datos viajan por la misma red y no solo
eso ademaacutes son tratados y gestionados de forma conjunta y coordinada Bajo estas
condiciones se obtiene un uso oacuteptimo de los recursos
Gracias al despliegue de nuevas redes de datos se puede ofrecer ya una gran
cantidad de servicios al usuario final con una calidad oacuteptima y ademaacutes de manera
centralizada Televisioacuten Internet y por supuesto voz Es decir ya no seraacute necesario una
ldquoliacutenea telefoacutenicardquo sino una liacutenea de datos
Dentro de este contexto la Voz sobre IP estaacute teniendo un auge vertiginoso
Fundamentalmente aquellos paiacuteses que disponen yo se estaacuten dotando de redes de uacuteltima
generacioacuten disponen de ventajas en uso y disfrute Sin redes fiables que cuenten con un
gran caudal de ancho de banda no es posible una migracioacuten seria y efectiva Desde este
punto de vista los paiacuteses o comunidades que no tengan claro este concepto perderaacuten el tren
digital y aumentaraacuten auacuten maacutes su deacuteficit tecnoloacutegico (brecha digital)
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
8
La telefoniacutea IP comenzoacute a principios de las deacutecadas de los 901 aunque la mala
calidad de la voz y el impulso que en aquellos momentos estaba tomando la RDSI (Red
digital de servicios integrados) hicieron que no pasara de ser solo un experimento Durante
esta deacutecada se produjo el auge de Internet lo que hizo que todos los esfuerzos tanto de las
empresas como de los operadores fueran dirigidos a potenciar su uso y las aplicaciones de
navegacioacuten Web y correo electroacutenico fueron las que maacutes eacutexito tuvieron lo que junto al
despliegue de las redes moacuteviles dejaron la voz relegada en un tercer plano
Hasta hace muy poco el freno para el despliegue de la telefoniacutea IP en el mercado lo
daba la propia tecnologiacutea la calidad del sonido era bastante defectuosa lo que disuadiacutea a
utilizarla y seguiacutea haciendo uso de la liacutenea telefoacutenica tradicional a pesar de ser bastante
maacutes caro salvo a esa problemaacutetica el sistema se fue abriendo camino Sus ventajas son
muacuteltiples es un servicio maacutes barato permite el uso de nomadismo ndash uso del mismo nuacutemero
telefoacutenico- en cualquier lugar y tiene capacidad multimedia Ademaacutes la calidad del servicio
va en aumento aproximaacutendose a la de la telefoniacutea convencional con la que se permite la
interconexioacuten
En principio todo apunta hacia el triunfo definitivo de la telefoniacutea IP tanto en el
segmento residencial como en el empresarial pero esto solamente se produciraacute si existe una
oferta amplia con calidad y que represente un costo inferior al de la telefoniacutea convencional
facilitando ademaacutes los mismos servicios Asiacute pues en un futuro no muy lejano es
previsible suponer que casi toda la voz se transportaraacute sobre IP pero los usuarios no seraacuten
conscientes de la tecnologiacutea que hay detraacutes sino que simplemente tendraacuten unas
comunicaciones mas econoacutemicas y una terminal multimedia para acceder a ellas con total
movilidad ya que al no depender de numeracioacuten geograacutefica podraacuten hacer y recibir sus
llamadas en cualquier lugar y momento
En el plano empresaria para lograr el enrutamiento de dichas llamadas telefoacutenicas
de manera efectiva es necesaria la implementacioacuten de un PBX (Private Branch Exchange)
utilizado para permitir la conexioacuten de diversos teleacutefonos personales y asiacute lograr la ejecucioacuten
de llamadas internas y la transmisioacuten de llamadas externas
Mantener redes de comunicacioacuten eficientes es prioritario dentro de una empresa ya
que gracias a ellas es posible conocer las necesidades de los clientes conocer los
ofrecimientos de los proveedores y mantener integrada a la organizacioacuten El conmutador
telefoacutenico es parte de la infraestructura de telecomunicaciones que hace posible cumplir
con esa funcioacuten de comunicacioacuten Hace ya algunos antildeo era necesario un operador de
conmutador quien atendiacutea las llamadas telefoacutenicas entrantes que posteriormente canalizaba
con las personas indicadas dentro del establecimiento Actualmente se hace uso de diversas
funciones programables con capacidad para establecer la comunicacioacuten a traveacutes de un
nuacutemero variable de liacuteneas y asiacute realizar el enlace de forma automaacutetica
1 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
9
Descripcioacuten
En base a los conocimientos de programacioacuten adquiridos en la carrera de Ingenieriacutea
en Comunicaciones y Electroacutenica se implementaraacute una aplicacioacuten Proxy PBX basada en
una tecnologiacutea de nueva generacioacuten VoIP Esta aplicacioacuten permitiraacute capturar y procesar
mensajes SIP especificados en el RFC 3261 que esteacuten implicados en una sesioacuten telefoacutenica
esto con el fin de hacer un reporte de llamadas Inicio de llamadas duracioacuten de llamadas
el nuacutemero de extensiones telefoacutenicas que intervienen en la llamada etc
El desarrollo de un software Proxy PBX estaraacute basado en el entorno de
programacioacuten Visual Studio C con la utilizacioacuten de bibliotecas de sockets desarrollado
para el Sistema Operativo Windows mediante su interfaz graacutefica
Para establecer la comunicacioacuten es necesario que exista un cliente y un servidor
donde el servidor tendraacute la funcioacuten de un PBX y podraacute almacenar y distribuir las peticiones
(llamadas) del cliente a toda la red local El Proxy PBX es un elemento que se pondraacute como
intermediario entre el servidor PBX y el cliente Softphone con la intencioacuten de generar los
reportes de las llamadas
Para lograr la comunicacioacuten entre el servidor y sus clientes seraacute necesario hacer uso
de diversos protocolos mediante el modelo OSI En la capa 1 (Fiacutesica) se utilizaraacute como
medio de transmisioacuten cable UTP categoriacutea 5 utilizado normalmente en redes LAN En la
capa 2 (Enlace de datos) se requeriraacute un switch para concentrar todas las terminales
existentes conectadas al servidor Siguiendo con la capa 3 (Red) se implementaraacute el
protocolo IP y con esto se configuraraacuten los clientes dentro de un dominio para ser visibles
por el servidor Dentro de la capa 4 (Transporte) para que exista transmisioacuten de datos se
haraacute uso del protocolo UDP basado en el enviacuteo de datagramas el cual resulta de mayor
factibilidad para transmitir voz en tiempo real Por uacuteltimo en la capa de aplicacioacuten el
protocolo SIP tomaraacute un papel importante para lograr la comunicacioacuten y reconocimiento de
las aplicaciones entre cliente y servidor
La aplicacioacuten Proxy PBX que se desarrollaraacute en este trabajo interviene en la capa 3 de
modelo OSI ya que re define direcciones IP con el fin de alcanzar al servidor PBX
manejara informacioacuten de capa 4 con la intencioacuten de aceptar conexiones y enviar mensajes
SIP mediante el protocolo UDP entre la aplicacioacuten cliente Softphone y la aplicacioacuten
servidor PBX y por uacuteltimo modificara informacioacuten de la capa de aplicacioacuten es decir del
mensaje SIP en su cabecera para dar a conocer informacioacuten de localizacioacuten de los
elementos que intervienen en la llamada SIP
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008
10
Justificacioacuten
Actualmente en Meacutexico hay poco desarrollo de aplicaciones para el manejo de
VoIP en lo que concierne a la telefoniacutea IP Softphone PBX Reporteador de llamadas y
Proxyacutes
Existen muchas aplicaciones para VoIP pero desarrolladas en el extranjero las
aplicaciones que generan reportes de llamadas son a veces incompatibles entre diferentes
marcas son caras y su soporte es en el paiacutes extranjero lo que hace a este tipo de soporte
ineficiente
Se puede adquirir un PBX IP basados en software gratuito normalmente para
Linux pero rara vez se pueden imprimir reportes
Por otro lado en Meacutexico no se desarrollan aplicaciones en tecnologiacuteas que estaacuten
despuntando como VoIP e incluso adquiriendo gran popularidad lo que nos deja en un
plano de atraso tecnoloacutegico
Objetivos
Objetivo General
Aplicar el lenguaje de programacioacuten C para desarrollar un software Proxy PBX
implementado en una red de aacuterea local que utiliza la tecnologiacutea VoIP
Objetivos Particulares
a) Aplicar los protocolos SIP IP y UDP para lograr la transmisioacuten y recepcioacuten de
la informacioacuten para asiacute manipular los datos seguacuten las necesidades del usuario
b) Programar sockets dentro del entorno de programacioacuten Windows C para el
desarrollo de una aplicacioacuten que nos permita gestionar las comunicaciones
dentro de una red
c) Establecer comunicacioacuten entre nuestra aplicacioacuten y teleacutefonos basados en la
tecnologiacutea VoIP
d) Disentildear una Interfaz Graacutefica que permita la gestioacuten de llamadas y el reporte de
las mismas
11
IP
Diagrama a bloques del proyecto y sus alcances
UPDRTP
UAC 1
SIP
PROXY PBX
Servidor de Registro
Reporteador
UAC
UAC 2
VoIP Gateway
PSTN
12
CAPITULO I ESTADO DEL ARTE
11 PBX
111 Antecedentes
Una de las necesidades fundamentales de las empresas es el mantener una
comunicacioacuten eficaz Esta funcioacuten actualmente es realizada por el sistema PBX (Private
Branch Exchange) es un dispositivo que permite la operacioacuten de una red telefoacutenica privada
que es utilizada dentro de una empresa Este sistema dispone de cierto nuacutemero de liacuteneas
conecta las extensiones internas y al mismo tiempo las conecta con la red puacuteblica
conmutada conocida tambieacuten como PSTN (Public Switched Telephone Network)
En un inicio se utilizaban centrales manuales de conmutacioacuten conocidas como
PMBX2 (Figura 1) Este teacutermino duro muy poco tiempo en el mercado y hace referencia a
eacutepoca donde las llamadas eran transferidas de un circuito a otro manualmente conectando
cables entre los abonados este sistema era poco eficiente y tuvo principalmente 2
problemas que impulsaron su evolucioacuten
El primero era que las operadoras podiacutean escuchar las llamadas y la segunda causa fue el
error humano ya que en ocasiones se enlazaban las llamadas a lugares equivocados La
solucioacuten realizar este procedimiento mediante maquinas automaacuteticas
Figura 1 ERICSSON PMBX 1A
2 Private Manual Branch Exchange
13
A partir de este punto el avance de la telefoniacutea estuvo iacutentimamente ligado al
desarrollo de los sistemas de coacutemputo ya que aunque los equipos que reemplazaban a los
PMBX todaviacutea utilizaban tecnologiacutea convencional su sistema central ya estaba basado en
una computadora Gracias a este avance se comenzaron a agregar funciones uacutetiles tanto en
telefoniacutea puacuteblica como en la telefoniacutea corporativa y asiacute se obteniacutean cada vez maacutes
beneficios maacutes funcionalidad mayor capacidad y menor costo
En el aacutembito empresarial es de suma importancia mantener comunicaciones
eficientes El sistema PBX se desarrolloacute para proveer a las empresas de funciones
mejoradas que no ofreciacutean las compantildeiacuteas de telefoacutenicas en la actualidad existen equipos
de conmutacioacuten que de manera automaacutetica registran las llamadas entrantes y salientes la
duracioacuten de cada una de ellas y los nuacutemeros troncales y de enlace entre otras
funcionalidades
112 Estado actual de los PBX
Una de las tendencias maacutes recientes en telefoniacutea es la telefoniacutea computarizada
paralelo al desarrollo de sistemas telefoacutenicos que transmiten la voz por medio de la red de
Internet Estos llevan el nombre de VoIP PBX oacute IP PBX
Actualmente existen cuatro diferentes opciones de sistemas telefoacutenicos
PBX
Servicio de PBX Virtual
IP PBX
Servicio de IP PBX Virtual
Un IP PBX es un sistema telefoacutenico basado en software que permite a un negocio
disfrutar de varias funcionalidades y servicios que son normalmente son muy difiacuteciles y
costosos de implementar con las centralitas telefoacutenicas PBX tradicionales
En la actualidad el registro y direccionamiento de llamadas es administrado mediante
software implementado bajo la tecnologiacutea VoIP que de manera automaacutetica suprime el
trabajo de una operadora telefoacutenica que registraba la duracioacuten de llamadas asiacute como la
restriccioacuten hacia diversos usuarios
Una la de las aplicaciones maacutes conocidas para realizar este tipo de funciones es la
llamada Asterisk que fue creada en el antildeo de 1999 por Mark Spencer de la empresa Digium
y donada a la comunidad con licencia libre tras lo cual se han recibido muchas
colaboraciones y mejoras por parte de muchos desarrolladores libres y empresas sin
solicitar nada a cambio
14
Poco a poco esta aplicacioacuten se ha convertido en la evolucioacuten de las tradicionales
centralitas analoacutegicas y digitales permitiendo tambieacuten la integracioacuten de la tecnologiacutea maacutes
actual VoIP Asterisk ha sido un sistema de comunicaciones completo avanzado y
econoacutemico en la actualidad
Este sistema permite realizar labores que hasta el diacutea de hoy lo llevaban realizando
sistemas extremadamente costosos y complicados
Una de las ventajas maacutes interesantes es su posibilidad como sistema hiacutebrido ya que
permite gestionar comunicaciones telefoacutenicas tradicionales (analoacutegicas digitales moacuteviles
etc) como comunicaciones IP mediante el uso de los protocolos estaacutendar de VoIP A pesar
de las ventajas que nos ofrece Asterisk presenta deficiencias en plataformas para Windows
ya que carece de funcionalidades para generar reportes de llamadas Dicha funcioacuten al ser
una pieza fundamental para un sistema PBX el cliente se ve en la necesidad de adquirir
este complemento lo cual incrementa costos debido al desarrollo y soporte teacutecnico en el
extranjero
15
12 VoIP
121 Antecedentes de la telefoniacutea convencional
En sus inicios el teleacutefono consistiacutea en un aparato con un altavoz y un microacutefono
unido mediante un cable con otro aparato semejante situado a cierta distancia (ver figura 2)
A traveacutes de dicho cable se enviaba y recibiacutea la voz de cada uno de los extremos lo que
permitioacute mantener conversaciones con personas situadas a distancia
En la primera etapa (1878) cada terminal debiacutea realizar la unioacuten con los teleacutefonos
remotos mediante un cable donde si no existiacutea conexioacuten en los dos extremos era imposible
efectuar la comunicacioacuten Eso provocoacute la aparicioacuten de muacuteltiples cables tirados por las
ciudades uniendo teleacutefonos particulares
Figura 2 Telefoniacutea punto a punto mediante cables
En la segunda etapa (1891) una entidad global se encargoacute de gestionar los cables
de modo que cada teleacutefono se unioacute a una central (ver figura 3) Cuando alguien deseaba
realizar una llamada en la central se uniacutean los cables de ambos teleacutefonos lo que permitiacutea
hablar con cualquier teleacutefono que estuviera conectado a la central sin necesidad de
conectar un cable especiacutefico con cada teleacutefono Para conseguir esto se hizo necesaria la
identificacioacuten de cada teleacutefono mediante un nuacutemero
Al principio las centrales eran manuales Era necesaria la existencia de un operador
que realizara la unioacuten de los cables a traveacutes de grandes paneles con muacuteltiples nodos Con el
tiempo se inventoacute una central automaacutetica que permitioacute acelerar el proceso
Durante muchos antildeos conseguir la conexioacuten telefoacutenica llevaba mucho tiempo en
ocasiones varias horas debido a la congestioacuten dentro de un canal de comunicacioacuten
16
Figura 3 Telefoniacutea conectada a central
En cualquier caso el hecho es que comenzaron a instalarse centrales en distintas
ciudades que luego eran unidas entre siacute Gracias a eso se pudieron realizar llamadas
interurbanas Para lograrlo la central origen debiacutea unir el cable del teleacutefono que realizaba
la llamada con el cable que la uniacutea con la central destino Y eacutesta a su vez debiacutea unir este
cable con el del teleacutefono destino Para aprovechar el cableado las uniones entre centrales se
multiplexaban de modo que era posible llevar por el mismo cable maacutes de una llamada
Esto se lograba mediante multiplexacioacuten por divisioacuten de frecuencia (FDM) donde
mediante un sintonizador era posible seleccionar una determinada frecuencia emitida por la
central telefoacutenica
Durante mucho tiempo toda la red telefoacutenica fue analoacutegica La informacioacuten
transmitida por los cables era una transformacioacuten directa de la voz en voltaje que era lo
que se enviaba y recibiacutea En su camino desde el origen al destino la sentildeal atravesaba
diversos filtros analoacutegicos repetidores y amplificadores Todos estos dispositivos (ademaacutes
de los posibles problemas del cable o interferencia) provocaban la aparicioacuten de ruido en el
sonido que no podiacutean ser eliminados faacutecilmente y que originaban una baja calidad de
sonido en el otro extremo
Con la aparicioacuten de la telefoniacutea digital la comunicacioacuten fue maacutes eficiente Mediante
el uso de conversores analoacutegicodigital y digitalanaloacutegico en lugar de enviar la voz
convertida en voltaje se enviacutea esa voz digitalizada La sentildeal transmitida puede seguir
sufriendo ruido e interferencia por culpa de problemas en el medio de transmisioacuten Pero
cuando llega a un punto intermedio de la red (central repetidor etc) la sentildeal original puede
ser restaurada completamente eliminando el ruido de la conversacioacuten
Progresivamente las redes telefoacutenicas de los distintos paiacuteses se han ido
transformando en digitales en lo que a conexioacuten entre centrales se refiere La conexioacuten
entre los teleacutefonos y la central sigue siendo analoacutegica pero las centrales recogen la sentildeal y
17
la digitalizan por lo que no se acumula ruido en el sonido por culpa de la conexioacuten entre
centrales
Esto es posible uacutenicamente gracias a la digitalizacioacuten de la voz que permite
almacenar partes de la conversacioacuten y mandarlas instantes despueacutes Es posible dividir por
ejemplo cada conversacioacuten en secciones de mileacutesimas de segundo que son enviadas a
traveacutes del cable en mucho menos tiempo auacuten pudiendo aprovechar el mismo cable para
cientos de conversaciones
Con el paso de los antildeos las nuevas tecnologiacuteas han adquirido un papel muy
importante dentro de las comunicaciones como lo es la tecnologiacutea VoIP que da lugar a la
implementacioacuten de la telefoniacutea IP que se viene abriendo paso frente a la telefoniacutea
convencional
122 Estado actual de la Telefoniacutea IP bajo la tecnologiacutea VoIP
En la deacutecada de los 90 un grupo de personas perteneciente al entorno de la
investigacioacuten tanto de instituciones educativas como empresariales comenzaron a mostrar
cierto intereacutes por transportar voz y video sobre redes IP especialmente a traveacutes de intranets
corporativas e Internet Esta tecnologiacutea es conocida hoy en diacutea como VoIP y es el proceso
de dividir el audio y el video en pequentildeos fragmentos transmitir dichos fragmentos a traveacutes
de una red IP y re ensamblar esos fragmentos en el destino final permitiendo de esta manera
que la gente pueda comunicarse
La idea de la VoIP no es nueva ya que hay patentes y publicaciones de
investigaciones que datan de varias deacutecadas La VoIP ha tomado un papel central en la
autopista de la informacioacuten (o Internet) para que la red pueda interconectar cada hogar y
cada negocio a traveacutes de una red de conmutacioacuten de paquetes Fue la posibilidad de un
despliegue masivo de Internet la que volvioacute a reabrir el intereacutes en la VoIP a partir de esos
antildeos
En 1995 una pequentildea compantildeiacutea llamada Vacoltec anuncioacute el lanzamiento del
primer teleacutefono software para Internet Este software era uacutenicamente uacutetil para entablar una
comunicacioacuten de PC a PC y para ello necesitaba hacer uso de diversos requisitos hardware
tales como microacutefono altavoces tarjeta de sonido y moacutedem Baacutesicamente el
funcionamiento de este software es igual al de hoy en diacutea transformar la sentildeal de voz en
paquetes IP una vez comprimida Sin embargo esta alternativa a la comunicacioacuten
telefoacutenica tradicional fue comercialmente un fracaso ya que las conexiones a Internet que
se disponiacutean ofreciacutean un ancho de banda muy escaso
Durante los antildeos siguientes la tecnologiacutea asociada a las redes de datos y las
comunicaciones continuoacute mejorando para ser en 1998 cuando se dieron definitivamente los
primeros pasos desde un punto de vista comercial En este antildeo diversas compantildeiacuteas lanzaron
al mercado adaptadores que permitiacutean hacer uso de los teleacutefonos tradicionales en un
entorno VoIP Ello facilitoacute el acercamiento a los clientes a la hora de poder hacer uso de la
18
tecnologiacutea VoIP por lo que algunas empresas importantes se lanzaron al mercado
ofreciendo productos y servicios relacionados con esta tecnologiacutea Durante el antildeo 1998 la
tecnologiacutea VoIP alcanzaba ya el 1 del traacutefico total de voz su carrera habiacutea comenzado
En 19993 compantildeiacuteas dedicadas a las redes de datos tales como CISCO crearon las
primeras plataformas destinadas a empresas capaces de tratar con traacutefico VoIP Esto supuso
un nuevo impulso a la VoIP ya que comenzoacute a implantarse en muchas empresas La
consecuencia directa fue que la VoIP alcanzara en el antildeo 2000 maacutes del 3 del traacutefico total
de voz
Las redes de datos siguieron mejorando en antildeos venideros y alrededor del antildeo 2005
ya era faacutecil para cualquier persona de paiacuteses desarrollados conseguir una conexioacuten a
Internet que cumpliera los requisitos miacutenimos para ofrecer una buena calidad de voz y una
comunicacioacuten fiable a traveacutes de VoIP reduciendo al miacutenimo las posibles interrupciones
que se pudieran producir durante la conversacioacuten
Esto supuso otro gran impulso a la VoIP y provocoacute que al diacutea de hoy existan
muchas soluciones que hacen uso de esta tecnologiacutea Un ejemplo claro es Asterisk una
centralita telefoacutenica de software libre que se distribuye bajo licencia GPL Este producto
soportado comercialmente por Digium se ha convertido en pocos antildeos en una de las
soluciones IP maacutes extendidas en diversos aacutembitos como el empresarial o el educativo Otro
ejemplo destacable de producto VoIP es Skype que fue creado por dos joacutevenes
universitarios en el antildeo 2003 A diferencia de Asterisk Skype hace uso de un protocolo
privado que no estaacute basado en un estaacutendar lo que a largo plazo se piensa que limitaraacute a sus
usuarios Al diacutea de hoy Skype se puede emplear en multitud de plataformas y su uso se
encuentra tambieacuten ampliamente extendido
De un modo u otro a finales del antildeo 2008 se esperaba que el negocio relacionado
con la VoIP llegara a la impresionante cifra de 5000 millones de doacutelares El bajo costo de
las llamadas a distancia y las nuevas funcionalidades que se estaacuten implementando son soacutelo
dos de los alicientes que estaacuten provocando esta revolucioacuten
Aunque VoIP puede definirse abreviada como una tecnologiacutea que aprovecha el
protocolo TCPIP para ofrecer conversaciones de voz lo cierto es que es mucho maacutes que
esto VoIP puede ser usada para reemplazar la telefoniacutea tradicional en un entorno
empresarial en un pequentildeo negocio o en una casa o simplemente para antildeadir ventajas a un
sistema de telefoniacutea tradicional
3 Joseacute Manuel Huidobro Moya Tecnologiacutea IP y Telefoniacutea VoIP 2006
19
El proceso de convergencia ha seguido un camino pausado No es sencillo invertir
en nuevos equipos o infraestructura como lo demanda el actual ritmo de crecimiento en
materia de TICs por tanto se tiende a seguir un modelo hiacutebrido donde conviven PBX
tradicionales y PBX habilitados con soporte para redes IP Hoy en diacutea la industria de las
telecomunicaciones ha decidido apostar fuerte por una plataforma comuacuten sobre el
Protocolo de Internet aunque como hemos mencionado anteriormente ha decidido hacerlo
con visioacuten de largo plazo Para muchas organizaciones incluyendo instituciones de
educacioacuten la convergencia significa la oportunidad de fusionar las aplicaciones existentes
con nuevas herramientas de comunicacioacuten y nuevos modelos de transmisioacuten de la
informacioacuten cuyas posibilidades son infinitas
En este rubro Meacutexico ocupa uno de los primeros lugares a nivel Ameacuterica Latina en
el uso de la telefoniacutea IP Cada vez maacutes organizaciones estaacuten optando por los beneficios de
la convergencia al mundo IP El mercado de la telefoniacutea por Internet ha crecido
constantemente en los uacuteltimos antildeos y seguiraacute con esta tendencia en el futuro proacuteximo
Las ventajas que la convergencia plantea se vislumbran prometedoras Auacuten no hay
una idea clara del impacto que esta tecnologiacutea de convergencia puede tener no soacutelo en los
modelos de negocios actuales sino en otros campos como lo es el sector educativo y de
investigacioacuten Quien domine el lenguaje de las comunicaciones por Internet tendraacute un vasto
mundo de oportunidades no solo de desarrollo profesional sino tambieacuten personal
20
CAPIacuteTULO II MARCO TEOacuteRICO
21 PBX
211 Definicioacuten
Una central privada automaacutetica de conmutacioacuten para aplicaciones telefoacutenicas
denominado generalmente PABX (Private Automatic Branch Exchange) o uacuteltimamente
solo PBX ya que se entiende que todas son automaacuteticas es un equipo que tiene control por
software y proporciona funciones de conmutacioacuten a los usuarios a ella conectados El PBX
permite conmutar las llamadas internas sin necesidad de acceder a la red puacuteblica de
conmutacioacuten
A continuacioacuten se explica el significado del acroacutenimo PABX
Private Debido a que este tipo de sistemas e instalaciones tienen un uso privado
cuyos servicios no se encuentran disponibles desde otras redes de telefoniacutea de
acceso puacuteblico
Automatic Se refiere al modo de conmutacioacuten que desde hace ya mucho tiempo
es automaacutetico para todos los equipos por lo que normalmente en vez de decir
PABX se dice PBX
Branch Sugiere que los equipos conectados a estas redes privadas se comportan
en realidad como una ramificacioacuten de las grandes redes de acceso puacuteblico
Exchange Debido a que estos sistemas permiten intercambiar informacioacuten es su
caso esta informacioacuten son sobre todo llamadas telefoacutenicas
212 IP PBX
Actualmente existe una gran diversidad de modelos de centrales telefoacutenicas centrales
con mayor o menor nuacutemero de extensiones para pequentildeas o grandes empresas de maacutes o
menos prestaciones con mayor o menor funcionalidad totalmente analoacutegicas semi-
digitales completamente digitales hiacutebridas o completamente IP
Un PBX IP es un equipo telefoacutenico disentildeado para ofrecer servicios de comunicacioacuten de
voz yo video a traveacutes de las redes de datos mediante tecnologiacutea VoIP e interactuar con la
red PSTN tanto RTB como RDSI y moacutevil
Para disponer de las funciones de una centralita telefoacutenica IP PBX se tienen varias
opciones IP PBX basada en hardware IP PBX basada en software IP Centrex y PBX
hiacutebrida con soporte VoIP
21
2121 Caracteriacutesticas
Una centralita telefoacutenica IP PBX permite comunicacioacuten de voz yo video a traveacutes de
las redes de datos utilizando tecnologiacutea VoIP asiacute como interactuar con las liacuteneas
telefoacutenicas convencionales PSTN o RTC (Red Telefoacutenica Conmutada) tanto analoacutegicas
RTB (Red Telefoacutenica Baacutesica) como digitales RDSI (Red Digital de Servicios Integrados) y
moacuteviles GSMGPRSUMTS
Una centralita telefoacutenica IP PBX trabaja internamente con el protocolo IP utilizando
infraestructuras de comunicaciones de datos basadas en IP como Internet LAN (Local
Area Network Red de aacuterea local) WLAN (Wireless LAN Wireless Local Area Network
Red de aacuterea local inalaacutembrica) y WAN (Wide Area Network Red de aacuterea amplia)
Una IP PBX puede tener las siguientes caracteriacutesticas de acuerdo a su funcionamiento
IP PBX hardware la centralita existe como dispositivo fiacutesico de hardware
Normalmente cada uno de estos tipos se basa en un hardware especiacutefico con su
propio procesador integrado que les permite soportar y manejar sus caracteriacutesticas
especiacuteficas de sentildealizacioacuten
IP PBX software (tambieacuten llamada Soft IP PBX) la centralita consiste en un
sistema de software
IP Centrex (tambieacuten llamado Virtual IP PBX o Hosted IP PBX) la compantildeiacutea
telefoacutenica proporciona virtualmente el servicio simulado de IP PBX
PBX con soporte VoIP (tambieacuten llamada PBX hiacutebrida) la mayoriacutea de PBX
tradicionales pueden disponer de las funciones de una centralita IP PBX conectando
moacutedulos donde se incorpora la tecnologiacutea VoIP
2122 Componentes y funcionamiento
A continuacioacuten se describen los principales componentes de una centralita telefoacutenica
IP PBX y su funcionamiento
La centralita telefoacutenica IP PBX es el nuacutecleo del sistema de comunicacioacuten telefoacutenica de la
empresa esta se conecta a la red LAN que debe disponer de suficiente ancho de banda para
el transporte de datos voz y video
Los teleacutefonos IP asiacute como los teleacutefonos IP DECT se conectan en la LAN y se registran en
la centralita telefoacutenica IP PBX
22
Las PCrsquos de la red tanto con conexioacuten cableada como Wi-Fi pueden acceder a la centralita
telefoacutenica IP PBX a traveacutes de la LAN realizando llamadas mediante Softphones
registrados en el IP PBX
Un gateway VoIP o ATA (Analog Telephone Adapter) permite conectar con equipos
estaacutendar como teleacutefonos analoacutegicos faxes o teleacutefonos inalaacutembricos DECT
La telefoniacutea VoIP permite extender la red telefoacutenica privada a traveacutes de Internet integrando
de ese modo oficinas remotas en la infraestructura de comunicaciones de la empresa Los
usuarios acceden a los servicios que proporciona la centralita PBX IP a traveacutes de diversos
dispositivos entre los cuales se encuentran los teleacutefonos IP Softphones Fax mensajeriacutea
instantaacutenea sistemas de videoconferencia dispositivos moacuteviles etc
22 Proxy PBX
221 Definicioacuten de un Sistema Proxy
Un sistema proxy proporciona acceso a Internet a un solo anfitrioacuten o a un nuacutemero
pequentildeo de anfitriones aunque parece que lo proporciona a todos Los anfitriones que si
tiene acceso actuacutean como proxy para las maacutequinas que no lo tienen haciendo lo que estas
uacuteltimas quieren que se haga
Un servidor proxy para un protocolo o para un conjunto de protocolos determinados
se ejecuta en un anfitrioacuten con doble a acceso o con un anfitrioacuten bastioacuten alguacuten anfitrioacuten con
el que pueda establecer comunicacioacuten con el usuario que pueda a su vez comunicarse con
el mundo exterior El programa cliente del usuario se comunica (ldquohablardquo) con este servidor
proxy en lugar de hacerlo directamente con el servidor ldquorealrdquo que estaacute en Internet El
servidor proxy evaluacutea solicitudes del cliente y decide cuales pasar y cuaacuteles no Si una
peticioacuten es aprobada el servidor proxy habla con el servidor real en nombre del cliente (de
ahiacute el teacutermino ldquoproxyrdquo que significa representante en espantildeol) y procede a transmitir las
solicitudes del cliente al verdadero servidor y a transmitir las respuestas de eacuteste de nuevo al
cliente
Para el usuario hablar con el servidor proxy es como hablar directamente con el verdadero
servidor En cuanto a eacuteste uacuteltimo habla con un usuario en el anfitrioacuten que ejecuta el
servidor proxy no sabe que el usuario en realidad estaacute en otro lugar
Un sistema proxy no requiere de hardware especial aunque si de un software especial para
la mayoriacutea de los servicios
23
222 Funcionamiento
Los detalles de coacutemo funciona un proxy variacutean de un servicio a otro Algunos servicios
proporcionan un proxy faacutecil o automaacuteticamente para esos servicios un proxy se instala al
realizar cambios de configuracioacuten a los servidores normales Sin embargo para la mayoriacutea
de los servicios la instalacioacuten de un proxy requiere de un software apropiado para servidor
proxy del lado del servidor De lado del cliente necesita uno de los siguientes
Software cliente personalizado
Con este enfoque el software debe saber coacutemo ponerse en contacto con el servidor proxy
en lugar de con el verdadero servidor cuando un usuario hace una solicitud y coacutemo decirle
al servidor proxy con cual servidor real conectarse
Procedimientos personalizados de usuario
Con este enfoque el usuario utiliza el software cliente estaacutendar para hablar con el servidor
proxy y le dice que se conecte con el verdadero servidor en lugar de conectarse con el
verdadero servidor directamente
223 Ventajas y desventajas del uso de un Proxy
Ventajas
Los servicios Proxy son buenos para la contabilidad del sistema
Debido a que los servidores Proxy comprenden el protocolo de niveles inferiores permiten
que se lleve la contabilidad del sistema de una forma muy efectiva
Desventajas
Los servicios Proxy podriacutean requerir servidores diferentes para cada servicio
Quizaacute necesite un servidor Proxy para cada protocolo por que el servidor Proxy
debe comprender el protocolo para determinar que permite y que no y para hacerse pasar
como cliente ante el verdadero servidor y como el verdadero servidor ante el cliente proxy
Coleccionar instalar y configurar todos estos servidores puede requerir mucho trabajo
Los productos y la paqueteriacutea difieren mucho en cuanto a la facilidad con la que
pueden ser configurados pero facilitar las cosas en un lugar puede hacerlas maacutes difiacuteciles en
otros Por ejemplo los servidores faacuteciles de configurar por lo general estaacuten limitados en
flexibilidad son faacuteciles de configurar porque hacen ciertas suposiciones sobre coacutemo
piensan que van a ser utilizados que puede o no ser lo correcto o apropiado para su sitio
24
224 Proxy a nivel de aplicacioacuten Protocolo SIP
Un proxy a nivel de aplicacioacuten es el que sabe sobre la aplicacioacuten especiacutefica para la
cual estaacute proporcionando servicios proxy comprende e interpreta los comandos en el
protocolo de la aplicacioacuten Por otro lado un proxy a nivel de circuito es el que crea un
circuito entre el cliente y el servidor sin interpretar el protocolo de la aplicacioacuten
Aunque ldquoa nivel de aplicacioacutenrdquo y ldquoa nivel de circuitordquo son teacuterminos utilizados a
menudo con mayor frecuencia distinguimos entre los servidores proxy ldquodedicados y
ldquogeneacutericosrdquo Un servidor proxy dedicado es el que sirve a un solo protocolo un servidor
proxy geneacuterico es el que sirve a varios protocolos
Dentro de la arquitectura de VoIP es necesario el uso de ciertos elementos que
permitan ordenar el traacutefico telefoacutenico y a la vez poner en contacto a los diferentes usuarios
de las redes implicadas
Tal y como trabajan los routers con los datos en general recibiendo y enviando
peticiones desde y hacia otras maquinas los diferentes protocolos IP necesitan igualmente
que alguien o algo encamine sus peticiones hacia los usuarios finales a fin de establecer
una conversacioacuten Esta tarea la realiza un servidor proxy o enrutador encargaacutendose de rutar
la sentildealizacioacuten hacia los sitios adecuados en funcioacuten de las indicaciones pertinentes que
cada protocolo implementa
En este contexto un Proxy SIP es una entidad intermediaria que actuacutea como un
servidor y un cliente con el propoacutesito de hacer peticiones en nombre de otros clientes Un
servidor proxy principalmente juega el papel de enrutamiento lo que significa que su
trabajo es asegurarse de que una solicitud se enviacutea a otra entidad maacutes cercana a los
dirigidos del usuario Los proxys son tambieacuten uacutetiles para la aplicacioacuten de la poliacutetica (por
ejemplo asegurarse de que un usuario se le permite hacer una llamada) Un Proxy
interpreta y si es necesario reescribe partes especiacuteficas de un mensaje de solicitud antes de
enviarlo
De esta forma los Proxyacutes se clasifican en 2 de la siguiente manera
Stateful Proxy Es una entidad loacutegica que mantiene el estado de las transacciones
durante el procesamiento de las peticiones Permite divisioacuten de una peticioacuten en
varias con la finalidad de la localizacioacuten en paralelo de la llamada y obtener la
mejor respuesta para enviarla al usuario que realizoacute la llamada
Stateless Proxy Una entidad loacutegica que no mantiene el estado de las transacciones
durante el procesamiento de las peticiones uacutenicamente reenviacutean mensajes
25
Los Proxyrsquos SIP son elementos que enrutan peticiones SIP al agente de usuario
servidores y las respuestas SIP a los agentes de usuario clientes La solicitud puede
atravesar varios Proxyacutes en su camino a un UAS Cada uno haraacute en el enrutamiento la
modificacioacuten de la solicitud antes de enviarlo a la siguiente elemento Las respuestas
recorreraacute el mismo conjunto de Proxyacutes que la solicitud atravesoacute en el orden inverso
Al ser un proxy es una funcioacuten loacutegica para un elemento de SIP Cuando una solicitud
de llega un elemento que puede desempentildear el papel de un primer indicador decide si es
necesario responder a la solicitud por su propia cuenta Por ejemplo la solicitud puede ser
incorrecta o el elemento puede necesitar credenciales del cliente antes de actuar como un
proxy El elemento puede responder con cualquier coacutedigo de error apropiado Al responder
directamente a una solicitud la elemento es el papel de un UAS
Figura 4 Esquema de enrutado en un entorno SIP
26
23 TECNOLOGIacuteA VoIP
231 Introduccioacuten a la VoIP
Tradicionalmente las redes de aacuterea local se vienen utilizando para la transmisioacuten de
datos pero conforme las aplicaciones tienden a ser multimedia y los sistemas de
comunicaciones en vez de ser elementos independientes y aislados para atender un
determinado tipo de comunicacioacuten son servidores de un conjunto maacutes complejo se tiende
a transmitir cualquier tipo de informacioacuten sobre los medios existentes Asiacute sobre la LAN
corporativa y sobre Internet unos medios extendidos por la mayor parte de las empresas
mediante la adopcioacuten de ciertos estaacutendares y la incorporacioacuten de algunos elementos es
posible enviar voz y viacutedeo con la gran ventaja y ahorro que supone el utilizar la
infraestructura existente
Sin embargo y mientras que los datos no son sensibles al retardo a la alteracioacuten del
orden en que llegan los paquetes o la peacuterdida de alguno de ellos ya que en el extremo
lejano se reconstruyen la voz y la imagen necesitan transmitirse en tiempo real siendo
especialmente sensibles a cualquier alteracioacuten que se pueda dar en sus caracteriacutesticas
Requieren por tanto de redes que ofrezcan un alto grado de servicio y garanticen el ancho
de banda necesario
232 Definicioacuten
VoIP (Voice Over Internet Protocol) es la posibilidad de enviar paquetes de voz en
tiempo real conjuntando teacutecnicas y tecnologiacuteas que nos permiten digitalizar la voz y
acondicionarla para que pueda ser transmitida a traveacutes de redes de datos basadas en el
protocolo de Internet (IP) VoIP es un grupo de recursos que permiten utilizar las redes IP
para aplicaciones de voz tales como telefoniacutea teleconferencias etc
Lo que permite tener conversaciones con personas a traveacutes de la red en lugar de
utilizar la telefoniacutea tradicional La principal ventaja de VoIP es la reduccioacuten de costos en
las llamadas realizadas
233 Implementacioacuten y funcionamiento de telefoniacutea IP
La telefoniacutea IP reuacutene la transmisioacuten de voz y de datos lo que posibilita la
utilizacioacuten de las redes informaacuteticas para efectuar llamadas telefoacutenicas Ademaacutes eacutesta
tecnologiacutea al desarrollar una uacutenica red encargada de cursar todo tipo de comunicacioacuten ya
sea de voz datos o video se denomina red convergente o red multiservicios
La telefoniacutea IP surge como una alternativa a la telefoniacutea tradicional brindando
nuevos servicios al cliente y una serie de beneficios econoacutemicos y tecnoloacutegicos con
caracteriacutesticas especiales como
27
a) Interoperabilidad con las redes telefoacutenicas actuales Donde se dispone de dos tipos
de Interconexioacuten a la red de telefoniacutea puacuteblica desde una central telefoacutenica IP y
directamente desde una tradicional
b) Calidad de Servicio Garantizada a traveacutes de una red de alta velocidad
En Telefoniacutea IP el concepto de calidad incluye aspectos como
- Red de alta disponibilidad que ofrece hasta de un 9999 de recursos
- Calidad de voz garantizada (bajos indicadores de errores de retardo de
eco etc)
c) Servicios de Valor Agregado como el actual prepago y nuevos servicios como la
mensajeriacutea unificada
Este modo de telefoniacutea hace uso de un tipo especial de teleacutefono denominado
Softphone es un software que hace una simulacioacuten de teleacutefono convencional por
computadora Es decir permite usar la computadora para hacer llamadas a otros Softphones
o a otros teleacutefonos convencionales usando un VSP
Normalmente un Softphone es parte de un entorno Voz sobre IP y puede estar basado en el
estaacutendar SIPH323 o ser privativo
234 Control de la comunicacioacuten
Al igual que ocurre en cualquier red las redes de voz sobre paquetes requieren de
una serie de normas que especifican las funcionalidades y servicios que este tipo de redes
deben proveer en todas y cada una de sus dimensiones Estas normas son los protocolos y
un aspecto muy importante es que tengan caraacutecter abierto y que sean internacionalmente
aceptados con el fin de garantizar la interoperabilidad entre productos de distintos
fabricantes facilitando la eleccioacuten de los usuarios y disminuyendo los precios de los
equipos al fabricarse estos en mayor escala
Una vez justificada la necesidad de protocolos el paso siguiente es determinar que
aacutembitos de las redes de voz sobre paquetes deben estandarizarse Para ello se analizara a
detalle los pasos implicados en el establecimiento de una llamada
En las redes telefoacutenicas convencionales una llamada consta de tres fases
establecimiento comunicacioacuten y desconexioacuten Durante el establecimiento se reservan los
recursos necesarios para que en la fase de comunicacioacuten la informacioacuten pueda fluir
libremente entre los dos extremos (cliente y servidor) Finalmente en la desconexioacuten se
liberan los recursos que previamente se habiacutean reservado y se pasa la informacioacuten
necesaria al servidor para que determine la tarifa de dichos recursos Este esquema continuacutea
siendo vaacutelido aunque con algunos cambios para las redes de voz sobre paquetes En estos
casos tradicionalmente se han venido distinguiendo tres grandes grupos de protocolos (ver
figura 5) que pueden ir bien sobre TCP yo UDP y ambos sobre IP
28
235 Paraacutemetros VoIP
Uno de los principales problemas a los que se enfrentan tanto VoIP como todas las
aplicaciones que se integran al protocolo IP es el garantizar la calidad de servicio sobre
Internet ya que puede tener limitaciones de ancho de banda en la ruta y por lo tanto no
existe un aprovechamiento oacuteptimo de los recursos que nos provee la red mundial de la
Internet
2351 Coacutedec
La voz ha de codificarse para poder ser transmitida por la red IP Para ello se hace
uso de coacutedecs que garanticen la codificacioacuten y compresioacuten del audio o del video para su
posterior decodificacioacuten y descompresioacuten antes de poder generar un sonido o imagen
utilizable Seguacuten el Coacutedec utilizado en la transmisioacuten se utilizaraacute maacutes o menos ancho de
banda La cantidad de ancho de banda utilizada suele ser directamente proporcional a la
calidad de los datos transmitidos
Entre los coacutedecs utilizados en VoIP encontramos los G711 G7231 y el G729
(especificados por la ITU-T) Estos Coacutedecs tienen este tamantildeo en su sentildealizacioacuten
G711 bit-rate de 56 o 64 Kbps
G722 bit-rate de 48 56 o 64 Kbps
G723 bit-rate de 53 o 64 Kbps
G728 bit-rate de 16 Kbps
G729 bit-rate de 8 o 13 Kbps
2352 Protocolos de sentildealizacioacuten
El objetivo es establecer un canal de comunicaciones a traveacutes del cual fluya la informacioacuten
de usuario y liberar el anal cuando finalice la comunicacioacuten Para ello debe existir un
dialogo entre los componentes de la red y entre la red y las terminales de usuario Son
protocolos de sentildealizacioacuten el H323 SIP y MGCP
29
2353 Protocolos de transporte de voz y ancho de banda de la voz
Son las normas que definen como debe realizarse la comunicacioacuten entre los extremos por
un canal de comunicaciones previamente establecido Los protocolos de transporte maacutes
empleados son RTCP RTP UDP y TCP
Figura 5 Esquema protocolos
Encapsulamiento de una trama VoIP
Una vez que la llamada ha sido establecida la voz seraacute digitalizada y entonces
transmitida a traveacutes de la red en tramas IP Las muestras de voz son primero encapsuladas
en RTP (Protocolo de Transporte en tiempo Real) y luego en UDP o TCP antes de ser
transmitidas en una trama IP La siguiente figura muestra un ejemplo de una trama VoIP
sobre una red LAN y WAN
Figura 6 Trama VoIP
30
236 Ventajas
VoIP tiene tambieacuten algunas desventajas sin embargo las ventajas que puede
aportar superan claramente a eacutestas A continuacioacuten se mencionan algunos de los beneficios
asociados al uso de VoIP y se ve coacutemo podriacutea mejorar la comunicacioacuten por voz
Ahorrar Dinero En una liacutenea RTC tiempo significa dinero VoIP emplea Internet
como medio de transporte donde el uacutenico costo que se tiene es la factura mensual
de Internet a tu proveedor de servicio o ISP Hoy en diacutea el servicio de Internet maacutes
comuacuten es una ADSL que se puede emplear de forma ilimitada y conlleva a un costo
fijo al mes De esta forma si el ADSL tiene una velocidad razonable podraacute hablar a
traveacutes de VoIP con una buena calidad de llamada y el coste seguiraacute siendo siempre
el mismo
Maacutes de dos personas En una liacutenea de teleacutefono convencional uacutenicamente dos
personas pueden hablar al mismo tiempo Con VoIP se puede configurar una
conferencia que permite a un grupo de personas comunicarse en tiempo real VoIP
comprime los paquetes durante la transmisioacuten algo que provoca que se pueda
transmitir una cantidad mayor de datos Como resultado se pueden establecer maacutes
llamadas a traveacutes de una uacutenica liacutenea de acceso
Hardware y software baratos El uacutenico hardware adicional ademaacutes de una
computadora y conexioacuten a Internet seraacute una tarjeta de sonido unos altavoces y un
microacutefono Todo este material hasta hoy en diacutea bastante barato Existen diferentes
paquetes de software descargables desde Internet que emplean VoIP y que sirven
para establecer comunicaciones por voz algunos con ciertas restricciones teniendo
que invertir en licencias para habilitar llamadas a cualquier parte del mundo Lo que
se debe tomar en cuenta es que para comenzar a emplear VoIP no es necesario un
teleacutefono con todo el equipamiento asociado a este algo que podriacutea resultar maacutes
caro Ademaacutes en la mayoriacutea de los casos no seraacute necesario hacer nuevas
instalaciones de cableado telefoacutenico ya que VoIP se integra con la red de datos
existente en la gran mayoriacutea de empresas y hogares
Prestaciones abundantes interesantes y uacutetiles Usar VoIP tambieacuten significa
beneficiarse de sus prestaciones abundantes que pueden hacer la experiencia de
emplear VoIP mucho maacutes rica y sofisticada tanto en el hogar como en el trabajo
En general ofrece un mayor equipamiento para la gestioacuten de llamadas Se podraacute
por ejemplo hacer llamadas en cualquier lugar del mundo a cualquier destino del
mundo uacutenicamente empleando una cuenta VoIP De esta forma la VoIP pasar a ser
un servicio tan portable como el e-mail es decir no limita la movilidad del
abonado Otras prestaciones que ofrece VoIP son el reconocimiento de llamada
posibilidad de crear nuacutemeros virtuales o el contestador automaacutetico por poner
algunos ejemplos
Maacutes que voz A estar basada en una red de paquetes VoIP puede manejar tambieacuten
otros tipos de datos ademaacutes de la voz podriacuteamos transmitir imaacutegenes video o texto
31
a la vez que la voz De esta forma se puede hablar con alguien a la vez que se le
enviacutean archivos o incluso a la vez que se le observa a traveacutes de una webcam
Uso maacutes eficiente de ancho de banda Se sabe que el 50 de una conversacioacuten de
voz es silencio VoIP rellena estos espacios de silencio con datos de forma que el
ancho de banda de los canales de comunicacioacuten no sean desaprovechados La
compresioacuten y la posibilidad de eliminar la redundancia cuando se transmite voz
seraacuten tambieacuten factores que elevaraacuten la eficiencia de uso del ancho de banda de la
conexioacuten
Esquema de red flexible La red que encontramos bajo VoIP no necesita tener un
esquema o topologiacutea en concreto Esto hace posible que una organizacioacuten pueda
hacer uso de la potencia de las tecnologiacuteas que elijan como ATM SONET o
Ethernet
Cuando empleamos VoIP la complejidad de la red inherente en las conexiones
RTC es eliminada creaacutendose una infraestructura flexible que puede soportar
muchos tipos de comunicacioacuten El sistema estaraacute maacutes estandarizado requeriraacute
menos equipamiento y su tolerancia a fallos seraacute mayor
Teletrabajo Si trabajas en una organizacioacuten que emplea una intranet o extranet
todaviacutea se podraacute acceder a una oficina de trabajo desde casa a traveacutes de VoIP Se
puede convertir el hogar en una parte de la oficina y usar remotamente la voz el fax
o los servicios de datos del lugar de trabajo a traveacutes de la intranet de la oficina La
naturaleza portaacutetil de la tecnologiacutea VoIP estaacute provocando que gane popularidad ya
que proporciona una gran cantidad de comodidades impensables hace unos antildeos La
portabilidad tanto de hardware como de servicios se estaacute convirtiendo cada diacutea maacutes
normal y en ese contexto VoIP encaja perfectamente
Fax sobre IP Los problemas de los servicios de fax sobre RTC son el alto costo que
conllevan para largas distancias la atenuacioacuten de la calidad en las sentildeales
analoacutegicas y la incompatibilidad entre algunas maacutequinas cuando se comunican La
transmisioacuten por fax en tiempo real sobre VoIP simplemente utiliza una interfaz de
fax para convertir los datos en paquetes y asegura que eacutestos seraacuten entregados
completamente y de forma segura
Otra ventaja de este sistema es que ni siquiera se necesitaraacute una maquina fax para
enviar y recibir fax
Desarrollo de software maacutes productivo VoIP puede combinar diferentes tipos de
datos enrutaacutendolos y sentildealizaacutendolos de forma muy flexible y robusta Como
resultado de esto los desarrolladores de aplicaciones de red encontraraacuten maacutes faacutecil
crear y desplegar aplicaciones que realicen comunicaciones de datos empleando
VoIP Ademaacutes la posibilidad de implementar VoIP en navegadores web y
servidores proporciona un aspecto de gran provecho tanto productivo como
competitivo a esta tecnologiacutea
32
24 Protocolo de aplicacioacuten SIP
241 Definicioacuten
El protocolo SIP es un protocolo de sentildealizacioacuten a nivel de aplicacioacuten encargado de
la iniciacioacuten modificacioacuten y terminacioacuten de sesiones multimedia las cuales se llevan a
cabo de manera interactiva Por sesiones multimedia se refiere a aplicaciones de mensajeriacutea
instantaacutenea aplicaciones de video audio conferencias y aplicaciones similares
SIP se definioacute en el RFC 2543 en marzo de 1999 por el grupo de trabajo MMSC
perteneciente a la IEFT En junio del 2002 el IETF publicoacute una nueva revisioacuten del SIP con
el RFC 3261
El protocolo SIP posee 4 caracteriacutesticas que lo hacen muy recomendable para
cumplir esta funcioacuten
Localizacioacuten del usuario SIP posee la capacidad de poder conocer en todo
momento la localizacioacuten de los usuarios De esta manera no importa en queacute lugar se
encuentre un determinado usuario En definitiva la movilidad de los usuarios no se
ve limitada
Negociacioacuten de los paraacutemetros Posibilidad de negociar los paraacutemetros necesarios
para la comunicacioacuten puertos para el traacutefico SIP asiacute como el traacutefico Media
direcciones IP para el traacutefico Media coacutedec etc
Disponibilidad del usuario SIP permite determinar si un determinado usuario estaacute
disponible o no para establecer una comunicacioacuten
Gestioacuten de la comunicacioacuten Permite la modificacioacuten transferencia finalizacioacuten de
la sesioacuten activa Ademaacutes informa del estado de la comunicacioacuten que se encuentra en
progreso
El protocolo SIP es una parte de una arquitectura multimedia ya que la uacutenica
finalidad es la de gestionar las sesiones multimedia iniciarlas modificarlas finalizarlas
etc Sin embargo se integra perfectamente con otros protocolos como RVSP RTP o RTSP
Gracias al protocolo SDP se puede formar una completa arquitectura multimedia
33
acute
251 Conceptos baacutesicos
El protocolo es similar al HTTP por la forma en que funciona (protocolo basado en
texto) y es similar a SMTP en la forma en la que se especifican las direcciones SIP
Las direcciones SIP identifican a un usuario de un determinado dominio A estas
direcciones SIP habitualmente se les llama URI (Uniform Resource Identifier) Una URI se
puede especificar de las siguientes maneras
sipusuariodominio[port]
sipusuariodireccioacutenIP[port]
El dominio representa el nombre del proxy SIP que conoce la direccioacuten IP del
terminal identificado por el usuario de dicho dominio El puerto por defecto para SIP es
5060 aunque es posible especificar otros adicionales si es necesario
En la tabla 1 se pueden ver algunos ejemplos de direcciones SIP
Tabla 1 Ejemplos de direcciones SIP
Nota en la nomenclatura usuariodireccioacutenIP la direccioacuten puede referirse a la IP del
usuario en un momento determinado o a su dominio
Es por tanto posible hacer uso de una direccioacuten IP si no disponemos de un dominio
registrado para este propoacutesito
253 Elementos SIP
Para una comunicacioacuten SIP es necesaria la intervencioacuten de varios elementos donde
cada uno desempentildea su papel Los elementos de la comunicacioacuten son
Los agentes de usuario (User agent) o de manera abreviada UA manejan la sentildealizacioacuten
SIP Se pueden dividir en dos categoriacuteas
Descripcioacuten Direccioacuten SIP
Usuario ldquo200rdquo perteneciente al dominio ldquoesimeipnmxrdquo 200esimeipnmx
Usuario ldquo200rdquo perteneciente al dominio con direccioacuten IP
1921681120
2001921681120
34
User agent client (UAC) Es un elemento que realiza peticiones SIP y acepta
respuestas SIP provenientes de UAS Un ejemplo de UAC es un teleacutefono VoIP ya
que realiza peticiones SIP
User agent server (UAS) Es el elemento encargado de aceptar las peticiones SIP
realizadas por el UAC y enviar a este la respuesta conveniente Un teleacutefono VoIP
tambieacuten es un ejemplo de UAS ya que acepta peticiones de inicio de comunicacioacuten
enviadas por otro teleacutefono UAC
Figura 7 Ejemplo de llamada SIP (200 llama a 201)
Los intermediarios necesarios para que la comunicacioacuten entre dos UA sea posible
Servidor Proxy Es el elemento encargado de reenviar las peticiones SIP
provenientes de un UAC al UAS destino que corresponde asiacute como de encaminar
las respuestas de UAS destino del UAC origen Podemos hacer una similitud con el
encaminamiento que realizan los router con los paquetes a nivel IP es decir seriacutea
como el encargado de enrutar los paquetes SIP Para enrutar lo que hace es una
traduccioacuten de la direccioacuten destino dada de la forma usuariodominio a la forma
usuariodireccioacutenIP donde direccioacuten IP es la direccioacuten IP que tiene en ese
momento el teleacutefono de destino
Figura 8 Ejemplo de llamada SIP con intermediarios (200 llama a 201)
35
En la figura 8 se observa la funcioacuten maacutes importante de un proxy SIP la de enrutar
los mensajes SIP estableciendo asiacute la sentildealizacioacuten SIP pertinente
Registrar-location server Acepta las peticiones de registro de los UAC
guardando toda la informacioacuten referente a la localizacioacuten fiacutesica del UAC para que
si posteriormente llega una peticioacuten con destino el UAC sea posible localizarlo
En el ejemplo de la figura 9 para que 200 llame al usuario 201 es necesario que
previamente ambos teleacutefonos se hayan registrado en servidor de registro Esto es
necesariamente asiacute porque el proxy SIP necesita conocer la direccioacuten IP del teleacutefono
201 para enviarle la peticioacuten de inicio de conversacioacuten y del mismo modo necesita
la direccioacuten IP del teleacutefono 200 para que pueda enrutarle las respuestas SIP
generadas por el teleacutefono 201
Figura 9 Proceso de registro
Una vez que los teleacutefonos se han registrado dentro de servidor estos pueden
entonces realizar y recibir llamadas entre siacute ya que el proxy SIP conoce sus direcciones IP
fiacutesicasreales (mediante consultas) Habitualmente el proxy SIP y el servidor de ldquoregistro-
localizacioacutenrdquo se encuentran juntos en el mismo software por lo general Con esto la
llamada seraacute realizada con eacutexito
Redirect Server Su funcionamiento es similar al servidor proxy anterior con la
diferencia que cuando este resuelve la direccioacuten esto es realiza la traduccioacuten
Servidor Proxy Servidor registro - localizacioacuten
200ualmx 1921681200 201ualmx 1921691201
36
informa al UAC que realizoacute la peticioacuten SIP para que sea este mismo el que la enviacutee
hacia el UA destino Un servidor de redireccioacuten actuacutea realmente como un UAS
Figura 10 Registro completado
Back ndash to ndash back user agent (B2BUA) Es una entidad intermediaria que procesa
peticiones SIP entrantes comportaacutendose como un UAS y responde a estas actuando
como un UAC regenerando por completo la peticioacuten SIP entrante en una nueva
peticioacuten SIP que va a ser enviada
245 Mensajes SIP
El dialogo entre clientes y los servidores SIP se basa en el intercambio de mensajes
de texto Estos mensajes se clasifican en 2 Peticiones y respuestas
Los mensajes de peticioacuten son enviados por las entidades cliente a las entidades servidor
Generalmente toda peticioacuten tiene asociada una respuesta del servidor excepto el ACK que
no requiere respuesta Toda respuesta SIP tiene asociado un coacutedigo numeacuterico que indica el
resultado del intento de servir la aplicacioacuten del cliente
Peticioacuten SIP Descripcioacuten
INVITE Es la peticioacuten SIP que se enviacutea a un usuario cuando queremos
establecer con eacutel comunicacioacuten en este caso una llamada
ACK Esta peticioacuten es enviada por el usuario origen que envioacute la peticioacuten
INVITE para hacer saber al usuario destino que su respuesta OK ha
sido recibida Es el momento en que ambos pueden empezar a enviar
traacutefico Media
BYE Para finalizar la conexioacuten la comunicacioacuten entre los dos usuarios
37
establecida anteriormente con INVITE
CANCEL Se utiliza para cancelar una peticioacuten por ejemplo INVITE que se
encuentra en progreso Por ejemplo si el teleacutefono destino estaacute sonando
pero auacuten no ha sido descolgado y el teleacutefono origen cuelga se enviacutea un
CANCEL a diferencia de un BYE que se enviaraacute si el teleacutefono destino
hubiera sido descolgado previamente y por tanto la comunicacioacuten
establecida unos instantes
OPTIONS Un UA puede enviar peticiones OPTIONS a un UAS para solicitar
cierta informacioacuten sobre este
REGISTER Un UAC enviacutea peticiones REGISTER a un servidor de registro-
localizacioacuten para informar de la posicioacuten actual en la que se encuentra
en un momento determinado Esto hace posible que el UAC pueda ser
localizado haciendo uso de su misma direccioacuten userdominio sin
importar donde el UAC se encuentre fiacutesicamente
Tabla 2 Peticiones SIP
Respuesta SIP Descripcioacuten
1xx Indican el estado temporal de la comunicacioacuten
2xx Informan del eacutexito de una peticioacuten SIP
3xx Informan que la peticioacuten SIP ha de ser reenviada a otro UAS
4xx Indican errores en el cliente SIP
5xx Corresponden a errores en el servidor SIP
6xx Informan de errores generales
Tabla 3 Respuestas SIP
Cabecera SIP
Las cabeceras que aparecen en los mensajes SIP dependen del tipo de mensaje y de los
paraacutemetros necesarios en cada uno de ellos Se indican a continuacioacuten los campos mas
frecuentes con su significado
Accept ndash Contact Especifica a que URI debe reenviar el proxy la peticioacuten
Allow ndash Events Lista los eventos soportados
Call- ID Identifica uniacutevocamente
Contact Transporta una URI que identifica el recurso solicitado o al recurso
llamante
Content-Encoding Indica el tipo de codificacioacuten aplicada al cuerpo del mensaje
Content-Length Indiga la longitud en octetos del cuerpo del mensaje
38
Content ndashType Indica el tipo de flujo de informacioacuten transportada en el cuerpo del
mensaje
CSeq Identifica uniacutevocamente transacciones dentro de un dialogo
Event Indica subscripcioacuten o notificacioacuten a un evento
From Indica el origen de la solicitud
Max-Forwards Limita el nuacutemero de saltos en un meacutetodo
Reason Indica la razoacuten de finalizacioacuten de la sesioacuten
Refer-To Contiene el URI o URL referenciado
Referred-By Contiene informacioacuten sobre el emisor de un mensaje de tipo REFER
Reject-Contact Indica el URI al que el proxy no puede hacer llegar la peticioacuten
Require Contiene la enumeracioacuten de caracteriacutesticas que debe soportar un servidor
Subject Indica el asunto de la sesioacuten multimedia
To Inndica el receptor de la peticioacuten
Via Se utiliza para grabar la ruta seguida por la peticioacuten para utilizarla en la
respuesta
39
25 Protocolo RTP
251 Definicioacuten
PROTOCOLO DE TRANSPORTE EN TIEMPO REAL RTP
RTP (Real- Time Transport Protocol) es el estaacutendar que define las comunicaciones
de audio y video en tiempo real sobre redes IP asumiendo por tanto la existencia de
peacuterdidas y retardos y la posibilidad de variacioacuten dinaacutemica de las caracteriacutesticas de la red en
el transcurso de la comunicacioacuten Suministra funciones de transporte extremo a extremo y
ofrece servicios tales como identificacioacuten del tipo de carga numeracioacuten de secuencia
timestamping etc No garantiza la entrega de traacutefico en tiempo real pero siacute suministra los
recursos para que eacuteste se entregue de manera sincronizada Como su nombre indica estaacute
orientado a la transmisioacuten de informacioacuten en tiempo real como la voz o video
Las aplicaciones interactivas en tiempo real incluidas la telefoniacutea IP y la videoconferencia
prometen controlar gran parte del crecimiento futuro de Internet Por tanto organismos de
estandarizacioacuten como IETF e ITU han estado ocupados durante muchos antildeos en el
establecimiento de estaacutendares para esta clase de aplicaciones Disponiendo de los
estaacutendares apropiados para las aplicaciones interactivas en tiempo real empresas
independientes podraacuten crear nuevos y convincentes productos que interoperen entre siacute
252 Funcionamiento
Dentro de un proceso de comunicacioacuten en tiempo real el lado emisor de una
aplicacioacuten multimedia antildeade campos de cabecera a los fragmentos de audiovideo antes de
pasarlos a la capa de transporte Estos campos de cabecera incluyen nuacutemeros de secuencia
y marcas de tiempo Dado que la mayoriacutea de las aplicaciones multimedia de red pueden
hacer uso de los nuacutemeros de secuencia y de las marcas de tiempo (TTL) es conveniente
disponer de una estructura de paquete estandarizada que incluya campos para los datos de
audiovideo los nuacutemeros de secuencia y las marcas de tiempo asiacute como otros campos
potencialmente uacutetiles RTP definido en el documento RFC 3550 es este estaacutendar RTP
puede emplearse para transportar formatos comunes como PCM GSM y MP3 para sonido
y MPEG H 263 para video Actualmente RTP disfruta de una amplia implementacioacuten en
centenares de productos y prototipos de investigacioacuten Ademaacutes es complementario de otros
importantes protocolos interactivos de tiempo real como SIP y H323
Normalmente RTP se ejecuta sobre UDP El lado del emisor encapsula un fragmento
multimedia dentro de un paquete RTP luego encapsula ese paquete en un segmento UDP y
despueacutes pasa el segmento a IP El lado del receptor extrae el paquete RTP del segmento
UDP a continuacioacuten extrae el fragmento multimedia del paquete RTP y lo pasa al
reproductor multimedia para su decodificacioacuten y procesamiento
40
253 Encapsulamiento
Cada paquete RTP incluye una cabecera fija y puede incluir tambieacuten campos de cabecera
adicionales especiacuteficos de la aplicacioacuten La figura ilustra la cabecera fija Los primeros
doce octetos estaacuten siempre presentes y se componen de los siguientes campos
Versioacuten (2 bits) la versioacuten actual es 2
Relleno (1 bit) indica si los octetos de relleno aparecen al final de la carga uacutetil Si
es asiacute el uacuteltimo octeto de la carga uacutetil incluye una cuenta del nuacutemero de octetos de
relleno El relleno se utiliza si la aplicacioacuten requiere que la carga uacutetil sea un nuacutemero
entero muacuteltiplo de alguna longitud por ejemplo 32 bits
Extensioacuten (1 bit) si se establece la cabecera fija viene seguida por exactamente una
cabecera de extensioacuten la cual se emplea para ampliaciones experimentales de RTP
Cuenta CSRC (4 bits) el nuacutemero de identificadores CSRC que siguen a ala
cabecera fija
0 4 8 9 16 31
V P X CC M Tipo de carga
uacutetil
Nuacutemero de secuencia
Marca de Tiempo
Indicador de fuente de sincronizacioacuten (SSRC)
Identificador de fuente de contribucioacuten (CSRC)
Identificador de fuente de contribucioacuten (CSRC)
Figura 11 Encapsulamiento RTP
V = Versioacuten
P = Relleno
X = Extensioacuten
CC = Cuenta CSRC
M = Marcador
41
Marcador (1 bit) la interpretacioacuten del bit marcador depende del tipo de carga uacutetil
normalmente se utiliza para indicar un punto sentildealado en el flujo de datos
Tipo de carga uacutetil (7 bits) identifica el formato de la carga uacutetil RTP que va a
continuacioacuten de la cabecera
Nuacutemero de secuencia (16 bits) permite la deteccioacuten de peacuterdidas y la secuenciacioacuten
de paquetes en una serie de paquetes que tengan la mima marca de tiempo
Marca de tiempo (32 bits) corresponde al instante de generacioacuten del primer octeto
de datos de la carga uacutetil Las unidades de tiempo de este campo dependen del tipo
de carga uacutetil Los valores han de ser generados desde un reloj local situado en la
fuente
Identificador de fuente de sincronizacioacuten un valor generado aleatoriamente que
indica de manera exclusiva cual es la fuente dentro de una sesioacuten
Identificador de fuente de contribucioacuten identifica una fuente que contribuye con o
antildeade datos a la carga uacutetil Este tipo de identificadores son suministrados por un
mezclador
42
Capiacutetulo III Herramientas
31 Sockets
Se denomina socket a un punto de comunicacioacuten a traveacutes del cual un proceso puede
comunicarse con otro Los procesos que intercambian informacioacuten a traveacutes de sockets
pueden encontrarse en sistemas diferentes
311 Sockets en C
El entorno de programacioacuten C proporciona un extenso conjunto de meacutetodos y
propiedades para las comunicaciones en red Dentro de este se incluye la biblioteca de
clases ldquosocketsrdquo que permite realizar transferencias de datos siacutencronos y asiacutencronos
mediante cualquiera de los protocolos de comunicacioacuten
La clase sockets sigue el modelo de nomenclatura de NET Framework proporciona
un extenso conjunto de meacutetodos y propiedades para las comunicaciones en red y permite
realizar transferencias de datos siacutencronos y asiacutencronos mediante cualquiera de los
protocolos de comunicacioacuten
Esta comunicacioacuten se basa en un esquema donde interactuan cliente y servidor
haciendo uso de diferentes funciones como se muestra en la figura 12
Figura 12 Proceso ClienteServidor
43
312 Meacutetodos clase socket
Bind ( )
Asocia un laquonombreraquo a un socket es decir asocia una direccioacuten IP y un puerto al
socket Normalmente se usaraacute bind en los siguientes casos
Para asociar una direccioacuten y un puerto a un servidor de tal manera que los
clientes sepan en donde encontrar este servicio
Un cliente que establezca comunicaciones no orientadas a conexioacuten asociara un
nombre al socket para poder recibir las respuestas a los datagramas que enviacutee un
servidor
Listen ( )
Se debe llamar tras haber obtenido un descriptor de socket y haberle asignado
un nombre con Bind ( )
Tras llamar a listen ( ) para comunicaciones orientadas a conexioacuten se ejecuta la
funcioacuten Accept ( )
Accept ( )
Nos permite aceptar una conexioacuten realizada por un cliente a un servidor
orientado a conexioacuten Esta funcioacuten tomara la primera conexioacuten que este en la cola
de espera a la cual se hace referencia en el segundo paraacutemetro de la funcioacuten listen( )
y nos devuelve un descriptor del socket a traveacutes del cual poder hacer uso de dicha
conexioacuten
Connect ( )
Permite a un proceso cliente comenzar el proceso de conexioacuten a un proceso
servidor
Normalmente la funcioacuten connect ( ) seraacute invocada por un cliente que quiere
conectarse a un servidor a traveacutes de un protocolo orientado a conexioacuten en este caso
provocara un intercambio de mensajes entre el sistema local y remoto que
culminara en el establecimiento de una conexioacuten o con la devolucioacuten de un coacutedigo
de error
Cada uno de estos procesos (Un proceso cliente y un proceso servidor) se encuentra
en un extremo de la comunicacioacuten consideraacutendose un socket como la abstraccioacuten de este
extremo
44
32 Desarrollo NET C
El avance de las herramientas de programacioacuten y los dispositivos electroacutenicos para el
consumidor ha creado nuevos requerimientos La integracioacuten de componentes de software
de diversos lenguajes fue difiacutecil y los problemas de instalacioacuten eran comunes ya que las
nuevas versiones de los componentes compartidos eran incompatibles con el software
anterior
Como resultado de la popularidad de los dispositivos electroacutenicos moacuteviles y las
aplicaciones web los usuarios ya no estaacuten restringidos soacutelo a las computadoras de
escritorio si no que se adquirioacute una nueva necesidad software accesible para todos y que
estuviera disponible a traveacutes de casi cualquier tipo de dispositivo Para satisfacer esta
necesidad Microsoft anuncio el lenguaje de programacioacuten C este lenguaje esta pensado
para la plataforma NET como un lenguaje que le permitiera a las programadores migrar
con facilidad hacia NET C tiene sus raiacuteces en C C++ y Java adapta las mejores
caracteriacutesticas de cada uno de estos lenguajes y agrega nuevas caracteriacutesticas propias
C estaacute orientado a objetos y contiene una Biblioteca de Clases que consta de
componentes preconstruidos que permiten desarrollar aplicaciones con rapidez C es
adecuado para el desarrollo de aplicaciones demandantes en especial para l crear las
aplicaciones populares basadas en la Web actual
La plataforma NET es la infraestructura sobre la cual pueden distribuirse aplicaciones
basadas en web a una gran variedad de dispositivos moacuteviles teleacutefonos celulares
computadoras de escritorio etc La plataforma ofrece un nuevo modelo de desarrollo de
software que permite crear aplicaciones en distintos lenguajes de programacioacuten de manera
que se comuniquen entre siacute
C es un lenguaje de programacioacuten visual controlado por eventos en el cual se crean
programas mediante el uso de un Entorno de Desarrollo Integrado (IDE) Con un IDE se
puede desarrollar crear ejecutar probar y depurar programas en C de manera
conveniente con lo cual se reduce el tiempo requerido para producir un programa funcional
en una fraccioacuten del tiempo que se llevariacutea si no se utilizara un IDE La plataforma NET
permite la interoperabilidad de los lenguajes
La arquitectura NET puede existir en varias plataformas no solo en los sistemas
basados en Microsoft Windows con lo que extiende la portabilidad de los programasNET
Un ejemplo es Mono un proyecto de software libre de Novell Otro ejemplo es NET
Portable de DotGNU
45
Un componente clave de la arquitectura NET son los servicios Web que son
componentes de software reutilizables que pueden usarse a traveacutes de Internet Los clientes y
otras aplicaciones pueden usar los servicios Web como bloques de construccioacuten
reutilizables
La estrategia de NET extiende el concepto de reutilizacioacuten de software hasta Internet
con lo cual permite que los programadores y las compantildeiacuteas se concentren es sus
especialidades sin tener que implementar cada componente de cada aplicacioacuten
C es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos que es a
la vez sencillo y potente y permite a los programadores crear una gran variedad de
aplicaciones Combinado con NET Framework Visual C permite la creacioacuten de
aplicaciones para Windows servicios Web herramientas de base de datos componentes
controles y mucho maacutes
Entre las aplicaciones que pueden crearse con C estaacuten
Aplicaciones Web ASPNET Describe la utilizacioacuten del editor de coacutedigo de C
en Visual Web Developer para crear aplicaciones Web con paacuteginas de coacutedigo
subyacente en C
Aplicaciones de Windows Forms Describe coacutemo utilizar los formularios
Windows Forms para crear aplicaciones para Windows
Aplicaciones de consola Explica coacutemo crear aplicaciones que no requieren una
interfaz de usuario graacutefica
Obtener acceso y mostrar datos Describe coacutemo interactuar con bases de datos
Aplicaciones moacuteviles e incrustadas Describe coacutemo crear aplicaciones para
Smart Device dispositivos incrustados y dispositivos moacuteviles
Crear y obtener acceso a servicios Web Describe coacutemo interactuar con
servicios Web XML
Crear componentes Describe la creacioacuten de controles de usuario y otros
componentes para NET Framework
Desarrollo en la plataforma Office Describe la utilizacioacuten de Visual Studio
Tools para Office para crear documentos inteligentes
Desarrollo empresarial Describe el desarrollo de aplicaciones para SQL Server
Microsoft Exchange Server etc
46
Programacioacuten en Tablet PC Describe el desarrollo de aplicaciones basadas en
tinta para Tablet PC
Audio viacutedeo juegos y graacuteficos Describe la utilizacioacuten de Windows Media y
DirectX para coacutedigo administrado
Crear Starter Kits Describe coacutemo crear Starter Kits para ayudar a otros a
ponerse raacutepidamente en marcha con su coacutedigo de ejemplo
Para el desarrollo de nuestra aplicacioacuten emplearemos una Aplicacion de Windows Forms
Un aplicacioacuten Windows es un programa que se ejecuta dentro de un sistema operativo
Windows (Windows 2000 Windows XP Windows 7 por ejemplo) y por lo general tiene
una interfaz grafica de usuario (GUI) la parte visual del programa con la que interactuacutea el
usuario
Las aplicaciones Windows Form son aquellas basadas en ventanas y controles comunes de
Windows que se ejecutan en local En la plataforma NET el espacio de nombres que ofrece
las clases necesarias para construir aplicaciones de escritorio bajo Windows se denomina
Windows Forms Este es tambieacuten el nombre geneacuterico que se le otorga ahora este tipo de
programas basados en ventanas
Los formularios Windows Forms son la tecnologiacutea que se utiliza en Visual C para crear
aplicaciones para clientes inteligentes basadas en Windows que se ejecutan en NET
Framework Cuando crea un proyecto de aplicacioacuten para Windows estaacute creando una
aplicacioacuten basada en formularios Windows Forms Utilizaraacute el Disentildeador de Windows
Forms para crear la interfaz de usuario y tendraacute acceso a otras funciones de disentildeo y tiempo
de ejecucioacuten
a Implementacioacuten ClickOnce
b Compatibilidad enriquecida de bases de datos con el control DataGridView
c Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el
aspecto y comportamiento de Microsoft Windows XP Microsoft Office o Microsoft
Internet Explorer
47
El modelo de evento de NET Framework se basa en la existencia de un delegado de
eventos que conecte un evento a su controlador Para provocar un evento se
requieren dos elementos
Delegado que identifica el meacutetodo que proporciona la respuesta al evento
Clase que contiene los datos de eventos
El delegado es un tipo que define una firma es decir el tipo del valor devuelto y los
tipos de lista de paraacutemetros de un meacutetodo Se puede utilizar el tipo de delegado para
declarar una variable que puede hacer referencia a cualquier meacutetodo con la misma
firma que el delegado
La firma estaacutendar de un delegado del controlador de eventos define un meacutetodo que
no devuelve ninguacuten valor cuyo primer paraacutemetro es del tipo Object y hace
referencia a la instancia que provoca el evento y cuyo segundo paraacutemetro se deriva
del tipo EventArgs y contiene los datos de evento Si el evento no genera los datos
de evento el segundo paraacutemetro simplemente es una instancia de EventArgs De lo
contrario el segundo paraacutemetro es un tipo personalizado derivado de EventArgs y
proporciona los campos o las propiedades necesarias para contener los datos de
evento
EventHandler es un delegado predefinido que representa especiacuteficamente un
meacutetodo controlador para un evento que no genera datos Si su evento genera datos
debe suministrar su propio tipo de datos de evento personalizado y crear un
delegado donde el tipo del segundo paraacutemetro sea el tipo personalizado o utilizar la
clase de delegado geneacuterico EventHandler y sustituir el tipo personalizado por el
paraacutemetro de tipo geneacuterico
Para asociar el evento al meacutetodo que lo controlaraacute hay que agregar una instancia
del delegado al evento Siempre que se produce el evento se llama al controlador de
eventos a menos que se quite el delegado
33 SDK SIPNET4
331 Descripcioacuten
El uso del SDK SIPNET estaacute orientado al desarrollo de aplicaciones y servicios
basados en el protocolo SIP Las aplicaciones estaacuten dirigidas al disentildeo de Clientes y
Servidores SIP soportadas por cualquier lenguaje NET Para cuestiones particulares del
proyecto se utilizaraacute el lenguaje de desarrollo C NET
El SDK proporciona al desarrollador caracteriacutesticas compatibles con NET Para su correcto
funcionamiento es necesario ser incorporado al componente NET VSS (Virtual Execution
System) y al Framework Los productos desarrollados con SDK SIPNET soportan Mono y
CLR Microsoft Del mismo modo proporciona un conjunto de clases que permiten el
4 Desarrollado por la empresa Konnetic
48
manejo de entidades y elementos que componen el protocolo SIP dejando como resultado
una biblioteca de clases muy potente para el desarrollo de aplicaciones orientadas a
Software SIP
El coacutedigo fuente estaacute escrito en su totalidad sobre Microsoft NET 20 Framework y corre
en sus versiones 20 30 35 y 40
Muchos de los requisitos y demandas para el desarrollo de aplicaciones SIP han dejado que
la biblioteca de clases SIPNET permita al desarrollador enfocarse en el disentildeo de
algoritmos orientados a la programacioacuten a alto nivel Pero al mismo tiempo sigue
permitiendo configuraciones y control de flujo sobre los mensajes SIP a bajo nivel basado
en eventos Dando como resultado una pila SIP que contiene todas las funciones y servicios
necesarios para el desarrollo estructurado de aplicaciones
La biblioteca proporciona funciones avanzadas de gestioacuten para multi-hilo de conexioacuten
disentildeado para llevar de manera eficiente los entornos de hardware multi-procesador y
multi-nuacutecleo para lograr alto rendimiento en los procesadores actuales Tambieacuten permite
un modelo de comunicacioacuten fiable mediante el apoyo TCP (Transmisioacuten Control Protocol)
o provee la autenticacioacuten y el cifrado mediante el uso de TLS (Transport Layer Security) o
bien permite un mayor rendimiento mediante el uso de UDP (User Datagram Protocol)
Los meacutetodos SIP soportados en la biblioteca incluyen REGISTER INVITE OPTIONS
ACK BYE CANCEL INFO UPDATE y MESSAGE
Los SIP URIrsquos son una parte compleja e importante del protocolo SIP El SDK SIPNET
proporciona un tipo de mecanismo seguro para los elementos URIrsquos derivado de las
bibliotecas de clases SystemUri SystemUriParser y SystemUriBuilder
Un entorno SIP consiste en un nuacutemero de entidades conectadas Estas incluyen UA (User
Agent) Proxy Server Registrar Server Redirect Server y B2BUA (Back-to-Back-User
Agent) Mediante la biblioteca de clases SIPNET se obtienen las herramientas necesarias
para el desarrollo de este tipo de entidades asiacute como para implementarlas dentro de alguna
entidad comercial ya desarrollada y existente en el mercado
En el desarrollo de un cliente y un servidor SIP es necesario el enviacuteo de paquetes de datos
tomando gran importancia su construccioacuten encapsulamiento y enviacuteo Para esto la biblioteca
permite la implementacioacuten de dichos procesos asegurando el cumplimiento del estaacutendar
para el protocolo SIP Por otro lado se busca que dichas aplicaciones cumplan con la
capacidad de recibir peticiones previamente generadas en este proceso la biblioteca
cumple un papel importante para el reconocimiento y anaacutelisis de diversas peticiones y asiacute
realizar acciones en funcioacuten de lo recibido
Las peticiones y respuestas generadas y procesadas estaacuten basadas en el documento RFC
3261 que tiene como funcioacuten estandarizar el desarrollo de aplicaciones basadas en el
protocolo SIP
La biblioteca acepta y codifica nuevos paraacutemetros de mensaje que no aparecen en la
especificacioacuten de mensajes conocidos para la biblioteca tales como meacutetodos coacutedigos de
respuesta extensiones de campos de cabecera (Extension Header Fields) y paraacutemetros de
cabecera Permite el anaacutelisis de mensajes entrantes mediante un motor poderoso DFA
(Deterministic Finite Automaton) para gestionar todo el anaacutelisis de cabeceras
49
La pila SIP puede autenticar cualquier peticioacuten SIP utilizando el esquema de autenticacioacuten
en conformidad con la especificacioacuten en el estaacutendar del protocolo SIP Tanto la
autenticacioacuten cliente como la autenticacioacuten Servidor son soportadas dentro de la biblioteca
La biblioteca SIP se ejecuta en un modo internamente multiprocesos presentado
singlethreaded o multithreaded Se utilizan los mecanismos de sincronizacioacuten para asegurar
seguridad en multithreading a nivel de objetos individuales tales como cuadros de diaacutelogo
y transacciones asiacute como grupo de objetos en la capa de transporte
La configuracioacuten de la pila SIP permite incluir los siguientes grupos de paraacutemetros
Propiedades por defecto de mensajes SIP
Limites de mensaje SIP
Paraacutemetros de red
Valores de temporizadores
Incluir valores para localizar servidores Proxys
Entre otros
En la siguiente tabla se muestran los nombres de RFCrsquos que estaacuten incorporados
directamente a la biblioteca SIPNET Otros protocolos como TLS no estaacuten incluidos
debido a que forman parte de la base NET Framework y no estaacuten incluidos La tabla
muestra en la primera columna el nuacutemero de RFC seguido por el nombre del protocolo y
finalmente indicando la funcionalidad que carece la biblioteca para implementar dicho
protocolo
RFC PROTOCOLO FALTA FUNCIONALIDAD
RFC 4566 Session Description Protocol Ninguna
RFC 4320 Actions Addressing Identified
Issues
with SIPs Non-INVITE
Transaction
Ninguna
RFC 3596 DNS Extension to Support IP
Version 6
Ninguna
RFC 3498 SIP Extension for Instant
Messaging
Ninguna
RFC 3581 An Extension to SIP for
Symmetric
Response Routing
Ninguna
RFC 3311 SIP UPDATE Method Ninguna
RFC 3264 An OfferAnswer Model with the
Session Description Protocol
Ninguna
RFC 3263 Locating SIP Servers Section 41 NAPTRSRV
records being verified against
TLS certificates
50
Section 44 Consideration for
stateless proxies
RFC 3261 Session Initiation Protocol Section 827 Stateless UAS
Behaviour
Section 83 Redirect Server
Section 103 Processing
REGISTER
requests in a registrar
Section 1322 Dialog creation
from multiple 2xx responses
Section 16 Proxy Behaviour
Section 23 SMIME
RFC 2976 SIP INFO Method Ninguna
RFC 2782 A DNS RR for Specifying the
Location of Services (DNS SRV)
Ninguna
RFC 2617 HTTP Authentication Basic and
Digest Access Authentication
Ninguna
RFC 2119 The Naming Authority Pointer
(NAPTR) DNS Resource Record
Ninguna
RFC 4475 SIP Torture Test Messages Ninguna
ETSI Conformance Test Specification
for SIP
Proxy Registrar Redirect auacuten
no se prueba su funcionalidad
Tabla 4 Conceptos generales
Dentro del SDK SIP NET existen teacuterminos que conceptualizan los procesos existentes en
una aplicacioacuten orientada a SIP A continuacioacuten se describen algunos de ellos
Connection Se sabe que una conexioacuten es una asociacioacuten entre dos puntos finales
que lleva paquetes de datos a traveacutes de una red Cada punto final se representa por
una direccioacuten IP y un puerto en SIP este concepto es referido como un flujo en la
unidad SIP NET API (Figura n) una conexioacuten puede utilizar TLS TCP o UDP
dentro de la capa de transporte
La unidad SIP NET API admite dos tipos de conexiones entrada y salida Una
conexioacuten de entrada esta a la escucha de paquetes entrantes en un extremo local
asignado Las conexiones de salida inician las transmisiones en un extremo local
asignado Las conexiones de salida suelen utilizar un nuacutemero de puerto efiacutemero y
posteriormente escuchar en ese puerto las respuestas
51
Figura 13 Arquitectura general de la Unidad SIPNET API
Destination Tuple Una tupla de destino contiene la informacioacuten necesaria para
conectarse a un dispositivo de red remoto Es formado por la direccioacuten IP del
dispositivo remoto el puerto remoto para escuchar y el protocolo de transporte Los
clientes pueden utilizar el servicio de bibliotecas DNS para resolver direcciones
puertos y transportes o puede enviar mensajes directamente a traveacutes de una tupla de
destino contenida en el objeto DestinationTuple
Dialog Un dialogo representa una relacioacuten SIP punto a punto entre dos o maacutes
clientes de usuario que persiste durante alguacuten tiempo Es anaacutelogo a una
conversacioacuten o a una llamada y algunas veces se refieren a eacutel como tal Una sesioacuten
es tiacutepicamente asociada a un dialogo
Header Field Un campo de cabecera es un componente del mensaje cabecera SIP
Un campo de cabecera puede aparecer con una o maacutes filas de campo de cabecera
Las filas de encabezado consisten en un nombre de campo de cabecera y cero o maacutes
valores de campo de cabecera Muacuteltiples valores de campo de cabecera en una
determinada fila se separan por coma Algunos campos de cabecera uacutenicamente
pueden tener un simple valor de campo y como resultado siempre aparecen como
una fila simple de campo de cabecera
Outbound Proxy Un proxy que recibe peticiones de un cliente existe aunque su
direccioacuten IP no pertenezca a la direccioacuten IP del servidor resuelta por el campo
Request-URI Por lo general un agente de usuario se configura manualmente con
un proxy de salida o puede conocer uno a traveacutes de protocolos de configuracioacuten
automaacutetico
52
La seccioacuten de configuracioacuten ProxyServers permite a la aplicacioacuten cliente configurar
el valor por defecto de salida de ProxyServers para los mensajes de peticioacuten
Mecanismos alternos estaacuten disponibles para proporcionar servicios de proxy
incluyendo en el SipCore Maacutes adelante se explicaraacute el funcionamiento de un objeto
SipCore
Los servidores proxy son utilizados por el procesador de mensajes salientes para
crearle una ruta al mensaje (a menos que un campo de cabecera route ya esteacute
presente) El procesador calcula la direccioacuten remota del mensaje de acuerdo al RFC
3261 y RFC 3263 y tiene en cuenta la existencia de servidores proxy de salida los
campos de cabecera Route y loose routing rules
Existe una configuracioacuten independiente para servidores proxy seguros que se
configuran como rutas de salida para todas las transmisiones seguras Solo los
servidores proxy con seguridad SIP URI se permiten para transmisiones seguras
Route Set Un conjunto de rutas es una coleccioacuten URIrsquos ordenadas o SIP URI que
representa una lista de nodos en la red (por lo general proxys) que necesitan ser
atravesados cuando se enviacutea una peticioacuten particular Un conjunto de rutas pueden
ser aprendidas a traveacutes de campos de cabecera como Record-Route o pueden ser
configurados manualmente
Session Una sesioacuten proporciona el canal de control en el que un cliente de usuario
puede invitar a otro a participar en alguna actividad o intercambio de descripciones
media requeridos para establecer una comunicacioacuten multimedia
Sip Transaction SIP es un protocolo basado en transacciones Las interacciones
entre los elementos de la red se llevaraacuten a cabo en intercambios de mensajes
independientes (Message Exchange Patterns) Una transaccioacuten SIP consta de una
sola peticioacuten y todas las respuestas a esta Se encuentran dos categoriacuteas de
transacciones las que inician con una peticioacuten INVITE (INVITE Transactions) y
los que no lo son (Generic Transactions)
La unidad SIP NET API se basa en ciertos recursos externos para su operacioacuten Estos
recursos deben estar disponibles en tiempo de ejecucioacuten y los permisos de control de acceso
se deben establecer a fin de que acceda a ellos el subproceso (thread) en ejecucioacuten Los
recursos incluyen
Sockets La biblioteca SIP NET es una biblioteca en red y requiere un acceso
ilimitado a sockets dentro de ella
Archivo IO La biblioteca SIPNET debe tener permisos para leer el fichero de
configuracioacuten y cualquier otro archivo enlazado dinaacutemicamente
La Unidad SIPNET API hace un uso extensivo de hilos (Threads) La biblioteca utiliza llamadas asiacutencronas cuando sea posible El trabajo con hilos se utiliza para invocar la aplicacioacuten encargada de la devolucioacuten de llamadas y algunos eventos colocados en subprocesos independientes donde las respuestas son demandadas
53
34 Configuracioacuten objeto SIP Core
El objeto SIP Core es la fachada de la biblioteca SIPNET (a veces llamado una clase
agregada) Expone importantes eventos puede controlar los meacutetodos y comportamientos
maacutes significativos de la biblioteca asiacute como establecer la configuracioacuten del sistema y otros
recursos utilizados El nuacutecleo SIP representado por el objeto SIP Core tambieacuten se encarga
de la inicializacioacuten y terminacioacuten de las diferentes capas El nuacutecleo SIP proporciona un
modelo de eventos que controlan el proceso de entrada y los mensajes salientes el
procesamiento subsecuente de fallos en la capa de transporte asiacute como la autenticacioacuten y el
estado de datos
La inicializacioacuten de un objeto SIP Core describe diferentes etapas A continuacioacuten se
muestran detalladamente cada una de ellas
Creacioacuten Antes de realizar cualquier actividad relacionada con SIP es necesario
crear e inicializar un objeto SIP Core En este proceso se lleva a cabo lo siguiente
o Inicializa un nuevo objeto SipTransportLayer
o Inicializa un nuevo objeto SipTransactionStateManager
o Inicializa un nuevo objeto HttpDigestClientAuthenticationManager
o Analizar cualquier configuracioacuten de aplicacioacuten (archivo conf)
o Validar la licencia 5
o Deserealiza el objeto SipConfiguration
Disposicioacuten El objeto SIP Core expone un meacutetodo finalizador encargado de liberar
recursos no administrados y realiza otras operaciones de limpieza antes de que la
conexioacuten sea llamada por el recolector de basura
Propiedades
o LocalAddressPort Utilizado por el MessageTransmitter para especificar el
campo de cabecera Via que para fines de la aplicacioacuten seraacute el punto final
donde los mensajes seraacuten devueltos especificando estos paraacutemetros en la
propiedad ldquoSentbyrdquo Una aplicacioacuten puede proporcionar un nombre de
dominio completo o una direccioacuten IP si este campo estaacute vaciacuteo el valor por
defecto seraacute la direccioacuten IP local
o Transport Layer La propiedad SipTransportLayer se encarga de gestionar la
transmisioacuten de mensajes hacia y desde la red en nombre del objeto SIP Core
reservado en memoria
o Sip Transaction State La propiedad SipTransactionStateManager se encarga
de la gestioacuten del estado transaccional y de diaacutelogo en nombre del objeto SIP
Core
5 Para el correcto funcionamiento es necesario el uso de una licencia con costo adicional
54
o ClientCertificates La transmisioacuten de mensajes TLS requiere que los clientes
proporcionen un certificado para el servidor y establecer una autenticacioacuten
mutua La propiedad ClientCertificates se copia directamente a la propiedad
SipTransportLayer
o MultiHeaderFormat El valor de esta propiedad indica si la biblioteca SIP
debe separar muacuteltiples valores de encabezados en las liacuteneas que sean
posibles
35 Trixbox
Como parte de herramienta principal para otorgar el servicio de un PBX se tomoacute la
infraestructura que ofrece Trixbox6 una distribucioacuten de Linux basada en CentOS que
otorgaraacute sentildealizacioacuten necesaria para registro y autenticacioacuten de usuarios SIP dentro de la
red Colocada e instalada dentro de una maquina virtual para maximizar el uso de una
misma tarjeta de red para el Proxy PBX desarrollado y el PBX de VoIP
36 Cliente Softphone
Para que se puedan mantener una conversacioacuten telefoacutenica se necesitan terminales
que puedan procesar la voz humana transformaacutendola en impulsos eleacutectricos que son
enviados por la red RTC Hoy en diacutea con la llegada de la telefoniacutea IP la voz es
codificadadecodificada mediante conversores analoacutegicosdigitales y posteriormente (ya
digital) paquetizada y lista para ser enviada por redes Ethernet (u otro tipo de redes IP)
mediante TCPIP
363 Descripcioacuten
Los Softphones son teleacutefonos implementados por software son programas informaacuteticos que
simulan las funcionalidades de un teleacutefono convencional pero ayudados de dos perifeacutericos
habituales microacutefono y auriculares estos uacuteltimos dispositivos conectados a una
computadora permiten que la voz pueda ser tratada por el Softphone y asiacute ser
transformada en paquetes IP
Un Softphones proporciona a un dispositivo que no sea un teleacutefono como una
computadora o una PDA las funcionalidades de un teleacutefono VoIP Para que esto sea
posible no es necesario que el dispositivo en cuestioacuten sea muy potente Simplemente se
necesita un equipo de audio adecuado y alguna forma de conectarse a una red TCPIP
Ademaacutes de las tiacutepicas caracteriacutesticas de un teleacutefono los Softphones incorporan
diversas funcionalidades avanzadas muy presentes en el aacutembito de la VoIP como son
videoconferencia chat grabacioacuten multiliacutenea etc
6 Distribucioacuten de Asterisk basado Software libre
55
Se pueden encontrar modelos que funcionen bajo diferentes protocolos aunque el mas
usado es el SIP Entre ellos el maacutes popular es el X-lite aunque tambieacuten existen muchos
otros que presentan buenas funcionalidades
La ventaja principal de un Softphone sobre un teleacutefono VoIP es el costo En muchas
empresas de debe instalar como miacutenimo un teleacutefono y una computadora en cada escritorio
Si pudieacuteramos quitar el teleacutefono se produciriacutea un ahorro considerable Ademaacutes hay una
gran cantidad de Softphones y la mayoriacutea de sistemas operativos ya vienen con alguno
instalado por defecto
364 X-lite
X-Lite fue desarrollado por CounterPath y es el principal Softphone libre SIP del mercado
disponible para la transferencia directa
Configuracioacuten del Softphone X-lite se lleva a cabo de la siguiente manera
1 Una vez instalado el Softphone (por ser software libre puede ser descargado de la
paacutegina del fabricante CounterPath) se procede a hacer la configuracioacuten pertinente
2 Seleccionamos ldquoSIP Account Settingsrdquo y apareceraacute la pantalla de la figura 14
oprima ldquoAddrdquo
Figura 14 SIP Account Settings
Para agregar una cuenta SIP se deben introducir ciertos paraacutemetros como se muestra en la
figura 15
56
Figura 15 Propiedades de configuracioacuten de una cuenta SIP
a) Display Name El Display Name es un identificador de nombre de usuario
b) User name El username es un identificador de tipo numeacuterico proporcionado por el
servidor para el control de acceso
c) Password Es la contrasentildea de acceso asociada al username
d) Authorization user name Utilizado para verificar la autentificacioacuten del usuario
dentro del PBX
e) Domain Es identificado por una direccioacuten IP o un nombre registrado en un servidor
de nombres de dominio (DNS) e indica el dominio al que pertenece el cliente
En la opcioacuten de elegir un dominio proxy se presentan tres diferentes modos de seleccioacuten de
dominio (Figura 16) la primera opcioacuten ldquodomainrdquo consiste en seleccionar un servidor proxy
impliacutecito en el mismo nombre de dominio donde fue registrado el teleacutefono en este caso
expresado mediante la direccioacuten IP 11110 La segunda opcioacuten rdquoproxyrdquo corresponde a un
nombre de dominio expresado fuera del servidor donde fue registrado el teleacutefono
asociando una direccioacuten IP a este campo Para fines del proyecto la direccioacuten IP 1111
corresponderaacute al Proxy PBX desarrollado Por uacuteltimo la tercera opcioacuten ldquotarget domainrdquo es
la opcioacuten por default cuando no cuenta con un servicio proxy
57
Figura 16 Configuracioacuten de cliente SIP
Una vez configurados estos paraacutemetros oprimimos ldquoAceptarrdquo y regresaremos a la ventana
ldquoSIP Accountsrdquo y apareceraacute la cuenta que acabamos de configurar (Figura 17) Para
finalizar haremos click en el boton ldquoCloserdquo
Figura 17 SIP Accounts cuenta configurada
Una vez realizado este proceso el Softphone X-lite estaacute listo para realizar y recibir
llamadas (Figura 18)
58
Figura 18 Teleacutefono registrado y autenticado
59
Capiacutetulo IV Desarrollo
Una vez reunidas las herramientas necesarias para realizar el Proxy PBX se inicia
el desarrollo de una aplicacioacuten basada en un entorno orientado a Windows que llevaraacute el
control y gestioacuten de los procesos necesarios para el registro y subscripcioacuten de clientes SIP
asiacute como la iniciacioacuten y finalizacioacuten de llamadas SIP
Tomando en cuenta que para el enviacuteo de paquetes a nivel de transporte existen dos
enfoques principales necesarios para la comunicacioacuten entre aplicaciones se encuentran las
orientadas a conexioacuten y no orientadas a conexioacuten En las comunicaciones orientadas a
conexioacuten se establece una conexioacuten que se mantiene durante el tiempo que dure la sesioacuten
Los servicios sin conexioacuten no garantizan confiabilidad los datos pueden tomar rutas
distintas dentro del sistema llegar despueacutes o no llegar
Los principales protocolos para el transporte de datos son Protocolo de control de
transmisioacuten (TCP) orientado a conexioacuten y el Protocolo de datagramas de usuarios (UDP)
no orientado a conexioacuten
Para fines de esta aplicacioacuten emplearemos el protocolo UDP Las llamadas que
cursan sobre una red de datos no requieren de la garantiacutea de transmisioacuten confiable de un
extremo a otro ya que en una conversacioacuten telefoacutenica no es necesaria la retransmisioacuten de
voz UDP incurre en una miacutenima sobrecarga necesaria para la comunicacioacuten entre
aplicaciones ademaacutes de reducir el traacutefico debido a la ausencia de intercambio
retransmisiones etc
Aplicaciones como audio y video en tiempo real pueden tolerar la peacuterdida ocasional
de datagramas cuando esto sucede se produce una pequentildea pausa en el audio o video que
se esteacute reproduciendo
41 Desarrollo de software de comunicacioacuten IP usando socket
Como un primer acercamiento a la programacioacuten de aplicaciones cliente-servidor se
realizaron una aplicacioacuten cliente y una aplicacioacuten servidor en el entorno de programacioacuten
Visual C NET utilizando la biblioteca de clases ldquoSocketsrdquo con el espacio de nombres
SystemNetSockets utilizando el protocolo TCP
Para la aplicacioacuten servidor se utiliza un objeto de tipo TcpListener que tiene la capacidad
de esperar solicitudes de conexioacuten a este objeto se le asocia un nuacutemero de puerto y una
direccioacuten IP especifica representada por un objeto de la clase IPAddress del espacio de
nombres SystemNet
El servidor escucha de forma indefinida hasta que un cliente trata de conectarse con el el
servidor crea una conexioacuten con el cliente cuando este le enviacutea una solicitud de conexioacuten
60
1 public void EjecutarServidor() 2 3 TcpListener oyente 4 int contador = 1 5 6 espera la conexion de un cliente y muestra el texto que enviacutea el cliente 7 try 8 crea TcpListener 9 IPAddress local = IPAddressParse(1111) 10 oyente = new TcpListener(local 50000) 11 12 TcpListener espera la solicitud de conexion 13 oyenteStart() 14 15 establece la conexion con base a la solicitud del cliente 16 while (true) 17 18 MostrarMensaje(Esperando Conexioacutenrn) 19 20 acepta una conexion entrante 21 conexion = oyenteAcceptSocket() 22 23 crea objeto NetworkStream asociado con el socket 24 socketStream = new NetworkStream(conexion) 25 26 crea objetos para transferir datos a traveacutes de un flujo 27 escritor = new BinaryWriter(socketStream) 28 lector = new BinaryReader(socketStream) 29 30 MostrarMensaje(Conexioacuten + contador + recibidarn) 31 32 Informa al cliente que la conexioacuten fue existosa 33 escritorWrite(SERVIDORgtgt Conexioacuten Existosa) 34 35 36 DeshabilitarEntrada(false) habilita la entrada de datos del cliente 37 38 string larespuesta = 39 40 Lee los datos de cadena que enviacutea el cliente 41 42 do 43 44 try 45 46 lee la cadena que enviacutea el cliente 47 larespuesta = lectorReadString() 48 49 muestra el mensaje 50 MostrarMensaje(rn + larespuesta) 51 fin de try 52 catch (Exception) 53 54 maneja la excepcioacuten si hay error al leer los datos 55 MostrarMensaje(rn Error al leer los datos delclientern)
56 break 57 fin de catch 58 while (larespuesta = CLIENTEgtgtTERMINAR ampamp
61
59 conexionConnected) 60 61 MostrarMensaje(rnEl Cliente terminoacute la comunicacioacutenrn) 62 63 Se cierra la comunicacioacuten 64 escritorClose() 65 lectorClose() 66 socketStreamClose() 67 conexionClose() 68 69 DeshabilitarEntrada(true) Deshabilita la entrada de datos 70 del cliente entradaTextBox 71 contador++ 72 fin de while 73 fin de try
Seccioacuten de Coacutedigo 1 Creacioacuten de aplicacioacuten Servidor TCP
Figura 19 Interfaz de aplicacioacuten Servidor TCP
62
Por otro lado para la aplicacioacuten cliente es necesario crear un objeto de la clase TcpClient
(espacio de nombres SystemNetSockets) para realizar la conexioacuten con el servidor La
conexioacuten se establece al llamar al meacutetodo Connect de TcpClient
1 public void EjecutarCliente() 2 3 TcpClient Cliente 4 try 5 6 MostrarMensaje(Tratando de conectarrn) 7 Cliente = new TcpClient() 8 ClienteConnect(1482043611 50000) 9 salida = ClienteGetStream() 10 escritor = new BinaryWriter(salida) 11 lector = new BinaryReader(salida) 12 MostrarMensaje(rn SE RECIBIERON FLUJOS DE ES rn) 13 DeshabilitarSalida(false) 14 do 15 16 try 17 18 mensaje = lectorReadString() 19 MostrarMensaje(rn + mensaje) 20 21 catch (Exception) 22 23 SystemEnvironmentExit(SystemEnvironmentExitCode) 24 25 26 while (mensaje = SERVIDORgtgtTERMINAR) 27 escritorClose() 28 lectorClose() 29 salidaClose() 30 ClienteClose() 31 ApplicationExit() 32 33 catch (Exception error) 34 35 MessageBoxShow(errorToString() Error en la conexion 36 MessageBoxButtonsOK MessageBoxIconError) 37 SystemEnvironmentExit(SystemEnvironmentExitCode) 38 39
Seccioacuten de coacutedigo 2 Creacioacuten de aplicacioacuten Cliente TCP
En la seccion de coacutedigo 2 se muestra el proceso de comunicacioacuten basado en socket TCP
donde se crea una instancia de tipo TCPClient encargada del enviacuteo y recepcioacuten de datos El
proceso se inicia con la conexioacuten a un servidor localizado con la direccioacuten IP
ldquo1482043611rdquo y un puerto de escucha en el 5000 posteriormente se crean dos instancias
de tipo BinaryWriter para leer datos recibidos y escribir datos para ser enviados
63
La condicioacuten de paro necesaria para el fiacuten de la comunicacioacuten estaraacute controlada por la
cadena ldquoSERVIDORgtgtTERMINARrdquo En ese momento se liberan recursos y se finaliza el
proceso Socket
Figura 20 Interfaz de aplicacioacuten Cliente TCP
64
42 Captura y anaacutelisis de Mensajes SIP
Como parte del anaacutelisis de protocolos en red se utilizoacute una herramienta orientada al
monitoreo de traacutefico en la red7 la siguiente imagen es captado mediante un sniffer de
coacutedigo abierto encargado de capturar los paquetes SIP utilizado en el proceso de
comunicacioacuten entre Softphone ndash Proxy y Proxy ndash PBX
Figura 21 Analizador de traacutefico en red captura de mensajes SIP
En la figura 21 se muestra la captura de un mensaje SIP utilizado para el monitoreo de
registro y subscripcioacuten de un cliente Softphone observando los campos de cabecera
incluidos dentro de un paquete Los paquetes de datos estaacuten presentes en uno o varios de
los procesos en la comunicacioacuten existente con la aplicacioacuten Proxy PBX siendo de gran
importancia el reconocimiento y procesamiento de paquetes SIP
411 Autentificacioacuten de Softphone en el PBX VoIP
Para el proceso de autenticacioacuten de un Softphone se incluyen diferentes procesos
necesarios para que dicho teleacutefono quede integrado en un Servidor de registro y
posteriormente tenga la capacidad de enviar y recibir llamadas mediante el enrutamiento
realizado por el Proxy PBX
Como se menciono anteriormente existen peticiones y respuestas que forman parte del
proceso de comunicacioacuten Cliente - Servidor y Cliente ndash Cliente Para el caso de la
autenticacioacuten de un teleacutefono IP basado en Software o cualquier teleacutefono soportado por la
tecnologiacutea VoIP se hace referencia a las siguientes peticiones y respuestas SIP
7 Analizador de traacutefico distribuido por The Wireshark Team
65
Como primer proceso de autenticacioacuten es necesario que un cliente se encuentre alojado en
un servidor de registro proporcionaacutendole un nombre de usuario contrasentildea y un nombre de
autorizacioacuten para iniciar sesioacuten
Para que el cliente tenga una localizacioacuten fiacutesica es necesario que enviacutee estos paraacutemetros a
traveacutes de la trama REGISTER esperando una contestacioacuten satisfactoria mediante una
respuesta OK con 1 Binding llamado asiacute al proceso de conexioacuten entre Cliente- Servidor
En la siguiente figura se muestra la trama para la peticioacuten REGISTER que inicialmente se
enviacutea cada vez que un teleacutefono inicia comunicacioacuten en red
Figura 22 Trama de una peticioacuten REGISTER
La funcionalidad del Proxy PBX durante este proceso es decidir el rumbo de la trama
esperando la localizacioacuten fiacutesica del usuario mediante un servidor de registro Obteniendo
asiacute la captacioacuten de todo el traacutefico y esperando un enrutamiento adecuado hacia el destino
final asociaacutendole una direccioacuten IP y un puerto para futuras conexiones
66
El proceso de autenticacioacuten y registro se muestra en el siguiente diagrama (Figura 23)
Figura 23 Proceso de autenticacioacuten y registro de un UAC
El inicio de localizacioacuten de un usuario dentro de la red se ejecuta mediante el enviacuteo de una
trama REGISTER El proxy PBX mediante el objeto SIP CORE seraacute el encargado de
procesar y enrutar todos los paquetes de datos ejecutando como primer proceso la
transmisioacuten de la trama REGISTER al Servidor de Registro Seguido de una contestacioacuten
de Unauthorized debido a la falta de credenciales para autentificacioacuten dentro del PBX
El cliente Softphone enviacutea nuevamente una trama REGISTER incluyendo las credenciales
necesarias para ser registrado y autenticado Al llegar dichos paraacutemetros al PBX enviacutea una
respuesta de estado completo OK (1 Binding) indicando al cliente su localizacioacuten fiacutesica y
registro Al ser registrado satisfactoriamente el PBX necesita conocer informacioacuten acerca
de la capacidad del cliente para soportar ciertos servicios y funcionalidades necesarias para
el proceso de comunicacioacuten para esto el PBX enviacutea una trama OPTIONS incluyendo estos
paraacutemetros retransmitiendo las veces que sean necesarias para conocer el estado del cliente
Softphone
Siguiendo con el proceso de registro el cliente solicita al PBX una subscripcioacuten iniciando
este proceso con el enviacuteo de una trama SUBSCRIBE que incluiraacute los paraacutemetros que
requiere el cliente para entrar en un estado de suscripcioacuten Siguiendo la misma
metodologiacutea el PBX solicita sus credenciales para completar el proceso y aquiacute
nuevamente el Proxy PBX encamina los datos hasta el cliente Una vez solicitadas al
cliente las credenciales de suscripcioacuten retransmite la trama SUBSCRIBE incluyendo los
paraacutemetros solicitados y concluyendo con estado completo OK
67
Finalmente el PBX enviacutea una trama NOTIFY que indica un estado de notificacioacuten
necesaria para que el cliente conozca su ubicacioacuten y propiedades con las que fue registrado
suscrito
Al concluir el proceso de autenticacioacuten como propoacutesito general el Proxy PBX almacenaraacute
los valores de nombre de usuario Display Name direccioacuten IP Puerto y campo Viacutea para el
reconocimiento de usuarios registrados y asiacute tener un control en el enrutamiento y
procesamiento de peticiones y respuestas relacionadas con cada usuario
43 Desarrollo de Software Proxy basado en transacciones SIP
El protocolo SIP estaacute orientado a transacciones es decir en las interacciones entre
los componentes tienen lugar en una serie de intercambios de mensajes independientes
Concretamente una transaccioacuten SIP consta de una uacutenica solicitud y las respuestas a esta
solicitud pueden ser provisionales y o definitivas
Las transacciones tienen un cliente y un servidor El lado del cliente se conoce como
una transaccioacuten cliente y del lado del servidor como una transaccioacuten servidor La
operacioacuten cliente enviacutea la solicitud y la transaccioacuten servidor enviacutea la respuesta
Las transacciones cliente y servidor son funciones loacutegicas que estaacuten incrustadas en
cualquier nuacutemero de elementos En concreto existen dentro de los agentes de usuario y los
servidores Proxy de estado
En el ejemplo de la figura 248 un UAC ejecuta la transaccioacuten cliente y su
Proxy de salida (outbound) ejecuta la transaccioacuten servidor En el Proxy de salida tambieacuten se
ejecuta una transaccioacuten cliente la cual enviacutea la solicitud a la transaccioacuten servidor del Proxy
de entrada (inbound) Ese proxy tambieacuten ejecuta una transaccioacuten cliente que a su vez enviacutea
la solicitud a la transaccioacuten servidor en la UAS
Figura 24 Transacciones SIP mediante un Proxy
Dentro de la biblioteca de clases explicada en la seccioacuten 33 es posible crear objetos de tipo
SIP Core capaces de generar eventos de tipo Server Transaction y Client Transaction
estos eventos son uacutetiles en el momento que se requiere procesar solicitudes y respuestas
para enrutarlas y asiacute lograr comunicacioacuten entre Clientes y Servidores
Con base a lo anterior se tiene el siguiente diagrama general de transacciones incluidas en
el desarrollo del proyecto (Fig 25)
8 RFC 3261 SIP Session Initiation Protocol Seccion 17 pag 122
68
Figura 25 Diagrama de transacciones incluidas en el Proxy PBX
69
Las siguientes liacuteneas de coacutedigo ejecutan las transacciones que seraacuten uacutetiles para el
proceso de comunicacioacuten mediante el Proxy PBX con el evento ProxyPBX_Load se carga
dentro del proyecto el meacutetodo general para realizar las transacciones necesarias que
ayudaraacuten al funcionamiento del Proxy PBX 1 private void ProxyPBX_Load(object sender EventArgs e) 2 3 EjecutarTransaction() 4 5 6 public void EjecutarTransaction() 7 8 CoreServerT = new SipCore() 9 SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111) 10 CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060) 11 CoreServerTStartListening(new IPEndPoint(localAddress 5060) 12 TransportProtocolUdp) 13 CoreServerTServerTransactionCreated += new 14 EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated) 15 16 17 private void OnServerTransactionCreated(object sender TransactionEventArgs e) 18 19 ServerTransaction trans = (ServerTransaction)eTransaction 20 if (transOriginalRequestMethod == SipMethodRegister) 21 22 CoreClientT = null 23 CoreClientT = new SipCore() 24 SystemNetIPAddress localAddress = 25 SystemNetIPAddressParse(1111) 26 CoreClientTLocalAddressPort = new IPDomainPort(new 27 IPEndPoint(localAddress 5060)) 28 29 SipRequest RegisterRequest = eTransactionOriginalRequest 30 RegisterRequestRemoveHeader(Via) 31 ViaHeaderField FieldVia = new ViaHeaderField(new 32 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 33 FieldViaBranch = ViaHeaderFieldNewBranch() 34 FieldViaProtocolName = UDP 35 FieldViaProtocolVersion = 20 36 FieldViaSentBy = new 37 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 38 RegisterRequestAddHeader(FieldVia) 39 ClientTransaction transaction = 40 SipTransactionCreateClientTransaction(RegisterRequest CoreClientT 41 true) 42 RegisterRequestSetTransaction(transaction) 43 RegisterRequestResponseReceived += new 44 EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived) 45 CoreClientTSendRequest(RegisterRequest) 46 47 48 if (transOriginalRequestMethod == SipMethodSubscribe) 49 50 CoreClientT = null 51 CoreClientT = new SipCore() 52 SystemNetIPAddress localAddress = 53 SystemNetIPAddressParse(1111)
70
54 CoreClientTLocalAddressPort = new IPDomainPort(new 55 IPEndPoint(localAddress 5060)) 56 57 SipRequest SubscribeRequest = eTransactionOriginalRequest 58 SubscribeRequestRemoveHeader(Via) 59 ViaHeaderField FieldVia = new ViaHeaderField(new 60 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 61 FieldViaBranch = ViaHeaderFieldNewBranch() 62 FieldViaProtocolName = UDP 63 FieldViaProtocolVersion = 20 64 FieldViaSentBy = new 65 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 66 SubscribeRequestAddHeader(FieldVia) 67 ClientTransaction transaction = 68 SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT 69 true) 70 SubscribeRequestSetTransaction(transaction) 71 SubscribeRequestResponseReceived += new 72 EventHandlerltResponseReceivedEventArgsgt 73 (SubscribeRequest_ResponseReceived) 74 CoreClientTSendRequest(SubscribeRequest) 75
Seccioacuten de Coacutedigo 3 Creacioacuten de transacciones SIP
44 Desarrollo de software Proxy para autenticar Softphone
Una de las funciones principales de la aplicacioacuten Proxy PBX es la autenticacioacuten de
usuarios (Softphone) y el registro de eacutestos dentro de la red y asiacute mismo su localizacioacuten
mediante el enviacuteo de paquetes de datos para esto el Software Proxy manipularaacute en funcioacuten
de peticiones y respuestas la sentildealizacioacuten necesaria para proporcionar un registro exitoso
mediante su identificacioacuten en un Servidor de Registro
Para este propoacutesito se hace uso de la extensa variedad de clases contenidas en el SDK para
protocolo SIP (seccioacuten 33) Entre ellas la clase principal SIP CORE que generaraacute los
procesos necesarios para el procesamiento de muacuteltiples peticiones y respuestas Dentro de
esta misma clase se permite el enviacuteo de paquetes definidos para cada propoacutesito teniendo la
tarea de construir tramas para los meacutetodos solicitados Por otro lado tomando respuestas
asociadas a una peticioacuten seraacute necesario el manejo de datos de una manera estructurada
utilizando listas enlazadas se almacenaraacuten paraacutemetros necesarios para la gestioacuten de la
comunicacioacuten
71
En la siguiente figura se muestra la estructura general de un nodo incluido en una
lista necesaria para la asociacioacuten entre peticiones y respuestas relacionadas con un UAC
Anterior DisplayName Username DireccionIP Puerto Via Siguiente
Figura 26 Nodo perteneciente a la clase NodoListaSoftphone
Dentro de este nodo seraacute necesario actualizar los paraacutemetros en tiempo de ejecucioacuten en
funcioacuten de las peticiones y respuestas asociadas con cada UAC Para la declaracioacuten de
instancias dentro de la clase NodoListaSoftphone se construyoacute la siguiente estructura
mostrada en la figura Seccioacuten de coacutedigo 4
1 public class NodoListaSoftphone 2 3 public NodoListaSoftphone anterior 4 public string DisplayName 5 public string Username 6 public string DireccionIP 7 public string Puerto 8 public string Via 9 public NodoListaSoftphone siguiente 10 public NodoListaSoftphone(string DisplayName string Username string 11 DireccionIP string Puerto string Via) 12 this(null DisplayName Username DireccionIP Puerto Via null) 13 14 public NodoListaSoftphone(NodoListaSoftphone anterior string 15 DisplayName string Username string DireccionIP string Puerto string 16 Via NodoListaSoftphone siguiente) 17 18 thisanterior = anterior 19 thisDisplayName = DisplayName 20 thisUsername = Username 21 thisDireccionIP = DireccionIP 22 thisPuerto = Puerto 23 thisVia = Via 24 thissiguiente = siguiente 25 26 public NodoListaSoftphone ANTERIOR 27 28 get return anterior 29 set anterior = value 30 31 public string DISPLAYNAME 32 33 get return DisplayName 34 set DisplayName = value 35 36 public string USERNAME 37 38 get return Username
72
39 set Username = value 40 41 public string DIRECCIONIP 42 43 get return DireccionIP 44 set DireccionIP = value 45 46 public string PUERTO 47 48 get return Puerto 49 set Puerto = value 50 51 public string VIA 52 53 get return Via 54 set Via = value 55 56 public NodoListaSoftphone SIGUIENTE 57 58 get return siguiente 59 set siguiente = value 60 61
Seccioacuten de Coacutedigo 4 Definicioacuten de estructura de datos asignada a cada usuario dentro de
la red
La clase NodoListaSoftphone es considerada una clase autoreferenciada ya que contiene
miembros de referencia que hacen referencia a un objeto del mismo tipo de clase En las
liacuteneas de coacutedigo 3 y 9 de la seccioacuten 4 se definen las referencias anterior y siguiente Los
miembros anterior y siguiente hacen referencia a un objeto de tipo NodoListaSoftphone
observando la declaracioacuten de un objeto del mismo tipo de ahiacute el teacutermino de clase
autoreferenciada
Dentro de esta clase tambieacuten contiene los miembros necesarios para el control de
enrutamiento de peticiones y respuestas Para ello se definen las propiedades DisplayName
Username DireccionIP Puerto y Viacutea
La propiedad DisplayName define el nombre de usuario utilizado para identificar a un
teleacutefono a nivel de usuario que seraacute utilizada para el control de acceso a un registro de
usuarios en tiempo real
La propiedad Username define un identificador de usuario proporcionado por el PBX para
hacer uacutenica la localizacioacuten de un teleacutefono dentro de la red IP
La propiedad DireccionIP define una direccioacuten loacutegica IPv4 utilizada para la identificacioacuten
uacutenica a nivel de capa de red para cada teleacutefono con esta propiedad el Proxy PBX en
funcioacuten de peticiones o respuestas elegiraacute el destino adecuado
La propiedad Puerto define un valor asociado a un cliente a nivel de capa de transporte por
el se enviacutean las peticiones iniciales y se espera que ahiacute sean contestadas con el fin de evitar
la peacuterdida de datos Para el propoacutesito en particular del proyecto cada cliente Softphone
73
dispone de un rango de puertos efiacutemeros disponibles para la comunicacioacuten definidos en el
protocolo UDP
Por uacuteltimo se define la propiedad Viacutea que contendraacute el campo de cabecera existente en la
trama SIP que seraacute actualizado junto con las demaacutes propiedades cada que inicie una nueva
peticioacuten el UAC
45 Desarrollo de software proxy para iniciar y finalizar una llamada
Una vez registrados los clientes con el PBX a traveacutes del Proxy PBX se inicia el proceso de
comunicacioacuten a traveacutes de la trama INVITE donde un cliente solicita establecer sesioacuten con
un usuario final para esto la aplicacioacuten desarrollada seraacute capaz de verificar si el usuario
final se encuentra en disponibilidad de aceptar una llamada o en otro caso verificar si
existe o no el usuario final
El procesamiento de la trama INVITE se lleva a cabo en un proceso interno de la aplicacioacuten
Proxy PBX donde recibe la peticioacuten inicial verifica el usuario final y toma la decisioacuten de
enrutarla o denegarla En la figura 27 se muestra el proceso de inicio y fin de sesioacuten basado
en transacciones SIP
Figura 27 Proceso de inicio y fin de llamada
El cliente Softphone1 Xlite inicia la sesioacuten enviando una trama INVITE al objeto SIP
CORE que seraacute el encargado de enrutar las llamadas a un destino final la aplicacioacuten Proxy
PBX internamente trabaja con un objeto de este tipo para iniciar las transacciones
necesarias y localizar dentro de la red al Softphone Xlite La ejecucioacuten de este proceso
estaraacute en funcioacuten de las peticiones realizadas al objeto SIP CORE tomando como paraacutemetro
principal que el meacutetodo recibido dentro de la peticioacuten estaacute relacionado con el meacutetodo SIP
INVITE En la seccioacuten de coacutedigo 5 se explica el reconocimiento del meacutetodo para este
proceso y la ejecucioacuten de enviacuteo y recepcioacuten de tramas relacionadas con el inicio de sesioacuten
74
1 if (transOriginalRequestMethod == SipMethodInvite) 2 3 InviteServerTransaction InviteTrans = 4 (InviteServerTransaction)eTransaction 5 CoreClientT = null 6 CoreClientT = new SipCore() 7 SystemNetIPAddress localAddress = 8 SystemNetIPAddressParse(1111) 9 CoreClientTLocalAddressPort = new IPDomainPort(new 10 IPEndPoint(localAddress 5060)) 11 string CampoVia 12 string IP 13 string Puerto 14 CampoVia = transOriginalRequestViaHeadersToString() 15 char[] sep = 16 string[] part = CampoViaSplit(sep) 17 IP = part[3] 18 Puerto = part[4] 19 string dname 20 string username 21 char[] tok = 22 string from = transOriginalRequestFromToString() 23 string[] part2 = fromSplit(tok) 24 dname = part2[2] 25 username = part2[4] 26 listaClienteInsertar(dname username IP Puerto Via) 27 listaRegistroInsertar(username IP Puerto) 28 char[] tok2 = 29 string To = transOriginalRequestRequestUriAbsoluteUriToString() 30 string[] part3 = ToSplit(tok) 31 string usernameDestino = part3[1] 32 string callIDpar = transOriginalRequestCallIdToString() 33 string[] parametros = listaRegistroBuscar(usernameDestino) 34 string DNDestino = transOriginalRequestToDisplayNameToString() 35 string Fecha = DateTimeNowDateToString() 36 37 SipResponse RingingResponse = new 38 SipResponse(InviteTransOriginalRequest SipStatusCodeRinging) 39 SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP) 40 DestinationTuple destination = new DestinationTuple(new 41 IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp) 42 CoreServerTSendResponseDirect(RingingResponse destination) 43 listaReportesInsertar(callIDpar dname username IP DNDestino 44 usernameDestino parametros[1] Fecha) 45 46 InviteRequest Invite = new InviteRequest() 47 ViaHeaderField FieldVia = new ViaHeaderField(new 48 IPDomainPort(SystemNetIPAddressParse(1111) 5060)) 49 FieldViaBranch = ViaHeaderFieldNewBranch() 50 FieldViaProtocolName = UDP 51 FieldViaProtocolVersion = 20 52 FieldViaSentBy = new 53 IPDomainPort(SystemNetIPAddressParse(1111) 5060) 54 InviteAddHeader(FieldVia)
Seccioacuten de coacutedigo 5 Gestioacuten de enviacuteo de trama INVITE a un usuario final
75
Para que un cliente destino localice el usuario fuente seraacute necesario que el Proxy PBX
enviacutee la sentildealizacioacuten necesaria para el inicio de sesioacuten como se muestra en la seccioacuten de
coacutedigo 4 el objeto SIP CORE hace un criterio de anaacutelisis para determinar si la transaccioacuten
Servidor reconoce un meacutetodo de tipo INVITE si esta condicioacuten se cumple enviacutea como
respuesta inmediata una trama de procedimiento 180 (RINGING) que seraacute llevada a un
estado de completo con un OK para indicar que la sesioacuten fue aceptada por el cliente
destino
46 Desarrollo de software Proxy PBX para generar reportes de llamadas
Para generar el Reporteador de llamadas dentro de la red se utilizoacute una base de
datos conectada al servidor Microsoft SQL Server 2008
La base de datos consiste en una tabla que almacenaraacute en tiempo real las llamadas
cursan sobre la red En la siguiente figura se muestra la tabla que se creoacute con los campos
pertinentes para realizar el reporte de llamadas
Figura 28 Base de datos Reporteador
Los campos que se tomaron en consideracioacuten para generar el reporte son
DisplayNameOrigen UserNameOrigen IPOrigen DisplayNameDestino
UserNameDestino IPDestino HoraInicio HoraFin Duracion y Fecha
Esta tabla fue creada en el control de usuario DATAGRIDVIEW para mostrar en
pantalla los datos de los usuarios y las llamadas que han realizado El DATAGRIDVIEW va
llenando sus registros en tiempo de ejecucioacuten y posteriormente los guarda en una base de
datos alojada dentro del proyecto Una vez almacenada la tabla se podraacuten hacer consultas
para generar los reportes de llamadas de acuerdo a las diferentes necesidades del
administrador
76
Capiacutetulo V Pruebas
51 Registro de teleacutefono SIP
Objetivo
El objetivo de esta prueba es el establecer el registro de un cliente Softphone a traveacutes de su
autenticacioacuten con el software PROXY PBX y eacuteste a su vez con el servidor de registro
situado dentro del IP PBX
Figura 29 Diagrama de registro de Softphone
El procedimiento a seguir para el registro y autenticacioacuten del un cliente Softphone dentro
de la red esta indicado en la figura 30 Para realizar dicha autenticacioacuten el Softphone
utiliza el meacutetodo REGISTER para indicarle al PROXY PBX su direccioacuten SIP
77
Figura 30 Esquema SIP de registro y autenticacioacuten de Softphone
511 Resultados
Como resultado a esta primera etapa de la realizacioacuten del proyecto se obtuvo el cliente
Softphone XLite registrado con el nombre de usuario 40 (figura 31)
Figura 31 Softphone registrado
78
De esta forma tambieacuten se capturo informacioacuten del usuario registrado a traveacutes del Log de
Tramas (Figura 32)
Figura 32 Log de Tramas Register
52 Establecimiento y liberacioacuten de sesioacuten SIP
Objetivo
El objetivo de esta etapa es el establecer una sesioacuten SIP entre dos clientes
Softphone que iniciaran y terminaran una llamada telefoacutenica El cliente Softphone 1 con
direccioacuten SIP URI 4011110 realiza una llamada al cliente Softphone 2 con SIP URI
3011110 en la figura 33 se muestra el diagrama Establecimiento y liberacioacuten de sesioacuten
SIP
El mensaje de establecimiento de llamada SIP INVITE es emitido por el que llama al
PROXY PBX eacuteste identifica la localizacioacuten del que esta llamado (direccioacuten IP) y encamina
la llamada a su destino El mensaje INVITE contiene distintos campos de cabecera
obligatorios entre los cuales estaacuten la direccioacuten SIP URI de quien llama ldquoFromrdquo la
direccioacuten SIP URI de quien recibe la llamada ldquoTordquo el identificador de la llamada ldquoCall-
IDrdquo el numero de secuencia ldquoCseqrdquo un numero maacuteximo de saltos ldquomax-forwardsrdquo
El campo de cabecera ldquoViardquo esta actualizado por todas las entidades que participan en el
enrutamiento de la llamada esto asegura que la respuesta seguiraacute el mismo camino que el
requerimiento
79
Por otra parte el meacutetodo SIP INVITE contiene el protocolo SDP (Session Description
Protocol) que esta encargado de definir las caracteriacutesticas media que el que inicia la
llamada necesita para realizarla
Figura 33 Diagrama Establecimiento y liberacioacuten de sesioacuten SIP
En la siguiente figura se muestra a detalle el procedimiento del enviacuteo de mensajes SIP
entre los UAC pasando por la entidad PROXY PBX para el inicio y fin de la sesioacuten
Figura 34 Esquema SIP de inicio y fin de llamada
80
521 Resultados
Como resultado a esta prueba se obtuvo mediante el Log de Tramas informacioacuten de origen
y destino de la llamada direcciones IP puertos utilizados entre otros campos (Figura 35)
Figura 35 Log de tramas inicio y fin de sesioacuten
La figura 36 muestra el cliente Softphone2 recibiendo la llamada del Softphone1 donde se
despliega su Username (40) asiacute como el Displayname (Liliana)
81
Figura 36 Softphone2 Figura 37 Llamada establecida
53 Prueba Reporteador
Objetivo
Como parte final del proyecto se implemento un servicio de reportes de llamada
donde se registra quienes establecieron comunicacioacuten dentro de la red hora de inicio y fin
de la llamada asiacute como la duracioacuten de la misma
Figura 38 Esquema PROXY PBX
82
531 Resultados
Figura 39Prueba Reporteador
54 Resultados finales
Figura 40 Aplicacioacuten PROXY PBX
83
Figura 41 Creacuteditos
84
Conclusiones
El desarrollo de software basado en normas o estaacutendares permite conocer a fondo el
funcionamiento de protocolos como en este caso El protocolo SIP para VoIP Se
comprendioacute a fondo como las aplicaciones de red con las que el usuario trabaja interactuacutean
con los diversos protocolos que forman el modelo TCPIP Para programar aplicaciones de
red es necesario conocer formatos de flujo de traacutefico y eventos que se disparan en funcioacuten
del traacutefico de red Programar protocolos de la capa de aplicacioacuten nos permite desarrollar
software adaptado a las necesidades de una empresa
Los alcances de este proyecto y algunas de las mejoras que podriacutean hacerse es la
extensioacuten de las funciones del Proxy PBX IP para ser reportes de llamadas de la PSTN asiacute
como la implementacioacuten de restricciones de las llamadas distribuir permisos y llevar un
control maacutes preciso del traacutefico de llamadas de la red
Despueacutes de realizar las pruebas necesarias se cumplieron los objetivos planteados
al inicio del proyecto y se logroacute la creacioacuten de una herramienta muy importante de uso
empresarial basada en un protocolo (SIP) estandarizado por una organizacioacuten internacional
como lo es la IETF ya que de esta forma se podriacutea llegar a una homologacioacuten con otras
aplicaciones basadas en este estaacutendar
85
Glosario
Coacutedec Software hardware o una combinacioacuten de ambos capaz de transformar un archivo
un flujo de datos o una sentildeal Los coacutedecs pueden codificar el flujo o la sentildeal y recuperarlo o
descifrarlo del mismo modo para la reproduccioacuten o la manipulacioacuten en un formato maacutes
apropiado para estas operaciones
PBX Private Branch Exchange Una PBX se encarga de establecer conexiones entre
terminales de una misma empresa o de hacer que se cursen llamadas al exterior Hace que
las extensiones tengan acceso desde el exterior desde el interior y ellas a su vez tengan
acceso tambieacuten a otras extensiones y a una liacutenea externa
Proxy El servidor proxy como en la mayoriacutea de los casos actuacutea como un intermediario que
de un UAC a los UAS o bien otras UACs Un Servidor Proxy puede ser utilizado para
encaminar las comunicaciones SIP tambieacuten se puede utilizar para la localizacioacuten de una
identidad SIP
PSTN Public Switched Telephone Network es una red con conmutacioacuten de circuitos
tradicional optimizada para comunicaciones de voz en tiempo real Cuando llama a alguien
cierra un conmutador al marcar y establece asiacute un circuito con el receptor de la llamada
SIP Session Initiation Protocol Es un protocolo estandarizado por la Internet Engineering
Task Force (IETF) para iniciar modificar y terminar una sesioacuten de usuario interactiva que
implica elementos multimedia
Socket Es un meacutetodo para la comunicacioacuten entre un programa del cliente y un programa
del servidor en una red Un socket se define como el punto final en una conexioacuten Los
sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcioacuten a veces
llamados interfaz de programacioacuten de aplicacioacuten de sockets
Softphone Es un software que simula un telefono en una PC y permite hacer llamadas
VoIP sin necesidad de tener un telefono IP fiacutesico Es decir convierte la PC en un Telefono
IP para hacer llamadas a otros softphones (de PC a PC) o a otros teleacutefonos convencionales
usando un Operador de Telefonia IP (de PC a Telefonos)
UAC User agent client es una aplicacioacuten que inicia hasta seis posibles peticiones SIP a un
UAS Las seis peticiones formuladas por la UAC son INVITE ACK OPTIONS BYE
CANCEL y REGISTER
UAS UAS es el servidor que aloja la aplicacioacuten encargada de recibir las solicitudes SIP de
un UAC y en la recepcioacuten devuelve una respuesta a la solicitud de nuevo a la UAC La
UAS puede emitir respuestas muacuteltiples a la UAC no necesariamente una sola respuesta La
comunicacioacuten entre UAC y UAS es cliente servidor y (peer-to-peer)
VoIP Es la abreviacioacuten en ingleacutes de Voice over IP (Voz sobre IP o voz sobre protocolo de
Internet) y se usa para identificar la tecnologiacutea detraacutes de comunicaciones usando voz y viacutedeo
a traveacutes de Internet
86
Anexo I
Coacutedigo
using System
using SystemCollections
using SystemCollectionsGeneric
using SystemComponentModel
using SystemData
using SystemDataSql
using SystemDataSqlClient
using SystemDataOleDb
using SystemThreading
using SystemNet
using SystemNetSockets
using SystemIO
using SystemDrawing
using SystemLinq
using SystemText
using SystemWindowsForms
using KonneticSignallingSip
using KonneticSignallingSdp
using KonneticNetTransport
namespace ProxyPBX
public partial class ProxyPBX Form
private delegate void UpdateTextCallback(string text)
private DateTime Hora
private DateTime Fecha
private string HoraC
private string FechaC
private SipCore CoreServerT = null
private SipCore CoreClientT = null
private SipCore CoreServerTOptions = null
private SipCore CoreServerTNotify = null
string CampoViaRegister
string CampoViaOptions
string CampoViaSubscribe
string CampoViaNotify
string CampoViaInvite
ListaSoftphone listaCliente = new ListaSoftphone()
ListaTrixBox listaServidor = new ListaTrixBox()
ListaRegistro listaRegistro = new ListaRegistro()
ListaReportes listaReportes = new ListaReportes()
87
ListaCallID listaCallID = new ListaCallID()
private Panel buttonPanel = new Panel()
private DataGridView ReporteadorDataGridView = new DataGridView()
private Button addNewRowButton = new Button()
private Button deleteRowButton = new Button()
public ProxyPBX()
InitializeComponent()
private void ProxyPBX_Load_1(object sender EventArgs e)
EjecutarTransaction()
DisDataGridView()
AReporteadorDataGridView()
public void EjecutarTransaction()
CoreServerT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreServerTLocalAddressPort = new IPDomainPort(localAddress 5060)
CoreServerTStartListening(new IPEndPoint(localAddress 5060)
TransportProtocolUdp)
CoreServerTServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(OnServerTransactionCreated)
private void OnServerTransactionCreated(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransac
if (transOriginalRequestMethod == SipMethodRegister)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
string dname
string username
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
88
string[] part = CampoViaSplit(sep)
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
IP = part[3]
Puerto = part[4]
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama REGISTER)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest RegisterRequest = eTransactionOriginalRequest
if (RegisterRequestAuthorizationHeaders = null)
Append(Credenciales + RegisterRequestAuthorizationHeadersToString())
RegisterRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111) 5060)
RegisterRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(RegisterRequest CoreClientT true)
RegisterRequestSetTransaction(transaction)
RegisterRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OnRegisterResponseReceived)
CoreClientTSendRequest(RegisterRequest)
if (transOriginalRequestMethod == SipMethodSubscribe)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
89
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string Via = transOriginalRequestViaHeadersToString()
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto Via)
listaRegistroInsertar(username IP Puerto)
Append()
Append(Trama SUBSCRIBE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
SipRequest SubscribeRequest = eTransactionOriginalRequest
if (SubscribeRequestAuthorizationHeaders = null)
Append(Credenciales +
SubscribeRequestAuthorizationHeadersToString())
SubscribeRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
SubscribeRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(SubscribeRequest CoreClientT true)
SubscribeRequestSetTransaction(transaction)
SubscribeRequestResponseReceived += new
90
EventHandlerltResponseReceivedEventArgsgt(SubscribeRequest_ResponseReceived)
CoreClientTSendRequest(SubscribeRequest)
if (eTransactionOriginalRequestMethod == SipMethodInvite)
InviteServerTransaction InviteTrans = (InviteServerTransaction)eTransaction
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string CampoVia
string IP
string Puerto
CampoVia = transOriginalRequestViaHeadersToString()
char[] sep =
string[] part = CampoViaSplit(sep)
IP = part[3]
Puerto = part[4]
string dname
string username
char[] tok =
string from = transOriginalRequestFromToString()
string[] part2 = fromSplit(tok)
dname = part2[2]
username = part2[4]
listaClienteInsertar(dname username IP Puerto CampoVia)
listaRegistroInsertar(username IP Puerto)
Append()
Append(TRAMA INVITE)
Append(USUARIO FUENTE)
Append(Campo Via + CampoVia)
Append(Username + username)
Append(Displayname + dname)
Append(Direccioacuten IP + IP)
Append(Puerto + Puerto)
char[] tok2 =
string To = transOriginalRequestRequestUriAbsoluteUriToString()
Append(Campo To + To)
string[] part3 = ToSplit(tok)
string usernameDestino = part3[1]
string callIDpar = transOriginalRequestCallIdToString()
string[] parametros = listaRegistroBuscar(usernameDestino)
string DNDestino = transOriginalRequestToDisplayNameToString()
string Fecha = DateTimeNowDateToString(d MMM yyyy)
string HoraInicio = DateTimeNowToString(hhmmssf)
91
Append(USUARIO DESTINO)
Append(Username + usernameDestino)
Append(Displayename + DNDestino)
Append(Direccioacuten IP + parametros[1])
Append(Puerto + parametros[2])
Append(CallID + transOriginalRequestCallIdToString())
Append(Fecha + Fecha)
Append(Hora Inicio + HoraInicio)
Append(InviteTransOriginalRequestToString())
if (parametros = null)
listaReportesInsertar(dname username IP DNDestino usernameDestino
parametros[1] HoraInicio Fecha)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametros[0]
UriToHost = parametros[1]
UriToPort = intParse(parametros[2])
Envio de respuesta Ringing para situar al usuario inicial en un estado de
procedimiento
SipResponse RingingResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeRinging)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreServerTSendResponseDirect(RingingResponse destination)
InviteRequest Invite = new InviteRequest(UriToSipUri)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
InviteAddHeader(FieldVia)
InviteMaxForwards = transOriginalRequestMaxForwards
InviteFrom = InviteTransOriginalRequestFrom
InviteFromRecreateTag()
InviteTo = new ToHeaderField(UriToSipUri)
InviteContactHeadersAdd(transOriginalRequestContactHeaders[0])
CallIdHeaderField callID = new CallIdHeaderField()
callIDRecreateCallId(1111)
92
InviteCallId = callID
CSeqHeaderField Cseq = new CSeqHeaderField(SipMethodInvite)
CseqNextSequence()
InviteCSeq = Cseq
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
InviteDate = new DateHeaderField(DateTimeNow)
for (int c = 0 c lt transOriginalRequestAllowHeadersCount c++)
InviteAllowHeadersAdd(transOriginalRequestAllowHeaders[c])
for (int c = 0 c lt transOriginalRequestSupportedHeadersCount c++)
InviteSupportedHeadersAdd(transOriginalRequestSupportedHeaders[c])
InviteContentType = transOriginalRequestContentType
InviteBody = transOriginalRequestBody
listaCallIDInsertar(callIDpar username usernameDestino)
SystemNetIPAddress RemoteAddressInvite =
SystemNetIPAddressParse(parametros[1]ToString())
DestinationTuple destinationInvite = new DestinationTuple(new
IPEndPoint(RemoteAddressInvite intParse(parametros[2])) TransportProtocolUdp)
InviteResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(invite_ResponseReceived)
CoreClientTSendRequestDirect(Invite destinationInvite)
else
SipResponse AnywhereResponse = new
SipResponse(InviteTransOriginalRequest SipStatusCodeDoesNotExistAnywhere)
SystemNetIPAddress RemoteAddressAnywhereResponse =
SystemNetIPAddressParse(IP)
Append(ESTADO FALLIDO)
Append(USUARIO NO ENCONTRADO)
DestinationTuple destinationAnywhereResponse = new DestinationTuple(new
IPEndPoint(RemoteAddressAnywhereResponse intParse(Puerto))
TransportProtocolUdp)
CoreServerTSendResponseDirect(AnywhereResponse
destinationAnywhereResponse)
if (transOriginalRequestMethod == SipMethodBye)
Response ByeResponse = ServidorSendResponseOK(eRequest)
ServidorBye(ByeResponse)
93
private void OnRegisterResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO + REGISTER OK===)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
CoreServerTOptions = null
CoreServerTOptions = new SipCore()
CoreServerTOptionsStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTOptionsServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTOptions_NewPort)
else
Append(ESTADO + REGISTER + eResponseStatusLineToString())
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
94
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaRegister = parametros[4]
SipResponse RespRegisterServerT = eResponse
RespRegisterServerTRemoveHeader(Via)
RespRegisterServerTViaHeadersAdd(CampoViaRegister)
CoreServerTSendResponseDirect(RespRegisterServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTOptions_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
if (transOriginalRequestMethod == SipMethodOptions)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestToUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest OptionsRequest = eTransactionOriginalRequest
OptionsRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
OptionsRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(OptionsRequest CoreClientT true)
OptionsRequestSetTransaction(transaction)
95
OptionsRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(OptionsRequest_ResponseReceived)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
CoreClientTSendRequestDirect(OptionsRequest destination)
private void OptionsRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA OPTIONS)
Append(ESTADO COMPLETADO)
string username
char[] tok2 =
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
string[] parametros = listaServidorBuscar(username)
CampoViaOptions = parametros[3]
SipResponse RespOptionsServerT = eResponse
Append(eResponseViaHeadersToString())
RespOptionsServerTRemoveHeader(Via)
RespOptionsServerTViaHeadersAdd(CampoViaOptions)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespOptionsServerT destination)
listaServidorEliminar(username)
private void SubscribeRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
int port
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO SUBSCRIBE OK)
char[] tok = =
string via = eResponseViaHeadersToString()
string[] part = viaSplit(tok)
port = intParse(part[5])
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
96
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
CoreServerTNotify = null
CoreServerTNotify = new SipCore()
CoreServerTNotifyStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) port) TransportProtocolUdp)
CoreServerTNotifyServerTransactionCreated += new
EventHandlerltTransactionEventArgsgt(CoreServerTNotify_NewPort)
if (eResponseStatusCodeNumber == 401)
Append(ESTADO SUBSCRIBE UNAUTHORIZED)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
private void CoreServerTNotify_NewPort(object sender TransactionEventArgs e)
ServerTransaction trans = (ServerTransaction)eTransaction
97
if (eTransactionOriginalRequestMethod == SipMethodNotify)
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string IP
string Puerto
string Via = transOriginalRequestViaHeadersToString()
string username
char[] tok =
string to = transOriginalRequestRequestUriAbsoluteUriToString()
string[] part2 = toSplit(tok)
username = part2[1]
IP = part2[2]
Puerto = part2[3]
listaServidorInsertar(username IP Puerto Via)
SipRequest NotifyRequest = eTransactionOriginalRequest
NotifyRequestRemoveHeader(Via)
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
NotifyRequestAddHeader(FieldVia)
ClientTransaction transaction =
SipTransactionCreateClientTransaction(NotifyRequest CoreClientT true)
NotifyRequestSetTransaction(transaction)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(IP)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(Puerto)) TransportProtocolUdp)
NotifyRequestResponseReceived += new
EventHandlerltResponseReceivedEventArgsgt(NotifyRequest_ResponseReceived)
CoreClientTSendRequestDirect(NotifyRequest destination)
private void NotifyRequest_ResponseReceived(object sender
ResponseReceivedEventArgs e)
Append(TRAMA NOTIFY)
Append(ESTADO COMPLETADO)
string IP
string username
char[] tok2 =
98
string to = eResponseToUriToString()
string[] part2 = toSplit(tok2)
username = part2[1]
IP = part2[2]
string[] parametros = listaServidorBuscar(username)
CampoViaNotify = parametros[3]
SipResponse RespNotifyServerT = eResponse
RespNotifyServerTRemoveHeader(Via)
RespNotifyServerTViaHeadersAdd(CampoViaNotify)
SystemNetIPAddress RemoteAddress = SystemNetIPAddressParse(11110)
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress 5060) TransportProtocolUdp)
CoreServerTSendResponseDirect(RespNotifyServerT destination)
listaServidorEliminar(username)
private void invite_ResponseReceived(object sender ResponseReceivedEventArgs e)
if (eResponseStatusCodeNumber == 401)
Append(===INVITE UNAUTHORIZED===)
string dname
string username
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaSubscribe = parametros[4]
SipResponse RespSubscribeServerT = eResponse
RespSubscribeServerTRemoveHeader(Via)
RespSubscribeServerTViaHeadersAdd(CampoViaSubscribe)
CoreServerTSendResponseDirect(RespSubscribeServerT destination)
listaClienteEliminar(dname username)
else
Append(LLAMADA EN PROCESO )
Append(ESTADO + eResponseStatusLineToString())
Append(eResponseToString())
string dname
string username
char[] tok2 =
99
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dname = part2[2]
username = part2[4]
string rport
char[] tok = =
string ViaResponse = eResponseViaHeadersToString()
string[] part = ViaResponseSplit(tok)
rport = part[2]
string FromRinging = eResponseFromUriToString()
char[] tokFromRing =
string[] part4 = FromRingingSplit(tokFromRing)
string usernameOrigen = part4[1]
string ToRinging = eResponseToUriToString()
char[] tokToRing =
string[] part3 = ToRingingSplit(tokToRing)
string usernameDestino = part3[1]
string[] parametros = listaClienteBuscar(dname username)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametros[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametros[3])) TransportProtocolUdp)
CampoViaInvite = parametros[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeRinging)
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallIDres = listaCallIDBuscar(usernameOrigen usernameDestino)
RespInviteServerTCallId = CallIDres
CSeqHeaderField CseqRinging = new CSeqHeaderField(SipMethodInvite)
CseqRingingNextSequence()
UserAgentHeaderField UserAgRing = new UserAgentHeaderField(ESIME
Proxy PBX v10)
RespInviteServerTUserAgent = UserAgRing
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInvite))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodAck))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodOptions))
100
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodCancel))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodBye))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodRefer))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodSubscribe))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodNotify))
RespInviteServerTAllowHeadersAdd(new
AllowHeaderField(SipMethodInfo))
RespInviteServerTSupportedHeadersAdd(replaces)
RespInviteServerTSupportedHeadersAdd(timer)
SipUri URIRing = eResponseToUri
ContactHeaderField contact = new ContactHeaderField(URIRing)
RespInviteServerTContactHeadersAdd(contact)
CoreServerTSendResponseDirect(RespInviteServerT destination)
CoreClientTStartListening(new
IPEndPoint(SystemNetIPAddressParse(1111) intParse(rport))
TransportProtocolUdp)
CoreClientTResponseReceived+=new
EventHandlerltResponseReceivedEventArgsgt(CoreClientT_ResponseReceived)
private void CoreClientT_ResponseReceived(object sender
ResponseReceivedEventArgs e)
if (eResponseStatusClass == SipStatusClassSuccessful)
Append(ESTADO INVITE OK)
Append(SESION ESTABLECIDA)
listaReportesMostrar()
Append(eResponseToString())
CoreClientT = null
CoreClientT = new SipCore()
SystemNetIPAddress localAddress = SystemNetIPAddressParse(1111)
CoreClientTLocalAddressPort = new IPDomainPort(new
IPEndPoint(localAddress 5060))
string usernameTo
char[] tok =
string to = eResponseToToString()
string[] part1 = toSplit(tok)
usernameTo = part1[2]
string[] parametrosTo = listaRegistroBuscar(usernameTo)
AckRequest Confirmacion = new AckRequest()
101
ViaHeaderField FieldVia = new ViaHeaderField(new
IPDomainPort(SystemNetIPAddressParse(1111) 5060))
FieldViaBranch = ViaHeaderFieldNewBranch()
FieldViaProtocolName = UDP
FieldViaProtocolVersion = 20
FieldViaSentBy = new IPDomainPort(SystemNetIPAddressParse(1111)
5060)
ConfirmacionAddHeader(FieldVia)
SipUriBuilder UriTo = new SipUriBuilder()
UriToUserName = parametrosTo[0]
UriToHost = parametrosTo[1]
UriToPort = intParse(parametrosTo[2])
RequestLine ReqLine = new RequestLine(UriToSipUri SipMethodAck)
ConfirmacionRequestLine = ReqLine
ConfirmacionMaxForwards = 70
ConfirmacionFrom = eResponseFrom
ConfirmacionTo = eResponseTo
SipUri URI = eResponseFromUri
ContactHeaderField contact = new ContactHeaderField(URI)
ConfirmacionContactHeadersAdd(contact)
ConfirmacionCallId = eResponseCallId
CSeqHeaderField CseqACK = new CSeqHeaderField(SipMethodAck)
CseqACKNextSequence()
ConfirmacionCSeq = CseqACK
UserAgentHeaderField UserAg = new UserAgentHeaderField(ESIME Proxy
PBX v10)
ConfirmacionUserAgent = UserAg
SystemNetIPAddress RemoteAddressTo =
SystemNetIPAddressParse(parametrosTo[1])
DestinationTuple destinationTo = new DestinationTuple(new
IPEndPoint(RemoteAddressTo intParse(parametrosTo[2])) TransportProtocolUdp)
CoreClientTSendRequestDirect(Confirmacion destinationTo)
string dnameFrom
string usernameFrom
char[] tok2 =
string from = eResponseFromToString()
string[] part2 = fromSplit(tok2)
dnameFrom = part2[2]
usernameFrom = part2[4]
string[] parametrosFrom = listaClienteBuscar(dnameFrom usernameFrom)
SystemNetIPAddress RemoteAddress =
SystemNetIPAddressParse(parametrosFrom[2])
DestinationTuple destination = new DestinationTuple(new
IPEndPoint(RemoteAddress intParse(parametrosFrom[3])) TransportProtocolUdp)
CampoViaInvite = parametrosFrom[4]
SipResponse RespInviteServerT = new SipResponse(SipStatusCodeOk)
102
RespInviteServerTViaHeadersAdd(CampoViaInvite)
FromHeaderField FromHeader = new FromHeaderField(eResponseFromUri)
FromHeaderDisplayName = eResponseFromDisplayName
FromHeaderRecreateTag()
RespInviteServerTFrom = FromHeader
ToHeaderField ToHeader = new ToHeaderField(eResponseToUri)
ToHeaderDisplayName = eResponseToDisplayName
ToHeaderRecreateTag()
RespInviteServerTTo = ToHeader
string CallidVuelta = listaCallIDBuscar(usernameFrom usernameTo)CALL
ID DEVUELTO
RespInviteServerTCallId = CallidVuelta
CSeqHeaderField CseqOK = new CSeqHeaderField(SipMethodInvite)
CseqOKNextSequence()
UserAgentHeaderField UserAgOK = new UserAgentHeaderField(ESIME Proxy
PBX v10)
RespInviteServerTUserAgent = UserAgOK
for (int c = 0 c lt eResponseAllowHeadersCount c++)
RespInviteServerTAllowHeadersAdd(eResponseAllowHeaders[c])
for (int c = 0 c lt eResponseSupportedHeadersCount c++)
RespInviteServerTSupportedHeadersAdd(eResponseSupportedHeaders[c])
SipUri URIOK = eResponseToUri
ContactHeaderField contactOK = new ContactHeaderField(URIOK)
RespInviteServerTContactHeadersAdd(contactOK)
RespInviteServerTContentType = eResponseContentType
RespInviteServerTBody = eResponseBody
CoreServerTSendResponseDirect(RespInviteServerT destination)
listaClienteEliminar(dnameFrom usernameFrom)
listaCallIDEliminar(dnameFrom
public void Append(string text)
BeginInvoke(new UpdateTextCallback(AppendText) new object[] text )
private void AppendText(string text)
mostrarTextBox2AppendText(rn + text)
public class NodoListaSoftphone
public NodoListaSoftphone anterior
103
public string DisplayName
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaSoftphone siguiente
public NodoListaSoftphone(string DisplayName string Username string
DireccionIP string Puerto string Via)
this(null DisplayName Username DireccionIP Puerto Via null)
public NodoListaSoftphone(NodoListaSoftphone anterior string DisplayName
string Username string DireccionIP string Puerto string Via NodoListaSoftphone
siguiente)
thisanterior = anterior
thisDisplayName = DisplayName
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaSoftphone ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAME
get return DisplayName
set DisplayName = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
104
get return Via
set Via = value
public NodoListaSoftphone SIGUIENTE
get return siguiente
set siguiente = value
public class ListaSoftphone
private NodoListaSoftphone primerNodo
private NodoListaSoftphone ultimoNodo
public ListaSoftphone()
primerNodo = ultimoNodo = null
public void Insertar(string DisplayName string Username string DireccionIP
string Puerto string Via)
if (primerNodo == null)
primerNodo = ultimoNodo = new NodoListaSoftphone(DisplayName
Username DireccionIP Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaSoftphone(null
DisplayName Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
do
if ((ActualDisplayName == DisplayName) ampamp (ActualUsername ==
Username))
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
ActualSIGUIENTEANTERIOR = null
105
primerNodo = ActualSIGUIENTE
break
if (ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo)
break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string DisplayName string Username)
NodoListaSoftphone Actual = primerNodo
string[] parametros = new string[5]
bool existe = false
do
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME ==
Username))
existe = true
break
if (Actual == ultimoNodo)
if ((ActualDISPLAYNAME == DisplayName) ampamp (ActualUSERNAME
== Username))
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualDISPLAYNAME
parametros[1] = ActualUSERNAME
parametros[2] = ActualDIRECCIONIP
parametros[3] = ActualPUERTO
106
parametros[4] = ActualVIA
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaTrixBox
public NodoListaTrixBox anterior
public string Username
public string DireccionIP
public string Puerto
public string Via
public NodoListaTrixBox siguiente
public NodoListaTrixBox(string Username string DireccionIP string Puerto string
Via)
this(null Username DireccionIP Puerto Via null)
public NodoListaTrixBox(NodoListaTrixBox anterior string Username string
DireccionIP string Puerto string Via NodoListaTrixBox siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thisVia = Via
thissiguiente = siguiente
public NodoListaTrixBox ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
107
get return DireccionIP
set DireccionIP = value
public string PUERTO
get return Puerto
set Puerto = value
public string VIA
get return Via
set Via = value
public NodoListaTrixBox SIGUIENTE
get return siguiente
set siguiente = value
public class ListaTrixBox
private NodoListaTrixBox primerNodo
private NodoListaTrixBox ultimoNodo
public ListaTrixBox()
primerNodo = ultimoNodo = null
public void Insertar(string Username string DireccionIP string Puerto string Via)
if (ListaVacia())
primerNodo = ultimoNodo = new NodoListaTrixBox(Username DireccionIP
Puerto Via)
else
primerNodoANTERIOR = primerNodo = new NodoListaTrixBox(null
Username DireccionIP Puerto Via primerNodo)
public void Eliminar(string Username)
NodoListaTrixBox Actual = primerNodo
do
if (ActualUSERNAME == Username)
108
if (Actual == ultimoNodo)
primerNodo = ultimoNodo = null
break
if (ActualANTERIOR == null)
primerNodo = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodo) break
Actual = ActualSIGUIENTE
while (Actual = null)
public string[] Buscar(string Username)
NodoListaTrixBox Actual = primerNodo
string[] parametros = new string[4]
bool existe = false
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodo)
if (ActualUSERNAME == Username)
existe = true
break
else break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
parametros[0] = ActualUsername
parametros[1] = ActualDireccionIP
109
parametros[2] = ActualPuerto
parametros[3] = ActualVia
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodo == null
public class NodoListaRegistro
public NodoListaRegistro anterior
public string Username
public string DireccionIP
public string Puerto
public NodoListaRegistro siguiente
public NodoListaRegistro(string Username string DireccionIP string Puerto)
this(null Username DireccionIP Puerto null)
public NodoListaRegistro(NodoListaRegistro anterior string Username string
DireccionIP string Puerto NodoListaRegistro siguiente)
thisanterior = anterior
thisUsername = Username
thisDireccionIP = DireccionIP
thisPuerto = Puerto
thissiguiente = siguiente
public NodoListaRegistro ANTERIOR
get return anterior
set anterior = value
public string USERNAME
get return Username
set Username = value
public string DIRECCIONIP
get return DireccionIP
set DireccionIP = value
110
public string PUERTO
get return Puerto
set Puerto = value
public NodoListaRegistro SIGUIENTE
get return siguiente
set siguiente = value
public class ListaRegistro
private NodoListaRegistro primerNodoRegistro
private NodoListaRegistro ultimoNodoRegistro
public ListaRegistro()
primerNodoRegistro = ultimoNodoRegistro = null
public void Insertar(string Username string DireccionIP string Puerto)
bool existe = false
if (ListaVacia())
primerNodoRegistro = ultimoNodoRegistro = new
NodoListaRegistro(Username DireccionIP Puerto)
else
NodoListaRegistro ActualRegistro = primerNodoRegistro
do
if (ActualRegistroUSERNAME == Username)
ActualRegistroDIRECCIONIP = DireccionIP
ActualRegistroPUERTO = Puerto
existe = true
break
if (ActualRegistro == ultimoNodoRegistro) break
ActualRegistro = ActualRegistroSIGUIENTE
while (ActualRegistro = null)
if (existe == false)
primerNodoRegistroANTERIOR = primerNodoRegistro = new
NodoListaRegistro(null Username DireccionIP Puerto primerNodoRegistro)
111
public string[] Buscar(string Username)
bool existe = false
NodoListaRegistro Actual = primerNodoRegistro
string[] parametros = new string[3]
do
if (ActualUSERNAME == Username)
existe = true
break
if (Actual == ultimoNodoRegistro) break
Actual = Actualsiguiente
while (Actual = null)
if (existe == true)
parametros[0] = ActualUSERNAME
parametros[1] = ActualDIRECCIONIP
parametros[2] = ActualPUERTO
return parametros
else
parametros = null
return parametros
public bool ListaVacia()
return primerNodoRegistro == null
class NodoListaReportes
NodoListaReportes anterior
public string DisplayNameOrigen
public string UserNameOrigen
public string IPOrigen
public string DisplayNameDestino
public string UserNameDestino
public string IPDestino
112
public string HoraInicio
public string HoraFin
public string Duracion
public string Fecha
NodoListaReportes siguiente
public NodoListaReportes(string DisplayNameOrigen string UserNameOrigen
string IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino
string HoraInicio string Fecha)
this(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha null)
public NodoListaReportes(NodoListaReportes anterior string DisplayNameOrigen
string UserNameOrigen string IPOrigen string DisplayNameDestino string
UserNameDestino string IPDestino string HoraInicio string HoraFin string Duracion
string Fecha NodoListaReportes siguiente)
thisanterior = anterior
thisDisplayNameOrigen = DisplayNameOrigen
thisUserNameOrigen = UserNameOrigen
thisIPOrigen = IPOrigen
thisDisplayNameDestino = DisplayNameDestino
thisUserNameDestino = UserNameDestino
thisIPDestino = IPDestino
thisHoraInicio = HoraInicio
thisHoraFin = HoraFin
thisDuracion = Duracion
thisFecha = Fecha
thissiguiente = siguiente
public NodoListaReportes ANTERIOR
get return anterior
set anterior = value
public string DISPLAYNAMEORIGEN
get return DisplayNameOrigen
set DisplayNameOrigen = value
public string USERNAMEORIGEN
get return UserNameOrigen
set UserNameOrigen = value
public string IPORIGEN
get return IPOrigen
set IPOrigen = value
113
public string DISPLAYNAMEDESTINO
get return DisplayNameDestino
set DisplayNameDestino = value
public string USERNAMEDESTINO
get return UserNameDestino
set UserNameDestino = value
public string IPDESTINO
get return IPDestino
set IPDestino = value
public string HORAINICIO
get return HoraInicio
set HoraInicio = value
public string HORAFIN
get return HoraFin
set HoraFin = value
public string DURACION
get return Duracion
set Duracion = value
public string FECHA
get return Fecha
set Fecha = value
public NodoListaReportes SIGUIENTE
get return siguiente
set siguiente = value
public class ListaReportes
private NodoListaReportes primerNodoReportes
private NodoListaReportes ultimoNodoReportes
public ListaReportes()
114
primerNodoReportes = ultimoNodoReportes = null
public void Insertar(string DisplayNameOrigen string UserNameOrigen string
IPOrigen string DisplayNameDestino string UserNameDestino string IPDestino string
HoraInicio string Fecha)
if (ListaVacia())
primerNodoReportes = ultimoNodoReportes = new
NodoListaReportes(DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio Fecha)
else
primerNodoReportesANTERIOR = primerNodoReportes = new
NodoListaReportes(null DisplayNameOrigen UserNameOrigen IPOrigen
DisplayNameDestino UserNameDestino IPDestino HoraInicio null null Fecha
primerNodoReportes)
public void Mostrar()
NodoListaReportes Actual = primerNodoReportes
string[] parametros = new string[10]
do
parametros[0] = ActualDisplayNameOrigen
parametros[1] = ActualUSERNAMEORIGEN
parametros[2] = ActualIPORIGEN
parametros[3] = ActualDISPLAYNAMEDESTINO
parametros[4] = ActualUSERNAMEDESTINO
parametros[5] = ActualIPDESTINO
parametros[6] = ActualHORAINICIO
parametros[7] = ActualHORAFIN
parametros[8] = ActualDURACION
parametros[9] = ActualFECHA
ProxyPBX objeto = new ProxyPBX()
objetoAReporteadorDataGridView(parametros)
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoReportes == null
115
class NodoListaCallID
NodoListaCallID anterior
public string CallID
public string usernameOrigen
public string usernameDestino
NodoListaCallID siguiente
public NodoListaCallID(string CallId string usernameOrigen string
usernameDestino)
this(null CallId usernameOrigen usernameDestino null)
public NodoListaCallID(NodoListaCallID anterior string CallID string
usernameOrigen string usernameDestino NodoListaCallID siguiente)
thisanterior = anterior
thisCallID = CallID
thisusernameOrigen = usernameOrigen
thisusernameDestino = usernameDestino
thissiguiente = siguiente
public NodoListaCallID ANTERIOR
get return anterior
set anterior = value
public string CALLID
get return CallID
set CallID = value
public string USERNAMEORIGEN
get return usernameOrigen
set usernameOrigen = value
public string USERNAMEDESTINO
get return usernameDestino
set usernameDestino = value
public NodoListaCallID SIGUIENTE
get return siguiente
set siguiente = value
116
public class ListaCallID
private NodoListaCallID primerNodoCALLID
private NodoListaCallID ultimoNodoCALLID
public ListaCallID()
primerNodoCALLID = ultimoNodoCALLID = null
public void Insertar(string CallId string usernameOrigen string usernameDestino)
if (ListaVacia())
primerNodoCALLID = ultimoNodoCALLID = new NodoListaCallID(CallId
usernameOrigen usernameDestino)
else
primerNodoCALLIDANTERIOR = primerNodoCALLID = new
NodoListaCallID(null CallId usernameOrigen usernameDestino primerNodoCALLID)
public string Buscar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
bool existe = false
string identificador
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
existe = true
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
if (existe == true)
identificador = ActualCALLID
return identificador
else
identificador = null
return identificador
117
public void Eliminar(string usernameOrigen string usernameDestino)
NodoListaCallID Actual = primerNodoCALLID
do
if ((ActualUSERNAMEORIGEN == usernameOrigen) ampamp
(ActualUSERNAMEDESTINO == usernameDestino))
if (Actual == ultimoNodoCALLID)
primerNodoCALLID = ultimoNodoCALLID = null
break
if (ActualANTERIOR == null)
primerNodoCALLID = ActualSIGUIENTE
break
if(ActualANTERIOR = null)
ActualANTERIORSIGUIENTE = ActualSIGUIENTE
ActualSIGUIENTEANTERIOR = ActualANTERIOR
break
if (Actual == ultimoNodoCALLID) break
Actual = ActualSIGUIENTE
while (Actual = null)
public bool ListaVacia()
return primerNodoCALLID == null
private void timer1_Tick(object sender EventArgs e)
labelHoraText = DateTimeNowToString(hhmmss)
labelFechaText = DateTimeNowDateToString()
private void button1_Click(object sender EventArgs e)
118
private void dataGridView1_CellFormatting(object sender
SystemWindowsFormsDataGridViewCellFormattingEventArgs e)
if (thisdataGridView1Columns[eColumnIndex]Name == Reporteador)
if (e = null)
if (eValue = null)
try
eValue = DateTimeParse(eValueToString())
ToLongDateString()
eFormattingApplied = true
catch (FormatException)
MessageBoxShow(0 Dato no valido e eValueToString())
public void DisDataGridView()
dataGridView1ColumnCount = 10
dataGridView1ColumnHeadersDefaultCellStyleBackColor = ColorNavy
dataGridView1ColumnHeadersDefaultCellStyleForeColor = ColorWhite
dataGridView1ColumnHeadersDefaultCellStyleFont = new
Font(ReporteadorDataGridViewFont FontStyleBold)
dataGridView1Name = ReporteadorDataGridView
dataGridView1Location = new Point(15 426)
dataGridView1Size = new Size(15 426)
dataGridView1AutoSizeRowsMode =
DataGridViewAutoSizeRowsModeDisplayedCellsExceptHeaders
dataGridView1ColumnHeadersBorderStyle =
DataGridViewHeaderBorderStyleSingle
dataGridView1CellBorderStyle = DataGridViewCellBorderStyleSingle
dataGridView1GridColor = ColorBlack
dataGridView1RowHeadersVisible = false
119
dataGridView1Columns[0]Name = DisplayNameOrigen
dataGridView1Columns[1]Name = UserNameOrigen
dataGridView1Columns[2]Name = IPOrigen
dataGridView1Columns[3]Name = DisplayNameDestino
dataGridView1Columns[4]Name = UserNameDestino
dataGridView1Columns[5]Name = IPDestino
dataGridView1Columns[6]Name = HoraInicio
dataGridView1Columns[7]Name = HoraFin
dataGridView1Columns[8]Name = Duracion
dataGridView1Columns[9]Name = Fecha
dataGridView1Columns[9]DefaultCellStyleFont = new
Font(dataGridView1DefaultCellStyleFont FontStyleItalic)
dataGridView1SelectionMode = DataGridViewSelectionModeFullRowSelect
dataGridView1MultiSelect = false
dataGridView1Dock = DockStyleFill
dataGridView1CellFormatting += new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting)
public void AReporteadorDataGridView()
string [] parametros)
if (parametros = null)
string[] row1 = parametros[0] parametros[1] parametros[2] parametros[3]
parametros[4] parametros[5] parametros[6] parametros[7] parametros[8] parametros[9]
dataGridView1RowsAdd(row1)
string[] usn = new string[10]
string usn0 = Liliana
string usn1 = Lilian
string usn2 = Lilia
string usn3 = Lili
string usn4 = Lil
string usn5 = Li
DateTime usn6 = DateTimeParse(020000)
DateTime usn7 = DateTimeParse(020000)
DateTime usn8 = DateTimeParse(020000)
DateTime usn9 = DateTimeParse(22112011)
for (int i = 0 i lt 10 i++)
120
string[] row1 = Agustin 10 1112 Liliana 20 1113 022000
022200 000200 11222011
string[] row0 = usn0ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row1 = usn1ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = usn2ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row3 = usn3ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row4 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row5 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row6 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row7 = usn4ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row8 = usn5ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row9 = usn6ToString() 20 1113 Agustin 10 1112
020000 020100 020000 11221968
string[] row2 = Paola 30 1114 Liliana 20 1113 030000
031000 001000 11222011
string[] row3 = Agustin 10 1112 Paola 30 1114
020007 020000 020000 11221968
string[] row3 = Liliana 20 1113 Paola 30 1114 015300
015600 000300 11222011
dataGridView1RowsAdd(row1)
dataGridView1RowsAdd(row2)
dataGridView1RowsAdd(row3)
private void button2_Click_1(object sender EventArgs e)
SqlConnection conn = new SqlConnection(Data
Source=SQLEXPRESSAttachDbFilename=CUsersAgustinDesktopPBX-
ServerPBXPBXDBRepmdfIntegrated Security=TrueUser Instance=True)
connOpen()
SqlDataReader myReader = null
SqlCommand ComandoSql = new SqlCommand()
INSERT INTO Tr+ ReporteadorDataGridViewRows[0]Cells[0])
121
ComandoSqlParametersAdd(usn0SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn1 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn2 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn3 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn4 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn5 SqlDbTypeNVarChar)
ComandoSqlParametersAdd(usn6 SqlDbTypeTime)
ComandoSqlParametersAdd(usn7 SqlDbTypeTime)
ComandoSqlParametersAdd(usn8 SqlDbTypeTime)
ComandoSqlParametersAdd(usn9 SqlDbTypeDate)
ComandoSqlCommandText = INSERT INTO Tr (DisplayNameOrigen
UserNameOrigenIPOrigenDisplayNameDestinoUserNameDestinoIPDestinoHoraInicio
HoraFinDuracionFecha) VALUES
(usn0usn1usn2usn3usn4usn5usn6usn7usn8usn9)
ComandoSqlConnection = conn
ComandoSqlExecuteNonQuery()
connClose()
private void buttonX2_Click(object sender EventArgs e)
Creditos firma = new Creditos()
firmaShow()
private void buttonX3_Click(object sender EventArgs e)
Close()
122
Bibliografiacutea
[1] Huidobro Moya Joseacute Manuel TECNOLOGIA VOIP Y TELEFONIA IP LA
TELEFONIA POR INTERNET Creaciones Copyright 2006
[2] Andrew S Tanenbaum REDES DE COMPUTADORAS Prentice-Hall 1998
[3] RFC 3261 SIP Session Initiation Protocol
[4] Deitel Harvey COacuteMO PROGRAMAR EN C Pearson Educacioacuten 2007
[5] Goacutemez Julio y Gil Francisco VoIP y Asterisk RA-MA Editorial2008