You are on page 1of 86

UNIVERSIDAD TECNOLOGICA NACIONAL

FACULTAD REGIONAL SAN NICOLAS

INGENIERIA EN ELECTRONICA

PROBLEMA DE INGENIERA
TECNICAS DIGITALES III

CENTRAL TELEFNICA IP EN MEMOR IA


COMPACT FLASH

Integrantes:
- Juan Carlos Priotti
- Martn Roberti

Docentes:
- Profesor: Felipe Poblete
- Auxiliar: Mariano Gonzlez

AO 2008

Tcnicas Digitales III Problema de ingeniera

INDICE
OBJETIVOS DEL TRABAJO

MATERIAS INTEGRADAS

POSIBLES APLICACIONES

BIBLIOGRAFA

DESARROLLO

INTRODUCCIN
Voz sobre IP
ASTERISK PBX
CONCEPTOS DE CLCULO DE TRFICO
DIMENSIONAMIENTO DE HARDWARE Y ACCESO A INTERNET
TEORA DE FUNCIONAMIENTO
INSTALACIN DEL SISTEMA

5
5
6
9
12
13
14

CONSIDERACIONES SOBRE LOS COSTOS DE NUESTRA PBX

27

RESULTADOS DE LAS PRUEBAS

28

CONCLUSIONES

28

ANEXOS

29

1. FOTOS DE PANTALLAS

29

2. PROTOCOLO SIP
Una breve historia del protocolo SIP
Funciones del protocolo SIP
Componentes del protocolo SIP
Clientes:
Servidores:
Comandos del procotolo SIP
Un ejemplo tpico de una sesin SIP
Formato de Solicitudes SIP
Formato de Respuesta de mensaje SIP
Tipos de respuesta SIP
Relacin entre llamada, dilogo, transaccin y mensajes

32
32
32
33
33
33
34
34
36
37
38
38

3. GUA DE INSTALACIN DE FreeBSD

41

4. LENGUAJE XML
Estructura de un documento XML
Modelos de contenido
XML Schemas (XSD)
Lenguaje de enlace XML (XLINK)

56
56
59
60
60

5. ADAPTADOR ANALGICO SISCO LINKSYS PAP2

61

6. ADVANTECH PCM 5820

61

7. LISTADOS DE PROGRAMAS

63

OBJETIVOS DEL TRABAJO


El objetivo del proyecto es crear una central telefnica basada en telefona IP utilizando hardware
mnimo y de bajo coste, en nuestro caso hacemos uso de una placa madre industrial sin partes
mviles y de bajo consumo marca Advantech modelo PCM-5820. En lo que respecta a Software, se
utiliz el sistema operativo Open Source FreeBSD en su versin 7.1, los lenguajes de programacin
PHP, XML y HTML, la plataforma Asterisk que es ni ms ni menos que el ncleo de la central
telefnica IP, el servidor WEB Lighttpd, siendo todas estas herramientas open source.

MATERIAS INTEGRADAS

Informtica II: Programacin estructurada y modular.


Sistemas de Comunicaciones II: Telefona, VoIP, trfico, redes y protocolos.
Tcnicas Digitales III: Programacin en ensamblador, dispositivos de almacenamiento,
motherboards.

POSIBLES APLICACIONES

Central telefnica IP para empresas PYMES. En el caso de grandes empresas se debera


ampliar las capacidades de Hardware.

BIBLIOGRAFA

Sitios de Internet.

Manual de FreeBSD - http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/


Lighttpd web server - http://www.lighttpd.net/
Asterisk - http://www.voip-info.org/wiki-Asterisk
PHP - http://www.php.net/manual/en/
HTML
XML - http://es.wikipedia.org/wiki/XML
Leyendo XML desde PHP - http://www.phpbsd.net/2007/02/09/leyendo-xml-desde-php-consimplexml/
SimpleXML - http://php5.bitflux.org/phpconf2004/slide_36.php
Compact Flash - http://www.pcengines.ch/cfwear.htm
ATA (adaptador telefnico analgico) http://www.linksys.com/servlet/Satellite?c=L_CASupport_C2&childpagename=US%2FLayo
ut&cid=1169083352234&pagename=Linksys%2FCommon%2FVisitorWrapper
SBC (Single Board Computer) PCM 5820 http://www.advantech.com/Support/detail_list.asp?model_id=PCM-5820

Libros, etc.

The complete FreeBSD - http://www.lemis.com/grog/Documentation/CFBSD/book.pdf.gz


Absolute FreeBSD, 2nd Edition -The Complete Guide to FreeBSD by Michael W. Lucas
November 2007, 744 pp. ISBN-10 1-59327-151-4 ISBN-13 978-1-59327-151-0
3

Asterisk: The Future of Telephony, Second Edition Join the Open Source PBX Revolution
By Jim Van Meggelen, Jared Smith, Leif Madsen
August 2007
Pages: 602
ISBN 10: 0-596-51048-9 | ISBN 13: 9780596510480

DESARROLLO
INTRODUCCIN
El Avance constante en los desarrollos de computadoras han hecho que en la actualidad contemos
con dispositivos de varios GHz de velocidad en tamaos de menos de 3,5 pulgadas sin necesidad
de contar con soportes mecnicos voluminosos para refrigerarse ni dispositivos de almacenamiento
mviles, por lo que es comn encontrar Motherboards de 3,5 pulgadas con soporte de
almacenamiento en memoria CF Compact Flash, placas ethernet, , conectores USB, puertos
series, salida a monitor y muchos otros dispositivos de I/O. Estos avances junto al continuo
desarrollo de software open source nos permiten desarrollar dispositivos de alta capacidad de
cmputo, altas prestaciones y gran estabilidad a un costo accesible.
En nuestro caso usaremos estas ventajas para desarrollar una central telefnica IP que corre bajo
el sistema operativo Unix Open Source FreeBSD todo embebido en una memoria Compact Flash
contando adems con una interface Web de administracin.

Voz sobre IP
Voz sobre Protocolo de Internet, tambin llamado Voz sobre IP, VoIP (por sus siglas en ingls),
es un grupo de recursos que hacen posible que la seal de voz viaje a travs de Internet empleando
un protocolo IP (Internet Protocol). Esto significa que se enva la seal de voz en forma digital en
paquetes en lugar de enviarla (en forma digital o analgica) a travs de circuitos utilizables slo
para telefona como una compaa telefnica convencional o PSTN (Public Switched Telephone
Network o Red Telefnica Pblica Conmutada).
Los Protocolos que son usados para llevar las seales de voz sobre la red IP son comnmente
referidos como protocolos de Voz sobre IP o protocolos IP, y entre ellos podemos mencionar al
protocolo SIP, H323, MGCP entre los ms usados.
El trfico de Voz sobre IP puede circular por cualquier red IP, incluyendo aquellas conectadas a
Internet, como por ejemplo redes de rea local (LAN).
Es muy importante diferenciar entre Voz sobre IP (VoIP) y Telefona sobre IP.

VoIP es el conjunto de normas, dispositivos, protocolos, en definitiva la tecnologa que


permite la transmisin de la voz sobre el protocolo IP.
Telefona sobre IP es el conjunto de nuevas funcionalidades de la telefona, es decir, en lo
que se convierte la telefona tradicional debido a los servicios que finalmente se pueden
llegar a ofrecer gracias a poder portar la voz sobre el protocolo IP en redes de datos.

Volvendo a los protocolos usados en Voz sobre IP, el protocolo SIP o Session Initiation Protocol
es el ms usado en los ltimos tiempos y ya es un estndar para comunicaciones en telefona por IP.
Este protocolo fue desarrollado por por el IETF MMUSIC Working Group con la intencin de ser
el estndar para la iniciacin, modificacin y finalizacin de sesiones interactivas de usuario donde
intervienen elementos multimedia como el video, voz, mensajera instantnea, juegos online y
realidad virtual.

La sintaxis de sus operaciones se asemeja a las de HTTP y SMTP, los protocolos utilizados en los
servicios de pginas Web y de distribucin de e-mails respectivamente. Esta similitud es natural ya
que SIP fue diseado para que la telefona se vuelva un servicio ms en la Internet.
En noviembre del ao 2000, SIP fue aceptado como el protocolo de sealizacin de 3GPP y
elemento permanente de la arquitectura IMS (IP Multimedia Subsystem)
Para una introduccin sobre el protocolo SIP ver el punto 1 del anexo.
ASTERISK PBX
Ya hemos visto que el protocolo SIP es el ms usado para comunicaciones en telefona IP, pero
hasta ahora no sabemos cmo vamos a poder usar ese protocolo de comunicacin para llevar a cabo
nuestro proyecto. Podramos decidir crear nuestro propio stack de SIP, pero eso sera una tarea que
llevara mucho tiempo y necesitaramos muchas horas hombre en programacin, pruebas y
correcciones de errores, por lo que vemos que lo ms acertado en el caso de desarrollos como estos
es usar software ya existente, que haya sido bien probado, que est actualmente en produccin y
que las licencias del mismo nos permitan hacer uso de ste y poder desarrollar y/o comercializar un
producto basado en este software. Todo lo anterior es posible gracias a la existencia de las
comunidades Open Source, que desarrollan y distribuyen software de gran calidad, con cdigo
fuente incluido y bajo licencias muy abiertas que dan libertad a nuestros desarrollos. Entre los
programas que incluyen stack de sip y nos sirven como base para crear productos propios podemos
citar:

Asterisk
SER
OpenSER
Yate
FreePBX

Nosotros optamos por Asterisk, ya que es de por s una PBX IP muy completa con muchos aos
de desarrollo, estabilidad y una gran comunidad de desarrolladores y empresas que usan esta
plataforma, lo que hace que ante cualquier duda sobre su configuracin y solucin de problemas
tengamos la posibilidad de encontrar la solucin de forma muy simple.
Asterisk posee adems de soporte SIP, soporte para otros protocolos de comunicacin como ser
H.323, Skinny (Cisco), IAX (Inter Asterisk Exchange), jabber, MGCP (Media Gateway Control
Protocol), Soporte para placas de telefona estndart (ZAP), transcodificacin para llamadas usando
diferentes cdigos (G.711u, G.711a, G.729, Speex, ILBC, GSM, etc). Tampoco podemos dejar de
lado la extensa lista de servicios PBX que nos ofrece como ser: creacin de IVR (Interactive Voice
Response), Grabacin de llamadas, creacin dial plans, voicemail y voice2email, call parking,
transferencia de llamadas, reenvo de llamadas y muchos otros servicios ms que interesantes que
quedan slo limitados a la imaginacin y conocimiento de las opciones de configuracin de esta
PBX IP.
En lo referente a la configuracin de Asterisk, nosotros nos enfocaremos en solamente dos
archivos de configuracin; extensions.conf y sip.con.
Extensions.conf es el archivo que nos dice qu hacer cuando llega una llamada a nuestra PBX, o
qu hacer en caso de querer hacer una llamada con algn telfono conectado a nuestra central
telefnica.
Un ejemplo de extensions.conf es el siguiente:

[general]
static=yes
writeprotect=no
[sip_users]
exten
exten
exten
exten
exten

=>
=>
=>
=>
=>

_2XX,1,Dial(SIP/${EXTEN},10)
_2XX,2,Voicemail(u${EXTEN}@default)
_2XX,3,Hangup()
_2XX,102,Voicemail(b${EXTEN}@default)
_2XX,103,Hangup

exten => 115,1,Playback(vm-extension)


exten => 115,2,SayDigits(${CALLERID(num)})
exten => 115,3,Hangup()
exten => 300,1,Answer()
exten => 300,2,Echo()
exten => 300,3,Hangup()
exten => 999,1,VoicemailMain(${CALLERID(num)})
exten => 999,2,Hangup()
exten => _00X.,1,Dial(SIP/${EXTEN}@provider,60)
exten => _00X.,2,Hangup()
exten => _X!,1,Playback(invalid)
exten => _X!,2,Hangup()

Donde tenemos tenemos un contexto general para configuraciones que afectan a todos los dems
contextos y un contecto sip_users, que en este caso lo usamos para generar la lgica de nuestro Dial
Plan.
Como vemos, para cualquier llamada que empiece con 2 y tenga 3 dgitos (_2XX) la llamada va a
ser dirigida a un usuario SIP con el mismo nmero marcado. En cado que la llamada falle por
usuario desconectado o busy se conectar automticamente al voicemail del usuario.
Si llamamos al 115, lo que escucharemos ser la PBX que nos repetir el nmero de nuestro
internos, cosa que usamos para saber si tenemos algn problema con el telfono IP.
Tambin tenemos una funcion Echo() cuando llamamos a la extensin 300, que lo que hace es
repetir lo que digamos con un cierto retardo (eco), de esta manera sabemos si la comunicacin es
bidireccional.
Llamando al 999 podemos acceder el men del voicemail, que nos pedir el password de nuestra
cuenta (crada por la interface web) y desde ah podremos oir los mensajes almacenados que
hayamos recibido.
Para las llamadas que empiecen con 00 la PBX direccionar la llamada al proveedor de servicios
de telefona que tenemos configurado en nuestra plataforma.
Por ltimo, para cualquier nmero que sea marcado y que no haya habido coincidencia (_X!) la
pbx reproducir un mensaje de audio diciendo que el nmero es invlido.
Sip.conf es el archivo que define la configuracin del soporte SIP y es donde tenemos las cuentas
de usuarios SIP creadas en el sistema.
Un ejemplo de archivo sip.conf puede ser el siguiente:
[general]
context=default
bindaddr=0.0.0.0

srvlookup=yes
disallow=all
allow=alaw
allow=ulaw
allow=gsm
[100]
username=100
secret=100
callerid=100
type=friend
host=dynamic
context=sip_users
dtmfmode=rfc2833
insecure=port
canreinvite=yes
nat=yes
[200]
username=200
secret=200
callerid=200
type=friend
host=dynamic
context=sip_users
dtmfmode=rfc2833
insecure=port
canreinvite=yes
nat=yes

En esta configuracin vemos que en la parte [general] definimos el compartamiento del protocolo
SIP a nivel servidor, donde decimos que el contexto por defecto es llamado default, el protocolo
SIP va a ser levantado en todas las IP's disponibles en el sistema (0.0.0.0), se va a poder usar DNS
SRV y habilitamos slo los codecs G.711a, G.711u. Y GSM.
En la segunda parte del archivo de configuracin definimos los usuarios o terminadores que
reconocemos para poder conectarnos. Los usuarios son telfonos IP que se registrarn en nuestra
plataforma, mientras que los terminadores son servicios provistos por empresas que nos dan la
posibilidad de conectarnos a telefona pblica y hacer llamadas a cualquier lugar del mundo a
precios extremadamente bajos ya que la larga distancia se trafica por Internet y/o poder asignar a
nuestra cental telefnica un nmero DID (Direct Inward Dialing) que no es otra cosa que tener un
nmero de telefona pblica asignado a nuestra central telefnica, sin la necesidad de contratar un
servicios con nuestro proveedor local de telefona, esto ltimo nos permite poseer un nmero de
telfono que puede ser numeracin local o numeracin de cualquier lugar del mundo (si son
provistos por el proveedor).
Aqu vemos que tenemos dos usuarios SIP 100 y 200, donde tienen como contrasea el nmero
100 y 200 respectivamente. Tambin especificamos el callerid igual a los nmeros de telfono
tambin tenemos que son cuentas del tipo friend, es decir que pueden hacer y recibir llamadas (las
otras son user y peer que solamente reciben o hacen llamadas respectivamente). Otros parmetros
que definimos son host, donde al especificar que sea dynamic decimos que el IP puede ser un IP
cualquiera y no uno fijo, tambin definimos el contexto al que va a caer la llamada en el dialplan
(este contexto se define en el archivo extensions.conf). Definimos el modo que usaremos para el
DTMF (Dual Tone Multi Frequency) sea acorde a la RFC2833, tambin especificamos si el cliente
puede hacer reinvites, que son INVITES siguientes a establecerse la llamada y sirven para evitar
tener que pasar el trfico de audio por la PBX, y que este camino se establezca entre los end points

(telfonos IP). El ltimo parmetro es nat=yes, que configura la cuenta para tener soporte NAT,
esto es muy necesario para los clientes que estn detrs de routers que hacen NAT, ya que sin este
soporte las llamadas salen con audio unidireccional.
Como vemos, con slo modificar dos archivos ya estamos con posibilidades de configurar nuestra
cental telefnica IP para poder hacer llamadas entre telfonos IP y con destinos a telefona pblica
(PSTN), por lo que debemos ahora encontrar una forma de poder hacer esto y aplicar estos cambios.
Esto ltimo lo podemos hacer mediante el uso de un lenguaje de programacin como ser PHP,
que permite crear una interface web para administrar la configuracin de nuestra plataforma,
permitiendo modificar los archivos de configuracin y aplicando estos cambios en Asterisk. Todo
esto lo podemos ver en detalles en el listado de programas al final del informe.

CONCEPTOS DE CLCULO DE TRFICO


