Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Sicherlich hatten viele von Ihnen, wie ich, die Idee, etwas Einzigartiges zu tun. In diesem Artikel beschreibe ich die technischen Probleme und Lösungen, mit denen ich bei der Entwicklung der PBX konfrontiert war. Vielleicht hilft das jemandem, sich für seine eigene Idee zu entscheiden, und jemandem, den ausgetretenen Pfaden zu folgen, denn auch ich habe von der Erfahrung der Pioniere profitiert.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Idee und Schlüsselanforderungen

Und alles begann einfach mit der Liebe zu Sternchen (Framework für den Aufbau von Kommunikationsanwendungen), Automatisierung von Telefonie und Installationen FreePBX (Weboberfläche für Sternchen). Wenn die Anforderungen des Unternehmens nicht konkret sind und innerhalb der Möglichkeiten liegen FreePBX - alles super. Die gesamte Installation erfolgte innerhalb von XNUMX Stunden, das Unternehmen erhielt eine konfigurierte Telefonanlage, eine benutzerfreundliche Oberfläche und eine kurze Schulung sowie auf Wunsch Support.

Aber die interessantesten Aufgaben waren ungewöhnlich und dann war es nicht so toll. Sternchen kann viel tun, aber um das Webinterface funktionsfähig zu halten, musste ein Vielfaches mehr Zeit aufgewendet werden. Daher kann ein kleines Detail viel länger dauern als die Installation des Rests der TK-Anlage. Dabei geht es nicht darum, dass das Schreiben einer Weboberfläche lange dauert, sondern vielmehr um die architektonischen Merkmale FreePBX. Architekturansätze und -methoden FreePBX wurde zur Zeit von PHP4 angelegt, und zu diesem Zeitpunkt gab es bereits PHP5.6, auf dem alles einfacher und bequemer gemacht werden konnte.

Der letzte Tropfen, der das Fass zum Überlaufen brachte, waren grafische Wählpläne in Form eines Diagramms. Als ich versuchte, so etwas zu bauen FreePBXMir wurde klar, dass ich es deutlich umschreiben müsste und es einfacher wäre, etwas Neues zu bauen.

Die wichtigsten Anforderungen waren:

  • Einfache Einrichtung, selbst für unerfahrene Administratoren intuitiv zugänglich. Somit benötigen Unternehmen von unserer Seite keine PBX-Wartung,
  • einfache Modifikation, sodass Aufgaben in angemessener Zeit gelöst werden können,
  • einfache Integration mit PBX. U FreePBX Es gab keine API zum Ändern von Einstellungen, d. h. Sie können beispielsweise keine Gruppen oder Sprachmenüs aus einer Drittanbieteranwendung erstellen, sondern nur die API selbst Sternchen,
  • OpenSource – für Programmierer ist dies äußerst wichtig für Modifikationen für den Client.

Die Idee einer schnelleren Entwicklung bestand darin, dass die gesamte Funktionalität aus Modulen in Form von Objekten besteht. Alle Objekte mussten eine gemeinsame übergeordnete Klasse haben, was bedeutet, dass die Namen aller Hauptfunktionen bereits bekannt sind und es daher bereits Standardimplementierungen gibt. Mit Objekten können Sie die Anzahl der Argumente in Form von assoziativen Arrays mit Zeichenfolgenschlüsseln drastisch reduzieren, was Sie in herausfinden können FreePBX Dies war möglich, indem die gesamte Funktion und die verschachtelten Funktionen untersucht wurden. Bei Objekten zeigt die banale Autovervollständigung alle Eigenschaften an und vereinfacht im Allgemeinen das Leben um ein Vielfaches. Darüber hinaus lösen Vererbung und Neudefinition bereits viele Probleme mit Modifikationen.

Das nächste, was die Nacharbeitszeit verlangsamte und das es zu vermeiden lohnte, war die Duplizierung. Wenn es ein Modul gibt, das für die Anwahl eines Mitarbeiters verantwortlich ist, sollten alle anderen Module, die einen Anruf an einen Mitarbeiter senden müssen, dieses verwenden und keine eigenen Kopien erstellen. Wenn Sie also etwas ändern müssen, müssen Sie die Änderungen nur an einer Stelle vornehmen und die Suche nach „wie es funktioniert“ sollte an einer Stelle erfolgen und nicht während des gesamten Projekts.

