Este projeto agora está descontinuado.
Isso ocorre porque me deparei com o projeto Drachtio, que compartilha a mesma visão e estrutura que eu tinha em mente para este projeto. O Drachtio é apenas um componente deste projeto - portanto, este projetado se transformou em outros projetos que acabarão por todos os componentes necessários para um PBX suave.
Há mais a fazer, incluindo presença.
O Project MediaSwitch foi projetado para ser um interruptor de VoIP escalável. Esqueça uma faca suíça que suporta 20 protocolos que pontecem as antigas rotas ISDN com H323 ou SIP. Este projeto foi projetado para ser esbelto, eficiente e rápido usando uma arquitetura assíncrona orientada a eventos. Sip, controle de chamadas e RTP.
O design é dividido em 3 componentes principais. Cada componente é principalmente uma única arquitetura rosqueada com portas de conclusão de E/S para rede (pense no Nginx sobre o Apache). Isto é:
Nota RE Green Threads - também conhecida como multi -threading cooperativa. A única desvantagem do uso dessa técnica é que seu software precisa cooperar com outros threads - ou seja, desistir do tempo de processamento. O componente SIP usa o C ++ Boost ASIO e o controle de chamadas usa o nó JS - ambas as estruturas muito boas para esse estilo. Ambos são estruturas de alto desempenho. O RTP também usa C ++ Boost ASIO.
Para a maioria dos usuários, isso significa que, quando você está escrevendo scripts do nó para seus próprios cenários de controle de chamadas, você deve entender a natureza assíncrona do nó e como escrever corretamente JavaScript assíncrono. Você pode bloquear todo o encadeamento de controle por não desistir do tempo do processador. No entanto, quando você acerta, acaba com um servidor muito eficiente.
Os 3 componentes principais:
Cada componente pode ser executado no mesmo servidor ou em servidores separados. Isso permite, por exemplo, o servidor 1 executando o controle SIP e as chamadas, se você transcode muito que aumenta a carga dos servidores RTP, vários servidores RTP.
Os eventos são comunicados por meio de um mecanismo de eventos HTTP. ou seja, se uma nova chamada SIP for gerada por um cliente (que envia um convite SIP), o projeto-SIP passará uma solicitação HTTP de volta ao servidor de controle. O Control Server comunicará as instruções de volta ao servidor SIP e ao (s) servidor (s) RTP (s).
O design deste projeto foi projetado para funcionar com serviços em nuvem, para que as cargas de trabalho possam ser ampliadas para cima e para baixo adequadamente.
Parte do design é estar na memória. ou seja, o servidor SIP não deve precisar consultar um banco de dados para obter informações de diretório. Após o início, as informações do diretório devem ser enviadas para o servidor SIP (pelo servidor de controle ou pelo seu site - um host amigável) - pense em memcache.
Todos os três projetos foram projetados para executar no mesmo servidor físico ou servidores separados. Dessa forma, o balanceamento de carga entre os servidores pode ser alcançado. Vários servidores RTP podem ser executados para lidar com grandes volumes de transcodificação para cada servidor SIP e controle.
Todos os serviços se comunicam via HTTP. A seção a seguir define as interfaces. Nesta seção, todos os exemplos usam Curl para obter ou postar dados.
Como o Project-SIP, o Control possui uma interface HTTP. Isso é simplificado pela Biblioteca de Control, escrevendo scripts de controle de chamadas se tornam simples:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;A biblioteca pode ser incluída com
const projectcontrol = require ( "projectcontrol" )(Observe que isso mudará quando lançado!).
O servidor SIP exige que as informações do usuário sejam carregadas para ele.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )Podemos controlar quais codecs permitimos. SUPORTED: PCMA, PCMU, 722, ILBC@20, 2833. (Nota ILBC e 2833 TODO).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]Gostaríamos de ser informados sobre novas chamadas
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}O objeto 'Call', que é passado, contém informações internas para rastrear a chamada. Informações
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" } } )
}
}Depois que o ProjectControl estiver configurado, a execução precisa chamar quais lugares tudo em seu loop de eventos.
projectcontrol . run ( )Lista de setters para chamadas de volta no ProjectControl:
Estes podem ser chamados várias vezes e os retornos de chamada serão empilhados e todos chamados.
Getters
Métodos
Semelhante ao convite do servidor SIP, essa chamada originará uma nova chamada - mas passará pelo processamento de chamadas primeiro (em comparação com a interface SIP que chamará cegamente o terminal SIP).
Notifique o servidor de controle de um registro SIP. Gerado pelo servidor SIP e enviado ao servidor de controle configurado usando a interface do diretório.
Coloque 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 "
}O host e a porta são a rede de clientes (de onde veio a solicitação) e o agente é a sequência do agente relatada pelo cliente SIP.
Exemplo: curl -x post -data -raw '{"domain": "bling.babblevoice.com", "user": "1000"}' -h "content -type: aplicativo/json" http: // control/reg/reg
Gerado pelo servidor SIP e enviado para o endereço de controle em relação ao domínio configurado usando a interface do diretório. Notifique o servidor de controle de um des-registro SIP.
Exclua http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
Exemplo usando CURL: Curl -x Delete -Data -Raw '{"Domain": "Bling.babblevoice.com", "Usuário": "1000"}' -h "content -type: Application/JSON" http: // Control/Reg
Essa interface é usada para adicionar informações de diretório ao servidor SIP.
Coloque http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}Retorna 201 no sucesso.
Exemplo 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
Isso é sinônimo de patch.
Isso substituirá apenas o usuário. Quando colocar o domínio, isso substitui o objeto de domínio inteiro.
Coloque http://127.0.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}curl -x put - -data -raw '{"secret": "1123654789"}' -h "content -type: Application/json" http://127.0.0.1/dir/bling.babblevoice.com/1003
Retorna o JSON listando este domínios a entrada no diretório.
Remova a entrada no diretório. O usuário também pode ser especificado - /dir/bling.babblevoice.com/1003.
Retorna o número de clientes registrados.
O exemplo:
Obtenha http://127.0.0.1:9000/reg/bling.babblevoice.com
ou filtrar para um usuário específico
Obtenha http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
Retorna 200 com o corpo:
{
"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
}
}
}
}Quando um pedido é para um domínio específico, os campos são:
Obtenha http://127.0.0.1:9000/reg/
Retorna 200 com o corpo:
{
"count" : 1255
}Esta é uma contagem completa de todos os registros neste servidor SIP.
Originar uma nova chamada.
Curl -x post -data -raw '[{"domain": "bling.babblevoice.com", "para:" "," de ":" "," maxforwards ": 70," CallerID ": {" Número ":" 123, "Nome": "123" "," "" ":" {"Control": "123," Name ":" 123 "," "" " }}] '-H "content -type: Application/json" http://127.0.0.1/invite
A opção de controle é opcional. Se estiver neste servidor, que receberá atualizações sobre o fluxo de chamadas. Caso contrário, o padrão listado no campo "To" será usado. Caso contrário, nenhuma atualização será enviada.
Exemplo: Curl -x Post - -Data -Raw '{"Callid": "", "Alertinfo": "SomEalertinfo"}' -h "Type: Application/Json" http: // sip/dir
Se a chamada não estiver em um estado de toque ou respondido, ela enviará um toque 180 junto com informações de alerta, se enviado.
Publicar um documento em branco criará um novo canal.
Exemplo: Curl -x Post - -Data -Raw '{}' -h "Content -Type: Application/JSON" http: // rtp/
O servidor retornará um documento JSON. Incluindo estatísticas sobre a carga de trabalho do servidor para que o servidor de controle possa tomar decisões com base na carga de trabalho e no roteamento.
Observe que incluí o RFC 4028 aqui para possíveis trabalhos futuros.
O servidor SIP pode ser executado com o sinalizador de teste:
Projeto-SIP-Test
Na pasta Testfiles, também existem outros arquivos de teste.
As portas padrão do servidor são 9000 para o servidor da Web e 5060 para o servidor SIP.
Algumas notas sobre o uso de Valgrind para teste de memória.
Valgrind--tool = MASSIF Project-RTP--FG
Após a execução, isso criará um arquivo maciço na direção da qual você executa Valgrind. ou seja, massif.out.3823 você pode usar o MS_PRINT para pretender os econtents deste arquivo:
ms_print Massif.out.3823
valgrind--leak-check = sim project-rtp--fg
RegisterClient.xml & .csv.
Que são arquivos de configuração a serem usados com o SIPP, que podem testar vários cenários.
SIPP 127.0.0.1:9997 -SF RegisterClient.xml -inf RegisterClient.csv -m 1 -l 1 -trace_msg -trace_err
ou sem os arquivos de log.
SIPP 127.0.0.1:9997 -SF RegisterClient.xml -inf RegisterClient.csv -m 1 -l 1
Para fazer upload de dados de teste para o uso do servidor SIP
SIPP 127.0.0.1 -SF uaclateoffer.xml -m 1 -l 1
DNF install ccache @desenvolvimento-tools g ++ boost-devel ilbc-devel spandsp-devel openssl-devel nodejs