Muchas veces el simple hecho de tener funcionando una centrar telefnica no nos asegura que
podamos realizar llamadas en el momento deseado, ya que existe la posibilidad que no hayamos
tenido en cuenta la cantidad de llamadas que va a traficar la misma y por esto no haber
dimensionado en forma correcta las lneas externas disponibles.
Para dimensionar las lneas externas correctamente debemos conocer un poco sobre la teora
estadstica usada para el clculo de los volmenes de trfico en telefona, esto es el nmero de
Erlang y las frmulas propuestas por este ingeniero dans.
El Erlang es una unidad adimensional utilizada en telefona como una medida estadstica del
volumen de trfico.
El trfico de un Erlang corresponde a un recurso utilizado de forma continua, o dos canales
utilizados al 50%, y as sucesivamente. Por ejemplo, si una oficina tiene dos operadores de telfono
y ambos estn ocupados durante todo el tiempo, esto representa dos Erlangs de trfico, o si un canal
de radio est ocupado durante treinta minutos en una hora se dice que soporta un trfico de 0.5
Erlangs.
De forma alternativa, un Erlang puede ser considerado como "multiplicador de utilizacin" por
unidad de tiempo, as un uso del 100% corresponde a 1 Erlang, una utilizacin de 200% son 2
Erlangs, y as sucesivamente. Por ejemplo, si el uso total del mvil en un rea por hora es de 180
minutos, esto representa 180/60 = 3 Erlangs. En general, si la tasa de llamadas entrantes es de por
unidad de tiempo y la duracin media de una llamada es h, entonces el trfico A en Erlangs es:
A = h
Esto puede ser usado para determinar si un sistema est sobredimensionado o se queda corto
(tiene demasiados o muy pocos recursos asignados. Por ejemplo, el trfico medido sobre muchas
horas de ocupacin puede ser usado para un T1 o un E1 para determinar cuntas lneas (troncales)
debieran de utilizarse durante las horas de mayor ocupacin.
El trfico medido en Erlangs es usado para calcular el nivel de servicio (GOS). Hay diferentes
frmulas para calcular el trfico entre ellos, Erlang B, Erlang C y la frmula de Engset. Esto ser
discutido a continuacin, y cada uno puede ser derivado como un caso espacial de Procesos de
tiempo continuo de Markov conocido como birth-death process.
Frmula Erlang B
La frmula de Erlang B asume una poblacin infinita de orgenes (como usuarios de telefona), la
cual ofrece trfico en conjunto a N servidores (como lneas en un grupo de troncales).

La tasa de llegadas de nuevas llamadas (tasa de nacimiento) es igual a y es constante, no


depende del nmero de recursos activos, porque se asume que el total de recursos es infinito. La
tasa de abandono (tasa de mortandad) es igual al nmero de llamadas en progreso dividida por h, la
media del tiempo de llamadas en espera. La frmula calcula la probabilidad de bloqueo en una
prdida del sistema, si un requerimiento no es atendido inmediatamente cuando trata de utilizar un
recurso, y este es abortado.
Por lo tanto no son encolados. El bloqueo ocurre cuando hay un nuevo requerimiento de recursos,
pero todos los servidores ya estn ocupados. La frmula asume que el trfico que es bloqueado se
libera inmediatamente.

A continuacin se muestra cmo puede ser expresado recursivamente, en una forma que es usada
para calcular tablas de la frmula de Erlang B:

donde:
* B es la probabilidad de bloqueo
* N es el nmero de recursos como servidores o circuitos en un grupo
* A = h es la cantidad de trfico entrante expresado en Erlangs
La frmula Erlang B se aplica a los sistemas con prdidas, tales como sistemas telefnicos tanto
fijos como mviles, que no ofrecen almacenamiento de llamadas (es decir, no permiten dejar la
llamada "en espera"), y no se pretende que lo hagan. Se asume que las llegadas de llamadas pueden
ser modeladas por un proceso de Poisson, pero es vlida para cualquier distribucin estadstica de
tiempos entre llamadas.
Erlang B tambin es una herramienta para dimensionar trfico entre centrales de conmutacin de
voz.
Frmula Erlang C
La Frmula de Erlang C tambin asume una infinita poblacin de fuentes, las cuales ofrecen en
conjunto, un trafico de A Erlangs hacia N servidores. Sin embargo, si todos los servidores estn
ocupados cuando una peticin llega de una fuente, la peticin es introducido en la cola. Un sin fin
de nmeros de peticiones podran ir a la cola en este modo simultneamente. Esta formula calcula la
probabilidad de la cola ofrecido en el trafico, asumiendo que las llamadas que fueron bloqueadas se
quedaran en el sistema hasta que se pueda atender. Esta formula es usada para determinar la
cantidad de agentes o representantes de clientes, que necesitar en un Call Center para despus
saber la probabilidad en la cola.
10

Donde:
* A es la intensidad total del trafico ofrecido en unidades de Erlangs.
* N es la cantidad de servidores [nmero de troncales].
* PW es la probabilidad de que un cliente tenga que esperar para ser atendido.
Se asume que las llamadas entrantes puede ser modeladas usando una distribucin de Poisson y
que el tiempo de espera de las llamadas son descriptas por una distribucin exponencial negativa.
Frmula Engset
La frmula Engset, as llamada por T. O. Engset, est relacionada pero funciona con una
poblacin finita de S orgenes en lugar de la poblacin infinita de orgenes que asume Erlang:

Esto puede ser expresado recursivamente del siguiente modo, en una forma que es usada para
calcular las tablas de la frmula Engset:

donde:
* E es la probabilidad de bloqueo
* A es el trfico en Erlangs generado por cada origen cuando est desocupado
* S es el nmero de orgenes
* N es el nmero de servidores
De nuevo, se asume que las llamadas que llegan pueden ser modeladas por una distribucin
Poisson y que los tiempos de espera son descriptos por una distribucin exponencial negativa. Sin
embargo, debido a que hay un nmero finito de servidores, la tasa de llegada de las nuevas llamadas
11

decrece a medida que nuevos orgenes (como abonados telefnicos) se vuelven ocupados y por lo
tanto no pueden originar nuevas llamadas. Cuando N = S, la frmula se reduces a una distribucin
binomial.
Teniendo en cuenta esta teora de trfico, nosotros podramos dimensionar en forma correcta la
cantidad de lneas salientes que necesitaramos en caso de usar nuestra PBX para dar servicios de
call center por ejemplo. Cuando hablamos de dimensionamiento en un caso as estamos hablando de
las lneas telefnicas a contratar (E1 en caso de Argentina) y del hardware a utilizar que soporte
estas lneas (voip gateway). En nuestro proyecto al enviar las llamadas por un proveedor de
servicios voip, estamos acotados ms por el trfico que dicho proveedor pueda darnos (cantidad de
llamadas simultneas), al ancho de banda que nos est dando el proveedor de Internet y al hardware
usado en la central telefnica.
* En caso de necesitar clculos rpidos existen infinidad de recursos en la red que aplican la teora
de trfico en una forma simple ej: http://www.erlang.com/calculator/

DIMENSIONAMIENTO DE HARDWARE Y ACCESO A INTERNET


Como hemos hablado en el punto anterior, adems de las lneas salientes disponibles deberemos
tener en cuenta el hardware usado y el ancho de banda de nuestro acceso a Intenet.
En el caso de tener que dimensionar el hardware de una central telefnica IP, deberemos tener en
cuenta los siguientes puntos:

Tipos de telfonos que planeamos usar (analgicos, SIP, Skinny, H.323, MGCP)
Cantidad de telfonos que operaremos
Cantidad de lneas externas
Tipo de lneas externas (nalog, BRI, PRI, T1, VoIP)
Cantidad de llamadas concurrentes internas/externas
Haremos transcodificacin?
Tipos de servicios a brindar (Cancelacin de eco, voicemail, colas de conferencia, call
center, grabacin de llamadas, IVRs, text to speech, reconocimiento de habla)
Tipo de versin de asterisk instalado

No existe una frmula para calcular las llamadas que nuestro sistema soportar antes de verse
superado, pero existen muchas experiencias e informacin sobre los lmites que podemos esperar.
Si tomamos en cuenta la versin de Asterisk usada, sabemos que la versin 1.2 comienza a tener
problemas cuando el trfico est alrededor de 220 llamadas concurrentes SIP. La versin 1.4 puede
soportar aproximadamente el doble de su antecesora, mientras que la 1.6 supera en un factor de 3 o
4 a la versin 1.4.
En cuanto a la velocidad y cantidad de memoria RAM, podemos decir que para CPUs de poca
velocidad Asterisk necesita de aproximadamente 30Mhz de cpu por cada llamada concurrente. En
nuestro proyecto usamos un micro 586 de 300 Mhz por lo que podemos decir que no deberamos
tener problemas en traficar hasta 10 llamadas SIP simultneas. En caso de CPUs de velocidades
media como ser 1Ghz (>256MB RAM), estamos en valores menores a 100 llamadas simultneas.
Finalmente si nuestro hardware posee un micro de varios Ghz de velocidad, ms de un ncleo y
suficiente memoria (> 1GB) podemos llegar a tener entre 200 y 350 llamadas concurrentes.
Todos los nmeros antes explicados pueden variar y ser menores si usamos transcodificacin en
las llamadas, es decir que recibimos una llamadas con un codec por ejemplo G.711 y

12

transcodificamos en G.729, esto debido a que necesitamos usar CPU extra para procesar el audio y
comprimir el mismo con los algoritmos que ofrece cada codec, cosa que no sucede si usamos el
mismo codec, ya que el audio es transferido directamente sin usar algoritmo alguno para
transcodificar.
En cuando al dimensionamiento del enlace a Internet, debemos tener en cuenta la cantidad de
llamadas simultneas y los codecs usados para las misma, ya que cada codec comprime el audio en
forma diferente y usa mayor o menor ancho de banda. Para los codecs ms comunes tenemos:

GSM - 13 Kbps, 20ms frame size


iLBC - 15Kbps,20ms frame size: 13.3 Kbps, 30ms frame size
ITU G.711 - 64 Kbps (ley u y a)
ITU G.723.1 - 5.3/6.3 Kbps, 30ms frame size
ITU G.726 - 16/24/32/40 Kbps
ITU G.729 - 8 Kbps, 10ms frame size
Speex - 2.15 a 44.2 Kbps

TEORA DE FUNCIONAMIENTO
La figura 4 muestra un esquema elemental del sistema desarrollado

Fig 4: Esquema general del proyecto


En el esquema de la figura 4 vemos que la IP PBX est representada como una motherboard SBC
(Single Board Computer) y est conectada a nuestra red local detrs de nuestro router que nos

13

conecta a Internet. El mismo lado del router tenemos nuestros telfonos IP o adaptadores
telefnicos analgicos (ATA) que adaptan nuestros telfonos analgicos para que trabajen como
telfonos IP. Tambin podemos tener computadoras con algn software con soporte SIP (softphone)
y poder usar estas computadoras como telfonos IP.
Nuestros telfonos, sean estos IP, computadoras con softphone o adaptadores analgicos van a
tener que registrarse en nuestra IP PBX, luego de lo cual podrn hacer llamadas entre ellos, pasando
todo el trfico telefnico a travs de nuestra red local. En caso de necesitar usar el telfono desde un
lugar remoto (otro pas por ejemplo), sto lo podremos hacer registrando nuestro telfono IP en la
IP pblica de nuestra PBX, para lo cual debemos tener configurado nuestro router para enviar todo
el trfico que llega a nuestro router a nuestra IP PBX(forward de los puertos).
En caso de necesitar hacer llamadas a PSTN (Public Switched Telephone Network), esto lo
podramos hacer aadiendo un aparato llamado Gateway, que hara la translacin de IP a telefona,
o sino de una forma ms simple (como lo hacemos nosotros), contratando un servicio de telefona
IP a algn proveedor, los que nos dan, adems de un nmero telefnico para recibir llamadas,
terminacin de llamadas a todo el mundo a un precio muy bajo (aprox 10 veces menos para
llamadas internacionales).
INSTALACIN DEL SISTEMA
A continuacin indicamos los pasos seguidos en orden para la instalacin del sistema
1. Instalacin de FreeBSD en una estacin de trabajo
2. Creacin de la imagen a descargar en la CF (Compact Flash) con TinyBSD
3. modificar la imagen con las configuraciones a medida (acceso a internet, instalacin de
servidor web, lenguaje php, asterisk, mpeg123, libreras, copiar interfaz web)
4. Copiar imagen en memoria compact flash
A continuacin pasamos a describir cada una de estas operaciones.
Instalacin del sistema operativo base (FreeBSD)
1.1 General
Para poder desarrollar nuestra aplicacin y crear una imagen que podamos luego copiar a la
memoria flash, debemos tener un sistema base, desde donde trabajaremos para crear la misma. Este
sistema base debe poseer todas las herramientas necesarias de desarrollo y tambin el cdigo fuente
tanto de las aplicaciones a instalar como as tambin del kernel del sistema operativo. Usaremos
FreeBSD, que es un unix open source de mucho uso en este tipo de aplicaciones industriales
"embedded" ya que es extremadamente estable y adems presenta una licencia mucho ms abierta
que otros sistemas operativos open source. Esta diferencia hace que podamos desarrollar nuestra
aplicacin, venderla y si no nos conviene no estamos obligados a entregar el cdigo fuente, cosa
que con licencias GNU o GPL no sucede.
La instalacin del Sistema Operativo FreeBSD se resume en los siguientes pasos:

Bajar imagen de CD desde ftp.freebsd.org y copiar en CD.


Arrancar instalacin con el CD.
Crear particin en disco para la instalacin.
Crear subparticiones.

14

Elegir tipo de instalacin (X-Developer + KERNEL Developer) e instalar el sistema


operativo.
Configurar interfaz de red y servicios.
Finalizar instalacin y arrancar nuevo sistema.

1.2 Modificacin del cdigo fuente del SO para superar problemas de compatibilidad
Debido a diferencias en la arquitectura de los microprocesadores Geode fabricados por National
(GX1) ciertas modificaciones deben ser hechas en el cdigo fuente del sistema operativo.
Pasamos a detallar las modificaciones a realizar:
1. Usar el chip 8254 en lugar del Registro TSC (Time Stamp Counter) como clock. Si el registro
TSC es usado, el clock ser muy lento en al menos un factor de 10. Esto hace que todo lo que use
un tsleep() se cuelgue, resultando en un sistema casi imposible de usar.

En el archivo:
/usr/src/sys/i386/isa/clock.c

Al final de la rutinA startrtclock(), reemplazar este cdigo:


init_TSC();
}

Por este cdigo:


/* init_TSC(); */
}

2. Modificar generic_bcopy() para usar byte-moves en vez de long-moves. En FreeBSD la rutina


generic_bcopy() usa una instruccin rep movsl. La direccin inicial pasada a generic_bcopy() es a
veces "non-long-alined". Esto debera funcionar, pero las plataformas GX1 se cuelgan.

En el archivo:
/usr/src/sys/i386/i386/support.s

Reemplazar este cdigo:


ENTRY(generic_bcopy)
pushl
%esi
pushl
%edi
movl
12(%esp),%esi
movl
16(%esp),%edi
movl
20(%esp),%ecx
movl
subl
cmpl
jb

%edi,%eax
%esi,%eax
%ecx,%eax
1f

/* overlapping && src < dst? */

15

shrl
cld
rep
movsl

$2,%ecx

/* copy by 32-bit words */


/* nope, copy forwards */

movl
andl

20(%esp),%ecx
$3,%ecx

/* any bytes left? */

rep
movsb
popl
popl
ret

%edi
%esi

Por este nuevo cdigo:


ENTRY(generic_bcopy)
pushl
%esi
pushl
%edi
movl
12(%esp),%esi
movl
16(%esp),%edi
movl
20(%esp),%ecx
movl
subl
cmpl
jb

%edi,%eax
%esi,%eax
%ecx,%eax
1f

shrl
cld
rep
movsl

$2,%ecx

movl
andl

20(%esp),%ecx
$3,%ecx

/* overlapping && src < dst? */

#if 0
/* copy by 32-bit words */
/* nope, copy forwards */

/* any bytes left? */

#else
cld

/* BRM */

#endif
rep
movsb
popl
popl
ret

%edi
%esi

Lo que esto hace es eliminar un intento de usar un lazo de optimizacin (lazo de instruccin de
movimiento de palabra). En su lugar, la cadena de caracteres es simplemente copiada usando la
instruccin de movimiento de bytes que normalmente manipula los bytes en la ltima palabra.
Este arreglo se necesita debido a una llamada en el archivo:
/usr/src/sys/dev/syscons/scvtb.c

16

La rutina sc_vtb_copy() llama a bcopy_toio() en una direccin impar cuando los bytes que
conforman la memoria de video estn siendo rpidamente movidos o copiados en memoria luego de
un backspace, generando una penalidad.
3. Remover el uso de la interrupcin INT 15/AX=E820h BIOS trap del modo VM86. Esta trampa
(trap) determina el tamao de la memoria fsica y la disposicin. FreeBSD usa esta
interrupcin para dimensionar la memoria fsica, pero usa un esquema anterior si el trap falla. Esta
interrupcin en la plataforma GX1 genera una falla de paginado fatal.
En el archivo:
/usr/src/sys/i386/i386/machdep.c

