A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

Di sicuru, parechji di voi, cum'è mè, avianu un'idea di fà qualcosa unicu. In questu articulu, descriveraghju i prublemi tecnichi è e suluzioni chì aghju avutu affruntà quandu u sviluppu di u PBX. Forsi questu aiuterà à qualcunu decide nantu à a so propria idea, è qualchissia per seguità u percorsu ben battutu, perchè aghju ancu benefiziu di l'esperienza di i pionieri.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

Idea è esigenze chjave

È tuttu principia solu cù amore per Asterisk (quadru per l'applicazioni di cumunicazione di custruzzione), l'automatizazione di a telefonia è l'installazione freepbx (interfaccia web per Asterisk). Sì i bisogni di a cumpagnia eranu senza specificità è cascà in e capacità freepbx - tuttu hè grande. L'intera installazione hè stata fatta in 24 ore, a cumpagnia hà ricevutu un PBX cunfiguratu, una interfaccia amichevule è una furmazione corta più supportu se vulete.

Ma i travaglii più interessanti ùn eranu micca standard è allora ùn era micca cusì fabuloso. Asterisk pò fà assai, ma per mantene l'interfaccia web in ordine, era necessariu di passà parechje volte più tempu. Allora un picculu dettagliu puderia piglià assai più di l'installazione di u restu di u PBX. È u puntu ùn hè micca chì ci vole assai tempu per scrive una interfaccia web, ma u puntu hè in e caratteristiche architettoniche. freepbx. Approcci è metudi di l'architettura freepbx hè statu dispostu à l'ora di php4, è in quellu mumentu ci era digià php5.6 nantu à quale tuttu puderia esse simplificatu è più convenientu.

L'ultima paglia era dialplans grafichi in forma di diagramma. Quandu aghju pruvatu à custruisce qualcosa cum'è questu per freepbx, Aghju realizatu chì averia da riscrive significativamente è saria più faciule per custruisce qualcosa di novu.

I requisiti chjave eranu:

  • installazione simplice, accessibile intuitivamente ancu per un amministratore principiante. Cusì, e cumpagnie ùn anu micca bisognu di mantenimentu PBX da a nostra parte,
  • mudificazione faciule per chì i travaglii sò risolti in tempu adattu,
  • facilità di integrazione cù PBX. U freepbx ùn ci era micca API per cambià i paràmetri, i.e. Ùn pudete micca, per esempiu, creà gruppi o menu di voce da una applicazione di terzu, solu l'API stessu Asterisk,
  • opensource - per i programatori questu hè assai impurtante per mudificazioni per u cliente.

L'idea di un sviluppu più veloce era di avè tutte e funziunalità cumposti da moduli in forma di oggetti. Tutti l'uggetti avianu avutu una classa parentale cumuna, chì significa chì i nomi di tutte e funzioni principali sò digià cunnisciuti è per quessa ci sò digià implementazioni predeterminate. L'uggetti vi permettenu di riduce dramaticamente u nùmeru d'argumenti in forma di array associative cù chjavi di stringa, chì pudete scopre in freepbx Hè statu pussibule esaminendu a funzione sana è e funzioni nidificate. In u casu di l'uggetti, l'autocompletion banale mostrarà tutte e proprietà, è in generale simplificà a vita parechje volte. In più, l'eredità è a redefinizione risolve digià parechji prublemi cù mudificazioni.

A prossima cosa chì rallentò u tempu di rielaborazione è vale a pena evità era a duplicazione. Se ci hè un modulu rispunsevuli di dialing un impiigatu, allura tutti l'altri moduli chì anu bisognu di mandà una chjama à un impiigatu devenu aduprà, è micca creà e so copie. Allora, se avete bisognu di cambià qualcosa, allora vi tuccherà à cambià solu in un locu è a ricerca di "cumu travaglia" deve esse realizatu in un locu, è micca cercatu in tuttu u prugettu.

Prima versione è primi errori

U primu prototipu era prontu in un annu. Tuttu u PBX, cum'è previstu, era modulare, è i moduli ùn puderanu micca solu aghjunghje una nova funziunalità per processà e chjama, ma ancu cambià l'interfaccia web stessu.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php
Iè, l'idea di custruisce un dialplan in a forma di tali schema ùn hè micca a mo, ma hè assai còmuda è aghju fattu u listessu per Asterisk.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

Scrivendu un modulu, i programatori puderanu digià:

  • crea a vostra propria funziunalità per u processu di chjama, chì puderia esse piazzatu nantu à u diagramma, è ancu in u menù di elementi à manca,
  • crea e vostre pagine per l'interfaccia web è aghjunghje i vostri mudelli à e pagine esistenti (se u sviluppatore di a pagina hà furnitu questu),
  • aghjunghje i vostri paràmetri à a tabulazione di paràmetri principali o crea a vostra propria tabulazione di paràmetri,
  • u programatore pò eredite da un modulu esistente, cambià parte di a funziunalità è registrà sottu un novu nome o rimpiazzà u modulu originale.

Per esempiu, questu hè cumu pudete creà u vostru propiu menu di voce:

......
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__); //Подменить существующий модуль