Erste Version und erste Fehler

Der erste Prototyp war innerhalb eines Jahres fertig. Die gesamte Telefonanlage war wie geplant modular aufgebaut und die Module konnten nicht nur neue Funktionen zur Anrufbearbeitung hinzufügen, sondern auch die Weboberfläche selbst verändern.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen
Ja, die Idee, einen Wählplan in Form eines solchen Schemas zu erstellen, stammt nicht von mir, aber es ist sehr praktisch und ich habe das Gleiche getan Sternchen.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Durch das Schreiben eines Moduls konnten Programmierer bereits:

  • Erstellen Sie Ihre eigene Funktionalität zur Anrufbearbeitung, die sowohl im Diagramm als auch im Menü der Elemente auf der linken Seite platziert werden kann.
  • Erstellen Sie Ihre eigenen Seiten für die Weboberfläche und fügen Sie Ihre Vorlagen zu vorhandenen Seiten hinzu (sofern der Seitenentwickler dies vorgesehen hat),
  • Fügen Sie Ihre Einstellungen zur Haupteinstellungsregisterkarte hinzu oder erstellen Sie Ihre eigene Einstellungsregisterkarte.
  • Der Programmierer kann von einem vorhandenen Modul erben, einen Teil der Funktionalität ändern und unter einem neuen Namen registrieren oder das ursprüngliche Modul ersetzen.

So können Sie beispielsweise Ihr eigenes Sprachmenü erstellen:

......
class CPBX_MYIVR extends CPBX_IVR
{
 function __construct()
 {
 parent::__construct();
 $this->_module = "myivr";
 }
}
.....
$myIvrModule = new CPBX_MYIVR();
CPBXEngine::getInstance()->registerModule($myIvrModule,__DIR__); //Зарегистрировать новый модуль
CPBXEngine::getInstance()->registerModuleExtension($myIvrModule,'ivr',__DIR__); //Подменить существующий модуль

Die ersten komplexen Umsetzungen brachten den ersten Stolz und die ersten Enttäuschungen. Ich war froh, dass es funktionierte, dass ich die Hauptfunktionen bereits reproduzieren konnte FreePBX. Ich war froh, dass den Leuten die Idee des Programms gefiel. Es gab noch viele Möglichkeiten, die Entwicklung zu vereinfachen, aber schon damals wurden einige Aufgaben bereits erleichtert.

Die API zum Ändern der PBX-Konfiguration war eine Enttäuschung – das Ergebnis entsprach überhaupt nicht unseren Wünschen. Ich habe das gleiche Prinzip wie in übernommen FreePBXDurch Klicken auf die Schaltfläche „Übernehmen“ wird die gesamte Konfiguration neu erstellt und die Module neu gestartet.

Es sieht so aus:

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen
*Der Wählplan ist eine Regel (Algorithmus), nach der ein Anruf verarbeitet wird.

Mit dieser Option ist es jedoch unmöglich, eine normale API zum Ändern der PBX-Einstellungen zu schreiben. Erstens der Vorgang des Anwendens von Änderungen auf Sternchen zu lang und ressourcenintensiv.
Zweitens können Sie nicht zwei Funktionen gleichzeitig aufrufen, weil Beide erstellen die Konfiguration.
Drittens werden alle Einstellungen übernommen, auch die vom Administrator vorgenommenen.

In dieser Version, wie in Askoziawar es möglich, die Konfiguration nur der geänderten Module zu generieren und nur die notwendigen Module neu zu starten, aber das sind alles halbe Sachen. Es war notwendig, den Ansatz zu ändern.

Zweite Version. Nase herausgezogen, Schwanz steckengeblieben

Die Idee zur Lösung des Problems bestand nicht darin, die Konfiguration und den Wählplan neu zu erstellen Sternchen, aber Informationen in der Datenbank speichern und direkt aus der Datenbank lesen, während der Anruf verarbeitet wird. Sternchen Ich wusste bereits, wie man Konfigurationen aus der Datenbank liest. Ändern Sie einfach den Wert in der Datenbank und der nächste Anruf wird unter Berücksichtigung der Änderungen verarbeitet. Die Funktion war perfekt zum Lesen von Wählplanparametern REALTIME_HASH.

