voip2day 2013: construyendo una centralita virtual con freeswitch
Post on 21-Jun-2015
547 Views
Preview:
DESCRIPTION
TRANSCRIPT
Construyendo una centralita virtualcon FreeSWITCH
7 de noviembre de 2013
José Francisco Irlesjfirles@siptize.com
@josefu
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Sobre Siptize
● Operador VoIP● Satmak: Soft-Switch 4/5● Plataforma Hosted PBX● Consultoría VoIP
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
¿Qué es FreeSWITCH? (I)
● Plataforma Open Source de comunicaciones● Puede usarse como:
– Biblioteca (libfreeswitch)– Softphone– PBX– Soft-switch– Etc
● Licencia MPL 1.1 ● B2BUA
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
¿Qué es FreeSWITCH? (y II)
● Configuración en XML (hay alternativas)● Soporte para diferentes protocolos
– SIP (udp, tcp, websockets)– H323– XMPP-Jingle– SCCP– Skype– TDM (FreeTDM)
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
¿Por qué elegir FreeSWITCH? (I)
● Máxima de FreeSWITCH: no reinventar la rueda– Sofia SIP– cURL– PostgreSQL y SQLite para el core
● Multiplataforma● Escalabilidad● Flexibilidad● Multi dominio● Sofia Profiles
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
¿Por qué elegir FreeSWITCH? (y II)
● Modelo de datos no prefijado● Tecnologías estándar para “realtime”:
– HTTP– XML– JSON
● Lenguaje de programación:– El que tú decidas
● Facilidad para clusterizar el backend: HTTP
con FreeSWITCH se liga más,y lo sabes...
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Arquitectura Hosted PBX
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Configuración de FreeSWITCH
● Módulo mod_xml_curl– Configuración mínima en local (fichero xml)– Resto de configuración cargada mediante servicio
web– RESTful
● POST a url configurada
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Ejemplo mod_xml_curl: REGISTER
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Request/Response de FreeSWITCH al servidor web
<document type="freeswitch/xml"> <section name="directory"> <domain name="domain1.awesomevoipdomain.faketld"> <params> <param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/> </params> <groups> <group name="default"> <users> <user id="1004"> <params> <param name="password" value="some_password"/> </params> </user> </users> </group> </groups> </domain> </section></document>
[hostname] => testmachine[section] => directory[tag_name] => domain[key_name] => name[key_value] => domain1.awesomevoipdomain.faketld[Event-Name] => REQUEST_PARAMS[Core-UUID] => c5c8cbf4-60c3-45a2-b110-933da620cfd2[FreeSWITCH-Hostname] => 25515_1_36308_177178[FreeSWITCH-IPv4] => 192.168.1.10[FreeSWITCH-IPv6] => ::1[Event-Date-Local] => 2009-10-27 00:47:10[Event-Date-GMT] => Tue, 27 Oct 2009 07:47:10 GMT[Event-Date-Timestamp] => 1256629630733916[Event-Calling-File] => sofia_reg.c[Event-Calling-Function] => sofia_reg_parse_auth[Event-Calling-Line-Number] => 1671[action] => sip_auth[sip_profile] => internal[sip_user_agent] => PolycomSoundPointIP-SPIP_320-UA/3.1.0.0084[sip_auth_username] => 1004[sip_auth_realm] => domain1.awesomevoipdomain.faketld[sip_auth_nonce] => 533c5264-12cb-4f8b-bcdb-5ecabe5e540f[sip_auth_uri] => sip:domain1.awesomevoipdomain.faketld:5060[sip_contact_user] => 1004[sip_contact_host] => 192.168.1.100[sip_to_user] => 1004[sip_to_host] => domain1.awesomevoipdomain.faketld[sip_from_user] => 1004[sip_from_host] => domain1.awesomevoipdomain.faketld[sip_request_host] => domain1.awesomevoipdomain.faketld[sip_request_port] => 5060[sip_auth_qop] => auth[sip_auth_cnonce] => hSVnPb32nA/OtkY[sip_auth_nc] => 00000001[sip_auth_response] => 6e4e611d7593d52e02451b70900071d8[sip_auth_method] => REGISTER[key] => id[user] => 1004[domain] => domain1.awesomevoipdomain.faketld[ip] => 192.168.1.100
Request Response
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Interactuar con FreeSWITCH
● Módulo mod_event_socket– Modo inbound/outbound– Enviar comandos y recibir la respuestas– Escucha de eventos– Conexión “statefull”: Socket TCP– “Equivalente” en asterisk: manager + FastAGI
● Módulo mod_xml_rpc: RESTful– Sólo para enviar comandos (y recibir su respuesta)– Conexión “stateless”: HTTP (request/response)
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Eventos en FreeSWITCH
● mod_event_socket (visto antes)● mod_event_multicast
– Permite replicar registros y presencia sin compartir base de datos
● mod_erlang_event● mod_event_zmq
– Formato JSON– Escalable– Bindings para múltiples lenguajes
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
CDR
● mod_cdr_xm l (recomendado)● mod_cdr_csv● mod_cdr_mongodb● mod_cdr_pg_csv● mod_cdr_sqlite● mod_json_cdr● mod_radius_cdr
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Ejemplo de CDR en XML
<?xml version="1.0"?><cdr core-uuid="5d80b2bf-7ae1-4fed-803e-7edf94468be0"> <channel_data> <state>CS_REPORTING</state> <direction>inbound</direction> <state_number>11</state_number> <flags>0=1;3=1;19=1;36=1;37=1;39=1;52=1;73=1</flags> <caps>1=1;2=1;3=1;4=1;5=1;6=1</caps> </channel_data> <variables> <direction>inbound</direction> <uuid>897211c5-2f67-4c77-9928-c8c0b9e49972</uuid> <session_id>56</session_id> <sip_from_user>100</sip_from_user> <sip_from_uri>100%40testsip.com</sip_from_uri> <sip_from_host>testsip.com</sip_from_host> <channel_name>sofia/internal/100%40testsip.com</channel_name> <sip_received_port>5060</sip_received_port> <sip_via_protocol>udp</sip_via_protocol> <sip_authorized>true</sip_authorized> <accountcode>100%40testsip.com</accountcode> <user_context>default</user_context>
…. <app_log> <application app_name="export" app_data="domain_name=testsip.com" app_stamp="1378365023484959"></application> <application app_name="export" app_data="domain=testsip.com" app_stamp="1378365023485712"></application> <application app_name="export" app_data="pbx_id=4028818b40e7e3830140e7e38512002f" app_stamp="1378365023486343"></application>
…. </app_log> <callflow dialplan="XML" unique-id="0ff824e3-80c0-495e-9292-4f09c787e942" profile_index="1"> <extension name="default_extension" number="*60600" current_app="transfer"> <application app_name="export" app_data="domain_name=testsip.com"></application> <application app_name="export" app_data="domain=testsip.com"></application> ….. </callflow>
….
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Alta Disponibilidad: cómo dormir más tranquilo
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Estrategia alta disponibilidad
● Base de datos en cluster HA● Replicar en “n” datacenters:
– Base de datos (sólo elementos necesarios)● Datos “read-only”
– Los CDR's se envían a la db principal● Usar los DNS
– Repartir carga (granularidad: centralita)– Ante un fallo en datacenter:
● Failover automático → SRV● Failover manual → Cambio en DNS
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
sofia recover
● “Magia” en FreeSWITCH● Se mueve todo (media incluido) de un servidor
a otro● El usuario sólo detecta una pérdida momentánea
de audio● Requerimientos:
– Base de datos del core compartida● <param name="odbc-dsn" value="odbc://dsn:username:password"/>● <param name="core-recovery-db-dsn" value="odbc://dsn:username:password"/>
– Parámetro en configuración de sofia:● <param name=”track-calls” value=”true”/>
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
sofia recover: situación normal
● Nodo activo:– “n” llamadas con media a través de él– “m” llamadas sin media a través de él
● Nodo pasivo, dos alternativas:– FreeSWITCH apagado– FreeSWITCH en marcha
● net.ipv4.ip_nonlocal_b ind=1
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
sofia recover: fallo en nodo activo
● Parar nodo activo● Nodo pasivo adquiere la IP flotante● Forzar update en tabla arp en el router
(arping)● Ejecutar “sofia recover” en nodo pasivo
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
sofia recover: nodo pasivo pasa a activo
● Se recuperan las llamadas activas● Pequeño lapsus (~2 segundos) sin audio
entre las extensiones
José Francisco Irles
www.siptize.com
Construyendo una centralita virtual con FreeSWITCH @josefu
Visión global de plataforma de centralita virtual
www.siptize.com
¿Preguntas?
top related