desarrollo de un software proxy pbx de voip con funciones

122
1 INSTITUTO POLITECNICO NACIONAL ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA Unidad ZacatencoINGENIERIA EN COMUNICACIONES Y ELECTRONICA Desarrollo de un Software Proxy PBX de VoIP con funciones de reporte de llamadas TESIS Que para obtener el título de Ingeniero en Comunicaciones y Electrónica Presentan: Liliana Aguilar Hernández Agustín Moreno Nájera Asesores: M. en C. Genaro Zavala Mejía M. en C. Fernando Noya Chávez Diciembre 2011

Upload: others

Post on 21-Oct-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 2: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 3: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 4: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 5: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 6: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 7: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 8: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 9: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 10: Desarrollo de un Software Proxy PBX de VoIP con funciones

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

Page 11: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 12: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 13: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 14: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 15: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 16: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 17: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 18: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 19: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 20: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 21: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 22: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 23: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 24: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 25: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 26: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 27: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 28: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 29: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 30: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 31: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 32: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 33: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 34: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 35: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 36: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 37: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 38: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 39: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 40: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 41: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 42: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 43: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 44: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 45: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 46: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 47: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 48: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 49: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 50: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 51: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 52: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 53: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 54: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 55: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 56: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 57: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 58: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 59: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 60: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 61: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 62: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 63: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 64: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 65: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 66: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 67: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 68: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 69: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 70: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 71: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 72: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 73: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 74: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 75: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 76: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 77: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 78: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 79: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 80: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 81: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 82: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 83: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 84: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 85: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 86: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 87: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 88: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 89: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 90: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 91: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 92: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 93: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 94: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 95: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 96: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 97: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 98: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 99: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 100: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 101: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 102: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 103: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 104: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 105: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 106: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 107: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 108: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 109: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 110: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 111: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 112: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 113: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 114: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 115: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 116: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 117: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 118: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 119: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 120: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 121: Desarrollo de un Software Proxy PBX de VoIP con funciones
Page 122: Desarrollo de un Software Proxy PBX de VoIP con funciones