Am Ende war nicht einmal ein Neustart nötig Sternchen Beim Ändern der Einstellungen wurden alle Einstellungen sofort übernommen Sternchen.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Die einzigen Änderungen am Wählplan sind das Hinzufügen von Durchwahlnummern und Hinweise. Aber das waren kleine, punktuelle Änderungen

exten=>101,1,GoSub(‘sub-callusers’,s,1(1)); - точечное изменение, добавляется/изменяется через ami

; sub-callusers – универсальная функция генерится при установке модуля.
[sub-callusers]
exten =>s,1,Noop()
exten =>s,n,Set(LOCAL(TOUSERID)=${ARG1})
exten =>s,n,ClearHash(TOUSERPARAM)
exten =>s,n,Set(HASH(TOUSERPARAM)=${REALTIME_HASH(rl_users,id,${LOCAL(TOUSERID)})})
exten =>s,n,GotoIf($["${HASH(TOUSERPARAM,id)}"=""]?return)
...

Mit können Sie ganz einfach eine Leitung im Wählplan hinzufügen oder ändern Freund (Steuerschnittstelle Sternchen) und es ist kein Neustart des gesamten Wählplans erforderlich.

Dadurch wurde das Problem mit der Konfigurations-API gelöst. Sie könnten sogar direkt in die Datenbank gehen und eine neue Gruppe hinzufügen oder beispielsweise die Einwahlzeit im Feld „Dialtime“ für die Gruppe ändern und der nächste Anruf würde bereits die angegebene Zeit dauern (Dies ist keine Empfehlung für Aktion, da einige API-Vorgänge dies erfordern Freund Anrufe).

Die ersten schwierigen Umsetzungen brachten wieder den ersten Stolz und die erste Enttäuschung. Ich war froh, dass es funktioniert hat. Die Datenbank wurde zu einem kritischen Glied, die Abhängigkeit von der Festplatte nahm zu, es gab mehr Risiken, aber alles funktionierte stabil und ohne Probleme. Und was am wichtigsten ist: Jetzt konnte alles, was über die Webschnittstelle erledigt werden konnte, über die API erledigt werden, und es wurden dieselben Methoden verwendet. Darüber hinaus wurde in der Weboberfläche die Schaltfläche „Einstellungen auf PBX anwenden“ entfernt, die von Administratoren oft vergessen wurde.

Die Enttäuschung war, dass die Entwicklung komplizierter wurde. Seit der ersten Version hat die PHP-Sprache einen Wählplan in der Sprache generiert Sternchen und es sieht völlig unlesbar aus, dazu noch die Sprache selbst Sternchen Für das Schreiben eines Wählplans ist es äußerst primitiv.

So sah es aus:

$usersInitSection = $dialplan->createExtSection('usersinit-sub','s');
$usersInitSection
 ->add('',new Dialplanext_gotoif('$["${G_USERINIT}"="1"]','exit'))
 ->add('',new Dialplanext_set('G_USERINIT','1'))
 ->add('',new Dialplanext_gosub('1','s','sub-AddOnAnswerSub','usersconnected-sub'))
 ->add('',new Dialplanext_gosub('1','s','sub-AddOnPredoDialSub','usersinitondial-sub'))
 ->add('',new Dialplanext_set('LOCAL(TECH)','${CUT(CHANNEL(name),/,1)}'))
 ->add('',new Dialplanext_gotoif('$["${LOCAL(TECH)}"="SIP"]','sipdev'))
 ->add('',new Dialplanext_gotoif('$["${LOCAL(TECH)}"="PJSIP"]','pjsipdev'))

In der zweiten Version wurde der Wählplan universell, er umfasste alle möglichen Verarbeitungsmöglichkeiten je nach Parameter und seine Größe nahm deutlich zu. All dies hat die Entwicklungszeit erheblich verlangsamt, und allein der Gedanke, dass es wieder einmal notwendig war, in den Wählplan einzugreifen, machte mich traurig.

Die dritte Version

Die Idee, das Problem zu lösen, war nicht zu generieren Sternchen Wählplan aus PHP herunterladen und verwenden FastAGI und alle Verarbeitungsregeln in PHP selbst schreiben. FastAGI ermöglicht Sternchen, um den Anruf zu verarbeiten, stellen Sie eine Verbindung zum Socket her. Empfangen Sie von dort Befehle und senden Sie Ergebnisse. Somit liegt die Logik des Wählplans bereits außerhalb der Grenzen Sternchen und kann in jeder Sprache geschrieben werden, in meinem Fall in PHP.

