INGENIERIA EN ELECTRONICA
PROBLEMA DE INGENIERA
TECNICAS DIGITALES III
Integrantes:
- Juan Carlos Priotti
- Martn Roberti
Docentes:
- Profesor: Felipe Poblete
- Auxiliar: Mariano Gonzlez
AO 2008
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
27
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
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
61
61
7. LISTADOS DE PROGRAMAS
63
MATERIAS INTEGRADAS
POSIBLES APLICACIONES
BIBLIOGRAFA
Sitios de Internet.
Libros, etc.
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.
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
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.
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/
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:
TEORA DE FUNCIONAMIENTO
La figura 4 muestra un esquema elemental del sistema desarrollado
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:
14
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
En el archivo:
/usr/src/sys/i386/i386/support.s
%edi,%eax
%esi,%eax
%ecx,%eax
1f
15
shrl
cld
rep
movsl
$2,%ecx
movl
andl
20(%esp),%ecx
$3,%ecx
rep
movsb
popl
popl
ret
%edi
%esi
%edi,%eax
%esi,%eax
%ecx,%eax
1f
shrl
cld
rep
movsl
$2,%ecx
movl
andl
20(%esp),%ecx
$3,%ecx
#if 0
/* copy by 32-bit words */
/* nope, copy forwards */
#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
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
17
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
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
-f
/usr/src/tools/tools/tinybsd/tinybsd.bin
-u
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
21
echo $line
done
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
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
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"
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
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.
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
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
USD 120
USD 70
USD 190
USD 65
USD 840
27
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
29
Cuando hacemos clic en el men Cuentas Crear, aparece la ventana que se muestra en la figura
7
30
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.
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.
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
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
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
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
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
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.
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
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
41
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.
43
El primer paso luego de seleccionar Standard es elegir el disco sobre el que trabajaremos en la
instalacin.
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.
45
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 (/)
47
No
48
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
50
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
[ 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
53
54
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.
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>
</Texto>
</Mensaje>
</Edit_Mensaje>
Destinatario, Texto)*>
(Nombre, Mail)>
Nombre (#PCDATA)>
Mail
(#PCDATA)>
57
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.
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[
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
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
60
61
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
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";
69
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;
}
}
70
<!->
<?
}
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";
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 .
}
?>
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
<!--->
<?
}
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
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
logout.php
<?php
session_destroy();
?>
<html>
<meta http-equiv="Refresh" content="0; url=index.html">
</html>
86