Ce projet est désormais interrompu.
C'est parce que je suis tombé sur le projet Drachtio qui partage la même vision et la même structure que j'avais en tête pour ce projet. Drachtio n'est qu'un composant de ce projet - donc cette projection s'est transformée en autres projets qui finiront par élaborer tous les composants requis pour un PBX doux.
Il y a plus à faire, y compris la présence.
Project MediaSwitch est conçu pour être un commutateur VoIP évolutif. Oubliez un couteau à armure suisse prenant en charge 20 protocoles de conduite de vieilles itinéraires RNIS avec H323 ou SIP. Ce projet est conçu pour être mince, efficace et rapide à l'aide d'une architecture asynchrone axée sur les événements. SIP, contrôle des appels et RTP.
La conception est décomposée en 3 composants de base. Chaque composant est principalement une architecture filetée unique avec des ports d'achèvement d'E / S pour le réseau (pensez à Nginx sur Apache). C'est à:
REMARQUE RE FREIR GREEN - autrement connu sous le nom de multi-threading coopératif. Le seul inconvénient avec l'utilisation de cette technique est que votre logiciel doit coopérer avec d'autres threads - c'est-à-dire abandonner le temps de traitement. Le composant SIP utilise C ++ Boost ASIO et le contrôle des appels utilise le nœud JS - les deux très bons frameworks pour ce style. Les deux sont des cadres haute performance. RTP utilise également C ++ Boost ASIO.
Pour la plupart des utilisateurs, cela signifie que lorsque vous écrivez des scripts de nœuds pour vos propres scénarios de contrôle des appels, vous devez comprendre la nature asynchrone du nœud et comment écrire correctement JavaScript asynchrone. Vous pouvez verrouiller l'ensemble du fil de contrôle en n'abandonnant pas le temps du processeur. Cependant, lorsque vous faites les choses correctement, vous vous retrouvez avec un serveur très efficace.
Les 3 composants principaux:
Chaque composant peut s'exécuter sur le même serveur ou sur des serveurs séparés. Cela permet, par exemple, le serveur 1 exécutant le contrôle SIP et des appels, alors si vous transcodez fortement, ce qui augmente la charge des serveurs RTP, plusieurs serveurs RTP.
Les événements sont communiqués via un mécanisme d'événements HTTP. c'est-à-dire que si un nouvel appel SIP est généré par un client (qui envoie une invitation SIP), le projet-SIP transmettra une demande HTTP au serveur de contrôle. Le serveur de contrôle communiquera ensuite des instructions à la fois au serveur SIP et au serveur RTP (s).
La conception de ce projet est conçue pour fonctionner avec les services cloud afin que les charges de travail puissent être étendues de haut en bas.
Une partie de la conception est d'être en mémoire. IE Le serveur SIP ne doit pas être tenu de demander une base de données pour obtenir des informations de répertoire. Après le démarrage, les informations de répertoire doivent être poussées vers le serveur SIP (soit par le serveur de contrôle, soit votre site Web - un hôte amical) - pensez à Memcache.
Les trois projets sont conçus pour s'exécuter sur le même serveur physique ou des serveurs séparés. De cette façon, l'équilibrage de charge entre les serveurs peut être réalisé. Plusieurs serveurs RTP peuvent ensuite être exécutés pour gérer de grands volumes de transcodage pour chaque serveur SIP et Control.
Tous les services communiquent entre eux via HTTP. La section suivante définit les interfaces. Dans cette section, tous les exemples utilisent Curl pour obtenir ou publier des données.
Comme Project-Sip, le contrôle a une interface HTTP. Ceci est simplifié par la bibliothèque de contrôle, l'écriture des scripts de contrôle des appels deviennent simples:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;La bibliothèque peut être incluse avec
const projectcontrol = require ( "projectcontrol" )(Remarque Cela changera lorsqu'il sera publié!).
Le serveur SIP exige que les informations utilisateur y soient téléchargées.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )Nous pouvons contrôler les codecs que nous permettons. Associé: PCMA, PCMU, 722, ILBC @ 20, 2833. (Remarque ILBC et 2833 TODO).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]Nous aimerions être informés des nouveaux appels
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}L'objet «appel» qui est passé contient des informations internes pour suivre l'appel. Informations concernant si elle sonne, répond, HungUp, etc. Vous pouvez également définir des fonctions de rappel sur l'appel
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" } } )
}
}Une fois que ProjectControl a été configuré, les besoins en RUNE sont des appels qui mettent tout cela dans sa boucle d'événements.
projectcontrol . run ( )Liste des setters pour les rappels dans ProjectControl:
Ceux-ci peuvent être appelés plusieurs fois et les rappels seront empilés et tous appelés.
Getters
Méthodes
Semblable au serveur SIP Invite, cet appel proviendra d'un nouvel appel - mais il passera par le traitement d'appel en premier (par rapport à l'interface SIP qui appellera aveuglément le point de terminaison SIP).
Informer le serveur de contrôle d'une enregistrement SIP. Généré par le serveur SIP et envoyé au serveur de contrôle configuré à l'aide de l'interface du répertoire.
Mettez 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 "
}L'hôte et le port sont le réseau client (d'où vient la demande) et l'agent est la chaîne d'agent rapportée par le client SIP.
Exemple: Curl -x Post --Data-RAW '{"Domain": "bling.babblevoice.com", "utilisateur": "1000"}' -h "Content-Type: application / json" http: // contrôle / regist
Généré par le serveur SIP et envoyé à l'adresse de contrôle par rapport au domaine configuré à l'aide de l'interface du répertoire. Informer le serveur de contrôle d'une dégagement SIP.
Supprimer http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
Exemple à l'aide de curl: curl -x delete --data-raw '{"domain": "bling.babblevoice.com", "utilisateur": "1000"}' -h "contenu-type: application / json" http: // contrôle / reg
Cette interface est utilisée pour ajouter des informations de répertoire au serveur SIP.
Mettez http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}Renvoie 201 sur le succès.
Exemple utilisant 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
Ceci est synonyme de patch.
Cela remplacera l'utilisateur uniquement. Lorsque vous placez le domaine, cela remplace l'ensemble de l'objet de domaine.
Mettez 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
Renvoie JSON répertoriant cette entrée de domaines dans le répertoire.
Retirez l'entrée dans le répertoire. L'utilisateur peut également être spécifié - /dir/bling.babblevoice.com/1003.
Renvoie le nombre de clients enregistrés.
L'exemple:
Obtenez http://127.0.0.1:9000/reg/bling.babblevoice.com
ou pour filtrer pour un utilisateur spécifique
Obtenez http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
Renvoie 200 avec le corps:
{
"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
}
}
}
}Lorsqu'une demande est pour un domaine spécifique, les champs sont:
Obtenez http://127.0.0.1:9000/reg/
Renvoie 200 avec le corps:
{
"count" : 1255
}Il s'agit d'un décompte complet de toutes les inscriptions sur ce serveur SIP.
Créer un nouvel appel.
CURL -X POST --Data-RAW '[{"Domain": "bling.babblevoice.com", "to:" "," From ":" "," maxforwards ": 70," callerid ": {" numéro ":" 123 "," name ":" 123 "," private ": false}," contrôle ": {" hôte ":" 127.0.0.0.1 " }}] '-H "Content-Type: Application / JSON" http://127.0.0.1/invite
L'option de contrôle est facultative. Si c'est dans c'est le serveur qui recevra des mises à jour concernant le flux d'appel. Sinon, la valeur par défaut répertoriée dans le champ "to" sera utilisée. Sinon, aucune mise à jour ne sera envoyée.
Exemple: Curl -x Post --data-raw '{"callid": "", "alertinfo": "SomealertInfo"}' -h "Content-Type: Application / JSON" http: // sip / dir
Si l'appel n'est pas dans un état de sonnerie ou de réponse, il enverra une sonnerie 180 avec des informations d'alerte si elle est envoyée.
La publication d'un document vierge créera un nouveau canal.
Exemple: curl -x post --data-raw '{}' -h "Content-Type: Application / JSON" http: // rtp /
Le serveur renvoie un document JSON. Y compris les statistiques concernant la charge de travail du serveur afin que le serveur de contrôle puisse prendre des décisions en fonction de la charge de travail ainsi que du routage.
Remarque, j'ai inclus RFC 4028 ici pour d'éventuels travaux futurs.
Le serveur SIP peut être exécuté avec l'indicateur de test:
Projet-sip - test
Dans le dossier TestFiles, il existe également d'autres fichiers de test.
Les ports par défaut pour le serveur sont 9000 pour le serveur Web et 5060 pour le serveur SIP.
Quelques notes sur l'utilisation de Valgrind pour les tests de mémoire.
Valgrind --tool = Massif Project-RTP --FG
Après l'exécution, cela créera un fichier Massif dans la direction à partir de laquelle vous exécutez valgrind. IE Massif.out.3823 Vous pouvez utiliser MS_Print pour prévoir ces econtent de ce fichier:
ms_print massif.out.3823
Valgrind - Leak-Check = Oui Project-RTP --FG
RegisterClient.xml & .csv.
Qui sont des fichiers de configuration à utiliser avec SIPP qui peuvent tester divers scénarios.
SIPP 127.0.0.1:9997 -SF registerClient.xml -inf registre.csv -m 1 -l 1 -trace_msg -trace_err
ou sans les fichiers de journalisation.
SIPP 127.0.0.1:9997 -SF RegisterClient.xml -inf RegisterClient.csv -M 1 -L 1
Pour télécharger des données de test sur le serveur SIP Utiliser
SIPP 127.0.0.1 -Sf uaclateoffer.xml -m 1 -l 1
DNF Installez CCACH @ Development-Tools G ++ Boost-Devel ILBC-Devel SpandSp-Devel OpenSSL-Devel Nodejs