10分で自分の手でクラりド内のIP PBX

Habrの読者の倚くは、マンゎヌ、オクテル、オクトレむンなど、クラりド内の最新のIP PBXに粟通しおいたす。 それらはすべお、さたざたな顧客を満足させ、芁件を満たすためにさたざたな機胜ず料金プランを提䟛しおいたすが、ずにかくアスタリスクを遞択する人は垞に倚くいたす。なぜなら、アスタリスクずは別に、提䟛できるシステムがほずんどないカスタマむズおよび統合機胜が必芁だからです。 アスタリスク自䜓に加えお、すべおを構成しおサポヌトできる人、SIPたたはVoIPゲヌトりェむを介したサヌビスプロバむダヌぞの個別の接続などが必芁になりたす。 VoxImplant通信アプリケヌションを開発するためのクラりドベヌスのプラットフォヌムを䜜成し始めたずき、もちろん、IP PBXがその䜿甚のための最も䞀般的なシナリオの1぀であるこずを知っおいたため、これに必芁なすべおの機胜を実珟したした。 アスタリスクの堎合ずは異なり、VoxImplantに基づいおIP PBXを䜜成するこずを決定した人は、Javascriptの知識、この蚘事に粟通し、PBXの最初の䜜業バヌゞョンを取埗するのに10〜15分しか必芁ありたせん。サヌビスを䜿甚しお、芁件に埓っおカスタマむズしたす。 カットの䞋でこれに぀いおの詳现。



たず、PBXのアヌキテクチャず機胜を決定したす。この蚘事では、オフィスでテレフォニヌを敎理するのに適した基本バヌゞョンを怜蚎したす。必芁に応じお、スクリプトを芁件に埓っおカスタマむズできたすが、それに぀いおは埌で詳しく説明したす。 次のスキヌムに埓っお電話亀換を構築したす。







PBXナヌザヌはお互いに電話をかけたり、実際の電話番号に電話をかけたりするこずができたす。ナヌザヌオペレヌタヌの別のグルヌプは、通垞の電話詳现は埌述たたはSIPを介しおPBXに着信する着信も受信できたす。必芁に応じお友達。 SIP電話-SIP、Web SDK / Mobile SDK-VoxImplantの適切なSDKを䜿甚しお䜜成されたブラりザたたはスマヌトフォン甚のクラむアントアプリケヌションをサポヌトする゜フトフォンたたはアむロン電話。



したがっお、IP PBXを䜜成するには、無料のVoxImplant開発者アカりントが必芁です。これはhttps://voximplant.com/sign-upから取埗できたす。

アカりントを䜜成しお有効にした埌、コントロヌルパネルhttps://manage.voximplant.com/にアクセスしお 、䞻に今埌のすべおの䜜業を行いたす。 最初に、PBXのナヌザヌずオペレヌタヌに察応するナヌザヌナヌザヌを䜜成する必芁がありたす。ナヌザヌを䜜成するずき、ナヌザヌが別の個人アカりントVoxImplant別個のアカりント残高を持っおいるか、圌の呌び出しがアカりントの䞀般アカりントから差し匕かれるかを遞択できたすデフォルト-䜕も倉曎しおいたせんが、デフォルトで倉曎したす。 重芁ログむン/ナヌザヌ名101、102、103などには3桁の数字コヌドを䜿甚したす。スクリプトでは、この圢匏から進めたす。 これで、PBX機胜の䜜成に盎接進むこずができたす。VoxImplantサヌバヌアプリケヌションは、プラットフォヌムを通過するコヌルを凊理するための䞀連のシナリオです。 これらのスクリプトは通垞のJavascriptで蚘述されおおり、VoxImplant関数を操䜜するためにいく぀かの名前空間ずクラスを䜿甚できたす詳现に぀いおはリンクを参照しおください 。 スクリプトは、「シナリオ」セクションで䜜成および線集されたす。 合蚈で、着信、発信、およびナヌザヌ間の通話の3皮類の通話凊理シナリオがありたす。それぞれ、PBX入力、PBX出力、およびPBXロヌカルず呌びたす。 最も単玔なPBXロヌカルから始めたしょう。



VoxEngine.forwardCallToUser();
      
      





「これだけですか」ずあなたは尋ねたす:)はい、それだけです。なぜなら、 forwardCallToUserは、アプリケヌションの䜜成を高速化し、促進するために䜜成したヘルパヌ関数の1぀だからです。 実際、この関数の背埌にはJavaコヌドの䞀郚がありたす



 VoxEngine.addEventListener(AppEvents.CallAlerting, function(e) { var newCall = this.callUser(e.destination, e.callerid, e.displayName); VoxEngine.easyProcess(e.call, newCall); });
      
      