En la rutina getmemsize(), reemplazar este cdigo:


i = vm86_datacall(0x15, &vmf, &vmc );

Por este nuevo cdigo:


#if 0
i = vm86_datacall(0x15, &vmf, &vmc );
#else
i = 1;
#endif

Esto elimina el intento de usar la interrupcin INT 15/E820.

2. Creacin de la imagen con TinyBSD


Una vez instalado FreeBSD, usamos el sript tinyBSD que es el que nos permite crear la imagen
con un sistema operativo FreeBSD reducido ms todas las aplicaciones necesarias. Este script viene
instalado por defecto en el sistema operativo.
Para comenzar lo primero que debemos conocer es la especificacin tcnica de la memoria flash
que es donde vamos a guardar la imagen que despus ser usada como si fuera un disco rgido por
la SBC.
Comencemos, lo primero es identificar el nombre de dispositivo que el sistema asigna a la
memoria CF, para ello tecleamos en el prompt del sistema el siguiente comando y le damos enter,
# dmesg

Cuando introducimos la memoria flash se despliega el siguiente mensaje


Dec
rev
Dec
bus
Dec
Dec

11 12:49:18 laptop
2.00/2.0a, addr 4>
11 12:49:18 laptop
uhub4
11 12:49:19 laptop
11 12:49:19 laptop

kernel: umass1: <Generic USB Storage Device, class 0/0,


on uhub4
root: Unknown USB device: vendor 0x0aec product 0x3260
kernel: da1 at umass-sim1 bus 1 target 0 lun 0
kernel: da1: <Generic USB Storage-CFC I20A> Removable

17

Direct Access SCSI-0 device


Dec 11 12:49:19 laptop kernel: da1: 40.000MB/s transfers
Dec 11 12:49:19 laptop kernel: da1: 122MB (250368 512 byte sectors: 64H 32S/T
122C)

Lo mismo podemos hacer con el comando


# tail f /var/log/messages

obtenindose el mismo mensaje.


El comando tail nos muestra los mensajes de syslog, que es un demonio (programa corriendo en
background) cuya funcin es mostrar los log del sistema, -f le indica al comando que lea la cola
de mensajes en forma continua.
Resaltamos con fondo de color amarillo sobre el mensaje los datos correspondientes a la memoria
CF, all se puede ver que al dispositivo se le asign el nombre da1, que es un dispositivo de
almacenamiento con una tasa de transferencia de 40 MB por segundos, con una capacidad de 122
MB distribuidos en 250368 sectores de 512 bytes, 64 cabezas, 122 cilindros y 32 sectores por pista
(sectors per track). Tambin podemos ejecutar el siguiente comando
# diskinfo v/dev/da1

El cual nos da una manera ms clara de ver las especificaciones de la compact flash, tal como se
muestra:
/dev/da1
512
128188416
250368
122
64
32

#
#
#
#
#
#

sectorsize
mediasize in bytes (122M)
mediasize in sectors
Cylinders according to firmware.
Heads according to firmware.
Sectors according to firmware.

El paso siguiente es definir el archivo de configuracin del kernel del sistema operativo llamado
TINYBSD y localizado en el directorio /usr/src/tools/tools/tinybsd/conf/default. Este archivo nos
permite especificar el soporte de dispositivos que tendr nuestro kernel como ser placas de red,
soporte para puertos serie/paralelo, placas wireless, etc.
Como slo nos interesa tener soporte para dispositivos que estn presentes en nuestra placa
madre, procedimos a eliminar el soporte para pcmcia, floppy disk, placas wireless, placas Ethernet
no presentes, intefaces tunnel, gif, ppp, soporte usb, etc. Al eliminar el soporte que no deseamos
usar hacemos que el kernel sea ms chico y ocupe menos memoria, influyendo esto en la velocidad
del sistema y tambin en la memoria disponible para nuestro sistema.
El archivo TiNYBSD quedar de esta manera:
machine
cpu
ident

i386
I586_CPU
TINYBSD

# To statically compile in device wiring instead of /boot/device.hints


#hints
"GENERIC.hints"
# Default places to look for devices.
options

SCHED_4BSD

# 4BSD scheduler
18

options
INET
# InterNETworking
options
FFS
# Berkeley Fast Filesystem
options
SOFTUPDATES
# Enable FFS soft updates support
options
UFS_ACL
# Support for access control lists
options
UFS_DIRHASH
# Improve performance on big directories
options
MD_ROOT
# MD is a potential root device
options
NFSCLIENT
# Network Filesystem Client
options
NFSSERVER
# Network Filesystem Server
options
NFS_ROOT
# NFS usable as /, requires NFSCLIENT
options
MSDOSFS
# MSDOS Filesystem
options
CD9660
# ISO 9660 Filesystem
options
PROCFS
# Process filesystem (requires PSEUDOFS)
options
PSEUDOFS
# Pseudo-filesystem framework
options
GEOM_PART_GPT
# GUID Partition Tables.
options
COMPAT_43
# Compatible with BSD 4.3 [KEEP THIS!]
options
COMPAT_FREEBSD4
# Compatible with FreeBSD4
options
SYSVSHM
# SYSV-style shared memory
options
SYSVMSG
# SYSV-style message queues
options
SYSVSEM
# SYSV-style semaphores
options
_KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options
KBD_INSTALL_CDEV
# install a CDEV entry in /dev
options
AHC_REG_PRETTY_PRINT # Print register bitfields in debug
options
ADAPTIVE_GIANT
# Giant mutex is adaptive.
device
apic
# I/O APIC
device
eisa
device
pci
# ATA and ATAPI devices
device
ata
device
atadisk
# ATA disk drives
device
atapist
# ATAPI tape drives
options
ATA_STATIC_ID # Static device numbering
# atkbdc0 controls both the keyboard and the PS/2 mouse
device
atkbdc
# AT keyboard controller
device
atkbd
# AT keyboard
device
psm
# PS/2 mouse
device
vga
# VGA video card driver
# syscons is the default console driver, resembling an SCO console
device
sc
# Add suspend/resume support for the i8254.
device
pmtimer
# Serial (COM) ports
device
sio
# 8250, 16[45]50 based serial ports
# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device
miibus
# MII bus support
device
rl
# RealTek 8129/8139
# Pseudo devices.
device
loop
# Network loopback
device
random
# Entropy device
device
ether
# Ethernet support

19

device
pty
# Pseudo-ttys (telnet etc)
device
md
# Memory "disks"
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device
bpf
# Berkeley packet filter

Ya teniendo las especificaciones tcnicas y el archivo de configuracin del kernel, lo que sigue es
ejecutar el script tinyBSD pasndole los parmetros tal como se muestra:
# /usr/src/tools/tools/tinybsd/tinybsd sectors=512 heads=64 spt=32 conf=default

Esto generar el archivo imagen tinybsd.bin en el directorio /usr/src/tools/tools/tinybsd/ el cual


incluir el kernel del sistema operativo, el sistema de archivos, comandos bsicos y drivers
necesarios para poder arrancar con el mismo desde la memoria compact flash especificada en la
creacin de la imagen.
3. Modificacin y configuracin de la imagen creada en el punto 2
3.1 Configuracin del sistema operativo
Ya teniendo la imagen creada con el sistema operativo en ella, debemos poder acceder a esta y
configurar los archivos de inicio del sistema. Para poder acceder a la imagen, podemos montar la
misma en el directorio /mnt de la siguiente forma:
# mdconfig -a -t vnode
# mount /dev/md0a /mnt

-f

/usr/src/tools/tools/tinybsd/tinybsd.bin

-u

luego editar y salvar los siguientes archivos:


# vi /etc/rc.conf
hostname="embedded"
sendmail_enable="NONE"
sshd_enable="YES"
usbd_enable="NO"
inetd_enable="NO"
portmap_enable="NO"
update_motd="NO"
varmfs="YES"
populate_var="YES"
varsize="8192"
tmpmfs="YES"
ifconfig_rl0="inet 192.168.1.100
defaultrouter="192.168.1.1"
lighttpd_enable="YES"

netmask 255.255.255.0"

asterisk_enable="YES"
noip_enable="YES"
Con estas opciones deshabilitamos los servicios que no queremos usar, configuramos la creacin de
/var y /tmp en memoria RAM con los tamaos indicados, configuramos la IP y puerta de enlace y
definimos asterisk y lighttpd para que se inicien junto al sistema.

20

# ee /etc/resolv.conf
nameserver

200.69.193.1

En resolv.conf definimos el IP del DNS que usaremos para resolver los nombres de dominio.
3.2 Instalacin y configuracin lighttpd y asterisk
Para poder instalar el servidor web y la IP PBX en nuestra m
i agen de memoria, primero
procederemos a instalar estos programas en nuestra computadora base, y luego copiaremos uno a
uno los archivos de cada instalacin a la imagen de nuestra memoria, que est montada en /mnt.
Para instalar los programas usaremos los ports del sistema:
#
#
#
#
#
#

cd /usr/ports/www/lighttpd
make install clean
cd /usr/ports/lang/php5
make install clean
cd /usr/ports/net/asterisk
make install clean

Ya con los programas instalados en el sistema base debemos averiguar cuales son los archivos que
fueron instalados y copiarlos a nuestra imagen:
pkg_info -qxL asterisk
/usr/local/man/man8/asterisk.8.gz
/usr/local/man/man8/astgenkey.8.gz
/usr/local/man/man8/autosupport.8.gz
/usr/local/man/man8/safe_asterisk.8.gz
/usr/local/etc/asterisk/adsi.conf-dist
/usr/local/etc/asterisk/adtranvofr.conf-dist
/usr/local/etc/asterisk/agents.conf-dist
/usr/local/etc/asterisk/alarmreceiver.conf-dist
/usr/local/etc/asterisk/alsa.conf-dist
/usr/local/etc/asterisk/asterisk.adsi-dist
...
...
..

Lo que nos dar una lista muy larga de archivos. Para no tener que copiar uno a uno los archivos, lo
que hacemos es crear un script que lo hace por nosotros, pero antes debemos tener la ubicacin de
cada archivo en un archivo de texto que ser leido por el script.
pkg_info -qxL asterisk > ./archivos.txt
pkg_info -qxL php5 >> ./archivos.txt
pkg_info -qxL lighttpd >> ./archivos.txt

El script que crearemos se llamar copiar_archivos.sh


# vi copiar_archivos.sh
#!/bin/sh
cat ./archivos.txt | while read line
do
cp $line /mnt$line

21

echo $line
done

Le damos permisos de ejecucin y los ejecutamos.


#chmod +x copiar_archivos.sh
# ./copiar_archivos.sh

Luego que se hayan terminado de copiar los archivos de los programas en la imagen, debemos
copiar las libreras que necesitan estos programas para funcionar. Para saber cuales son las libreras
usamos el comando ldd
# ldd /usr/local/sbin/lighttpd
/usr/local/sbin/lighttpd:
libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x280a3000)
libssl.so.5 => /usr/lib/libssl.so.5 (0x280ca000)
libcrypto.so.5 => /lib/libcrypto.so.5 (0x2810b000)
libc.so.7 => /lib/libc.so.7 (0x28264000)
# cp /usr/local/lib/libpcre.so.0 /mnt/usr/local/lib/libpcre.so.0
# cp /usr/lib/libssl.so.5 /mnt/usr/lib/libssl.so.5
# cp /lib/libcrypto.so.5 /mnt/lib/libcrypto.so.5
# ldd /usr/local/sbin/asterisk
/usr/local/sbin/asterisk:
libncurses.so.7 => /lib/libncurses.so.7 (0x2814e000)
libm.so.5 => /lib/libm.so.5 (0x2818d000)
libcrypto.so.5 => /lib/libcrypto.so.5 (0x281a2000)
libthr.so.3 => /lib/libthr.so.3 (0x282fb000)
libc.so.7 => /lib/libc.so.7 (0x2830e000)
#
#
#
#
#

cp
cp
cp
cp
cp

/lib/libncurses.so.7 /mnt/lib/libncurses.so.7
/lib/libm.so.5 /mnt/lib/libm.so.5
/lib/libcrypto.so.5 /mnt/lib/libcrypto.so.5
/lib/libthr.so.3 /mnt/lib/libthr.so.3
/lib/libc.so.7 /mnt/lib/libc.so.7

# ldd /usr/local/bin/php
/usr/local/bin/php:
libcrypt.so.4 => /lib/libcrypt.so.4 (0x282a4000)
libm.so.5 => /lib/libm.so.5 (0x282bd000)
libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x282d2000)
libz.so.4 => /lib/libz.so.4 (0x283f5000)
libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28407000)
libc.so.7 => /lib/libc.so.7 (0x284fc000)

#
#
#
#
#
#

cp
cp
cp
cp
cp
cp

/lib/libcrypt.so.4 /mnt/lib/libcrypt.so.4
/lib/libm.so.5 /mnt/lib/libm.so.5
/usr/local/lib/libxml2.so.5 /mnt/usr/local/lib/libxml2.so.5
/lib/libz.so.4 /mnt/lib/libz.so.4
/usr/local/lib/libiconv.so.3 /mnt/usr/local/lib/libiconv.so.3
/lib/libc.so.7 /mnt/lib/libc.so.7

Algo que adems debemos copiar a la imagen en el archivo de configuracin del SSHD para poder
luego acceder a la PBX por medio de SSH (Secure Shell):

22

#cp /etc/ssh/sshd_config /etc/ssh/sshd_config

Editamos luego este archivo y le agregamos la opcin para poder entrar al sistema como root en
forma remota:
#vi /mnt/etc/ssh/sshd_config
permitrootlogin = yes

Luego debemos modificar el archivo de inicio del servidor Lighttpd:


#vi

usr/local/etc/lighttpd.conf

y agregamos:
{{{
server.modules = (
"mod_fastcgi",
)

esto tambin:
fastcgi.server = ( ".php" => ((
"bin-path" => "/usr/local/bin/php-cgi",
"socket" => "/tmp/php.socket"
)))

Y esto:
"max-procs" => 1,

Esto ltimo habilita un slo proceso para correr, lo que es bueno ya que tenemos slo 128 MB de
memoria y debemos cuidar la misma que luego ser utilizada por los procesos de la PBX.
Luego agregamos esta lnea en /usr/local/etc/php.ini:
#vi /usr/local/etc/php.ini
cgi.fix_pathinfo = 1
}}}