Es gab viel Versuch und Irrtum. Das Hauptproblem war, dass ich bereits viele Klassen/Dateien hatte. Es dauerte etwa 1,5 Sekunden, Objekte zu erstellen, sie zu initialisieren und sich gegenseitig zu registrieren, und diese Verzögerung pro Aufruf kann nicht ignoriert werden.

Die Initialisierung sollte nur einmal erfolgen und daher begann die Suche nach einer Lösung mit dem Schreiben eines Dienstes in PHP P-Threads. Nach einer Woche des Experimentierens wurde diese Option aufgrund der Komplexität der Funktionsweise dieser Erweiterung auf Eis gelegt. Nach einem Monat des Testens musste ich auch die asynchrone Programmierung in PHP aufgeben; ich brauchte etwas Einfaches, das jedem PHP-Anfänger vertraut ist, und viele Erweiterungen für PHP sind synchron.

Die Lösung war unser eigener Multithread-Dienst in C, der mit kompiliert wurde PHPLIB. Es lädt alle ATS-PHP-Dateien, wartet auf die Initialisierung aller Module, fügt einander einen Rückruf hinzu und speichert ihn zwischen, wenn alles fertig ist. Bei Anfrage per FastAGI Es wird ein Stream erstellt, eine Kopie aus dem Cache aller Klassen und Daten darin reproduziert und die Anfrage an die PHP-Funktion übergeben.

Bei dieser Lösung vergeht die Zeit vom Absenden eines Anrufs an unseren Service bis zum ersten Befehl Sternchen von 1,5 s auf 0,05 s verringert und diese Zeit hängt leicht von der Größe des Projekts ab.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Dadurch wurde die Zeit für die Entwicklung des Wählplans erheblich verkürzt, und ich weiß das zu schätzen, da ich den gesamten Wählplan aller Module in PHP neu schreiben musste. Erstens sollten Methoden bereits in PHP geschrieben sein, um ein Objekt aus der Datenbank zu erhalten; sie wurden für die Anzeige im Webinterface benötigt, und zweitens, und das ist die Hauptsache, ist es endlich möglich, bequem mit Zeichenfolgen mit Zahlen und Arrays zu arbeiten mit Datenbank und vielen PHP-Erweiterungen.

Um den Dialplan in der Modulklasse zu verarbeiten, müssen Sie die Funktion implementieren dialplanDynamicCall und Argumentation pbxCallRequest enthält ein Objekt, mit dem man interagieren kann Sternchen.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Darüber hinaus wurde es möglich, den Dialplan zu debuggen (PHP verfügt über xdebug und funktioniert für unseren Dienst). Sie können Schritt für Schritt vorgehen, indem Sie die Werte von Variablen anzeigen.

Anrufdaten

Für alle Analysen und Berichte sind korrekt erfasste Daten erforderlich, und auch dieser PBX-Block hat von der ersten bis zur dritten Version viele Versuche und Irrtümer durchlaufen. Anrufdaten sind oft ein Zeichen. Ein Anruf = eine Aufzeichnung: Wer hat angerufen, wer hat geantwortet, wie lange haben sie gesprochen? Bei interessanteren Optionen gibt es ein zusätzliches Schild, das anzeigt, welcher PBX-Mitarbeiter während des Anrufs angerufen wurde. Doch all das deckt nur einen Teil des Bedarfs ab.

Die anfänglichen Anforderungen waren:

  • Speichern Sie nicht nur, wen die TK-Anlage angerufen hat, sondern auch, wer geantwortet hat, denn Es kommt zu Abhörversuchen und dies muss bei der Analyse von Anrufen berücksichtigt werden.
  • Zeit, bevor Sie sich mit einem Mitarbeiter in Verbindung setzen. In FreePBX Bei einigen anderen TK-Anlagen gilt der Anruf als angenommen, sobald die TK-Anlage den Hörer abnimmt. Für das Sprachmenü müssen Sie jedoch bereits den Hörer abheben, damit alle Anrufe beantwortet werden und die Wartezeit auf eine Antwort 0-1 Sekunde beträgt. Daher wurde beschlossen, nicht nur die Zeit vor einer Antwort zu speichern, sondern auch die Zeit vor der Verbindung mit Schlüsselmodulen (das Modul selbst setzt dieses Flag. Derzeit ist es „Mitarbeiter“, „Externe Leitung“).
  • Für einen komplexeren Wählplan, bei dem ein Anruf zwischen verschiedenen Gruppen übertragen wird, war es notwendig, jedes Element separat untersuchen zu können.

