Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Mesthine akeh saka sampeyan, kaya aku, duwe ide kanggo nindakake sing unik. Ing artikel iki aku bakal njlèntrèhaké masalah technical lan solusi sing aku kudu ngadhepi nalika ngembangaken PBX. Mbok iki bakal bantuan wong mutusaké ing idea dhewe, lan wong kanggo tindakake dalan uga-trodden, amarga aku uga entuk manfaat saka pengalaman pionir.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Idea lan syarat utama

Lan kabeh diwiwiti mung karo katresnan kanggo tanda bintang (kerangka kanggo mbangun aplikasi komunikasi), otomatisasi telpon lan instalasi freepbx (antarmuka web kanggo tanda bintang). Yen kabutuhan perusahaan tanpa spesifik lan ambruk ing kemampuan freepbx - kabeh iku gedhe. Kabeh instalasi njupuk Panggonan ing XNUMX jam, perusahaan nampa PBX diatur, antarmuka pangguna-loropaken lan short training plus support yen pengin.

Nanging tugas sing paling menarik yaiku non-standar lan banjur ora apik banget. tanda bintang bisa nindakake akeh, nanging supaya antarmuka web supaya bisa digunakake, iku perlu kanggo nglampahi kaping pirang-pirang wektu. Dadi rincian cilik bisa njupuk luwih suwe tinimbang nginstal PBX liyane. Lan titik kasebut ora mbutuhake wektu suwe kanggo nulis antarmuka web, nanging titik kasebut ana ing fitur arsitektur. freepbx. Pendekatan lan metode arsitektur freepbx ditata ing wektu php4, lan ing wektu iku wis ana php5.6 sing kabeh bisa digawe luwih prasaja lan luwih trep.

Jerami pungkasan yaiku dialplan grafis kanthi bentuk diagram. Nalika aku nyoba kanggo mbangun kaya iki kanggo freepbx, Aku temen maujud sing aku kudu Ngartekno nulis ulang lan bakal luwih gampang kanggo mbangun soko anyar.

Syarat utama yaiku:

  • persiyapan prasaja, intuisi diakses malah kanggo administrator anyar. Dadi, perusahaan ora mbutuhake pangopènan PBX ing sisih kita,
  • modifikasi gampang supaya tugas ditanggulangi ing wektu sing cukup,
  • ease saka integrasi karo PBX. U freepbx ora ana API kanggo ngganti setelan, i.e. Sampeyan ora bisa, contone, nggawe grup utawa menu swara saka aplikasi pihak katelu, mung API dhewe tanda bintang,
  • opensource - kanggo programer iki penting banget kanggo modifikasi kanggo klien.

Gagasan pangembangan sing luwih cepet yaiku nduwe kabeh fungsi kalebu modul ing wangun obyek. Kabeh obyek kudu duwe kelas induk sing umum, tegese jeneng kabeh fungsi utama wis dikenal lan mulane wis ana implementasine standar. Obyek bakal ngidini sampeyan nyuda sacara dramatis jumlah argumen ing wangun array asosiatif kanthi tombol senar, sing bisa ditemokake ing freepbx Sampeyan bisa kanthi mriksa kabeh fungsi lan fungsi nested. Ing kasus obyek, autocompletion banal bakal nuduhake kabeh sifat, lan umume bakal nyederhanakake urip kaping pirang-pirang. Kajaba iku, warisan lan redefinisi wis ngrampungake akeh masalah karo modifikasi.

Bab sabanjure sing nyuda wektu kerja maneh lan kudu dihindari yaiku duplikasi. Yen ana modul sing tanggung jawab kanggo nelpon karyawan, kabeh modul liyane sing kudu ngirim telpon menyang karyawan kudu nggunakake, lan ora nggawe salinan dhewe. Dadi, yen sampeyan kudu ngganti soko, sampeyan kudu ngganti mung ing sak panggonan lan search kanggo "carane" kudu digawa metu ing sak panggonan, lan ora digoleki ing kabeh project.

Versi pisanan lan kesalahan pisanan

