من المؤكد أن العديد منكم ، مثلي ، كانت لديهم فكرة لجعل شيء فريد. في هذه المقالة سأصف المشاكل والحلول التقنية التي كان يجب مواجهتها في تطوير بدالات الهاتف الأوتوماتيكية. ربما سيساعد هذا شخصًا ما على اتخاذ قرار بشأن فكرته ، وشخص ما يجب أن يتبع المسار المطروق ، لأنني استخدمت أيضًا تجربة الرواد.

متطلبات الفكرة والمفتاح
كل شيء مبتذل التي بمحبة النجمة (إطارا لبناء تطبيقات الاتصالات)، والتشغيل الآلي من الاتصالات الهاتفية والمنشآت FreePBX (واجهة ويب لل النجمة ). إذا كانت احتياجات الشركة غير ملحوظة وملائمة لقدرات FreePBX - كل شيء رائع . تم التثبيت بالكامل في يوم واحد ، تلقت الشركة مقسم هاتف آلي تم تكوينه ، وواجهة مريحة وتدريب قصير ، بالإضافة إلى الدعم حسب الرغبة.
. Asterisk , -, . , . , , FreePBX. FreePBX php4, php5.6 .
. FreePBX, , - .
:
- , . ,
- , ,
- . FreePBX API , .. , , , API Asterisk,
- opensource – .
, . , . , FreePBX , . , . .
, — . , , , , . , - , « » , .
. , , , , -.

, , Asterisk.

, :
, :
......
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__);
. , , FreePBX. , . , .
API — , . , FreePBX, Apply .
:

* — (), .
API . -, Asterisk .
-, , .. .
-, .
, Askozia, , . .
.
Asterisk, . Asterisk , , REALTIME_HASH.
Asterisk Asterisk.

– hints.
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)
...
Ami ( Asterisk) .
API . , , “dialtime” ( , .. API Ami ).
. , . , , , . , -, API . , - « », .
. php Asterisk , Asterisk .
:
$usersInitSection = $dialplan->createExtSection('usersinit-sub','s');
$usersInitSection
->add('',new \Dialplan\ext_gotoif('$["${G_USERINIT}"="1"]','exit'))
->add('',new \Dialplan\ext_set('G_USERINIT','1'))
->add('',new \Dialplan\ext_gosub('1','s','sub-AddOnAnswerSub','usersconnected-sub'))
->add('',new \Dialplan\ext_gosub('1','s','sub-AddOnPredoDialSub','usersinitondial-sub'))
->add('',new \Dialplan\ext_set('LOCAL(TECH)','${CUT(CHANNEL(name),/,1)}'))
->add('',new \Dialplan\ext_gotoif('$["${LOCAL(TECH)}"="SIP"]','sipdev'))
->add('',new \Dialplan\ext_gotoif('$["${LOCAL(TECH)}"="PJSIP"]','pjsipdev'))
, . , .
Asterisk php, FastAGI php. FastAGI Asterisk, , . . Asterisk , php.
. , /. , 1,5 , , .
1 php Pthreads. - . php , - , php, php .
‘’, PHPLIB. php , , , – . FastAGI , php .
Asterisk 1,5 0,05 .

, , c php. -, php , -, -, – - php.
dialplanDynamicCall pbxCallRequest Asterisk.

( php xdebug ), .
. – . = : , , . , . .
:
- , , .. ,
- . FreePBX , , . , 0-1 . , ( . «», « »),
- , , .
, .
:
( — ).

- « » 05:55:52 89295671458 89999999999, «2» 104. 60 36 .
- «2» 112 «1» 8 . 14 .
- «1» 13
, .

:
- « » 05:55:52 89295671458 89999999999.
- 05:55:53 «test»
- « », 16 . .
- « » () «1» 5 . .
- « » « ». ( ) 11 .
- « » «1, 2, 3» 11 . .
- . « 1». . 0 .
- « ». 31 , .
- «», 12 .
- 2 «1» «2» 12 «2». . «2», «2» «2».
. , . , , , , - , .
, . , , .
, , , , .
?
, – .
php, .. sip , , . Asterisk. ( - ) . Asterisk , - . , , , .
:
API. , , API . API , , . API .
(/), (, , , , ). – .
ما سيحدث بعد ذلك سيظهر الوقت. هناك العديد من الفروق الدقيقة التي تستحق العودة ، وهناك العديد من الخطط ، ولكن مر عام بالفعل منذ إنشاء الإصدار الثالث ويمكننا القول بالفعل أن الفكرة تعمل. ناقص الإصدار الثالث الرئيسي هو موارد الأجهزة ، ولكن من أجل راحة التطوير ، عادةً ما يكون عليك بهذه الطريقة أن تدفع.