I primi implementazioni cumplessi anu purtatu u primu orgogliu è i primi delusioni. Eru cuntentu chì hà travagliatu, chì era digià capaci di ripruduce e caratteristiche principali freepbx. Eru felice chì a ghjente hà piaciutu l'idea di u schema. Ci era ancu parechje opzioni per simplificà u sviluppu, ma ancu in quellu tempu, alcune di e tarei eranu digià facilitate.

L'API per cambià a cunfigurazione PBX hè stata una delusione - u risultatu ùn era micca in tuttu ciò chì vuliamu. Aghju pigliatu u listessu principiu cum'è in freepbx, clicchendu u buttone Apply, tutta a cunfigurazione hè recreata è i moduli sò riavviati.

Sembra cusì:

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php
*Dialplan hè una regula (algoritmu) da quale una chjama hè processata.

Ma cù questa opzione, hè impussibile di scrive una API normale per cambià i paràmetri PBX. Prima, u funziunamentu di applicà cambiamenti à Asterisk troppu longu è risorsa intensiva.
Siconda, ùn pudete micca chjamà duie funzioni à u stessu tempu, perchè tramindui creà a cunfigurazione.
In terzu, applicà tutti i paràmetri, cumpresi quelli fatti da l'amministratore.

In questa versione, cum'è in Askozia, era pussibule di generà a cunfigurazione di solu muduli cambiati è riavvia solu i moduli necessarii, ma questi sò tutti i mezi. Era necessariu di cambià l'approcciu.

Seconda versione. Nasu tirò fora a coda appiccicata

L'idea di risolve u prublema ùn era micca di ricreà a cunfigurazione è u dialplan per Asterisk, ma salvate l'infurmazioni in a basa di dati è leghje direttamente da a basa di dati mentre trasfurmendu a chjama. Asterisk Sapia digià cumu leghje cunfigurazioni da a basa di dati, solu cambià u valore in a basa di dati è a prossima chjama serà trattata tenendu in contu i cambiamenti, è a funzione era perfetta per leghje i paràmetri di dialplan. REALTIME_HASH.

À a fine, ùn ci era ancu bisognu di riavvia Asterisk quandu cambiassi i paràmetri è tutti i paràmetri cuminciaru à esse applicati immediatamente Asterisk.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

L'unicu cambiamenti à u dialplan sò l'aghjunzione di numeri di estensione è pinseri. Ma questi eranu picculi cambiamenti spot

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)
...

Pudete facilmente aghjunghje o cambià una linea in u dialplan usendu Ami (interfaccia di cuntrollu Asterisk) è ùn hè micca necessariu reboot di tuttu u dialplan.

Questu hà risoltu u prublema cù l'API di cunfigurazione. Pudete ancu andà direttamente in a basa di dati è aghjunghje un novu gruppu o cambià, per esempiu, u tempu di dial-up in u campu "dialtime" per u gruppu è a prossima chjama durà digià u tempu specificatu (Questa ùn hè micca una raccomandazione per azzione, postu chì alcune operazioni API necessitanu Ami chjama).