Prototipe pisanan wis siap ing setahun. Kabeh PBX, kaya sing direncanakake, modular, lan modul kasebut ora mung bisa nambah fungsi anyar kanggo ngolah panggilan, nanging uga ngganti antarmuka web kasebut dhewe.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php
Ya, ide nggawe dialplan ing bentuk skema kasebut dudu aku, nanging trep banget lan aku uga nindakake perkara sing padha. tanda bintang.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Kanthi nulis modul, programer wis bisa:

  • nggawe fungsi dhewe kanggo pangolahan telpon, sing bisa diselehake ing diagram, uga ing menu unsur ing sisih kiwa,
  • gawe kaca dhewe kanggo antarmuka web lan tambahake template sampeyan menyang kaca sing wis ana (yen pangembang kaca wis nyedhiyakake iki),
  • tambahake setelan sampeyan menyang tab setelan utama utawa gawe tab setelan sampeyan dhewe,
  • programmer bisa oleh warisan saka modul ana, ngganti bagean saka fungsi lan ndhaftar ing jeneng anyar utawa ngganti modul asli.

Contone, iki carane sampeyan bisa nggawe menu swara dhewe:

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

Implementasi kompleks pisanan nggawa bangga pisanan lan kuciwo pisanan. Aku bungah sing bisa, aku wis bisa ngasilaken fitur utama freepbx. Aku bungah yen wong seneng karo gagasan skema kasebut. Isih ana akeh opsi kanggo nyederhanakake pembangunan, nanging ing wektu iku sawetara tugas wis digawe luwih gampang.

API kanggo ngganti konfigurasi PBX ana kuciwo - asil ora ing kabeh kita wanted. Aku njupuk prinsip padha ing freepbx, kanthi ngeklik tombol Aplikasi, kabeh konfigurasi digawe maneh lan modul diwiwiti maneh.

Katon kaya mangkene:

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php
*Dialplan minangka aturan (algoritma) ing ngendi telpon diproses.

Nanging kanthi pilihan iki, ora bisa nulis API normal kanggo ngganti setelan PBX. Pisanan, operasi nglamar owah-owahan kanggo tanda bintang dawa banget lan sumber daya intensif.
Sareh, sampeyan ora bisa nelpon loro fungsi ing wektu sing padha, amarga loro bakal nggawe konfigurasi.
Katelu, ditrapake kabeh setelan, kalebu sing digawe dening administrator.

Ing versi iki, kaya ing Askozia, iku bisa kanggo generate konfigurasi mung diganti modul lan miwiti maneh mung modul perlu, nanging iki kabeh setengah ngukur. Iku perlu kanggo ngganti pendekatan.

Versi kapindho. Irung ditarik metu buntut macet

Gagasan kanggo ngatasi masalah kasebut ora nggawe konfigurasi lan dialplan kanggo tanda bintang, nanging nyimpen informasi menyang database lan maca saka database langsung nalika proses telpon. tanda bintang Aku wis ngerti carane maca konfigurasi saka database, mung ngganti nilai ing database lan telpon sabanjuré bakal diproses njupuk menyang akun owah-owahan, lan fungsi sampurna kanggo maca paramèter dialplan REALTIME_HASH.

Pungkasane, ora perlu miwiti maneh tanda bintang nalika ngganti setelan lan kabeh setelan wiwit Applied langsung kanggo tanda bintang.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Mung owah-owahan kanggo dialplan punika Kajaba saka nomer extension lan pitakon. Nanging iki minangka owah-owahan cilik

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

Sampeyan bisa kanthi gampang nambah utawa ngganti baris ing dialplan nggunakake Ami (antarmuka kontrol tanda bintang) lan ora perlu urip maneh kabeh dialplan.

Iki ngrampungake masalah karo API konfigurasi. Sampeyan bisa malah langsung menyang database lan nambah grup anyar utawa ngganti, contone, wektu dial-up ing kolom "dialtime" kanggo grup lan telpon sabanjure wis suwene wektu sing ditemtokake (Iki dudu rekomendasi kanggo tumindak, wiwit sawetara operasi API mbutuhake Ami telpon).

