Dieses Projekt wird jetzt eingestellt.
Dies liegt daran, dass ich auf das Drachtio -Projekt gestoßen bin, das die gleiche Vision und Struktur teilt, die ich für dieses Projekt im Sinn habe. Drachtio ist nur eine Komponente dieses Projekts - daher hat sich dieses projizierte in andere Projekte verwandelt, die letztendlich alle für ein weiche PBX erforderlichen Komponenten ausführen werden.
Es gibt noch mehr zu tun, einschließlich der Präsenz.
Project MediaSwitch ist ein skalierbarer VoIP -Switch. Vergessen Sie ein Schweizer-Army-Messer, das 20 Protokolle unterstützt, die alte ISDN-Routen mit H323 oder SIP überbrücken. Dieses Projekt ist mit einer ereignisorientierten, asynchronen Architektur schlank, effizient und schnell ausgestattet. SIP, Rufregelung und RTP.
Das Design ist in 3 Kernkomponenten unterteilt. Jede Komponente ist in erster Linie eine einzelne Thread -Architektur mit E/A -Abschlussports für Netzwerk (denken Sie an Nginx über Apache). Dies ist zu:
HINWEIS RE GREEN Threads - auch als kooperatives Multi -Threading bekannt. Der einzige Nachteil bei der Verwendung dieser Technik ist, dass Ihre Software mit anderen Threads zusammenarbeiten muss - dh die Verarbeitungszeit aufgeben. Die SIP -Komponente verwendet C ++ Boost ASIO und Call Control verwendet Knoten JS - beide sehr gute Frameworks für diesen Stil. Beide sind Hochleistungsrahmen. RTP verwendet auch C ++ Boost ASIO.
Für die meisten Benutzer bedeutet dies, wenn Sie Knotenskripte für Ihre eigenen Call Control -Szenarien schreiben, müssen Sie die asynchrone Natur des Knotens verstehen und wie man asynchrone JavaScript ordnungsgemäß schreibt. Sie können den gesamten Kontrollfaden einsperrten, indem Sie die Prozessorzeit nicht aufgeben. Wenn Sie es jedoch richtig machen, erhalten Sie einen sehr effizienten Server.
Die 3 Hauptkomponenten:
Jede Komponente kann entweder auf demselben Server oder auf separaten Servern ausgeführt werden. Dies ermöglicht beispielsweise Server 1, das SIP und Call Control ausführt.
Die Ereignisse werden über einen HTTP -Ereignismechanismus kommuniziert. dh wenn ein neuer SIP-Anruf von einem Client generiert wird (der eine SIP-Einladung sendet), übergeben Project-SIP eine HTTP-Anforderung an den Steuerserver zurück. Control Server übermittelt dann Anweisungen sowohl dem SIP -Server als auch dem RTP -Server (en) zurück.
Das Design dieses Projekts ist so konzipiert, dass er mit Cloud -Diensten funktioniert, damit Workloads angemessen auf und ab skaliert werden können.
Ein Teil des Designs ist es, in Memory zu sein. IE Der SIP -Server sollte nicht verpflichtet werden, eine Datenbank abzufragen, um Verzeichnisinformationen zu erhalten. Nach dem Start sollten Verzeichnisinformationen auf den SIP -Server (entweder über den Steuerserver oder Ihre Website - ein freundlicher Host) gedrückt werden - denken Sie an Memcache.
Alle drei Projekte sind so konzipiert, dass sie entweder auf demselben physischen Server oder separaten Servern ausgeführt werden. Auf diese Weise kann ein Lastausgleich zwischen Servern erreicht werden. Anschließend können mehrere RTP -Server ausgeführt werden, um große Transkodierungsvolumina für jeden SIP- und Kontrollserver zu verarbeiten.
Alle Dienste kommunizieren über HTTP miteinander. Der folgende Abschnitt definiert die Schnittstellen. In diesem Abschnitt verwenden alle Beispiele Curl, um Daten zu erhalten oder zu posten.
Wie Project-SIP verfügt Control über eine HTTP-Schnittstelle. Dies wird durch die Kontrollbibliothek vereinfacht, und das Schreiben von Anrufkontrollskripten wird einfach:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;Die Bibliothek kann mit enthalten sein
const projectcontrol = require ( "projectcontrol" )(Beachten Sie, dass sich dies bei der Veröffentlichung ändern wird!).
Auf dem SIP -Server müssen Benutzerinformationen darauf hochgeladen werden.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )Wir können steuern, welche Codecs wir zulassen. SURPORTED: PCMA, PCmu, 722, ILBC@20, 2833. (Anmerkung ILBC und 2833 Todo).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]Wir möchten über neue Anrufe informiert werden
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}Das in "Anruf" übergebene "Anruf" enthält interne Informationen, um den Anruf zu verfolgen. Informationen darüber, ob es klingelt, beantwortet, hugup usw. Sie können auch Rückruffunktionen auf dem Anruf festlegen
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" } } )
}
}Sobald ProjectControl konfiguriert wurde, muss der Run -Bedarf angerufen werden, der alles in seiner Ereignisschleife legt.
projectcontrol . run ( )Liste der Setzer für Anrufbeutel in ProjectControl:
Diese können mehrmals aufgerufen werden und die Rückrufe werden gestapelt und alle aufgerufen.
Getters
Methoden
Ähnlich wie beim SIP -Server wird ein neuer Anruf eingeladen, aber er wird zuerst die Anrufverarbeitung durchlaufen (im Vergleich zur SIP -Schnittstelle, die blind den SIP -Endpunkt aufruft).
Benachrichtigen Sie den Steuerserver über eine SIP -Registrierung. Generiert vom SIP -Server und an den Control Server gesendet, der mit der Verzeichnisschnittstelle konfiguriert ist.
Setzen Sie 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 "
}Der Host und Port sind das Client -Netzwerk (wobei die Anfrage stammt) und der Agent ist die vom SIP -Client gemeldete Agent -Zeichenfolge.
Beispiel: curl -x post - -data -raw '{"domain": "bling.babblevoice.com", "Benutzer": "1000"}' -h "Content -Type: Application/JSON" http: // control/reg
Erstellt vom SIP -Server und gesendet an die Steueradresse mit der mit der Verzeichnisschnittstelle konfigurierten Domäne. Benachrichtigen Sie den Steuerserver über eine SIP-De-Registrierung.
Löschen Sie http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
Beispiel mit Curl: curl -x delete - -data -raw '{"domain": "bling.babblevoice.com", "Benutzer": "1000"}' -h "content -type: application/json" http: // control/reg
Diese Schnittstelle wird zum Hinzufügen von Verzeichnisinformationen zum SIP -Server verwendet.
Setzen Sie http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}Rücksendung 201 zum Erfolg.
Beispiel mit 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
Dies ist ein Synonym für Patch.
Dies ersetzt nur den Benutzer. Wenn Sie die Domäne setzen, ersetzen Sie das gesamte Domänenobjekt.
Setzen Sie http://127.0.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}curl -x put - -data -raw '{"Geheimnis": "1123654789"}' -h "Content-type: application/json" http://127.0.0.1/dir/bling.babblevoice.com/1003
Gibt JSON zurück, das diesen Domain -Eintrag im Verzeichnis auflistet.
Entfernen Sie den Eintrag in das Verzeichnis. Der Benutzer kann auch angegeben werden - /dir/bling.babblevoice.com/1003.
Gibt die Anzahl der registrierten Kunden zurück.
Das Beispiel:
Holen Sie sich http://127.0.0.1:9000/reg/bling.babblevoice.com
oder für einen bestimmten Benutzer zu filtern
Holen Sie sich http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
Gibt 200 mit dem Körper zurück:
{
"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
}
}
}
}Wenn eine Anfrage für eine bestimmte Domäne bestimmt ist, sind die Felder:
Holen Sie sich http://127.0.0.1:9000/reg/
Gibt 200 mit dem Körper zurück:
{
"count" : 1255
}Dies ist eine vollständige Anzahl aller Registrierungen auf diesem SIP -Server.
Einen neuen Anruf entstehen.
curl -X POST --data-raw '[{ "domain": "bling.babblevoice.com", "to: "", "from": "", "maxforwards": 70, "callerid": { "number": "123", "name": "123", "private": false }, "control": { "host": "127.0.0.1", "port": 9001 }}] '-H "content -type: application/json" http://127.0.0.1/invite
Die Steuerungsoption ist optional. Wenn dies in diesem Bereich ist, erhält der Server Aktualisierungen bezüglich des Anrufflusses. Wenn nicht, wird die im Feld "TO" aufgeführte Standardeinstellung verwendet. Wenn nicht, werden keine Aktualisierungen gesendet.
Beispiel: curl -x post - -data -raw '{"callid": "", "alertInfo": "somealtinfo"}' -h "Inhaltstyp: application/json" http: // sip/dir
Wenn sich der Anruf nicht in einem klingenden oder beantworteten Zustand befindet, wird ein 180er Klingeln zusammen mit Warninformationen gesendet, wenn er gesendet wird.
Das Posten eines leeren Dokuments erstellt einen neuen Kanal.
Beispiel: curl -x post - -data -raw '{}' -h "content -type: application/json" http: // rtp/
Der Server gibt ein JSON -Dokument zurück. Einschließlich Statistiken zur Arbeitsbelastung des Servers, damit der Steuerserver sowohl auf der Workload als auch auf der Routing Entscheidungen treffen kann.
Beachten Sie, ich habe hier RFC 4028 für mögliche zukünftige Arbeiten aufgenommen.
Der SIP -Server kann mit dem Testflag ausgeführt werden:
Projekt-SIP-Test
In den Ordner -Testdaten gibt es auch andere Testdateien.
Die Standardports für den Server sind 9000 für den Webserver und 5060 für den SIP -Server.
Einige Hinweise zur Verwendung von Valgrind für Speichertests.
Valgrind--Tool = MASFIF PROJECT-RTP-FG
Nach dem Laufen erstellt dies eine Massiv -Datei im Direktor, aus dem Sie Valgrind ausführen. IE MASSF.OUT.3823 Mit MS_PRINT können Sie die Ekontents dieser Datei vorgeben:
MS_PRINT MASSF.OUT.3823
Valgrind-Leak-Check = Ja Project-RTP--FG
RegisterClient.xml & .csv.
Das sind Konfigurationsdateien, die mit SIPP verwendet werden sollen, die verschiedene Szenarien testen können.
SIPP 127.0.0.1:9997 -sf RegisterClient.xml -inf RegisterClient.csv -m 1 -l 1 -trace_msg -trace_err
oder ohne die Protokollierungsdateien.
SIPP 127.0.0.1:9997 -sf RegisterClient.xml -inf RegisterClient.csv -m 1 -l 1
So hochladen Sie Testdaten auf die Verwendung des SIP -Servers
SIPP 127.0.0.1 -sf uaclateoffer.xml -m 1 -l 1
DNF Installation CCACHE @Development-Tools G ++ Boost-Devel ILBC-Devel Spandsp-Devel OpenSL-Devel NodeJs