I primi implementazioni difficili anu purtatu di novu u primu orgogliu è delusione. Eru felice chì hà travagliatu. A basa di dati hè diventata un ligame criticu, a dependenza di u discu aumentava, ci era più risichi, ma tuttu hà travagliatu stabile è senza prublemi. E più impurtante, avà tuttu ciò chì puderia esse fattu per l'interfaccia web puderia esse fattu per l'API, è i stessi metudi sò stati utilizati. Inoltre, l'interfaccia web hà eliminatu u buttone "applicà paràmetri à PBX", chì l'amministratori spessu si scurdavanu.

A delusione era chì u sviluppu hè diventatu più cumplicatu. Dapoi a prima versione, a lingua PHP hà generatu un dialplan in a lingua Asterisk è pare cumplettamente illegibile, più a lingua stessa Asterisk per scrive un dialplan hè estremamente primitivu.

Ciò chì pareva:

$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 a seconda versione, u dialplan hè diventatu universale, cumpresu tutte l'opzioni di trasfurmazioni pussibuli sicondu i paràmetri è a so dimensione hà aumentatu significativamente. Tuttu chistu hà rallentatu assai u tempu di sviluppu, è u pensamentu stessu chì una volta era necessariu interferiscenu cù u dialplan m'hà fattu tristu.

A terza versione

L'idea di risolve u prublema ùn era micca di generà Asterisk dialplan da php è aduprà FastAGI è scrive tutte e regule di trasfurmazioni in PHP stessu. FastAGI si permette di Asterisk, per processà a chjama, cunnette à u socket. Riceve cumandamenti da quì è mandà risultati. Cusì, a logica di u dialplan hè digià fora di e fruntiere Asterisk è pò esse scrittu in ogni lingua, in u mo casu in PHP.

Ci hè statu assai prucessu è errore. U prublema principali era chì aghju digià avutu assai classi / schedari. Pigliò circa 1,5 seconde per creà l'uggetti, l'inizializà, è registrà l'altri cun l'altri, è questu ritardu per chjama ùn hè micca qualcosa chì pò esse ignoratu.

L'inizializazione duveria accadutu solu una volta è per quessa a ricerca di una suluzione principia cù scrive un serviziu in php usendu Pthreads. Dopu à una settimana di sperimentazione, sta opzione hè stata abbandunata per via di l'intricacies di cumu funziona sta estensione. Dopu un mesi di teste, aghju avutu ancu abbandunà a prugrammazione asincrona in PHP; Aviu bisognu di qualcosa simplice, familiar à qualsiasi principianti PHP, è parechje estensioni per PHP sò sincrone.

A suluzione era u nostru propiu serviziu multi-threaded in C, chì hè statu compilatu cù PHPLIB. Caricà tutti i schedarii ATS php, aspetta chì tutti i moduli si inizializzanu, aghjunghje una callback à l'altri, è quandu tuttu hè prontu, cache. Quandu si dumanda da FastAGI un flussu hè creatu, una copia da u cache di tutte e classi è e dati hè ripruduciutu in questu, è a dumanda hè passata à a funzione php.

Cù sta suluzione, u tempu da mandà una chjama à u nostru serviziu à u primu cumandamentu Asterisk diminuite da 1,5s à 0,05s è sta volta dipende pocu nantu à a dimensione di u prugettu.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

In u risultatu, u tempu per u sviluppu di dialplan hè stata ridutta significativamente, è possu apprezzà questu postu chì aghju avutu a riscriva tuttu u dialplan di tutti i moduli in PHP. Prima, i metudi sò digià scritti in php per uttene un ughjettu da a basa di dati; eranu necessarii per a visualizazione in l'interfaccia web, è in segundu, è questu hè u principale, hè infine pussibule di travaglià convenientemente cù stringhe cù numeri è arrays. cù basa di dati più parechje estensioni PHP.

Per processà u dialplan in a classa di moduli avete bisognu di implementà a funzione dialplanDynamicCall è argumentu pbxCallRequest cuntene un oggettu per interagisce cù Asterisk.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

Inoltre, hè diventatu pussibule di debug u dialplan (php hà xdebug è funziona per u nostru serviziu), pudete passà passu à passu vedendu i valori di variabili.

Chjama dati