Implementasine angel pisanan maneh nggawa bangga lan kuciwo pisanan. Aku bungah sing bisa. Basis data dadi link kritis, katergantungan ing disk tambah, ana risiko liyane, nanging kabeh bisa stabil lan tanpa masalah. Lan sing paling penting, saiki kabeh sing bisa ditindakake liwat antarmuka web bisa ditindakake liwat API, lan cara sing padha digunakake. Kajaba iku, antarmuka web nyingkirake tombol "aplikasi setelan menyang PBX", sing asring dilalekake para pangurus.

Kuciwane yaiku pangembangane dadi luwih rumit. Wiwit versi pisanan, basa PHP wis nggawe dialplan ing basa kasebut tanda bintang lan katon rampung ora bisa diwaca, plus basa dhewe tanda bintang kanggo nulis dialplan iku arang banget primitif.

Apa sing katon:

$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'))

Ing versi kapindho, dialplan dadi universal, kalebu kabeh opsi pangolahan sing bisa gumantung saka parameter lan ukurane tambah akeh. Kabeh iki nemen kalem mudhun wektu pembangunan, lan banget panginten sing sepisan maneh iku perlu kanggo ngganggu dialplan digawe kula sedhih.

Versi katelu

Gagasan kanggo ngrampungake masalah kasebut ora ngasilake tanda bintang dialplan saka php lan nggunakake FastAGI lan nulis kabeh aturan pangolahan ing PHP dhewe. FastAGI Nanging ngidini tanda bintang, kanggo proses telpon, sambungake menyang soket. Nampa printah saka ing kono lan ngirim asil. Mangkono, logika dialplan wis ana ing njaba wates tanda bintang lan bisa ditulis ing basa apa wae, ing kasusku ing PHP.

Ana akeh nyoba lan kesalahan. Masalah utama yaiku aku wis duwe akeh kelas / file. Butuh udakara 1,5 detik kanggo nggawe obyek, miwiti, lan ndhaptar saben liyane, lan wektu tundha saben telpon iki ora bisa digatekake.

Initialization kudu kedadeyan mung sapisan lan mulane panelusuran solusi diwiwiti kanthi nulis layanan ing php nggunakake Pthreads. Sawise eksperimen seminggu, opsi iki dibatalake amarga kerumitan cara kerja ekstensi iki. Sawise tes sewulan, aku uga kudu nilar pemrograman asinkron ing PHP; Aku butuh sing prasaja, akrab karo pemula PHP, lan akeh ekstensi kanggo PHP sing sinkron.

Solusi kasebut yaiku layanan multi-threaded dhewe ing C, sing dikompilasi PHPLIB. Iku mbukak kabeh file php ATS, ngenteni kabeh modul kanggo initialize, nambah callback kanggo saben liyane, lan nalika kabeh wis siyap, caches. Nalika takon dening FastAGI stream digawe, salinan saka cache kabeh kelas lan data maleh ing, lan panjalukan liwati kanggo fungsi php.

Kanthi solusi iki, wektu saka ngirim telpon menyang layanan kita kanggo printah pisanan tanda bintang sudo saka 1,5s kanggo 0,05s lan wektu iki rada gumantung ing ukuran project.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Akibaté, wektu kanggo pembangunan dialplan suda Ngartekno, lan aku bisa appreciate iki amarga aku kudu nulis ulang kabeh dialplan kabeh modul ing PHP. Kaping pisanan, cara kudu wis ditulis ing php kanggo entuk obyek saka database; padha dibutuhake kanggo tampilan ing antarmuka web, lan liya, lan iki bab utama, iku pungkasanipun bisa kanthi trep karo strings karo nomer lan susunan. karo database plus akeh ekstensi PHP.

Kanggo proses dialplan ing kelas modul sampeyan kudu ngleksanakake fungsi dialplanDynamicCall lan argumentasi pbxCallRequest bakal ngemot obyek kanggo sesambungan karo tanda bintang.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Kajaba iku, bisa uga debug dialplan (php duwe xdebug lan bisa digunakake kanggo layanan kita), sampeyan bisa mindhah langkah demi langkah kanthi ndeleng nilai variabel.

Telpon data