Als beste Lösung erwies sich, dass die PBX-Module bei Anrufen Informationen über sich selbst senden und diese Informationen schließlich in Form eines Baums speichern.

Es sieht aus wie das:

Zunächst allgemeine Informationen zum Anruf (wie alle anderen auch - nichts Besonderes).

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

  1. Ich habe einen Anruf über eine externe Leitung erhalten.Für den Teig„um 05:55:52 von der Nummer 89295671458 auf die Nummer 89999999999, am Ende wurde es von einem Mitarbeiter beantwortet“Sekretär2» mit der Nummer 104. Der Kunde wartete 60 Sekunden und sprach 36 Sekunden.
  2. Mitarbeiter "Sekretär2„ruft die 112 an und ein Mitarbeiter antwortet“Manager1» nach 8 Sekunden. Sie reden 14 Sekunden lang.
  3. Der Kunde wird zum Mitarbeiter übertragen.Manager1", wo sie noch 13 Sekunden weiter reden

Aber das ist nur die Spitze des Eisbergs: Für jeden Datensatz können Sie über die PBX eine detaillierte Anrufliste abrufen.

Die Geschichte eines Projekts oder wie ich 7 Jahre damit verbracht habe, eine Telefonanlage auf Basis von Asterisk und PHP zu erstellen

Alle Informationen werden als Verschachtelung von Aufrufen dargestellt:

  1. Ich habe einen Anruf über eine externe Leitung erhalten.Für den Teig» um 05:55:52 von der Nummer 89295671458 zur Nummer 89999999999.
  2. Um 05:55:53 sendet die Amtsleitung einen Anruf an den eingehenden Anschluss.Test»
  3. Bei der Bearbeitung eines Anrufs nach dem Schema wird das Modul „Anruf des Managers", in dem der Anruf 16 Sekunden dauert. Hierbei handelt es sich um ein für den Kunden entwickeltes Modul.
  4. Modul "Anruf des Managers„Sendet einen Anruf an den für die Nummer zuständigen Mitarbeiter (Kunden)“Manager1” und wartet 5 Sekunden auf eine Antwort. Der Manager antwortete nicht.
  5. Modul "Anruf des Managers„Sendet einen Anruf an die Gruppe“CORP-Manager" Dies sind andere Manager derselben Richtung (die im selben Raum sitzen) und 11 Sekunden auf eine Antwort warten.
  6. Gruppe "CORP-Manager„Mitarbeiter anrufen“Manager1, Manager2, Manager3„gleichzeitig für 11 Sekunden. Keine Antwort.
  7. Das Gespräch des Managers endet. Und die Schaltung sendet einen Anruf an das Modul.Auswählen einer Route aus 1c" Auch ein für den Kunden geschriebenes Modul. Hier wurde der Anruf 0 Sekunden lang bearbeitet.
  8. Die Schaltung sendet einen Anruf an das Sprachmenü „Basic mit zusätzlicher Wählfunktion" Der Kunde wartete dort 31 Sekunden, es gab keine weitere Anwahl.
  9. Das Schema sendet einen Anruf an die Gruppe „Sekretäre", wobei der Kunde 12 Sekunden wartete.
  10. In einer Gruppe werden 2 Mitarbeiter gleichzeitig aufgerufen“Sekretär1"Und"Sekretär2" und nach 12 Sekunden antwortet der Mitarbeiter "Sekretär2" Die Antwort auf den Anruf wird in übergeordnete Anrufe dupliziert. Es stellte sich heraus, dass er in der Gruppe antwortete: „Sekretär2", beim Anruf antwortete die Schaltung"Sekretär2„ und beantwortete den Anruf auf der Amtsleitung mit „Sekretär2".

