La historia de un proyecto o cómo creé un PBX de 7 años basado en Asterisk y Php

Seguramente muchos de ustedes, como yo, tuvieron la idea de hacer algo único. En este artículo describiré los problemas técnicos y las soluciones que tuvieron que encontrarse en el desarrollo de centrales telefónicas automáticas. Quizás esto ayude a alguien a decidir su idea y a alguien a seguir el camino trillado, porque también utilicé la experiencia de los pioneros.


imagen


Idea y requisitos clave


Asterisk (framework ), FreePBX ( Asterisk). FreePBX – . , , .


. Asterisk , -, . , . , , FreePBX. FreePBX php4, php5.6  .


. FreePBX, , - .


:


  • , . ,
  • , ,
  • . FreePBX API , .. , , , API Asterisk,
  • opensource – .

, . , . , FreePBX , . , . .


, — . , , , , . , - , « » , .



. , , , , -.


imagen
, , Asterisk.


imagen


, :


  • , , ,
  • - ( ),
  • ,
  • , .

, :


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


:


imagen
* — (), .


API . -, Asterisk .
-, , .. .
-, .


, Askozia, , . .


.


Asterisk, . Asterisk , , REALTIME_HASH.


Asterisk Asterisk.


imagen


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 .


imagen


, , c php. -, php , -, -, – - php.


dialplanDynamicCall pbxCallRequest Asterisk.


imagen


( php xdebug ), .



. – . = : , , . , . .


:


  • , , .. ,
  • . FreePBX , , . , 0-1 . , ( . «», « »),
  • , , .

, .


:


( — ).


imagen


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

, .


imagen


:


  1. « » 05:55:52 89295671458 89999999999.
  2. 05:55:53 «test»
  3. « », 16 . .
  4. « » () «1» 5 . .
  5. « » « ». ( ) 11 .
  6. « » «1, 2, 3» 11 . .
  7. . « 1». . 0 .
  8. « ». 31 , .
  9. «», 12 .
  10. 2 «1» «2» 12 «2». . «2», «2» «2».

. , . , , , , - , .


, . , , .


, , , , .


?


, – .


php, .. sip , , . Asterisk. ( - ) . Asterisk , - . , , , .


:


  • ,
  • -,
  • , ,
  • .

API. , , API . API , , . API .


(/), (, , , , ). – .


Lo que sucederá después mostrará el tiempo. Hay muchos más matices que vale la pena rehacer, hay muchos más planes, pero ya ha pasado un año desde la creación de la tercera versión y ya se puede decir que la idea funciona. El principal inconveniente de la tercera versión son los recursos de hardware, pero para la conveniencia del desarrollo, por lo general, siempre tiene que pagar de esa manera.


All Articles