Sembarang analytics lan laporan mbutuhake data sing diklumpukake kanthi bener, lan blok PBX iki uga ngalami akeh cobaan lan kesalahan saka versi pisanan nganti versi katelu. Asring, data telpon minangka tandha. Telpon siji = rekaman siji: sapa sing nelpon, sapa sing njawab, suwene anggone ngobrol. Ing opsi sing luwih menarik, ana tandha tambahan sing nuduhake karyawan PBX sing diarani nalika nelpon. Nanging kabeh iki mung kalebu bagean saka kabutuhan.

Syarat awal yaiku:

  • nyimpen ora mung sing PBX disebut, nanging uga sing mangsuli, amarga ana interceptions lan iki kudu dianggep nalika nganalisa telpon,
  • wektu sadurunge nyambungake karo karyawan. Ing freepbx lan sawetara PBX liyane, telpon dianggep dijawab sanalika PBX njupuk telpon. Nanging kanggo menu swara sampeyan kudu ngangkat telpon, supaya kabeh telpon dijawab lan wektu nunggu jawaban dadi 0-1 detik. Mulane, diputusake kanggo ngirit ora mung wektu sadurunge nanggepi, nanging wektu sadurunge nyambungake karo modul kunci (modul dhewe nyetel bendera iki. Saiki iku "Karyawan", "Jalur njaba"),
  • kanggo dialplan luwih Komplek, nalika telpon travels antarane macem-macem kelompok, iku perlu kanggo bisa kanggo nliti saben unsur dhewe.

Opsi sing paling apik yaiku nalika modul PBX ngirim informasi babagan awake dhewe ing telpon lan pungkasane nyimpen informasi kasebut ing wangun wit.

Kayane kaya iki:

Pisanan, informasi umum babagan telpon (kaya wong liya - ora ana sing khusus).

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

  1. Nampa telpon ing garis njaba "Kanggo tes"jam 05:55:52 saka nomer 89295671458 nganti nomer 89999999999, akhire dijawab karyawan"Sekretaris2»karo nomer 104. Klien nenggo 60 detik lan ngandika kanggo 36 detik.
  2. karyawan"Sekretaris2"telpon menyang 112 lan karyawan mangsuli"Manajer1»sawise 8 detik. Dheweke ngomong nganti 14 detik.
  3. Klien ditransfer menyang Karyawan "manajer1" ing ngendi dheweke terus ngomong nganti 13 detik liyane

Nanging iki minangka puncak gunung es; kanggo saben rekaman sampeyan bisa entuk riwayat telpon sing rinci liwat PBX.

Crita siji proyek utawa carane aku nglampahi 7 taun nggawe PBX adhedhasar Asterisk lan Php

Kabeh informasi ditampilake minangka nesting saka telpon:

  1. Nampa telpon ing garis njaba "Kanggo tes» jam 05:55:52 saka nomer 89295671458 nganti nomer 89999999999.
  2. Ing 05:55:53 baris njaba ngirim telpon menyang sirkuit mlebu "test»
  3. Nalika ngolah telpon miturut skema, modul "telpon manager", kang telpon 16 detik. Iki minangka modul sing dikembangake kanggo klien.
  4. Modul"telpon manager"ngirim telpon menyang karyawan sing tanggung jawab kanggo nomer (klien) "Manajer1"lan ngenteni 5 detik kanggo nanggepi. Manajer ora mangsuli.
  5. Modul"telpon manager"ngirim telpon menyang grup"Manajer CORP" Iki minangka manajer liyane saka arah sing padha (lungguh ing kamar sing padha) lan ngenteni 11 detik kanggo nanggepi.
  6. Kelompok "Manajer CORP"telpon karyawan"Manajer1, Manajer2, Manajer3" bebarengan kanggo 11 detik. Ora ana wangsulan.
  7. Telpon manager mungkasi. Lan sirkuit ngirim telpon menyang modul "Milih rute saka 1c" Uga modul ditulis kanggo klien. Ing kene telpon diproses sajrone 0 detik.
  8. Sirkuit ngirim telpon menyang menu swara "Dasar karo telpon tambahan" Klien ngenteni 31 detik ing kana, ora ana telpon tambahan.
  9. Skema kasebut ngirim telpon menyang Grup "sekretaris", ing ngendi klien ngenteni 12 detik.
  10. Ing grup, 2 karyawan diarani bebarengan "Sekretaris1"Lan"Sekretaris2"Lan sawise 12 detik karyawan mangsuli"Sekretaris2" Jawaban kanggo telpon diduplikasi menyang telpon wong tuwa. Pranyata ing grup dheweke mangsuli "Sekretaris2", nalika nelpon sirkuit dijawab "Sekretaris2"lan mangsuli telpon ing baris njaba karo"Sekretaris2".