Es ist die Speicherung von Informationen über jeden Vorgang und deren Verschachtelung, die eine einfache Erstellung von Berichten ermöglicht. Ein Bericht über das Sprachmenü hilft Ihnen herauszufinden, wie sehr es hilft oder behindert. Erstellen Sie einen Bericht über von Mitarbeitern verpasste Anrufe. Berücksichtigen Sie dabei, dass der Anruf abgefangen wurde und daher nicht als verpasst gilt, und berücksichtigen Sie, dass es sich um einen Gruppenanruf handelte und jemand anderes früher geantwortet hat, was bedeutet, dass der Anruf ebenfalls nicht verpasst wurde.

Eine solche Informationsspeicherung ermöglicht es Ihnen, jede Gruppe einzeln zu betrachten und zu bestimmen, wie effektiv sie funktioniert, und ein Diagramm der beantworteten und verpassten Gruppen pro Stunde zu erstellen. Sie können die Genauigkeit der Verbindung zum verantwortlichen Manager auch überprüfen, indem Sie die Übertragungen nach der Verbindung zum Manager analysieren.

Sie können auch ganz untypische Untersuchungen durchführen, zum Beispiel wie oft Nummern, die nicht in der Datenbank sind, die richtige Durchwahl wählen oder wie viel Prozent der ausgehenden Anrufe auf ein Mobiltelefon umgeleitet werden.

Das Ergebnis?

Für die Wartung der TK-Anlage ist kein Fachmann erforderlich, dies kann auch der einfachste Administrator übernehmen – in der Praxis erprobt.

Für Modifikationen sind keine Spezialisten mit ernsthafter Qualifikation erforderlich; PHP-Kenntnisse sind ausreichend, weil Es wurden bereits Module für das SIP-Protokoll, für die Warteschlange, für das Anrufen eines Mitarbeiters und andere geschrieben. Es gibt eine Wrapper-Klasse für Sternchen. Um ein Modul zu entwickeln, kann (und sollte) ein Programmierer vorgefertigte Module aufrufen. Und Wissen Sternchen sind völlig unnötig, wenn der Kunde eine Seite mit einem neuen Bericht hinzufügen möchte. Die Praxis zeigt jedoch, dass Programmierer von Drittanbietern zwar zurechtkommen, sich jedoch ohne Dokumentation und normale Berichterstattung über Kommentare unsicher fühlen, sodass noch Raum für Verbesserungen besteht.

Module können:

  • neue Anrufverarbeitungsfunktionen erstellen,
  • neue Blöcke zur Weboberfläche hinzufügen,
  • von einem der vorhandenen Module erben, Funktionen neu definieren und ersetzen oder einfach eine leicht modifizierte Kopie sein,
  • Fügen Sie Ihre Einstellungen zur Einstellungsvorlage anderer Module hinzu und vieles mehr.

PBX-Einstellungen über API. Wie oben beschrieben werden alle Einstellungen in der Datenbank gespeichert und zum Zeitpunkt des Anrufs gelesen, sodass Sie alle PBX-Einstellungen über die API ändern können. Beim Aufruf der API wird die Konfiguration nicht neu erstellt und die Module nicht neu gestartet, daher spielt es keine Rolle, wie viele Einstellungen und Mitarbeiter Sie haben. API-Anfragen werden schnell ausgeführt und blockieren sich nicht gegenseitig.

Die TK-Anlage speichert alle Tastenbetätigungen bei Anrufen mit Dauer (Warten/Gespräch), Verschachtelung und in PBX-Begriffen (Mitarbeiter, Gruppe, Amtsleitung, nicht Kanal, Nummer). Dadurch können Sie verschiedene Berichte für bestimmte Kunden erstellen und der größte Teil der Arbeit besteht darin, eine benutzerfreundliche Oberfläche zu erstellen.

Die Zeit wird zeigen, was als nächstes passieren wird. Es gibt noch viele Nuancen, die überarbeitet werden müssen, es gibt noch viele Pläne, aber seit der Erstellung der 3. Version ist ein Jahr vergangen und wir können bereits sagen, dass die Idee funktioniert. Der Hauptnachteil von Version 3 sind die Hardware-Ressourcen, für die Sie jedoch normalerweise bezahlen müssen, um die Entwicklung zu vereinfachen.

Source: habr.com

Kommentar hinzufügen