Este proyecto ahora está descontinuado.
Esto se debe a que me encontré con el proyecto Drachtio que comparte la misma visión y estructura que tenía en mente para este proyecto. Drachtio es solo un componente de este proyecto, por lo que este proyectado se ha transformado en otros proyectos que eventualmente eliminarán todos los componentes necesarios para un PBX blando.
Hay más por hacer, incluida la presencia.
Project MediaSwitch está diseñado para ser un interruptor de VoIP escalable. Olvídese de un cuchillo de armero suizo que apoya 20 protocolos que unen rutas ISDN antiguas con H323 o SIP. Este proyecto está diseñado para ser delgado, eficiente y rápido utilizando una arquitectura asincrónica basada en eventos. SIP, control de llamadas y RTP.
El diseño se descompone en 3 componentes centrales. Cada componente es principalmente una arquitectura roscada única con puertos de finalización de E/S para la red (piense en Nginx sobre Apache). Esto es para:
Nota RE Hilos verdes, también conocidos como cooperativo múltiple, subprocesos. El único inconveniente con el uso de esta técnica es que su software tiene que cooperar con otros hilos, es decir, renunciar al tiempo de procesamiento. El componente SIP utiliza C ++ Boost ASIO y Call Control usa el nodo JS, ambos marcos muy buenos para este estilo. Ambos son marcos de alto rendimiento. RTP también usa C ++ Boost ASIO.
Para la mayoría de los usuarios, esto significa que cuando está escribiendo scripts de nodo para sus propios escenarios de control de llamadas, debe comprender la naturaleza asincrónica del nodo y cómo escribir correctamente JavaScript asíncrono. Puede bloquear todo el hilo de control al no renunciar al tiempo del procesador. Sin embargo, cuando lo hace bien, termina con un servidor muy eficiente.
Los 3 componentes principales:
Cada componente puede ejecutarse en el mismo servidor o en servidores separados. Esto permite, por ejemplo, el servidor 1 ejecutando el control de SIP y la llamada, entonces si transcode en gran medida, lo que aumenta la carga de los servidores RTP, múltiples servidores RTP.
Los eventos se comunican a través de un mecanismo de eventos HTTP. es decir, si un cliente genera una nueva llamada SIP (que envía una invitación SIP), entonces Project-SIP volverá a pasar una solicitud HTTP al servidor de control. El servidor de control comunicará las instrucciones de nuevo al servidor SIP y al servidor RTP.
El diseño de este proyecto está diseñado para funcionar con servicios en la nube para que las cargas de trabajo se puedan escalar de manera apropiada.
Parte del diseño es estar en memoria. es decir, el servidor SIP no se debe requerir que consulte una base de datos para obtener información del directorio. Después de comenzar, la información del directorio debe ser presionada al servidor SIP (ya sea por el servidor de control o su sitio web, un host amable), piense en memcache.
Los tres proyectos están diseñados para ejecutarse en el mismo servidor físico o servidores separados. De esta manera, se puede lograr el equilibrio de carga entre los servidores. Luego se pueden ejecutar múltiples servidores RTP para manejar grandes volúmenes de transcodificación para cada servidor SIP y control.
Todos los servicios se comunican entre sí a través de HTTP. La siguiente sección define las interfaces. En esta sección, todos los ejemplos usan curl para obtener o publicar datos.
Al igual que Project-SIP, el control tiene una interfaz HTTP. Esto se simplifica por la biblioteca de control, la escritura de scripts de control de llamadas se vuelve simple:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;La biblioteca se puede incluir con
const projectcontrol = require ( "projectcontrol" )(Tenga en cuenta que esto cambiará cuando se libere!).
El servidor SIP requiere que se cargue la información del usuario.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )Podemos controlar qué códecs permitimos. Supuestado: PCMA, PCMU, 722, ILBC@20, 2833. (Nota ILBC y 2833 TODO).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]Nos gustaría estar informados sobre nuevas llamadas
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}El objeto 'Llamada' que se pasa contiene información interna para rastrear la llamada. Información sobre si está sonando, respondió, colgó, etc. También puede establecer funciones de devolución de llamada en la llamada
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
call . onhangup = ( ) =>
{
console . log ( "hung up" )
}
/* Indicate ringing to the caller - not needed as the second leg ringing signal will be passed back */
call . ring ( )
/* Make a call */
if ( "3" == call . destination )
{
call . newcall ( { to : { user : "1003" } } )
}
}Una vez que ProjectControl se haya configurado, Ejecutar necesidades de llamadas que lo colocen todo en su bucle de eventos.
projectcontrol . run ( )Lista de setters para devoluciones de llamadas en ProjectControl:
Estos se pueden llamar varias veces y las devoluciones de llamada se apilarán y se llaman todos.
Getters
Métodos
Similar a la invitación del servidor SIP, esta llamada originará una nueva llamada, pero primero pasará por el procesamiento de llamadas (en comparación con la interfaz SIP que llamará ciegamente el punto final SIP).
Notifique al servidor de control de un registro SIP. Generado por el servidor SIP y enviado al servidor de control configurado utilizando la interfaz de directorio.
Pon http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
{
"host" : " 127.0.0.1 " ,
"port" : 45646 ,
"agent" : " Z 5.2.28 rv2.8.114 "
}El host y el puerto son la red del cliente (de donde proviene la solicitud) y el agente es la cadena del agente informada por el cliente SIP.
Ejemplo: curl -x post --data -raw '{"dominio": "bling.babblevoice.com", "usuario": "1000"}' -h "tipo de contenido: aplicación/json" http: // reg/reg
Generado por el servidor SIP y enviado a la dirección de control contra el dominio configurado utilizando la interfaz de directorio. Notifique al servidor de control de una desinscripción SIP.
Eliminar http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
Ejemplo usando curl: curl -x delete --data -raw '{"dominio": "bling.babblevoice.com", "usuario": "1000"}' -h "type de contenido: aplicación/json" http: // control/reg
Esta interfaz se utiliza para agregar información de directorio al servidor SIP.
Pon http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}Devuelve 201 al éxito.
Ejemplo usando curl:
curl -X PUT --data-raw '{ "control": "http://127.0.0.1:9001", "users": [ { "username": "1003", "secret": "1123654789"}]}' -H "Content-Type:application/json" http://127.0.0.1/dir/bling.babblevoice.com
Esto es sinónimo de parche.
Esto reemplazará solo al usuario. Cuando se ponga el dominio, esto reemplaza todo el objeto de dominio.
Pon http://127.0.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}curl -x put --data -raw '{"secret": "1123654789"}' -h "contenido -type: aplicación/json" http://127.0.1/dir/bling.babblevoice.com/1003
Devuelve JSON enumerando esta entrada de dominios en el directorio.
Elimine la entrada en el directorio. El usuario también se puede especificar - /dir/bling.babblevoice.com/1003.
Devuelve el número de clientes registrados.
El ejemplo:
Obtenga http://127.0.0.1:9000/reg/bling.babblevoice.com
o para filtrar para un usuario específico
Obtenga http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
Devuelve 200 con el cuerpo:
{
"domain" : " bling.babblevoice.com " ,
"count" : 3 ,
"registered" : 1 ,
"users" : {
"1000" : {
"registered" : false
},
"1001" : {
"registered" : false
},
"1003" : {
"registered" : true ,
"outstandingping" : 0 ,
"remote" : {
"host" : " 127.0.0.1 " ,
"port" : 42068 ,
"agent" : " Z 5.2.28 rv2.8.114 "
},
"epochs" : {
"registered" : 1552507958
}
}
}
}Cuando una solicitud es de un dominio específico, los campos son:
Obtenga http://127.0.0.1:9000/reg/
Devuelve 200 con el cuerpo:
{
"count" : 1255
}Este es un recuento completo de todos los registros en este servidor SIP.
Origina una nueva llamada.
curl -x post --data -raw '[{"dominio": "bling.babblevoice.com", "a:" "," de ":", "maxforwards": 70, "callerID": {"número": "123", "nombre": "123", "privado": falso}, "control": {"host": "127.0.0.0. }}] '-H "Content -type: Application/JSON" http://127.0.0.1/invite
La opción de control es opcional. Si es en este, el servidor recibirá actualizaciones con respecto al flujo de llamadas. De lo contrario, se utilizará el predeterminado en el campo "a". Si no es esto, no se enviarán actualizaciones.
Ejemplo: curl -x post --data -raw '{"callID": "", "alertinfo": "somealertinfo"}' -h "contenido: aplicación/json" http: // dir/diry
Si la llamada no está en un estado de sonar o responder, enviará un sonar 180 junto con la información de alerta si se envía.
Publicar un documento en blanco creará un nuevo canal.
Ejemplo: curl -x post --data -raw '{}' -h "content -type: aplicación/json" http: // rtp/
El servidor devolverá un documento JSON. Incluyendo estadísticas sobre la carga de trabajo del servidor para que el servidor de control pueda tomar decisiones basadas en la carga de trabajo y el enrutamiento.
Nota, he incluido RFC 4028 aquí para un posible trabajo futuro.
El servidor SIP se puede ejecutar con el indicador de prueba:
SIP-SIP-Test
En los archivos de prueba de carpetas también hay otros archivos de prueba.
Los puertos predeterminados para el servidor son 9000 para el servidor web y 5060 para el servidor SIP.
Algunas notas sobre el uso de Valgrind para las pruebas de memoria.
Valgrind--Tool = Massif Project-rtp --fg
Después de ejecutar, esto creará un archivo Massif en el Directry desde el que ejecuta Valgrind. es decir, Massif.out.3823 Puede usar MS_PRINT para pretender los Econtents de este archivo:
MS_PRINT MASSIF.OUT.3823
Valgrind--Leak-check = sí Project-rtp --fg
RegisterClient.xml & .csv.
Que son archivos de configuración que se utilizarán con SIPP que pueden probar varios escenarios.
sipp 127.0.0.1:9997 -sf registroClient.xml -inf registroClient.csv -m 1 -l 1 -trace_msg -trace_err
o sin los archivos de registro.
Sipp 127.0.0.1:9997 -SF RegisterClient.xml -inf RegisterClient.CSV -M 1 -L 1
Para cargar datos de prueba en el uso del servidor SIP
SIPP 127.0.0.1 -SF UACLATOOFFER.XML -M 1 -L 1
DNF Instalar ccache @desarrollo de desarrollo g ++ boost-devel ILBC-devel spandsp-devel openssl-devel nodejs