Qualchese analisi è rapporti necessitanu dati raccolti currettamente, è stu bloccu PBX hà ancu passatu assai prucessu è errore da a prima à a terza versione. Spessu, chjamate dati hè un signu. Una chjama = una arregistramentu : quale hà chjamatu, quale hà rispostu, quantu parlanu. In l'opzioni più interessanti, ci hè un signu supplementu chì indica quale impiegatu PBX hè statu chjamatu durante a chjama. Ma tuttu questu copre solu una parte di i bisogni.

I requisiti iniziali eranu:

  • Salvà micca solu quale u PBX hà chjamatu, ma ancu chì hà rispostu, perchè ci sò intercepzioni è questu duverà esse cunsideratu quandu analizà e chjama,
  • tempu prima di cunnette cù un impiegatu. In freepbx è qualchì altru PBX, a chjama hè cunsiderata risposta appena u PBX piglia u telefunu. Ma per u menu di voce, avete digià bisognu di piglià u telefunu, cusì tutte e chjama sò risposti è u tempu d'attesa per una risposta diventa 0-1 secondu. Per quessa, hè statu decisu di salvà micca solu u tempu prima di una risposta, ma u tempu prima di cunnette cù moduli chjave (u modulu stessu stabilisce sta bandiera. Attualmente hè "Impiegatu", "Line esterna"),
  • per un dialplan più cumplessu, quandu una chjama viaghja trà i gruppi diffirenti, era necessariu di pudè esaminà ogni elementu separatamente.

A megliu opzione hè stata quandu i moduli PBX mandanu l'infurmazioni nantu à elli nantu à e chjama è, in fine, salvanu l'infurmazioni in a forma di un arbre.

Sembra cusì:

Prima, infurmazione generale nantu à a chjama (cum'è tutti l'altri - nunda di speciale).

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

  1. Ricevutu una chjama nantu à una linea esterna "Per a prova"à 05:55:52 da u numeru 89295671458 à u numeru 89999999999, à a fine hè statu rispostu da un impiigatu"Sicritariu 2» cù u numeru 104. U cliente hà aspittatu 60 seconde è hà parlatu per 36 seconde.
  2. Impiegatu "Sicritariu 2"Fà una chjama à u 112 è un impiegatu risponde"Manager 1» dopu à 8 seconde. Parlanu per 14 seconde.
  3. U Cliente hè trasferitu à l'Impiegatu "manager 1"induve cuntinueghjanu à parlà per altri 13 seconde

Ma questu hè a punta di l'iceberg; per ogni registru pudete uttene una storia di chjama dettagliata attraversu u PBX.

A storia di un prughjettu o cumu aghju passatu 7 anni per creà un PBX basatu annantu à Asterisk è Php

Tutte l'infurmazioni sò presentate cum'è un nidificazione di chjamate:

  1. Ricevutu una chjama nantu à una linea esterna "Per a prova» à 05:55:52 da u numeru 89295671458 à u numeru 89999999999.
  2. À 05:55:53 a linea esterna manda una chjama à u circuitu Entrante "francese test»
  3. Quandu si tratta una chjama secondu u schema, u modulu "chjama di u manager", in quale a chjama hè 16 seconde. Questu hè un modulu sviluppatu per u cliente.
  4. Modulu "chjama di u manager" manda una chjama à l'impiigatu rispunsevuli di u numeru (cliente) "Manager 1" è aspetta 5 seconde per una risposta. U manager ùn hà micca rispostu.
  5. Modulu "chjama di u manager"Manda una chjama à u gruppu"I dirigenti di a CORP" Quessi sò altri gestori di a listessa direzzione (seduti in a stessa stanza) è aspittendu 11 seconde per una risposta.
  6. Gruppu "I dirigenti di a CORP"chjama l'impiegati"Manager 1, Manager 2, Manager 3"simultaneamente per 11 seconde. Nisuna risposta.
  7. A chjama di u manager finisce. È u circuitu manda una chjama à u modulu "Selezzione di una strada da 1c" Ancu un modulu scrittu per u cliente. Quì a chjama hè stata processata per 0 seconde.
  8. U circuitu manda una chjama à u menu di voce "Basic cù marcatura supplementaria" U cliente hà aspittatu quì per 31 seconde, ùn ci era micca marcatu supplementu.
  9. U schema manda una chjama à u Gruppu "Segretarii", induve u cliente hà aspittatu 12 seconde.
  10. In un gruppu, 2 impiegati sò chjamati à u stessu tempu "Sicritariu 1"E"Sicritariu 2"è dopu à 12 seconde l'impiigatu risponde"Sicritariu 2" A risposta à a chjama hè duplicata in e chjama di i genitori. Risulta chì in u gruppu hà rispostu "Sicritariu 2", quandu chjamava u circuitu rispose "Sicritariu 2" è hà rispostu à a chjama nantu à a linea esterna cù "Sicritariu 2».