Iki minangka nyimpen informasi babagan saben operasi lan nesting sing bakal nggawe laporan kanthi gampang. Laporan ing menu swara bakal mbantu sampeyan ngerteni carane mbantu utawa ngalangi. Mbangun laporan ing telpon ora kejawab dening karyawan, njupuk menyang akun sing telpon dicegat lan mulane ora dianggep ora kejawab, lan njupuk menyang akun sing iku telpon grup, lan wong liya mangsuli sadurungé, kang tegese telpon uga ora kejawab.

Panyimpenan informasi kasebut bakal ngidini sampeyan njupuk saben klompok kanthi kapisah lan nemtokake cara kerjane kanthi efektif, lan nggawe grafik klompok sing dijawab lan ora kejawab miturut jam. Sampeyan uga bisa mriksa sepira akurat sambungan menyang manajer sing tanggung jawab kanthi nganalisa transfer sawise nyambung menyang manajer.

Sampeyan uga bisa nindakake pasinaon cukup atypical, contone, sepira kerepe nomer sing ora ana ing database nelpon extension bener utawa apa persentasi saka telpon metu diterusake menyang telpon seluler.

Apa ing pungkasan?

Spesialis ora dibutuhake kanggo njaga PBX, administrator paling biasa bisa nindakake - diuji ing praktik.

Kanggo modifikasi, spesialis kanthi kualifikasi serius ora dibutuhake; kawruh PHP cukup, amarga Modul wis ditulis kanggo protokol SIP, lan kanggo antrian, lan nelpon karyawan, lan liya-liyane. Ana kelas pambungkus kanggo tanda bintang. Kanggo ngembangake modul, programer bisa (lan kanthi cara sing apik) nelpon modul sing wis siap. Lan kawruh tanda bintang ora perlu yen klien njaluk nambah kaca kanthi laporan anyar. Nanging praktik nuduhake yen sanajan programer pihak katelu bisa ngatasi, dheweke rumangsa ora aman tanpa dokumentasi lan jangkoan komentar normal, mula isih ana ruang kanggo perbaikan.

Modul bisa:

  • nggawe kemampuan pangolahan telpon anyar,
  • nambah blok anyar menyang antarmuka web,
  • warisan saka modul apa wae sing ana, nemtokake maneh fungsi lan ngganti, utawa mung dadi salinan sing rada diowahi,
  • tambahake setelan sampeyan menyang template setelan modul liyane lan liya-liyane.

Setelan PBX liwat API. Kaya sing kasebut ing ndhuwur, kabeh setelan disimpen ing database lan diwaca nalika nelpon, supaya sampeyan bisa ngganti kabeh setelan PBX liwat API. Nalika nelpon API, konfigurasi ora digawe maneh lan modul ora diwiwiti maneh, mulane, ora Matter carane akeh setelan lan karyawan sing duwe. Panjaluk API ditindakake kanthi cepet lan ora mblokir saben liyane.

PBX nyimpen kabeh operasi tombol kanthi telpon kanthi durasi (nunggu / obrolan), nesting lan ing istilah PBX (karyawan, grup, saluran eksternal, dudu saluran, nomer). Iki ngidini sampeyan nggawe macem-macem laporan kanggo klien tartamtu lan umume kerjane yaiku nggawe antarmuka sing ramah pangguna.

Wektu bakal ngandhani apa sing bakal kelakon sabanjure. Isih akeh nuansa sing kudu didandani, isih akeh rencana, nanging wis setaun wiwit nggawe versi kaping 3 lan kita wis bisa ujar manawa ide kasebut bisa digunakake. Kerugian utama versi 3 yaiku sumber daya hardware, nanging biasane sampeyan kudu mbayar kanggo gampang pembangunan.

Source: www.habr.com

Add a comment