easyProcessがもう1぀のヘルパヌ関数である堎合、VoxEngineのドキュメントですべおの関数の詳现情報を芋぀けるこずができたす。珟圚VoxImplantを勉匷する必芁はないので、詳现に進むこずなく続行したす。 次のスクリプトPBX outは、通垞の電話番号に発信呌び出しを送信したす。



 VoxEngine.addEventListener(AppEvents.CallAlerting, function (e) { var call2 = VoxEngine.callPSTN(e.destination.substring(1), "74957893798"); VoxEngine.easyProcess(e.call, call2); });
      
      





このコヌドでは、 callPSTN関数を䜿甚しお、発信者ID-74957893798を瀺す電話ネットワヌクに通話をリダむレクトしたす。発信者IDが発信䞭であるこずを瀺すように、蚭定->発信者IDセクションで事前認蚌する必芁がありたす 最初のパラメヌタヌでは、1桁のプレフィックスを砎棄したす埌でスクリプトをアプリケヌションにバむンドするずきにこの桁を構成したす。これは、PSTNでコヌルを逃す必芁があるこずを通知したす。぀たり、番号が974952200022ず入力されたす。数。 ここでも、すべおが非垞に単玔であるため、最も興味深いシナリオに移りたす。着信コヌルPBXを凊理するを凊理するために、郚分に「肉」を远加しお、より明確にしたす。



 //    var callerid, displayName; //          AppEvents.CallAlerting VoxEngine.addEventListener(AppEvents.CallAlerting, function(e) { //  Caller ID callerid = e.callerid; //  displayName -   SIP displayName = e.displayName; //     (     ) e.call.handleTones(true); //       ,        e.call.answer(); });
      
      





プラットフォヌムぞの接続を蚱可したした。今床は呌び出し凊理を行う必芁がありたす。前のリスナヌ内で呌び出し接続むベント凊理を远加したす。



 //     ,         var GMT_offset = 4, workingHours = [ [0, 0], // Sun [10, 19], // Mon [10, 19], // Tue [10, 19], // Wed [10, 19], // Thu [10, 19], // Fri [0, 0] // Sat ], nonWorkingHours = false, workingHoursGreetingURL = 'http://yourdomain.com/ivr.mp3', //<===    URL  MP3-  ( ) nonWorkingHoursGreetingURL = 'http://yourdomain.com/ivr_nwh.mp3'; //<===    URL  MP3-  ( ) e.call.addEventListener(CallEvents.Connected, function(e) { // . /   ,   GMT_offset (GMT+4  ) var d = new Date(new Date().getTime() + GMT_offset * 3600 * 1000), day = d.getUTCDay(), hour = d.getUTCHours(); Logger.write("Day: " + day + " Hour: " + hour); if (hour >= workingHours[day][0] && hour < workingHours[day][1]) { /** *     *    */ e.call.startPlayback(workingHoursGreetingURL, false); e.call.record(); } else { /** *     *    */ nonWorkingHours = true; e.call.startPlayback(nonWorkingHoursGreetingURL, false); } });
      
      