Hè a salvezza di l'infurmazioni nantu à ogni operazione è a so nidificazione chì permetterà di fà simpliciamente rapporti. Un rapportu nantu à u menu di voce vi aiuterà à sapè quantu aiuta o impedisce. Custruisce un rapportu nantu à i chjamati mancati da l'impiegati, tenendu in contu chì a chjama hè stata interceptata è per quessa ùn hè micca cunsiderata mancata, è tenendu in contu chì era una chjama di gruppu, è qualcunu hà rispostu prima, chì significa chì a chjama ùn hè micca mancata.

Un tali almacenamentu di l'infurmazioni vi permetterà di piglià ogni gruppu separatamente è di determinà quantu funziona in modu efficace, è custruisce un graficu di gruppi risposti è mancati per ora. Pudete ancu verificà quantu hè precisa a cunnessione cù u manager rispunsevuli analizendu i trasferimenti dopu a cunnessione à u manager.

Pudete ancu fà studii abbastanza atipichi, per esempiu, quantu spessu i numeri chì ùn sò micca in a basa di dati marcanu l'estensione curretta o quale percentuale di e chjama in uscita sò trasmessi à un telefuninu.

Ciò à a fine?

Un specialista ùn hè micca necessariu di mantene a PBX; l'amministratore più ordinariu pò fà - pruvatu in pratica.

Per mudificazioni, ùn sò micca necessarii specialisti cun qualificazione seria; a cunniscenza di PHP hè abbastanza, perchè I moduli sò digià scritti per u protocolu SIP, è per a fila, è per chjamà un impiigatu, è altri. Ci hè una classe wrapper per Asterisk. Per sviluppà un modulu, un programatore pò (è in una bona manera deve) chjamà moduli pronti. È a cunniscenza Asterisk sò completamente innecessarii se u cliente dumanda à aghjunghje una pagina cù qualchì novu rapportu. Ma a pratica mostra chì ancu chì i programatori di terzu pò affruntà, si sentenu insicuri senza documentazione è a cobertura normale di cumenti, cusì ci hè sempre spaziu per migliurà.

I moduli ponu:

  • creà novi capacità di trattamentu di chjama,
  • aghjunghje novi blocchi à l'interfaccia web,
  • eredite da qualsiasi di i moduli esistenti, ridefinisce e funzioni è rimpiazzà, o simpricimenti esse una copia ligeramente mudificata,
  • aghjunghje i vostri paràmetri à u mudellu di paràmetri di altri moduli è assai di più.

Paràmetri PBX via API. Comu descrittu sopra, tutti i paràmetri sò guardati in a basa di dati è leghje à u mumentu di a chjama, cusì pudete cambià tutti i paràmetri PBX attraversu l'API. Quandu chjamate l'API, a cunfigurazione ùn hè micca ricreata è i moduli ùn sò micca riavviati, per quessa, ùn importa micca quantu paràmetri è impiegati avete. E dumande API sò eseguite rapidamente è ùn si bluccanu micca.

U PBX guarda tutte l'operazioni chjave cù e chjama cù durata (attesa / cunversazione), nidificazione è in termini PBX (impiegatu, gruppu, linea esterna, micca canale, numeru). Questu permette di custruisce diversi rapporti per i clienti specifichi è a maiò parte di u travagliu hè di creà una interfaccia user-friendly.

U tempu dirà ciò chì succede dopu. Ci hè ancu parechje sfumature chì deve esse rifatte, ci sò ancu assai piani, ma un annu hè passatu da a creazione di a versione 3rd è pudemu digià dì chì l'idea travaglia. U principale svantaghju di a versione 3 hè i risorse hardware, ma questu hè di solitu ciò chì duvete pagà per facilità di sviluppu.

Source: www.habr.com

Add a comment