Hozirgi kunda masofadan turib ishlash juda muhim. Qo’ng’iroqlar markazi operatorlari ham ishlamoqda. Ushbu operatorlarga mijozlarga ofis serveri orqali qo’ng’iroq qilish imkoniyatini berishda qiyinchilik tug’ildi. Ammo muammo shundaki: mobil internet sifati har doim ham dasturiy ta’minotning ishlashiga imkon bermaydi. Sinovning birinchi haftasidan boshlab biz operatorlardan audio yo’qolishi, artefaktlar (aks-sado, kechikish va boshqalar) va hatto to’liq ishlamasligi haqida shikoyatlar bilan bombardimon qilindik.
Bu muammoning yagona yechimi operatorlarni mijozlarga mobil ovoz orqali ulash edi, bunda Asteriskni tranzit kommutatori sifatida ishlatish mumkin edi. Ba’zilar hayron bo’lishlari mumkin: nega shunchaki bir telefondan boshqasiga qo’ng’iroq qilmaslik kerak?
Xo’sh, chunki qo’ng’iroqlar yozib olinishi kerak va mijozlar bir nechta operator raqamlari o’rniga qo’ng’iroq markazi raqamini ko’rishni xohlashadi.
Buning eng oddiy yo’li operatorlarga kommutatorni tergandan so’ng chaqirilgan tomonning raqamini terish imkonini berishdir. Biroq, har bir mijozning raqamini qo’lda terish operatorlarni juda katta qiyinchiliklarga duchor qilgan bo’lar edi. Shu sababli, biz darhol bu variantni rad etdik va buning o’rniga ikkita tashqi raqamni argument sifatida qabul qiladigan va Asteriskni ularni terish va ulashga majbur qiladigan APIni joriy etishni taklif qildik.
Keyin, ushbu vazifani amalga oshirishni ko’rib chiqaylik.
Birinchidan, skript tomonidan boshlangan qo’ng’iroqlarni qayta ishlaydigan kontekst qo’shaylik.
/etc/astersk/extensions_custom.conf faylini oching (FreePBX uchun tegishli) va quyidagilarni qo’shing:
[commutate]
exten => _X.,1,Dial(SIP/gorod/${EXTEN});
exten => _X.,n,Macro(dialstatus,s,1)
exten => _X.,n,Hangup ;
[macro-dialstatus]
exten => s,1,Answer
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CANCEL,1,Hangup
exten => s-BUSY,1,Playtones(425/375,0/375)
exten => s-BUSY,n,Busy(7)
exten => s-BUSY,n,Hangup
exten => s-CHANUNAVAIL,1,Hangup Bu yerda «shahar» — ikkinchi abonentga qo’ng’iroq amalga oshiriladigan magistralning nomi.
PJSIP drayveri bilan ishlashda ikkinchi qator quyidagicha ko’rinadi:
exten => _X.,1,Dial(PJSIP/${EXTEN}@gorod); CLIdagi asosiy qayta yuklash buyrug’i yordamida yulduzcha bilan belgilangan konfiguratsiya fayllarini qayta yuklang.
Agar siz FreePBX dan foydalanayotgan bo’lsangiz, boshqaruv interfeysi allaqachon yoqilgan. U bilan ishlash tafsilotlarini /etc/asterisk/manager.conf faylida topishingiz mumkin.
mushuk /etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
displayconnects=no ;only effects 1.6+
[admin]
secret = supersecretpass
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate,message
write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate,message
writetimeout = 5000
#include manager_additional.conf
#include manager_custom.conf Bu yerda biz asosan menejerning login va paroliga qiziqamiz.
Endi biz API sifatida xizmat qiladigan PHP skriptini yaratishimiz kerak. Veb-katalogda istalgan qulay nomga ega fayl yarating.
vi /var/www/html/call.php
<pre class="wp-block-syntaxhighlighter-code"><?php
if($_REQUEST['n1'] >= 100000000 && $_REQUEST['n2'] >= 100000000 && $_REQUEST['n1'] < 1000000000 && $_REQUEST['n2'] < 1000000000){
$n1 = $_REQUEST['n1'];
$n2 = $_REQUEST['n2'];
$timeout = 10;
$socket = fsockopen("localhost","5038", $errno, $errstr, $timeout);
fputs($socket, "Action: Login\r\n");
fputs($socket, "UserName: admin\r\n");
fputs($socket, "Secret: supersecretpass\r\n\r\n");
$wrets=fgets($socket,128);
echo $wrets."\r\n";
fputs($socket, "Action: Originate\r\n" );
fputs($socket, "Channel: local/".$n1."@from-internal\r\n" );
fputs($socket, "MaxRetries: 0\r\n" );
fputs($socket, "WaitTime: 30\r\n" );
fputs($socket, "Exten: $n2\r\n" );
fputs($socket, "Context: commutate\r\n" );
fputs($socket, "Priority: 1\r\n" );
fputs($socket, "Async: yes\r\n\r\n" );
$wrets=fgets($socket,128);
echo $wrets;
//echo "TRUE";
} else {
echo 'FALSE';
}
?></pre> Argumentlarni tekshirishning mutlaqo ahmoqona usulim uchun menga shippak otmang. Mening holatimda, nol bilan boshlanib bo’lmaydigan to’qqiz xonali sonlarni topishim kerak va men oddiy ifoda yozishga juda dangasa edim. ;)) Boshqa har qanday holatda, siz chekni yanada sodda qilishingiz va hatto operator raqamlarining tasdiqlangan ro’yxatini qo’shishingiz mumkin.
XXXXXXXXX operator va abonent raqamlari bilan almashtirilgandan so’ng, skriptni https://[server address]/call.php?n1=XXXXXXXXXXX&n2=XXXXXXXXX kabi havola orqali chaqirishga harakat qilamiz.
Agar hamma narsa to’g’ri sozlangan bo’lsa, server qo’ng’iroqni n1 raqamiga yo’naltiradi va agar ulanish muvaffaqiyatli bo’lsa, n2 raqami teriladi. Agar ikkinchi qo’ng’iroqqa javob berilsa, n1 kanalidagi operator n2 raqamidagi abonentga ulanadi. Aks holda, butun sessiya server tomonidan to’xtatiladi.
Ushbu skriptdan, shuningdek, n1 argumenti sifatida operatorlar yoki qo’ng’iroq guruhlari raqamlarini oldindan ko’rsatish orqali veb-qayta qo’ng’iroq qilish vidjeti uchun ham foydalanish mumkin.