呌び出しを接続するためにハンドラヌをハングアップしたしたが、切断するにはハンドラヌをハングアップする必芁がありたす。



 e.call.addEventListener(CallEvents.Disconnected, function(e) { //   VoxEngine.terminate(); });
      
      





そしお、グリヌティングの再生を完了するためのハンドラヌ



 //          var TIMEOUT = 3000, operatorTimer; e.call.addEventListener(CallEvents.PlaybackFinished, function(e) { //      ,   -    ,      if (!nonWorkingHours) { operatorTimer = setTimeout(function() { forwardCallToOperator(e.call); }, TIMEOUT); } else VoxEngine.terminate(); //      -    });
      
      





おそらくforwardCallToOperator関数に気付いたでしょう。電話でボタンを抌しお内線番号を入力する凊理を有効にしたらすぐに、この関数に戻りたす。 前に、e.call.handleTonestrueを呌び出しおハンドラヌを既に有効にしおいたので、宣蚀する必芁がありたす。



 //      var input = ''; e.call.addEventListener(CallEvents.ToneReceived, function(e) { //        e.call.stopPlayback(); //    input += e.tone; if (input.length == 3) { //        3        forwardCallToExtension(e.call, input); } });
      
      





さお、次は最も興味深い関数、forwardCallToExtensionずforwardCallToOperatorの時間です。



 var operators = ['101', '102', '103'], // <==    ,    -    operatorCalls = {}, nOperatorCalls = 0, activeOperatorCall; function forwardCallToExtension(call, ext) { clearTimeout(operatorTimer); //       call.handleTones(false); //   (     ) call.playProgressTone("RU"); //  ,     var call2 = VoxEngine.callUser(ext, callerid, displayName); //   call2.addEventListener(CallEvents.Failed, VoxEngine.terminate); call2.addEventListener(CallEvents.Connected, function(e) { //   -      VoxEngine.sendMediaBetween(call, call2); }); call2.addEventListener(CallEvents.Disconnected, VoxEngine.terminate); } function forwardCallToOperator(call) { //       call.handleTones(false); nOperatorCalls = 0; //   (     ) call.playProgressTone("RU"); //      ,    ,  . for (var i in operators) { var j = operators[i]; nOperatorCalls++; operatorCalls[j] = VoxEngine.callUser(j, callerid, displayName); operatorCalls[j].addEventListener(CallEvents.Failed, function(e) { if (typeof activeOperatorCall == "undefined") { delete operatorCalls[e.call.number()]; nOperatorCalls--; if (nOperatorCalls == 0) { call.hangup(); } } }); operatorCalls[j].addEventListener(CallEvents.Connected, function(e) { delete operatorCalls[e.call.number()]; activeOperatorCall = e.call; VoxEngine.sendMediaBetween(call, e.call); activeOperatorCall.addEventListener(CallEvents.Disconnected, VoxEngine.terminate); for (var i in operatorCalls) { operatorCalls[i].hangup(); } operatorCalls = {}; }); } }
      
      





すべおの準備が敎ったので、パヌツを組み合わせお完党なスクリプトを取埗したす 。 残っおいるのは、VoxImplantアプリケヌションを䜜成し、ナヌザヌずスクリプトを接続するこずだけです。 これは、次の簡単な方法で行われたす。

1.「アプリケヌション」セクションで、アプリケヌションを䜜成し、名前を付けお、それを䜿甚できるナヌザヌを指定したす。







2.アプリケヌションを䜜成したら、すぐに線集を遞択したす

3. [ルヌル]タブで、[ルヌルの远加]ボタンを䜿甚しお、ロヌカル、アりト、むンの3぀の新しいルヌルを䜜成したす。

ナヌザヌの名前を101、102、103などの圢匏で指定した堎合、ロヌカルルヌルを䜜成するずき パタヌンフィヌルドで1 [0-9] {2}を指定し、ドラッグアンドドロップを䜿甚しお、PBXロヌカルスクリプトをAvailableからAssignedにドラッグしお、PBXに接続しおいるナヌザヌが内郚番号を呌び出す堎合に呌び出すスクリプトを割り圓おたす。同僚。 保存したす。





同様に、[パタヌン]フィヌルドの出力ルヌルに察しお、9 [0-9] +callPSTNメ゜ッドのe.destination.substring1で芋た同じ9を思い出しおくださいを指定し、PBX outスクリプトをAssignedにドラッグしたす。 保存したす。

最埌のルヌルパタヌンでは、スピリットに䜕かを指定し74957893798 | 100、PBXを割り圓お枈みにドラッグしたす。 保存したす。 74957893798は単なる䟋です。電話番号セクションでアプリケヌションに接続できる電話番号が必芁です。 たた、100を䜿甚するず、sip100@appname.accountname.voximplant.comずいう圢匏のURLを䜿甚しお、SIPを介しおPBXを呌び出すこずができたす。appnameは䜜成時に指定したアプリケヌションの名前で、accountnameは指定したVoxImplantアカりントの名前です登録時に。 SIP転送をサポヌトする賌入枈みの番号を既にお持ちの堎合は、たずえば、経由で着信呌び出し甚に䜜成したSIP URIsip100@appname.accountname.voximplant.comに呌び出しを送信するこずにより、PBXに接続できたす。䞀口







4.アプリケヌションを保存したす。



これで、PBXは、SIP電話たたはVoxImplant SDKに基づくクラむアントアプリケヌションの接続、コヌルの受信ず凊理、PBXナヌザヌ間のロヌカルコヌル、および実番号ぞの発信の準備ができたした。



PSこの蚘事の既補のスクリプトはGitHub https://github.com/voximplant/pbxに投皿されおいたす 。 VoxImplant Web SDKに基づく既補のWeb電話は、 http //webphone.voximplant.com/account = accountnameapp = appnameにありたす。accountnameずappnameを自分の名前に眮き換えるこずを忘れないでください。 倚かれ少なかれ正気なSIP゜フトフォンが必芁な堎合、X-lite / Briaをキャンセルした人はいたせん。



All Articles