y establecemos lmites de memoria mximos en 10MB (128 MB por defecto), lmites para post en
1MB y limite de archivo para subir en 1MB. Sino vamos a estar asignando muchos recursos que no
sern utilizados por el servidor web, ya que slo tendr un usuario a la vez conectado cuando haya
que hacer cambios en la configuracin y nosotros deseamos tener la mayor cantidad de memoria
disponible para la PBX.
Asterisk por defecto corre como usuario root, y el servidor lighttpd corre como usuario www, por
lo que debemos hacer ciertos cambios en la configuracin de asterisk para permitir ser
comandado/modificado por medio de la interface web. Estos cambios se detallan a continuacin:
chmod 666 /usr/local/etc/asterisk/*
23

Con esto le damos permisos completo de lectura y escritura a los archivos de configuracin de
Asterisk (as la interface puede modificar los archivos).
En /usr/local/etc/rc.d/asterisk agregamos:
command_args="-U www"

esto es para que levante los servicios con el usuario www.


Luego cambiamos permisos a los archivos de Asterisk
chown -R www /usr/local/etc/asterisk
chown -R www /usr/local/lib/asterisk/modules
chown -R www /usr/local/share/asterisk

El directorio /var, que es usado por los programas para escribir logs y guardar archivos como ser
el PID del proceso debe ser creado al inicio, no es creado completamente. La instalacin bsica de
TinyBSD no contempla eso, por lo que nosotros debemos hacernos cargo de eso copiando
/etc/mtree/BSD.var.dist a la imagen de memoria:
# cp /etc/mtree/BSD.var.dist /mnt/etc/mtree/BSD.var.dist
y luego modificndolo para crear directorios necesitados por Asterisk

run
named
..
ppp
..
asterisk
..

spool
lock
..
asterisk
..

uname=bind gname=bind
gname=network mode=0770
uname=www

uname=uucp gname=dialer mode=0775


uname=www

Luego en /usr/local/etc/asterisk/asterisk.conf no debemos olvidar de cambiar astrundir => /var/run


por astrundir => /var/run/asterisk, que es donde s va a poder escribir su PID al iniciar.
Como nuestro asterisk va a estar detrs de un router, y no va a tener IP pblica, nos podremos
encontrar con el problema que el servidor del proveedor del servicio de telefona no sepa cul es
nuestro IP, ya que Asterisk va a estar enviando los mensajes SIP con el IP provado nuestro. Esto lo
podemos arreglar configurando asterisk para reescribir los mensajes SIP antes de enviarlos al
proveedor de terminacin, y para esto ltimo debemos saber nuestro IP siempre que conectemos

24

nuestra PBX en la red local. Como puede ser muy engorroso actualizar asterisk siempre son el IP
pblico de momento decidimos usar un nombre de dominio que se actualice automticamente con
los datos entregados por la PBX. Hay muchos servicios gratis de este tipo como ser DynDNS, NOIP, etc.
Nosotros nos decidimos por NO-IP debido a la simplicidad de instalacin y que su cliente est
hecho en lenguaje C, y usa slo una librera estndard como dependencia.
Para instalar NO-IP en el sistema base hacemos lo siguiente:
#cd /usr/ports/dns/noip
#make install
#make conf

Con make conf creamos la configuracin, en la que deberemos proveer el nombre de usuario y
password con el que nos registeamos en la pgina de NO-IP(http://www.no-ip.com/) y luego
copiamos los archivos a la imagen montada en /mnt
# pkg_info -qxL noip
/usr/local/bin/noip2
/usr/local/share/doc/noip/README.FIRST

/usr/local/share/doc/noip/COPYING
/usr/local/etc/rc.d/noip
#cp /usr/local/bin/noip2 /mnt/usr/local/bin/noip2
#cp /usr/local/etc/rc.d/noip /mnt/usr/local/etc/rc.d/noip
#cp /usr/local/etc/no-ip2.conf /mnt/usr/local/etc/no-ip2.conf
Luego editamos el archivo de configuracin /mnt/usr/local/etc/no-ip2.conf y especificamos que
root para iniciar el servicio en vez del usuario noip, ya que este ltimo no est presente en la imagen
del sistema.

3.3 Instalacin de la interfaz web


Ya teniendo los archivos de los programas completamente copiados en la imagen, slo nos queda
copiar la interface web a la image:
#cp -rv ./tecnicas3 /usr/local/www/
cambiamos permisos para que nuestro servidor web no tenga problemas en leer los archivos que
componen la interface:
#chown -R www /usr/local/www/
4 copiado de imagen de disco en compact flash
Ya con los programas y la interface web instalados en la imagen, debemos desmontar la misma y
luego copiarla a la memoria. Para copiar una imagen no podemos usar el comando cp, ya que la
imagen no es un archivo simple, sino que es una imagen que debe ser copiada sector en la memoria,
lo que sera similar a copiar una imagen de CD a un compact disk, para esto ltimo usamos el
comando dd

25

# dd if=/usr/src/tools/tools/tinybsd/tinybsd.bin of=/dev/da1

Siendo /dev/da1 la compact flash reconocida en el sistema. Luego de copiar la imagen, slo nos
queda conectar la compact flash al conector de la placa SBC e iniciar el sistema. Si todo sali bien,
podremos acceder a nuestra interfaz en http://192.168.0.100/tecnicas3/ entrando con un user admin
y contrasea password. Desde la interface web podremos crear cuentas y luego apuntando
nuestros telfonos al IP de la PBX, registrarnos y hacer llamadas.

26

CONSIDERACIONES SOBRE LOS COSTOS DE NUESTRA PBX


Para nuestro proyecto hemos optado por usar una placa SBC de bajo consumo de 3.5 pulgadas de
tamano y conector compact flash. El uso de esta placa no es al azar, sino que hemos tenido en
cuenta el uso que le daremos al la IP PBX, la necesidad de usar una memoria compact flash en vez
de un disco rgido y el bajo consumo de nuestro equipo. Podriamos haber usado una simple PC
domstica, de mayor velocidad, pero a la hora de proyectar una aplicacin industrial como ser esta
PBX IP, debemos tener en cuenta el bajo consumo de la misma, con el consiguiente poco
calentamiento de los componentes, y la no necesidad de contar con partes moviles para refrigerar la
misma, lo que nos da mayor estabilidad en el tiempo y a la vez nos permite poder emplazar la
misma en ambientes cerrados y tambin con particulas en el aire. En un ambiente industrial
como el que citamos no sera posible tener mucha estabilidad usando hardware con partes moviles
como ser ventiladores para el microprocesador y discos rgidos, ya que estos ltimos son muy
vulnerables a las vibraciones.
En lo referentes al precio del hardware, tenemos diversos fabricantes de placas madre y
adaptadores SIP, pero recomendamos los siguientes:

Hardware
SBC
SBC
SBC
ATA
ATA

Fabricante
PC Engines
Soekris
Advantech
Linksys
Grandstream

Sitio Web
www.pcengines.ch
www.soekris.com
www.advantech.com
www.linksys.com
www.grandstream.com

Precios
USD 120
USD 180
USD 230
USD 70
USD 50

Si consideramos que cada uno de los adaptadores telefnicos tienen un costo entre 50 70 dolares y
presentan 2 bocas telefnicas podemos establecer un costo de entre 25 y 35 dlares por boca, lo que
sumado al precio de los aparatos telefnicos de calidad intermedia (aprox USD30) nos da un costo
total de entre 55 y 65 dlares.
Para la construccin de la central telefnica tenemos los siguientes costos:
SBC PC Engines (http://www.pcengines.ch/alix3c1.htm)
Compact Flash 1GB (http://www.pcengines.ch/cf1024dp.htm)
Caja (http://www.pcengines.ch/box2c.htm)
Adaptador 18V (http://www.pcengines.ch/ac18veur.htm)

USD 101
USD 6
USD 7
USD 6

Costo total PBX

USD 120

Costo importacin (aprox 50%) + envio


Costo total PBX en Argentina
Costo Telfono + boca (Linksys)

USD 70
USD 190
USD 65

Costo Tocal PBX + 10 bocas

USD 840

27

RESULTADOS DE LAS PRUEBAS


Las pruebas de funcionamiento fueron hechas un adaptador telefnico-analgico Linksys PAP2 y
usando Xlite como softphone (www.xten.com) en una PC, que se registraron como usuarios 100 y
101 y pudieron realizar llamadas entre ellos con excelente calidad de audio. Las pruebas de
Voicemail fueron tambin exitosas, siendo estas hechas al llamar a alguno de los usuarios y no
atender las llamadas. Los mensajes pudieron ser escuchados discando 999 y entrando la clave de
acceso.
Para llamadas salientes por medio de un proveedor de telefona usamos una cuenta con VoIP
Buster (www.voipbuster.com), y pudimos realizar llamadas a telefona pblica tambin con muy
buena calidad.

CONCLUSIONES
Habiendo trabajado en la creacin de algo tan til y verstil como lo es una central telefnica IP
en un tiempo razonable y con tan pocos recursos econmicos, nos damos cuenta de la importancia
que tiene a nivel educativo y tecnolgico el uso de software open source, el cul nos abre nuevos
horizontes en el desarrollos de aplicaciones, nos brinda la posibilidad de crear productos de mucha
calidad y a la vez innovadores, y nos permite estar actualizados en lo que respecta a nuevas
tecnologas que ya estn a prueba y en produccin, de las que casi no se han escrito libros.
Creemos que estas nuevas tecnologas open source deben ser incluidas en las materias
integradoras que componen la carrera de Ingeniera Electrnica y que se debe dar mucho empuje a
que los futuros Ingenieros tengan conocimiento en programacin, unix y sistemas Embebidos ya
que estos componen gran parte de los equipamientos modernos y existe una gran demanda a nivel
nacional e internacional de estos conocimientos, los que a la larga influyen en forma muy positiva
al crecimiento de la industria nacional y a la mejora en el posicionamiento de nuestro pas en el
grupo de los pases productores de tecnologa.

28

ANEXOS
1. FOTOS DE PANTALLAS
A continuacin mostramos las imgenes de las pantallas de la central telefnica. La figura 5
muestra la pantalla donde accedemos a la central telefnica IP por medio de un Usuario y una
Contrasea.
Usuario: admin.
Contrasea: password

Fig 5. Pantalla de autenticacin de usuario


Una vez que nos hemos logueado, aparece la pantalla principal de la central tal como vemos en la
figura 6

Fig 6. Pantalla general de la central telefnica IP

29

Cuando hacemos clic en el men Cuentas Crear, aparece la ventana que se muestra en la figura
7

Fig 7. Ventana de creacin de cuenta.

30

Otra ventana importante es la que se muestra en la figura 8, que corresponde al men


configuracin

Fig 8. Pantalla de configuracin


Por ltimo, en la figura 9, mostramos la pantalla que visualiza el registro o historial de llamadas
en la central, cuando hacemos clic en el men llamadas

Fig 9. Historial de llamadas


31

2. PROTOCOLO SIP
Una breve historia del protocolo SIP
Inicialmente slo el sistema telefnico tradicional fue el principal medio para transmitir mensajes,
Sin embargo, con el advenimiento de la Internet, se consider la necesidad se fabricar un sistema
que conecte a personas a lo largo de la red basada en IP. Diferentes comunidades presentaron
diferentes soluciones, pero la solucin presentada por IETF (Internet Engineering Task Force) fue
finalmente aceptado como uno ms general. Sin embargo, el desarrollo del protocolo SIP en la IETF
no fue un un proceso de un solo paso.
Febrero 1996
Borradores iniciales se produjeron en forma de:
Session Invitation Protocol (SIP) M.Handley, E.Schooler
Simple Conference Invitation Protocol (SCIP) H.Schulzrinne
La intencin original de SIP fue crear un mecanismo para invitar a gente en gran escala a
conferencias multipunto sobre el Backbone Multicast de Internet (Mbone). En esta etapa, la
telefona IP en realidad no exista. El primer proyecto se conoce como "draft-ietf-mmusic-sip-00".
Inclua slo un tipo de solicitud, que fue una peticin de llamada. (Se pregunta qu est haciendo
la msica en SIP? Bueno, es un acrnimo de Multiparty Multimedia Session Control. Las personas
de IETF locos por la msica despus de todo.)
Diciembre 1996
Una nueva versin de "draft-ietf-mmusic-sip-01" se propuso como una modificacin de la SIP-0.
Sin embargo todava no tena la forma de SIP, tal como lo conocemos ahora.
Enero 1999
La IETF public el proyecto llamado "draft-ietf-mmusic-sip-12", el cual contiene las 6 peticiones
que SIP tiene hoy en da.
Marzo 1999
SIP RFC 2543 publicado como un estndar.
Fue modificado ms para llegar a la ms moderna versin RFC 3261.

Funciones del protocolo SIP


SIP se limita slo al inicio, modificacin y terminacin de sesiones. Sirve a cuatro grandes
propsitos:

SIP permite el establecimiento de la ubicacin del usuario (es decir, la traduccin de un


nombre de usuario a su actual direccin de red).
SIP ofrece la funcin de negociacin a fin de que todos los participantes en una sesin
pueden ponerse de acuerdo en las caractersticas soportadas entre ellos.
SIP es un mecanismo de gestin de llamadas - por ejemplo, aadiendo, disminuyendo, o
transfiriendo participantes.
32

SIP permite cambiar las caractersticas de un perodo de sesiones mientras se encuentra en


progreso.

Todas las otras funciones se realizan con otros protocolos.


Este hecho, significa que SIP no es un protocolo de descripcin de sesiones, y que SIP no hace
control de conferencias. SIP no es un protocolo de reserva de recursos y no tiene nada que ver con
la calidad del servicio (QoS). SIP puede trabajar en un marco con otros protocolos para asegurarse
de que estas funciones se realizan - SIP, pero no hacerlo. SIP puede funcionar con SOAP, HTTP,
XML, VXML, WSDL, UDDI, SDP y otros. Todo el mundo tiene un papel que jugar!
Con todo lo dicho, SIP es an uno de los ms importantes protocolos. Mejor aprender acerca de
los componentes SIP.

Componentes del protocolo SIP


Las entidades que interactan en un escenario SIP son llamados User Agents (UA)
Los User Agents puede operar en dos modos -

User Agent Client (UAC) : Genera y enva las solicitudes a los servidores.
User Agent Server (UAS) : Recibe las solicitudes, procesa estas solicitudes y genera las
respuestas.

Nota: Un solo UA puede funcionar como ambos.


Clientes:
En general, asociamos el concepto de los clientes a los usuarios finales, es decir, las aplicaciones
se ejecutan en los sistemas utilizados por las personas. Puede ser un softphone corriendo en una PC
o un dispositivo de mensajera en el telfono IP. ste genera una solicitud cuando intenta llamar a
otra persona a travs de la red y enva la peticin a un servidor (generalmente un servidor proxy).
Vamos a ir a travs del formato de las solicitudes y los servidores proxy en mayor detalle ms
adelante.
Servidores:
Los servidores son, en general, parte de la red. Ellos poseen un conjunto predefinido de reglas
para manejar las solicitudes enviadas por los clientes.
Los servidores pueden ser de varios tipos -

Servidor proxy: Estos son el tipo ms comn de servidor en un entorno SIP. Cuando una
peticin se genera, la direccin exacta del destinatario no se sabe de antemano. Por lo tanto,
el cliente enva la peticin a un servidor proxy. El servidor en nombre del cliente (como si
dando un proxy para ello) remite la solicitud a otro servidor proxy o el propio receptor.
Redirect Server: Un redirect server redirige el pedido de vuelta al cliente indicando que el
cliente necesita intentar por una ruta diferente para llegar al destinatario. En general, ocurre
cuando un destinatario se ha movido de su posicin original ya sea en forma temporal o
permanente.
Registrar: Uno de los principales puestos de trabajo de los servidores es para detectar la
ubicacin de un usuario en una red. Para saber la ubicacin de los usuarios, stos tienen que
registrar sus ubicaciones (IP y puerto) en un servidor Registrar. Los usuarios de vez en
cuando actualizan su registro de ubicacin (por el envo de un tipo especial de mensaje) a un
servidor Registrar.

33

Location Server: Las direcciones registradas en un Registro se almacenan en un Location


Server.

Ahora que los componentes estn listos, tenemos los comandos SIP para hacer que funcionen.
Comandos del procotolo SIP
INVITE : Invita a un usuario a una llamada

ACK : (Acknowledgement) el acuse de recibo se utiliza para facilitar el intercambio de


mensajes fiables para las invitaciones.

BYE :Finaliza una conexin entre los usuarios

CANCEL :Finaliza una solicitud, o de bsqueda, para un usuario. Se utiliza si un cliente


enva un INVITE y luego cambia su decisin de llamar al destinatario.

OPTIONS :solicita informacin a un servidor acerca de sus capacidades.

REGISTER :Registra la ubicacin actual de un usuario.

INFO : Se utiliza para sealizacin a mitad de sesiones.

Un ejemplo tpico de una sesin SIP


Sealizacin SIP sigue el paradigma de servidor-cliente, tal como se utiliza ampliamente en la
Internet por protocolos como HTTP o SMTP. La siguiente figura presenta un tpico intercambio de
solicitudes y respuestas. Tenga en cuenta que es slo un caso tpico y no incluye todos los casos
posibles.
Antes de la comprensin de los mtodos, en primer lugar se debe entender el diagrama. El User1
utiliza su softphone para llegar al telfono SIP del User2. Servidor1 y Servidor2 ayudan a
configurar las sesiones en nombre de los usuarios. Este acuerdo comn de los proxies y los usuarios
finales se llama "SIP trapezoidal", como se muestra por la lnea punteada. Los mensajes aparecen
verticalmente en el orden en que aparecen, es decir, el mensaje en la parte superior (INVITE M1) es
primero seguido por otros. La direccin de las flechas muestra el remitente y el destinatario de cada
mensaje. Cada mensaje contiene un nmero de 3-dgitos seguido de un nombre y cada uno tiene la
etiqueta 'M' y un nmero de serie. El nmero de 3-dgitos es el cdigo numrico de los mensajes
asociados comprendido fcilmente por las mquinas. Los usuarios humanos utilizan el nombre para
identificar el mensaje.

34

Fig 1.
La operacin comienza con el User1 enviando una solicitud de INVITE al User2. Pero User1 no
conoce la ubicacin exacta de User2 en la red IP, as que pasa la solicitud a servidor1. El Servidor1
en nombre de User1 enva una solicitud de INVITE a User2 al server2. Se enva una respuesta
TRYING a User1 informando que est tratando de llegar a User2. La respuesta podra haber sido
diferente, pero vamos a discutir los otros tipos de respuestas ms tarde. Si se est preguntando cmo
servidor1 sabe que tiene que enviar la solicitud a server2, lo veremos ms adelante cuando veamos
el proceso de registracin.
Al recibir un INVITE M2 de server1, server2 funciona de manera similar como servidor1. ste
reenva una peticin de INVITE a User2 (Nota: Aqu server2 sabe la ubicacin de User2. Si no
supiera la ubicacin, reenviara la peticin a otro servidor proxy. Por lo tanto, una peticin de
INVITE pueden viajar a travs de varios servidores proxy antes de llegar al destinatario ). Despus
de la transmisin del INVITE M3, server2 enva una respuesta TRYING al servidor1.
El telfono SIP, en la recepcin de la peticin INVITE, comienza a sonar (ring) informando al
User2 que la peticin de llamada ha llegado. Se enva una seal de respuesta RINGING al server2
que llega a usuario1 a travs de servidor1. Por lo tanto, el User1 recibe una confirmacin que el
User2 ha recibido la solicitud de INVITE.
User2 en este momento tiene la opcin de aceptar o rechazar la llamada. Supongamos que decide
aceptarla. Tan pronto como se acepta la llamada, una respuesta 200 OK es enviada por el telfono al
server2. Recordando la ruta del INVITE llega al usuario1. El softphone del User1 enva un mensaje
de ACK para confirmar la configuracin de la lamada.
l
Este 3-way-handshaking
(INVITE+OK+ACK) es usado para el inicio de una llamada fiable. Tenga en cuenta que el mensaje
de ACK no est utilizando los proxies para llegar a User2 ya que User1 por ahora sabe la ubicacin
exacta de User2.
Una vez que la conexin ha sido establecida, la media fluye entre los dos extremos. El trfico
media es controlado a travs de protocolos diferentes a SIP por ejemplo RTP (Realtime
Transmission Protocol).
Cuando una de las partes en la sesin decide desconectar, (User2 en este caso) enva un mensaje
BYE a la otra parte. La otra parte enva un mensaje de 200 OK para confirmar la terminacin de la
sesin.
35

Formato de Solicitudes SIP


Ya hemos visto que las solicitudes son enviadas por los clientes a servidores. Ahora vamos a
discutir lo que realmente contienen las solicitudes. El siguiente es el formato de una solicitud
INVITE enviada por User1.
INVITE sip:user2@server2.com SIP/2.0
Via: SIP/2.0/UDP pc33.server1.com;branch=z9hG4bK776asdhds Max-Forwards: 70
To: user2 <sip:user2@server2.com>
From: user1 <sip:user1@server1.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.server1.com
CSeq: 314159 INVITE
Contact: <sip:user1@pc33.server1.com>
Content-Type: application/sdp
Content-Length: 142
---- User1 Message Body Not Shown ---La primera lnea del texto-mensaje codificado se llama Request Line. Identifica que el mensaje es
una peticin.
Request-Line
Method SP Request-URI SP SIP-Version CRLF
[SP = single-space & CRLF=Carriage Return + Line Feed
Aqu el method es INVITE, request uri-es "user2@server2.com" y SIP versin 2.
Las siguientes lneas son un conjunto de campos de cabecera.

Via:
Contiene la direccin local de User1, es decir, pc33.server1.com donde est a la espera de
las respuestas por venir.

Max-Forward:
Se utiliza para limitar el nmero de saltos que esta peticin se puede tomar antes de llegar al
destinatario. Es decrementado por uno en cada salto ya que es necesario evitar que la
solicitud viaje en forma indefinida en caso de que sea atrapada en un bucle.

To:
Contiene un nombre para mostrar "User2" y un SIP o SIPS URI <user2@server2.com>

From:
Tambin contiene un nombre para mostrar "User1" y un SIP o ISPS URI
<user1@server1.com>. Tambin contiene una etiqueta que es una secuencia pseudoaleatoria insertada por la aplicacin SIP que funciona como un identificador de la persona
que llama en el cuadro de dilogo.

Call-ID:
Se trata de un identificador nico global de la llamada generada como la combinacin de
una cadena pseudo-aleatorio y el uso de la direc
cin IP del softphone
El Call-ID es nico para una llamada. Una llamada puede contener varios dilogos. Cada dilogo se

36

identifican de forma nica por una combinacin de From, To and Call-ID.

CSeq:
Contiene un entero y un nombre de mtodo. Cuando una transaccin se inicia, el primer
mensaje es Cseq aleatorio. Despus de esto, se incrementa por uno con cada nuevo mensaje.
It is used to detect non-delivery of a message or out-of-order delivery of messages. Se utiliza
para detectar la no entrega de un mensaje o entrega de los mensajes fuera de orden.

Contact:
Contiene un SIP o SIPS URI que es una ruta directa a User1. Contiene un nombre de
usuario y un nombre de dominio completo (FQDN). Tambin puede tener una direccin IP.
El campo Via campo se utiliza para enviar la respuesta a la solicitud. El Campo contact se
utiliza para enviar las solicitudes futuras. Esa es la razn por la que la respuesta 200 OK de
User2 va a User1 a travs de los proxies. Pero cuando User2 genera una peticin BYE (una
nueva solicitud y no una respuesta a INVITE), sta va directamente a User1 sin pasar por
los proxies.

Content-Type:
Contiene una descripcin del cuerpo del mensaje (no se muestra).

Content-Length:
Se trata de un octeto (byte) que es la cuenta del tamao del cuerpo del mensaje.

La cabecera puede contener otros campos de cabecera tambin. Sin embargo esos campos son
opcionales. Tenga en cuenta que el cuerpo del mensaje no se muestra aqu. El cuerpo se utiliza para
transmitir informacin acerca de la sesion de media escrita en la sesin Session Description
Protocol (SDP).
Formato de Respuesta de mensaje SIP
As es como ser la respuesta del SIP User2:
SIP/2.0 200 OK
Via: SIP/2.0/UDP site4.server2.com;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP site3.server1.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.server1.com;branch=z9hG4bK776asdhds;received=192.0.2.1
To: user2 <sip:user2@server2.com>;tag=a6c85cf
From: user1 <sip:user1@server1.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.server1.com
CSeq: 314159 INVITE
Contact: <sip:user2@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
---- User2 Message Body Not Shown ----

Status Line
La primera lnea en una respuesta se llama Status Code
SIP-Version SP Status-Code SP Reason-Phrase CRLF

37

[SP = single-space & CRLF=Carriage Return + Line Feed ]

Aqu la versin SIP es 2.0, el Status Code es 200 y Reason Phrase es OK.
Los campos de cabecera que siguen la lnea de estado son similares a las de una solicitud. Slo
mencionaremos las diferencias

Via:
Hay ms de un campo Via. Esto se debe a que cada uno de los elementos a travs de los
cuales las peticiones de INVITE han pasado ha aadido su identidad en el campo Via. Tres
campos son aadidos por softphone de User1, server1 el primer servidor proxy y el segundo
proxy server2. La respuesta reconstruye el camino de la INVITE utilizando los campos Via.
En su camino de regreso, cada uno de los elementos elimina el campo Via correspondiente
antes de transmitirla de vuelta a la persona que llama.

To:
Tenga en cuenta que el campo ahora contiene una etiqueta. Esta etiqueta se utiliza para
representar al destinatario de la llamada en un dilogo.

Contact:
Contiene la direccin exacta de User2. Por lo tanto User1 no tiene la necesidad de utilizar
servidores proxy para encontrar a User2 en el futuro.

Es una respuesta 2xx. Sin embargo las respuestas pueden ser differnet en funcin de situaciones
particulares.

Tipos de respuesta SIP


El primer dgito del Status-Code define la categora de respuesta. As, cualquier respuesta de entre
100 y 199 se denomina como un respuesta "1xx" y as se hace para cualquier otro tipo. SIP/2.0
permite seis tipos de respuesta y son similares a las de HTTP.

1xx: Provisional -- solicitud recibida, contina el proceso de solicitud.


2xx: Success -- la accin se ha recibido, comprendido y aceptado.
3xx: Redirection -- se necesitan tomar ciertas acciones para completar la solicitud.
4xx: Client Error -- la solicitud contiene sintaxis mala o no puede cumplirse en este
servidor;
5xx: Server Error -- el servidor no puede cumplir con una solicitud aparentemente vlida
6xx: Global Failure -- la solicitud no puede cumplirse en cualquier servidor.

Si uno se recibe una respuesta con un Status Code de la forma yxx que no es comprendido por la
parte receptora, sta trata la respuesta como una respuesta y00 es decir, si un cliente recibe una
respuesta desconocida 345, la va a tratar como una respuesta 300. Un desconocido 1xx es tratado
como 183 (Session in Progress). Por lo tanto, cada UA debe saber cmo reaccionar ante 100,183,
200, 300, 400, 500 y 600.
En SIP se habla de las llamadas, dilogos, transacciones y mensajes. Lo siguiente pgina se aclara
su interrelacin.
Relacin entre llamada, dilogo, transaccin y mensajes
Los mensajes son los distintos cuerpos de texto intercambiados entre un servidor y un cliente.
38

Puede haber dos tipos de mensajes. : solicitudes y respuestas.


Transaccin se produce entre un cliente y un servidor e incluye todos los mensajes desde la
primera solicitud enviada desde el cliente al servidor, hasta una respuesta final (no 1xx) enviada
desde el servidor al cliente. Si la solicitudes un INVITE y la respuesta final no es un 2xx, la
transaccin tambin incluye un ACK a la respuesta. El ACK para una respuesta 2xx a una solicitud
INVITE es una transaccin por separado.
Dialogo es una relacin SIP peer-to-peer entre dos UAS que persiste durante algn tiempo. Un
dilogo es identificado por un call-ID, una etiqueta local y una etiqueta remota. Un dilogo sola ser
mencionado como una pierna de llamada.
Una llamada comprende todos los dilogos involucrados. Es lo mismo que una sesin.
La siguiente figura explica la relacin en forma ms clara.

Fig 2. (RINGING es una respuesta 1xx y OK es una respuesta 2xx)


Una llamada puede tener conexiones a un nmero de destinatarios a la vez formando una serie de
dilogos. Todos estos dilogos hacen una sola llamada.

39

REGISTRACIN EN SIP
Viendo una tpica sesin SIP vemos que la persona que llama no sabe la direccin del destinatario
inicialmente. Los servidores proxy hacen el trabajo de averiguar la ubicacin exacta del
destinatario. Lo que realmente sucede es que cada usuario registra su ubicacin actual en un
servidor de registro (REGISTRAR). La aplicacin enva un mensaje llamado REGISTER
informando al servidor su ubicacin actual. El Registrar almacena esta relacin (entre el usuario y
su direccin actual) en un location server y ste es utilizado por otros servidores proxy para
localizar al usuario.

Fig 3.
El usuario yy utiliza la IP 195.31.65.152 como su ubicacin actual y la registra con el servidor.
Esto realmente ayuda a la movilidad de los usuarios. Digamos que hay una aplicacin de
mensajera, y que se puede acceder desde diferentes computadoras. Tan pronto como entramos en
una sesin con un nombre de usuario, la aplicacin REGISTER (Registra)el nombre de usuario con
la IP de ese equipo. El campo 'Expire' refleja la duracin para la cual el registro ser vlido, por lo
tanto los usuarios deben refrescar sus registraciones de vez en cuando.
Tenga en cuenta que la diferencia entre un servidor proxy y un registro o un servidor de ubicacin
a menudo es lgica. Fsicamente pueden ser situados en la misma mquina.

40

3. GUA DE INSTALACIN DE FreeBSD


Como primer paso para la instalacin debemos bajar la imagen de CD del instalador de FreeBSD
desde:
ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/7.1/
La imagen que bajemos puede ser la que permite bootear solamente y que no posea los archivos
de instalacin (aprox 40MB de tamao), lo permite que la descarga sea bien rpida y que podemos
empezar a trabajar casi al instante, pero por otro lado, al momento de instalar el sistema operativo
deberemos poseer conexin a internet para que el instalador descargue dichos archivos. Por todo
esto recomendamos bajar el disco 1 de instalacin, ya que ste poseen todo lo necesario para
instalar un entorno de desarrollo.
Luego de bajar la imagen debemos copiar la misma a un CD, tarea que puede realizarse con el
comando cdrecord desde Linux o sino usando el Nero Burning Room desde Windows.
Ya con la imagen creada, debemos configurar la PC para poder iniciar la instalacin desde el CD,
esto ltimo lo realizamos desde la BIOS. Luego de este ltimo paso procedemos a iniciar la
instalacin del sistema operativo "booteando" el CD de instalacin.
La primera imagen que nos aparecer ser la siguiente:

Fig 1. Pantalla de inicio en la instalacin de FreeBSD


Debemos elegir la opcin 1, que es la por defecto. Luego nos irn apareciendo menes con las
opciones de instalacin que detallamos paso a paso:

41

Fig 2. Opciones de Instalacin: Pas


En este primer men elegimos el pas donde nos encontramos, lo que nos deja configurar la
distribucin del teclado y dems configuraciones regionales.

Fig 3. Opciones de instalacin: Modo de Instalacin

42

Este es el men principal de la instalacin, y nos deja elegir tanto el modo de instalacin como
reparar una instalacin existente, particionar discos, hacer una actualizacin del sistema y muchas
cosas ms.

Fig 4. Opciones de instalacin, tipo de instalacin.


Nosotros elegiremos Standard, que nos dejar instalar el sistema con un simple ayudante que nos
guiar paso a paso.

Fig 5. Opciones de Instalacin: Seleccin de unidad de instalacin

43

El primer paso luego de seleccionar Standard es elegir el disco sobre el que trabajaremos en la
instalacin.

Fig 6. Opciones de instalacin: configuracin de particiones


Luego nos mostrar las particiones existentes y el tipo de stas. Nosotros deberemos crear una
particin primaria (slo podemos tener 4 en total) y en caso de no tener espacio podremos eliminar
alguna particin existente que no usemos.

Fig 7. Opciones de instalacin: configuracin de particiones


44

Luego de hacer lugar eliminando particiones que no usamos (D = Delete Slice) procedemos a
crear una particin del tipo FreeBSD (tipo 165) con el tamao adecuado (recomendamos >= 10GB
para entornos de desarrollo). Especificando 20G por ejemplo, crearemos una particin de 20GB.
Luego presionando la tecla Q salimos del men y pasamos al siguiente.

Fig 8. Opciones de instalacin: sector de arranque.


En este men elegimos "Install the FreeBSD Boot Manager" en caso de tener otros sistemas
operativos instalados en el mismo sistema. En caso que vayamos a tener slo FreeBSD corriendo,
elegimos Install a estndar MBR. Si ya tuviramos otro boor loader, elegimos la opcin 3, que deja
el MBR sin modificar.

45

Fig 9. Opciones de instalacin: seleccin de unidad de instalacin

Seleccionamos el disco donde se instalar el Boot Loader.

Fig 10. Opciones de instalacin: Configuracin de particiones

46

Y luego entraremos al men donde deberemos crear sub particiones dentro de la particin
FreeBSD ya creada, con sus respectivos puntos de montaje. Lo mas simple es decirle al instalador
que las cree automticamente presionando la A, pero como nuestro entorno es de desarrollo y no
necesitamos crear particiones para los archivos de usuarios ya que nuestro sistema no trabaja como
servidor, lo que nos puede convenir es crear slo 2 particiones, una del tipo "swap" que tenga el
doble del tamao de la memoria RAM y otra del tipo "file system" que ocupe el espacio sobrante y
que tenga punto de montaje en el directorio raz (/)

Fig 11. Opciones de Instalacin: configuracin de particiones


Otro de los casos es crear las particiones a mano como vemos en el grfico, donde hemos creado
una particin raz (/) de 512MB, una particin swap de 512MB, una particin /var de 512MB y una
/usr de mas de 6GB. Tener particiones limitadas en tamao nos ayuda a que si por ejemplo los logs,
que se almacenan en /var/log crezcan son control, no llenen la particin principal (/) donde est
instalado el kernel y dems comandos esenciales para el funcionamiento del SO.

47

Fig 12. Opciones de instalacin: componentes a instalar.

En el siguiente paso deberemos elegir el tipo de distribucin a instalar. Como nosotros


necesitamos crear un sistema usando el cdigo fuente del kernel y aplicaciones, deberemos elegir
Developer o X-Developer (incluye X Windows). Luego se nos presentar un men donde elegimos
instalar los Ports, que son scripts de instalaciones remotas automticas.
User Confirmation Requested
Would you like to install the FreeBSD ports collection?
This will give you ready access to over 19,000 ported software packages, at a cost of around
445 MB of disk space when "clean" and possibly much more than that if a lot of the distribution
tarballs are loaded (unless you have the extra CDs from a FreeBSD CD/DVD distribution
available and can mount it on /cdrom, in which case this is far less of a problem).
The Ports Collection is a ery
v
valuable resource and well worth having
on your /usr partition, so it is advisable to say Yes to this option..
For more information on the Ports Collection & the latest ports,
visit:
http://www.FreeBSD.org/ports
[ Yes ]

No

48

Fig 13. Opciones de instalacin: Ubicacin del archivo de instalacin.


Ahora elegimos desde dnde queremos instalar FreeBSD. SI bajamos el disco1 de instalacin
elegimos CD/DVD. Si bajamos el disco bootonly, deberemos instalar desde ftp u otro medio remoto
como ser http.
User Confirmation Requested
Last Chance! Are you SURE you want to continue the installation?
If you're running this on a disk with data you wish to save then WE
STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!
We can take no responsibility for lost disk contents!
[ Yes ] No

Luego confirmamos que inicie la instalacin y esperamos que termine.


Message
Congratulations! You now have FreeBSD installed on your system.
We will now move on to the final configuration questions.
For any option you do not wish to configure, simply select No.
If you wish to re-enter this utility after the system is up, you may
do so by typing: /usr/sbin/sysinstall.

49

[ OK ]
[ Press enter or space ]
Luego de terminar la instalacin el instalador nos ir pidiendo que configuremos diferentes
servicios.
User Confirmation Requested
Would you like to configure any Ethernet or SLIP/PPP network devices?
[ Yes ] No

Fig 14. Opciones de instalacin: configuracin de la placa de red.


Configuramos la conexin ethernet para poder tener conectividad a Internet.

User Confirmation Requested


Do you want to try IPv6 configuration of the interface?
Yes [ No ]

50

User Confirmation Requested


Do you want to try DHCP configuration of the interface?
Yes [ No ]

Fig 15. Opciones de instalacin: configuracin de IP.

Lo ms simple es usar DHCP para no tener que configurar la IP en forma manual.

User Confirmation Requested


Do you want this machine to function as a network gateway?
[ Yes ]

No

Elegimos que no deseamos que el SO trabaje como gateway (no hacemos re router de red)
User Confirmation Requested
Do you want to configure inetd and the network services that it provides?

Yes [ No ]
No aceptamos configurar inetd (Internet Daemon) ya que nuestra pc no ser un server.

51

User Confirmation Requested


Would you like to enable SSH login?
Yes

[ No ]

Aceptamos instalar el server SSH para poder conectarnos remotamente a nuestra pc (siempre es
bueno el acceso remoto)
User Confirmation Requested
Do you want to have anonymous FTP access to this machine?
Yes [ No ]
No instalamos acceso remoto a ftp (no hace falta)
User Confirmation Requested
Do you want to configure this machine as an NFS server?
Yes [ No ]
Tampoco NFS server (Network File System)
User Confirmation Requested
Do you want to configure this machine as an NFS client?
Yes [ No ]
Tampoco NFS Client
User Confirmation Requested
Would you like to customize your system console settings?
[ Yes ] No
No necesitamos configurar los seteos del sistema
User Confirmation Requested
Would you like to set this machine's time zone now?
[ Yes ] No

52

Fig 16. Opciones de instalacin: configuracin del uso horario.


User Confirmation Requested
Would you like to enable Linux binary compatibility?
[ Yes ] No
No necesitamos compatibilidad Linux, ya que compilaremos todo desde cdigo fuente (no
usaremos binarios precompilados para linux)
User Confirmation Requested
Does this system have a PS/2, serial, or bus mouse?
[ Yes ] No
User Confirmation Requested
Podemos configurar si tenemos algn Mouse conectado.
The FreeBSD package collection is a collection of hundreds of
ready-to-run applications, from text editors to games to WEB servers
and more. Would you like to browse the collection now?
[ Yes ] No
No necesitamos instalar programas precompilados por ahora
User Confirmation Requested
Would you like to add any initial user accounts to the system? Adding

53

at least one account for yourself at this stage is suggested since


working as the "root" user is dangerous (it is easy to do things which
adversely affect the entire system).
[ Yes ] No
Aqu podemos agregar algn user al sistema, si no lo hacemos, usaremos root, que es el
administrador del sistema.
Message
Now you must set the system manager's password.
This is the password you'll use to log in as "root".
[ OK ]
[ Press enter or space ]
New password:
Retype new password :
Aqu creamos una contrasea para root
User Confirmation Requested
Visit the general configuration menu for a chance to set any last options?
Yes [ No ]
Como ya no tenemos ms nada que instalar, optamos por salir tal como se ve en la figura 17

54

Fig 17. Fin de la instalacin

Aparece la siguiente pregunta:


Are you sure you wish to exit?
Pulsamos en Yes
[ Yes ] No

El sistema se reiniciar y nos pide que estemos seguros de haber sacado cualquier CD/DVD de la
lectora, de esta manera se evi
ta que arranque de nuevo el in
stalador del SO.
Luego de arrancar el sistema nos va a pedir el username y contrasea, que son root y la clave que
hemos creado con anterioridad. Con estos pasos ya estaremos listos para
empezar con el desarrollo de nuestro sistema embebido.

55

4. LENGUAJE XML
Historia
XML proviene de un lenguaje inventado por IBM en los aos setenta, llamado GML (Generalized
Markup Language), que surgi por la necesidad que tena la empresa de almacenar grandes
cantidades de informacin. Este lenguaje gust a la ISO, por lo que en 1986 trabajaron para
normalizarlo, creando SGML (Standard Generalized Markup Language), capaz de adaptarse a un
gran abanico de problemas. A partir de l se han creado otros sistemas para almacenar informacin.
En el ao 1989 Tim Berners Lee cre la web, y junto con ella el lenguaje HTML. Este lenguaje se
defini en el marco de SGML y fue de lejos la aplicacin ms conocida de este estndar. Los
navegadores web sin embargo siempre han puesto pocas exigencias al cdigo HTML que
interpretan y as las pginas web son caticas y no cumplen con la sintaxis. Estas pginas web
dependen fuertemente de una forma especfica de lidiar con los errores y las ambigedades, lo que
hace a las pginas ms frgiles y a los navegadores ms complejos.
Otra limitacin de SGML es que cada documento pertenece a un vocabulario fijo, establecido por el
DTD. No se pueden combinar elementos de diferentes vocabularios. Asimismo es imposible para un
intrprete (por ejemplo un navegador) analizar el documento sin tener conocimiento de su
gramtica (del DTD). Por ejemplo, el navegador sabe que antes de una etiqueta <div> debe haberse
cerrado cualquier <p> previamente abierto. Los navegadores resolvieron esto incluyendo lgica
ad-hoc para el HTML, en vez de incluir un analizador genrico. Ambas opciones, de todos modos,
son muy complejas para los navegadores. Se busc entonces definir un subconjunto del SGML que
permita:
Mezclar elementos de diferentes lenguajes. Es decir que los lenguajes sean extensibles.
La creacin de analizadores simples, sin ninguna lgica especial para cada lenguaje.
Empezar de cero y hacer hincapi en que no se acepte nunca un documento con errores de
sintaxis.
Para hacer esto XML deja de lado muchas caractersticas de SGML que estaban pensadas para
facilitar la escritura manual de documentos. XML en cambio est orientado a hacer las cosas ms
sencillas para los programas automticos que necesiten interpretar el documento.
Ventajas del XML
Es extensible: Despus de diseado y puesto en produccin, es posible extender XML con
la adicin de nuevas etiquetas, de modo que se pueda continuar utilizando sin complicacin
alguna.
El analizador es un componente estndar, no es necesario crear un analizador especfico
para cada versin de lenguaje XML. Esto posibilita el empleo de cualquiera de los
analizadores disponibles. De esta manera se evitan bugs y se acelera el desarrollo de
aplicaciones.
Si un tercero decide usar un documento creado en XML, es sencillo entender su estructura y
procesarla. Mejora la compatibilidad entre aplicaciones.

Estructura de un documento XML


La tecnologa XML busca dar solucin al problema de expresar informacin estructurada de la
56

manera ms abstracta y reutilizable posible. Que la informacin sea estructurada quiere decir que se
compone de partes bien definidas, y que esas partes se componen a su vez de otras partes. Entonces
se tiene un rbol de pedazos de informacin. Ejemplos son un tema musical, que se compone de
compases, que estn formados a su vez por notas. Estas partes se llaman elementos, y se las seala
mediante etiquetas.
Una etiqueta consiste en una marca hecha en el documento, que seala una porcin de ste como un
elemento. Un pedazo de informacin con un sentido claro y definido. Las etiquetas tienen la forma
<nombre>, donde nombre es el nombre del elemento que se est sealando.
A continuacin se muestra un ejemplo para entender la estructura de un documento XML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE Edit_Mensaje SYSTEM "Lista_datos_mensaje.dtd"
[<!ELEMENT Edit_Mensaje (Mensaje)*>]>
<Edit_Mensaje>
<Mensaje>
<Remitente>
<Nombre>Nombre del remitente</Nombre>
<Mail> Correo del remitente </Mail>
</Remitente>
<Destinatario>
<Nombre>Nombre del destinatario</Nombre>
<Mail>Correo del destinatario</Mail>
</Destinatario>

<Texto>
<Asunto>
Este es mi documento con
no contiene atributos ni
</Asunto>
<Parrafo>
Este es mi documento con
no contiene atributos ni
</Parrafo>

una estructura muy sencilla


entidades....

una estructura muy sencilla


entidades....

</Texto>
</Mensaje>
</Edit_Mensaje>

Aqu est el ejemplo de cdigo del DTD del documento "Edit_Mensaje":


<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- Este es el DTD de Edit_Mensaje -->
<!ELEMENT Mensaje (Remitente,
<!ELEMENT Remitente
<!ELEMENT
<!ELEMENT

Destinatario, Texto)*>
(Nombre, Mail)>
Nombre (#PCDATA)>
Mail
(#PCDATA)>

<!ELEMENT Destinatario (Nombre, Mail)>


<!ELEMENT Nombre (#PCDATA)>
<!ELEMENT Mail
(#PCDATA)>

57

<!ELEMENT Texto (Parrafo)>


<!ELEMENT Asunto (#PCDATA)>
<!ELEMENT Parrafo (#PCDATA)>

Documentos XML bien formados


Los documentos denominados como "bien formados" (del ingls well formed) son aquellos que
cumplen con todas las definiciones bsicas de formato y pueden, por lo tanto, analizarse
correctamente por cualquier analizador sintctico (parser) que cumpla con la norma. Se separa esto
del concepto de validez que se explica ms adelante.

Los documentos han de seguir una estructura estrictamente jerrquica con lo que respecta
a las etiquetas que delimitan sus elementos. Una etiqueta debe estar correctamente incluida
en otra, es decir, las etiquetas deben estar correctamente anidadas. Los elementos con
contenido deben estar correctamente cerrados.

Los documentos XML slo permiten un elemento raz del que todos los dems sean parte, es
decir, solo pueden tener un elemento inicial.

Los valores atributos en XML siempre deben estar encerrados entre comillas simples o
dobles.

El XML es sensible a maysculas y minsculas. Existe un conjunto de caracteres llamados


espacios en blanco (espacios, tabuladores, retornos de carro, saltos de lnea) que los
procesadores XML tratan de forma diferente en el marcado XML.

Es necesario asignar nombres a las estructuras, tipos de elementos, entidades, elementos


particulares, etc. En XML los nombres tienen alguna caracterstica en comn.

Las construcciones como etiquetas, referencias de entidad y declaraciones se denominan marcas;


son partes del documento que el procesador XML espera entender. El resto del documento entre
marcas son los datos "entendibles" por las personas. Partes de un documento XML.
Un documento XML est formado por el prlogo y por el cuerpo del documento.
Prlogo
Aunque no es obligatorio, los documentos XML pueden empezar con unas lneas que describen la
versin XML, el tipo de documento y otras cosas.
El prlogo contiene:

Una declaracin XML. Es la sentencia que declara al documento como un documento


XML.

Una declaracin de tipo de documento. Enlaza el documento con su DTD (definicin de


tipo de documento), o el DTD puede estar incluido en la propia declaracin o ambas
cosas al mismo tiempo.

Uno o ms comentarios e instrucciones de procesamiento.

Cuerpo
A diferencia del prlogo, el cuerpo no es opcional en un documento XML, el cuerpo debe contener
un y solo un elemento raz, caracterstica indispensable tambin para que el documento est bien

58

formado.
Elementos
Los elementos XML pueden tener contenido (ms elementos, caracteres o ambos), o bien ser
elementos vacos.
Atributos
Los elementos pueden tener atributos, que son una manera de incorporar caractersticas o
propiedades a los elementos de un documento. Deben ir entre comillas.
Entidades predefinidas
Entidades para representar caracteres especiales para que, de esta forma, no sean interpretados
como marcado en el procesador XML.
Secciones CDATA
Es una construccin en XML para especificar datos utilizando cualquier carcter sin que se
interprete como marcado XML. Solo se utiliza en los atributos. No confundir con 2(#PCDATA) que
es para los elementos. Permite que caracteres especiales no rompan la estructura. Ej:
<![CDATA[

contenido especial: & ]]>

Comentarios
Comentarios a modo informativo para el programador que han de ser ignorados por el procesador.
Los comentarios en XML tienen el siguiente formato:
<!--- Esto es un comentario --->
<!-- Otro comentario -->

Validez
Que un documento est "bien formado" solamente se refiere a su estructura sintctica bsica, es
decir, que se componga de elementos, atributos y comentarios como XML especifica que se
escriban. Ahora bien, cada aplicacin de XML, es decir, cada lenguaje definido con esta tecnologa,
necesitar especificar cul es exactamente la relacin que debe verificarse entre los distintos
elementos presentes en el documento.
Esta relacin entre elementos se especifica en un documento externo o definicin (expresada
como DTD (Document Type Definition = Definicin de Tipo de Documento) o comoXSchema).
Crear una definicin equivale a crear un nuevo lenguaje de marcado, para una aplicacin especfica.
Document type definition (DTD)
La DTD define los tipos de elementos, atributos y entidades permitidas, y puede expresar algunas
limitaciones para combinarlos. Los documentos XML que se ajustan a su DTD son denominados
vlidos. Los elementos deben ajustarse a un tipo de documento declarado en una DTD para que el
documento sea considerado como vlido.

Modelos de contenido
Un modelo de contenido es un patrn que establece los subelementos aceptados, y el orden en
que se aceptan.

59

Declaraciones de lista de atributos


Los atributos se usan para aadir informacin adicional a los elementos de un documento.
Tipos de atributos

AtributosCDATA y NMTOKEN
Atributos enumerados y notaciones
Atributos ID y IDREF

Declaracin de entidades
XML hace referencia a objetos que no deben ser analizados sintcticamente segn las reglas
XML, mediante el uso de entidades. Las entidades pueden ser:
Internas o externas
Analizadas o no analizadas
Generales o parametrizadas
Espacios de nombres
Los espacion de nombres XML permiten separar semnticamente los elementos que forman un
documento XML.
XML Schemas (XSD)
Un Schema es algo similar a un DTD. Define qu elementos puede contener un documento XML,
cmo estn organizados y qu atributos y de qu tipo pueden tener sus elementos.
Ventajas de los Schemas frente a los DTDs

Usan sintaxis de XML, al contrario que los DTDs.


Permiten especificar los tipos de datos.
Son extensibles.

Herramientas para trabajar con documentos XML


De hecho cualquier procesador de texto, que sea capaz de producir archivos txt es capaz de
generar XML, aunque en los entornos de desarrollo comoEclipse o Visual Studio, se facilita, ya que
reconoce los formatos y ayuda a generar un XML bien formado.
Lenguajes creados usando XML
Extensible Stylesheet Language (XSL)
EL Lenguaje de Hoja de Estilo Extensible (eXtensible Stylesheet Language, XLS) es una familia
de lenguajes que permiten describir como los archivos codificados en xml sern formateados (para
mostrarlos) o transformados. Hay tres lenguajes en esta familia: XSL Transformations (XSLT), XSL
Formatting Objects (XSL-FO)y XML Path Language.
Lenguaje de enlace XML (XLINK)
Xlink es una aplicacin XML que intenta superar las limitaciones que tienen los enlaces de
hipertexto en HTML. Es una especificacin que todava est en desarrollo.

60

5. ADAPTADOR ANALGICO SISCO LINKSYS PAP2


http://www.linksys.com/servlet/Satellite?childpagename=US%2FLayout&packedargs=c%3DL_Pro
duct_C2%26cid%3D1117044308483%26site%3DUS&pagename=Linksys%2FCommon%2FVisito
rWrapper

6. ADVANTECH PCM 5820

Fig 1. SBC (Single Board Computer)

61

Fig 2. SBC vista lado TOP

Fig 3. SBC vista lado bottom

62

7. LISTADOS DE PROGRAMAS
sip.xml
<?xml version="1.0" ?>
<configuracion>
<sip_general>
<param1>[general]</param1>
<param2>context=default</param2>
<param3>bindaddr=0.0.0.0</param3>
<param4>srvlookup=yes</param4>
<param5>disallow=all</param5>
<param6>allow=alaw</param6>
<param7>allow=ulaw</param7>
<param8>allow=gsm</param8>
<param9>externip=tecnicas3.servehttp.com</param9>
<param10>localnet=10.0.0.0/255.255.255.0</param10>
<param11>register => tecnicas3:cfrd3k@sip.voipbuster.com</param11>
</sip_general>
<sip_provider>
<param1>[provider]</param1>
<param2>type=peer</param2>
<param3>host=sip1.voipbuster.com</param3>
<param4>username=tecnicas3</param4>
<param5>fromuser=tecnicas3</param5>
<param6>secret=xxxxxxx</param6>
</sip_provider>
<sip_user id="200">
<username>200</username>
<secret>200</secret>
<callerid>200</callerid>
<type>friend</type>
<host>dynamic</host>
<context>sip_users</context>
<dtmfmode>rfc2833</dtmfmode>
<insecure>port</insecure>
<canreinvite>yes</canreinvite>
<nat>yes</nat>
<mailbox>200</mailbox>
</sip_user>
</configuracion>

63

voicemail.xml
<?xml version="1.0" ?>
<configuracion>
<vm_general>
<param1>[general]</param1>
<param2>format=wav49|gsm|wav</param2>
<param3>serveremail=IPPBX</param3>
<param4>attach=yes</param4>
<param5>skipms=3000</param5>
<param6>maxsilence=10</param6>
<param7>silencethreshold=128</param7>
<param8>maxlogins=3</param8>
<param9>emaildateformat=%A, %B %d, %Y at %r</param9>
<param10>sendvoicemail=yes</param10>
<param11>[default]</param11>
</vm_general>
<vm_user id="100">
<username>100</username>
<secret>100</secret>
<name>Juan</name>
<email>jcpriotti@gmail.com</email>
</vm_user>

Index.html
<html>
<body>
<style>
form {
width: 50%;
margin: auto;
text-align: left; }
</style>
<form action="login.php" method="post">
<H3>IP PBX login</H3>
<p>Username: <input type="text" name="username" /></p>
<p>Password :<input type="password" name="password" /></p>
<p><input type="submit" value="Login" /></p>
</form>
</body>
</html>

Index_error.html
<html>
<body>
<style>
form {
width: 50%;

64

margin: auto;
text-align: left; }
</style>
<form action="login.php" method="post">
<H3>IP PBX login</H3>
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="Login" /></p><br />
<H4>El nombre de usuario o el password son incorrectos!</H4>
</form>
</body>
</html>

login.php
<?
session_start();
$username = $_POST["username"];
$password = $_POST["password"];
$e = ERROR;
if ( $password == "password" && $username == "admin" )
{
$e = OK;
}
else
$e = ERROR;
if
{

($e == OK)
$_SESSION['logged'] = 1;
$url = "ippbx.php";

}
else
{
session_destroy();
$url = "index_error.html";
}
header("location:$url");
?>

config/sidebar.inc
<style>
form {
width: 50%;
margin: 5%;
text-align: right; }
div {
width: 20%;
height: 500%;
float:left;
}
</style>

<div>

65

<img src = "images/telefono.jpeg"><br/><br />


<a href = "ippbx.php?page=create_account"<img src="images/ccrear.png"></a><br>
<a href = "ippbx.php?page=edit_account"<img src="images/ceditar.png"></a><br>
<a href = "ippbx.php?page=delete_account"<img src="images/cborrar.png"></a><br>
<a href = "ippbx.php?page=create_voicemail"<img src="images/vcrear.png"></a><br>
<a href = "ippbx.php?page=edit_voicemail"<img src="images/veditar.png"></a><br>
<a href = "ippbx.php?page=delete_voicemail"<img
src="images/vborrar.png"></a><br>
<a href = "ippbx.php?page=list_calls"<img src="images/llamadas.png"></a><br>
<a href = "ippbx.php?page=edit_config"<img
src="images/configuracion.png"></a><br>
<a href = "ippbx.php?page=apply_changes"<img src="images/aplicar.png"></a><br>
<a href = "ippbx.php?page=logout"<img src="images/salir.png"></a><br>
</div>

ippbx.php
<?php
session_start();
?>
<html>
<body>
<?php
if(!isset($_SESSION['logged']) && $_SESSION['logged']!=1){
session_destroy();
} else {
include('config/sidebar.inc');
switch ($_GET['page']) {
case 'create_account':
include('create_account.html');
break;
case 'edit_account':
include('edit_account.php');
break;
case 'delete_account':
include('delete_account.php');
break;
case 'create_voicemail':
include('create_voicemail.html');
break;
case 'edit_voicemail':
include('edit_voicemail.php');
break;
case 'delete_voicemail':
include('delete_voicemail.php');
break;
case 'list_calls':
include('list_calls.php');
break;
case 'edit_config':
include('edit_config.php');
break;
case 'apply_changes':
include('apply_changes.php');
break;
case 'logout':
include('logout.php');

66

break;

default:
?>
<H3>IP PBX:</H3><br />
Utilice los menes de para crear, editar y eliminar cuentas de usuario y de
voicemail, <br />
listar llamadas, modificar archivos de configuracin y aplicar cambios.<br />
<?php
break;
};
}
?>
</body>
</html>

create_account.html
<html>
<body>
<H3>Creacin de cuentas</H3>
<form action="create_account.php" method="post">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="text" name="secret" /></p>
<p>CallerID: <input type="text" name="callerid" /></p>
<p>Host: <input type="text" name="host" value="dynamic"/></p>
<p>Context: <input type="text" name="context"
value="sip_users"/></p>
<p>DTMF Mode: <select name="dtmfmode">
<option value=rfc2833>rfc2833</option>";
<option value=inband>inband</option>";
<option value=info>info</option>";
<option value=auto>auto</option>";
</select></p>
<p>Insecure: <select name="insecure">
<option value=port>port</option>";
<option value=invite>invite</option>";
<option value=port,invite>port,invite</option>";
</select></p>
<p>CanReinvite: <select name="canreinvite">
<option value=yes>yes</option>";
<option value=no>no</option>";
</select></p>
<p>Nat: <select name="nat">
<option value=yes>yes</option>";
<option value=no>no</option>";
</select></p>
<p><input type="submit" /></p>
</form>
</body>
</html>

create_account.php

67

<?php
include('config/sidebar.inc');
$username=$_POST['username'];
$secret=$_POST['secret'];
$callerid=$_POST['callerid'];
$host=$_POST['host'];
$context=$_POST['context'];
$dtmfmode=$_POST['dtmfmode'];
$insecure=$_POST['insecure'];
$canreinvite=$_POST['canreinvite'];
$nat=$_POST['nat'];
$stringData="";
$destination_xml='/usr/local/etc/asterisk/sip.xml';
$destination_txt='/usr/local/etc/asterisk/sip.conf';
$existe="0";
$error1="0";
$error2="0";
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
//
print_r($xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
//existe la cuenta a crear?
foreach ($xml->sip_user as $sip_user) {
if ($sip_user["id"]=="$username"){
$existe="1";
break;
}
}
//si no existe, la creamos
if ($existe=="0") {
$new_user=$xml->addChild('sip_user');
$new_user->addAttribute('id', $username);
$new_user->addChild('username', $username);
$new_user->addChild('secret', $secret);
$new_user->addChild('callerid', $callerid);
$new_user->addChild('type', 'friend');
$new_user->addChild('host', $host);
$new_user->addChild('context', $context);
$new_user->addChild('dtmfmode', $dtmfmode);
$new_user->addChild('insecure', $insecure);
$new_user->addChild('canreinvite', $canreinvite);
$new_user->addChild('nat', $nat);
$new_user->addChild('mailbox', $username);
//escribimos el archivo xml a disco
$rs=write_file($destination_xml, $xml->asXML());
if ( $rs ) {
$error1="0";
}
else {
$error1="1";
}
//Leemos del XML la configuracion [General]
$param1=$xml->sip_general->param1;

68

$param2=$xml->sip_general->param2;
$param3=$xml->sip_general->param3;
$param4=$xml->sip_general->param4;
$param5=$xml->sip_general->param5;
$param6=$xml->sip_general->param6;
$param7=$xml->sip_general->param7;
$param8=$xml->sip_general->param8;
$param9=$xml->sip_general->param9;
$param10=$xml->sip_general->param10;
$param11=$xml->sip_general->param11;
$provparam1=$xml->sip_provider->param1;
$provparam2=$xml->sip_provider->param2;
$provparam3=$xml->sip_provider->param3;
$provparam4=$xml->sip_provider->param4;
$provparam5=$xml->sip_provider->param5;
$provparam6=$xml->sip_provider->param6;

//creamos un string a partir de los parametros que obtenemos del archivo XML
$stringData=$stringData .
"$param1\n$param2\n$param3\n$param4\n$param5\n$param6\n$param7\n$param8\n$param9
\n$param10\n$param11\n\n$provparam1\n$provparam2\n$provparam3\n$provparam4\n$pro
vparam5\n$provparam6\n\n";
foreach ($xml->sip_user
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
}

as
.
.
.
.
.
.
.
.
.
.
.
.

$sip_user) {
"[" . $sip_user->username . "]\n";
"username=" . $sip_user->username . "\n";
"secret=" . $sip_user->secret . "\n";
"callerid=" . $sip_user->callerid . "\n";
"type=" . $sip_user->type . "\n";
"host=" . $sip_user->host . "\n";
"context=" . $sip_user->context . "\n";
"dtmfmode=" . $sip_user->dtmfmode . "\n";
"insecure=" . $sip_user->insecure . "\n";
"canreinvite=" . $sip_user->canreinvite . "\n";
"nat=" . $sip_user->nat . "\n";
"mailbox=" . $sip_user->mailbox . "\n\n";

//escribimos en disco el archivo de texto sip.conf


$rs=write_file($destination_txt, $stringData);
if ( $rs ) {
$error2="0";
}
else {
$error2="1";
}
}
//mostramos en la pagina web los errores que hayamos obtenido
if ($existe=="1")
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>Error. La
cuenta ya existe.</b></font><br />';
else {
if ($error1=="1" && $error2=="1")
echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Error al intentar crear el archivo de configuracin.</b></font><br
/>';
else

69

echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>La


cuenta ha sido creada exitosamente.</b></font><br />';
}
//funcion que escribe archivos en disco
function write_file($filename, $contents) {
if ($fp=fopen($filename, "w")) {
fputs($fp, $contents, strlen($contents));
fclose($fp);
return 1;
}
else { return 0; }
}
?>

edit_account.php
<html>
<body>
<?php
$username= $_POST['username'];
$destination_xml='/usr/local/etc/asterisk/sip.xml';
if (is_string($username)) {
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else exit('No se puede abrir el archivo $destination_xml');
//buscamos la cuenta a crear
foreach ($xml->sip_user as $sip_user) {
if ($sip_user["id"]=="$username"){
$username=$sip_user->username;
$secret=$sip_user->secret;
$callerid=$sip_user->callerid;
$host=$sip_user->host;
$context=$sip_user->context;
$dtmf=$sip_user->dtmf;
$insecure=$sip_user->insecure;
$canreinvite=$sip_user->canreinvite;
$nat=$sip_user->nat;
break;
}
}

//ac mostramos los formularios para edicion


include('config/sidebar.inc');
?>
<H3>Edicin de cuentas</H3>
<form action="edit_account_action.php" method="post">
<p>Username: <input type="text" name="username"
value="<?=$username?>"/></p>
<p>Password: <input type="text" name="secret"
value="<?=$secret?>"/></p>

70

<p>CallerID: <input type="text" name="callerid"


value="<?=$callerid?>"/></p>
<p>Host: <input type="text" name="host" value="<?=$host?>"/></p>
<p>Context: <input type="text" name="context"
value="<?=$context?>"/></p>
<p>DTMF Mode: <select name="dtmfmode">
<option value=rfc2833>rfc2833</option>";
<option value=inband>inband</option>";
<option value=info>info</option>";
<option value=auto>auto</option>";
</select></p>
<p>Insecure: <select name="insecure">
<option value=port>port</option>";
<option value=invite>invite</option>";
<option value=port,invite>port,invite</option>";
</select></p>
<p>CanReinvite: <select name="canreinvite">
<option value=yes>yes</option>";
<option value=no>no</option>";
</select></p>
<p>Nat: <select name="nat">
<option value=yes>yes</option>";
<option value=no>no</option>";
</select></p>
<p><input type="submit" /></p>
</form>

<!->
<?
}

<H4><meta http-equiv="Refresh" content="0; url=edit_account.php"> </H4> --

else {
?>
<H3>Edicin de cuentas</H3>
<form action="edit_account.php" method="post">
<p>Username: <select name="username">
<option "selected" value="0">Usuario</option>
<?php
//cargamos y leemos las cuentas creadas en el XML y despues las mostramos como
opciones de formulario
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else exit('No se puede abrir el archivo $destination_xml');
foreach ($xml->sip_user as $sip_user) {
echo "<option value=\"$sip_user->username\">$sip_user->username</option>";
}
?>
</select></p>
<p><input type="submit" /></p>
</form>
<?
}
?>

71

</body>
</html>

edit_account_action.php
<?php
include('config/sidebar.inc');
$username=$_POST['username'];
$secret=$_POST['secret'];
$callerid=$_POST['callerid'];
$host=$_POST['host'];
$context=$_POST['context'];
$dtmfmode=$_POST['dtmfmode'];
$insecure=$_POST['insecure'];
$canreinvite=$_POST['canreinvite'];
$nat=$_POST['nat'];
$stringData="";
$destination_xml='/usr/local/etc/asterisk/sip.xml';
$destination_txt='/usr/local/etc/asterisk/sip.conf';
$existe="0";
$error1="0";
$error2="0";
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
//
print_r($xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
//buscamos la cuenta a modificar
foreach ($xml->sip_user as $sip_user) {
if ($sip_user["id"]=="$username"){
$sip_user->username=$username;
$sip_user->secret=$secret;
$sip_user->callerid=$callerid;
$sip_user->host=$host;
$sip_user->context=$context;
$sip_user->dtmf=$dtmf;
$sip_user->insecure=$insecure;
$sip_user->canreinvite=$canreinvite;
$sip_user->nat=$nat;
$sip_user->mailbox=$username;
break;
}
}
//escribimos el archivo xml a disco
$rs=write_file($destination_xml, $xml->asXML());
if ( $rs ) {
$error1="0";
}
else {
$error1="1";
}
//Leemos del XML la configuracion [General]
$param1=$xml->sip_general->param1;

72

$param2=$xml->sip_general->param2;
$param3=$xml->sip_general->param3;
$param4=$xml->sip_general->param4;
$param5=$xml->sip_general->param5;
$param6=$xml->sip_general->param6;
$param7=$xml->sip_general->param7;
$param8=$xml->sip_general->param8;
$provparam1=$xml->sip_provider->param1;
$provparam2=$xml->sip_provider->param2;
$provparam3=$xml->sip_provider->param3;
$provparam4=$xml->sip_provider->param4;
$provparam5=$xml->sip_provider->param5;
$provparam6=$xml->sip_provider->param6;

//creamos un string a partir de los parametros que obtenemos del archivo XML
$stringData=$stringData .
"$param1\n$param2\n$param3\n$param4\n$param5\n$param6\n$param7\n$param8\n$param9
\n$param10\n$param11\n\n$provparam1\n$provparam2\n$provparam3\n$provparam4\n$pro
vparam5\n$provparam6\n\n";
foreach ($xml->sip_user
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
}

as
.
.
.
.
.
.
.
.
.
.
.
.

$sip_user) {
"[" . $sip_user->username . "]\n";
"username=" . $sip_user->username . "\n";
"secret=" . $sip_user->secret . "\n";
"callerid=" . $sip_user->callerid . "\n";
"type=" . $sip_user->type. "\n";
"host=" . $sip_user->host . "\n";
"context=" . $sip_user->context. "\n";
"dtmfmode=" . $sip_user->dtmfmode . "\n";
"insecure=" . $sip_user->insecure . "\n";
"canreinvite=" . $sip_user->canreinvite. "\n";
"nat=" . $sip_user->nat. "\n";
"mailbox=" . $sip_user->mailbox . "\n\n";

//escribimos en disco el archivo de texto sip.conf


$rs=write_file($destination_txt, $stringData);
if ( $rs ) {
$error2="0";
}
else {
$error2="1";
}
//mostramos en la pagina web los errores que hayamos obtenido
if ($error1=="1" && $error2=="1")
echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Error al intentar crear el archivo de configuracin.</b></font><br
/>';
else
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>La
cuenta ha sido editada exitosamente.</b></font><br />';
//funcion que escribe archivos en disco
function write_file($filename, $contents) {
if ($fp=fopen($filename, "w")) {
fputs($fp, $contents, strlen($contents));
fclose($fp);
return 1;

73

}
else { return 0; }
}

?>

delete_account.php
<html>
<body>
<H3>Eliminacin de cuentas</H3>
<form action="delete_account_action.php" method="post">
<p>Username: <select name="username">
<option "selected" value="0">Usuario</option>
<?php
$destination_xml='/usr/local/etc/asterisk/sip.xml';
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
foreach ($xml->sip_user as $sip_user) {
echo "<option value=\"$sip_user->username\">$sip_user->username</option>";
}
?>
</select></p>
<p><input type="submit" /></p>
</form>
</body>
</html>

delete_account_action.php
<?php
include('config/sidebar.inc');
$username=$_POST['username'];
$stringData="";
$destination_xml='/usr/local/etc/asterisk/sip.xml';
$destination_txt='/usr/local/etc/asterisk/sip.conf';
$existe="0";
$error1="0";
$error2="0";
$posicion="0";
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
//buscamos la posicion del usuario a eliminar
foreach ($xml->sip_user as $sip_user) {
if ($sip_user["id"]=="$username"){

74

$existe="1";
break;
}
$posicion++;
}
if ($existe=="1") {
//creamos un documento DOM a partir del documento XML
$doc=new DOMDocument();
$doc->load($destination_xml);
//buscamos el nodo a eliminar y lo eliminamos
$node=$doc->getElementsByTagName("sip_user")->item($posicion);
$doc->getElementsByTagName("configuracion")->item(0)->removeChild($node);
//importamos desde DOM a XML
$xml=simplexml_import_dom($doc);
//guardamos el archivo xml en disco
$rs=write_file($destination_xml, $xml->asXML());
if ( $rs ) {
$error1="0";
}
else {
$error1="1";
}
//Leemos del XML la configuracion [General]
$param1=$xml->sip_general->param1;
$param2=$xml->sip_general->param2;
$param3=$xml->sip_general->param3;
$param4=$xml->sip_general->param4;
$param5=$xml->sip_general->param5;
$param6=$xml->sip_general->param6;
$param7=$xml->sip_general->param7;
$param8=$xml->sip_general->param8;
$param9=$xml->sip_general->param9;
$param10=$xml->sip_general->param10;
$param11=$xml->sip_general->param11;
$provparam1=$xml->sip_provider->param1;
$provparam2=$xml->sip_provider->param2;
$provparam3=$xml->sip_provider->param3;
$provparam4=$xml->sip_provider->param4;
$provparam5=$xml->sip_provider->param5;
$provparam6=$xml->sip_provider->param6;
//creamos un string a partir de los parametros que obtenemos del archivo XML
$stringData=$stringData .
"$param1\n$param2\n$param3\n$param4\n$param5\n$param6\n$param7\n$param8\n$param9
\n$param10\n$param11\n\n$provparam1\n$provparam2\n$provparam3\n$provparam4\n$pro
vparam5\n$provparam6\n\n";
foreach ($xml->sip_user
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData
$stringData=$stringData

as
.
.
.
.
.
.
.
.
.
.

$sip_user) {
"[" . $sip_user->username . "]\n";
"username=" . $sip_user->username . "\n";
"secret=" . $sip_user->secret . "\n";
"callerid=" . $sip_user->callerid . "\n";
"type=" . $sip_user->type. "\n";
"host=" . $sip_user->host . "\n";
"context=" . $sip_user->context. "\n";
"dtmfmode=" . $sip_user->dtmfmode . "\n";
"insecure=" . $sip_user->insecure . "\n";
"canreinvite=" . $sip_user->canreinvite. "\n";

75

$stringData=$stringData .
}

"nat=" . $sip_user->nat. "\n\n";

//escribimos en disco el archivo de texto sip.conf


$rs=write_file($destination_txt, $stringData);
if ( $rs ) {
$error2="0";
}
else {
$error2="1";
}
}
//mostramos en la pagina web los errores que hayamos obtenido
if ($existe=="0")
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>Error. La
cuenta no existe.</b></font><br />';
else {
if ($error1=="1" && $error2=="1")
echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Error al intentar crear el archivo de configuracin.</b></font><br
/>';
else
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>La
cuenta ha sido eliminada exitosamente.</b></font><br />';
}
//funcion que escribe archivos en disco
function write_file($filename, $contents) {
if ($fp=fopen($filename, "w")) {
fputs($fp, $contents, strlen($contents));
fclose($fp);
return 1;
}
else { return 0; }
}

?>

create_voicemail.html
<html>
<body>
<H3>Creacin de Voicemail</H3>
<form action="create_voicemail.php" method="post">
<p>Cuenta: <input type="text" name="username" /></p>
<p>Password: <input type="text" name="secret" /></p>
<p>Nombre: <input type="text" name="name" /></p>
<p>Email: <input type="text" name="email"/></p>
<p><input type="submit" /></p>
</form>
</body>
</html>

76

create_voicemail.php
<?php
include('config/sidebar.inc');
$username=$_POST['username'];
$secret=$_POST['secret'];
$name=$_POST['name'];
$email=$_POST['email'];
$stringData="";
$destination_xml='/usr/local/etc/asterisk/voicemail.xml';
$destination_txt='/usr/local/etc/asterisk/voicemail.conf';
$existe="0";
$error1="0";
$error2="0";
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
//
print_r($xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
//existe la cuenta a crear?
foreach ($xml->vm_user as $vm_user) {
if ($vm_user["id"]=="$username"){
$existe="1";
break;
}
}
//si no existe, la creamos
if ($existe=="0") {
$new_user=$xml->addChild('vm_user');
$new_user->addAttribute('id', $username);
$new_user->addChild('username', $username);
$new_user->addChild('secret', $secret);
$new_user->addChild('name', $name);
$new_user->addChild('email', $email);
//escribimos el archivo xml a disco
$rs=write_file($destination_xml, $xml->asXML());
if ( $rs ) {
$error1="0";
}
else {
$error1="1";
}
//Leemos del XML la configuracion [General]
$param1=$xml->vm_general->param1;
$param2=$xml->vm_general->param2;
$param3=$xml->vm_general->param3;
$param4=$xml->vm_general->param4;
$param5=$xml->vm_general->param5;
$param6=$xml->vm_general->param6;
$param7=$xml->vm_general->param7;
$param8=$xml->vm_general->param8;
$param9=$xml->vm_general->param9;
$param10=$xml->vm_general->param10;
$param11=$xml->vm_general->param11;

77

//creamos un string a partir de los parametros que obtenemos del archivo XML
$stringData=$stringData .
"$param1\n$param2\n$param3\n$param4\n$param5\n$param6\n$param7\n$param8\n$param9
\n$param10\n\n$param11\n";
foreach ($xml->vm_user as $vm_user) {
$stringData=$stringData . $vm_user->username . " => " . $vm_user->secret . "," .
$vm_user->name . "," . $vm_user->email . "\n";
}
//escribimos en disco el archivo de texto sip.conf
$rs=write_file($destination_txt, $stringData);
if ( $rs ) {
$error2="0";
}
else {
$error2="1";
}
}
//mostramos en la pagina web los errores que hayamos obtenido
if ($existe=="1")
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>Error. La
cuenta ya existe.</b></font><br />';
else {
if ($error1=="1" && $error2=="1")
echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Error al intentar crear el archivo de configuracin.</b></font><br
/>';
else
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>La
cuenta ha sido creada exitosamente.</b></font><br />';
}
//funcion que escribe archivos en disco
function write_file($filename, $contents) {
if ($fp=fopen($filename, "w")) {
fputs($fp, $contents, strlen($contents));
fclose($fp);
return 1;
}
else { return 0; }
}

?>

edit_voicemail.php
<html>
<body>
<?php
$username= $_POST['username'];
$destination_xml='/usr/local/etc/asterisk/voicemail.xml';
if (is_string($username)) {

78

//cargamos el archivo de configuracion xml


if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else exit('No se puede abrir el archivo $destination_xml');
//buscamos la cuenta a crear
foreach ($xml->vm_user as $vm_user) {
if ($vm_user["id"]=="$username"){
$username=$vm_user->username;
$secret=$vm_user->secret;
$name=$vm_user->name;
$email=$vm_user->email;
break;
}
}

//ac mostramos los formularios para edicion


include('config/sidebar.inc');
?>
<H3>Edicin de Voicemail</H3>
<form action="edit_voicemail_action.php" method="post">
<p>Cuenta: <input type="text" name="username"
value="<?=$username?>"/></p>
<p>Password: <input type="text" name="secret"
value="<?=$secret?>"/></p>
<p>Nombre: <input type="text" name="name"
value="<?=$name?>"/></p>
<p>Email: <input type="text" name="email"
value="<?=$email?>"/></p>
<p><input type="submit" /></p>
</form>

<!--->
<?
}

<H4><meta http-equiv="Refresh" content="0; url=edit_voicemail.php"> </H4>

else {
?>
<H3>Edicin de Voicemail</H3>
<form action="edit_voicemail.php" method="post">
<p>Cuenta: <select name="username">
<option "selected" value="0">Voicemail</option>
<?php
//cargamos y leemos las cuentas creadas en el XML y despues las mostramos como
opciones de formulario
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else exit('No se puede abrir el archivo $destination_xml');
foreach ($xml->vm_user as $vm_user) {
echo "<option value=\"$vm_user->username\">$vm_user->username</option>";
}
?>

79

</select></p>
<p><input type="submit" /></p>
</form>
<?
}
?>
</body>
</html>

edit_voicemail_action.php
<?php
include('config/sidebar.inc');
$username=$_POST['username'];
$secret=$_POST['secret'];
$name=$_POST['name'];
$email=$_POST['email'];
$stringData="";
$destination_xml='/usr/local/etc/asterisk/voicemail.xml';
$destination_txt='/usr/local/etc/asterisk/voicemail.conf';
$existe="0";
$error1="0";
$error2="0";
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
//
print_r($xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
//buscamos la cuenta a modificar
foreach ($xml->vm_user as $vm_user) {
if ($vm_user["id"]=="$username"){
$vm_user->username=$username;
$vm_user->secret=$secret;
$vm_user->name=$name;
$vm_user->email=$email;
break;
}
}
//escribimos el archivo xml a disco
$rs=write_file($destination_xml, $xml->asXML());
if ( $rs ) {
$error1="0";
}
else {
$error1="1";
}
//Leemos del XML la configuracion [General]
$param1=$xml->vm_general->param1;
$param2=$xml->vm_general->param2;
$param3=$xml->vm_general->param3;
$param4=$xml->vm_general->param4;
$param5=$xml->vm_general->param5;
$param6=$xml->vm_general->param6;

80

$param7=$xml->vm_general->param7;
$param8=$xml->vm_general->param8;
$param9=$xml->vm_general->param9;
$param10=$xml->vm_general->param10;
$param11=$xml->vm_general->param11;
//creamos un string a partir de los parametros que obtenemos del archivo XML
$stringData=$stringData .
"$param1\n$param2\n$param3\n$param4\n$param5\n$param6\n$param7\n$param8\n$param9
\n$param10\n\n$param11\n";
foreach ($xml->vm_user as $vm_user) {
$stringData=$stringData . $vm_user->username . " => " . $vm_user->secret . "," .
$vm_user->name . "," . $vm_user->email . "\n";
}
//escribimos en disco el archivo de texto vm.conf
$rs=write_file($destination_txt, $stringData);
if ( $rs ) {
$error2="0";
}
else {
$error2="1";
}
//mostramos en la pagina web los errores que hayamos obtenido
if ($error1=="1" && $error2=="1")
echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Error al intentar crear el archivo de configuracin.</b></font><br
/>';
else
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>La
cuenta ha sido editada exitosamente.</b></font><br />';
//funcion que escribe archivos en disco
function write_file($filename, $contents) {
if ($fp=fopen($filename, "w")) {
fputs($fp, $contents, strlen($contents));
fclose($fp);
return 1;
}
else { return 0; }
}

?>

delete_voicemail.php
<html>
<body>
<H3>Eliminacin de Voicemail</H3>
<form action="delete_voicemail_action.php" method="post">
<p>Cuenta: <select name="username">
<option "selected" value="0">Voicemail</option>
<?php
$destination_xml='/usr/local/etc/asterisk/voicemail.xml';

81

if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
foreach ($xml->vm_user as $vm_user) {
echo "<option value=\"$vm_user->username\">$vm_user->username</option>";
}
?>
</select></p>
<p><input type="submit" /></p>
</form>
</body>
</html>

delete_voicemail_action.php
<?php
include('config/sidebar.inc');
$username=$_POST['username'];
$stringData="";
$destination_xml='/usr/local/etc/asterisk/voicemail.xml';
$destination_txt='/usr/local/etc/asterisk/voicemail.conf';
$existe="0";
$error1="0";
$error2="0";
$posicion="0";
//cargamos el archivo de configuracion xml
if (file_exists($destination_xml)) {
$xml=simplexml_load_file($destination_xml);
} else {
exit('No se puede abrir el archivo $destination_xml');
}
//buscamos la posicion del usuario a eliminar
foreach ($xml->vm_user as $vm_user) {
if ($vm_user["id"]=="$username"){
$existe="1";
break;
}
$posicion++;
}
if ($existe=="1") {
//creamos un documento DOM a partir del documento XML
$doc=new DOMDocument();
$doc->load($destination_xml);
//buscamos el nodo a eliminar y lo eliminamos
$node=$doc->getElementsByTagName("vm_user")->item($posicion);
$doc->getElementsByTagName("configuracion")->item(0)->removeChild($node);
//importamos desde DOM a XML
$xml=simplexml_import_dom($doc);
//guardamos el archivo xml en disco
$rs=write_file($destination_xml, $xml->asXML());
if ( $rs ) {
$error1="0";
}

82

else {
$error1="1";
}
//Leemos del XML la configuracion [General]
$param1=$xml->vm_general->param1;
$param2=$xml->vm_general->param2;
$param3=$xml->vm_general->param3;
$param4=$xml->vm_general->param4;
$param5=$xml->vm_general->param5;
$param6=$xml->vm_general->param6;
$param7=$xml->vm_general->param7;
$param8=$xml->vm_general->param8;
$param9=$xml->vm_general->param9;
$param10=$xml->vm_general->param10;
$param11=$xml->vm_general->param11;
//creamos un string a partir de los parametros que obtenemos del archivo XML
$stringData=$stringData .
"$param1\n$param2\n$param3\n$param4\n$param5\n$param6\n$param7\n$param8\n$param9
\n$param10\n\n$param11\n";
foreach ($xml->vm_user as $vm_user) {
$stringData=$stringData . $vm_user->username . " => " . $vm_user->secret . "," .
$vm_user->name . "," . $vm_user->email . "\n";
}
//escribimos en disco el archivo de texto vm.conf
$rs=write_file($destination_txt, $stringData);
if ( $rs ) {
$error2="0";
}
else {
$error2="1";
}
}
//mostramos en la pagina web los errores que hayamos obtenido
if ($existe=="0")
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>Error. La
cuenta no existe.</b></font><br />';
else {
if ($error1=="1" && $error2=="1")
echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Error al intentar crear el archivo de configuracin.</b></font><br
/>';
else
echo '<font face="Arial, Helvetica, sans-serif" size="2"><b>La
cuenta ha sido eliminada exitosamente.</b></font><br />';
}
//funcion que escribe archivos en disco
function write_file($filename, $contents) {
if ($fp=fopen($filename, "w")) {
fputs($fp, $contents, strlen($contents));
fclose($fp);
return 1;
}
else { return 0; }

83

?>

list_calls.php
<html>
<body>
<H3>Listado de llamadas</H3>
<?php
$destination = "/var/log/asterisk/cdr-csv/Master.csv";
print "<p><b>CDRs desde el ultimo reset del sistema:</b><br />";
print "<table
border=2><tr><th>Fecha<th>Usuario<th>Destino<th>Duracion(seg)<th>Estado:\n";
if (file_exists($destination)) {
$file = fopen($destination, "r");
while (!feof($file) ) {
$line = fgetcsv($file, 1024);
print "<tr><td>" . $line[10];
print "<td>" . $line[1];
print "<td>" . $line[2];
print "<td>" . $line[13];
print "<td>" . $line[14];
print "\n";
}
print "</table>\n";
fclose($file);
}
?>
</body>
</html>

edit_config.php
<?php
$texto=$_POST['texto'];
$archivo=$_POST['archivo'];
$config_files="/usr/local/etc/asterisk/config_files.txt";
if (is_string($texto))
{
$myFile = "/usr/local/etc/asterisk/$archivo";
$fh = fopen($myFile, 'w');
fwrite($fh, $texto);
fclose($fh);
?>
<H4><meta http-equiv="Refresh" content="0;
url=ippbx.php?page=edit_config"> </H4>
<?
}
else {
// se seleccion un archivo a editar?
if (is_string($archivo))
{
$myFile = "/usr/local/etc/asterisk/$archivo";
$fh = fopen($myFile, 'r');

84

$theData = fread($fh, filesize($myFile));


fclose($fh);
include('config/sidebar.inc');
?>
<html>
<head>
<title>Edicion de archivos de configuracin</title>
</head>
<body>
<H3>Modificar y guardar archivo</H3>
<form action="edit_config.php" method="post">
<strong><?=$archivo?>:</strong><br />
<input type=hidden name="archivo" value="<?=$archivo?>">
<textarea name="texto" rows="20" cols="40">
<?=$theData?></textarea>
<br />
<input type="submit" value="Submit" />
</form>
<?
}
else {
//mostramos las opciones de archivos a editar
?>
<H3>Seleccione el archivo a editar</H3>
<form action="edit_config.php" method="post">
Archivo de configuracin: <select name="archivo">
<?
$config=file($config_files);
foreach ($config as $linea) {
echo "<option value=$linea>$linea</option>";
}
?>
<option value=config_files.txt>config_files.txt</option>
</select>
<p><input type="submit" /></p>
</form>
<?
}
}
?>
</body>
</html>

apply_changes.php
<html>
<body>
<?php
system('/usr/local/sbin/asterisk -rx reload', $retval);
if ($retval == 0) echo '<font face="Arial, Helvetica, sans-serif"
size="2"><b>Cambios aplicados exitosamente.</b></font><br />';

85

else echo "Fall la aplicacin de los cambios";


?>
</body>
</html>

logout.php
<?php
session_destroy();
?>
<html>
<meta http-equiv="Refresh" content="0; url=index.html">
</html>

86