アスタリスクのクイックヘルパー

この記事では、アスタリスクアプリケーションの暫定的な開発を要約します。 それはすべて、年末年始に始まりました。 アスタリスクですばやく音声ダイヤルをしたかったからです。 次に、 発信者の番号による方向の検索が行われました (番号8〜800を入力する場合に便利です)。 その後、いくつかのカスタムプロジェクトがありました。 そして最近では、 アスタリスクのLCR 。 これらのアプリケーションはすべて、 ding-dongライブラリを使用して開発されており、node.jsアプリケーションでAGI(Asterisk Gateway Interface)を操作できます。



さらに、node.jsとding-dongを使用すると、便利なアスタリスクアプリケーションをすばやく開発できることを示したいと思います。



過去 6か月間、 ding-dongnode-agiプロジェクトのフォーク)は、約束スタイル(私の同僚のDenisに感謝)とAGI関数の完全なセットをサポートし始めました。



しかし、アプリケーションを作成する前に、まず何か他のものについて話したいと思います。 さらに、「自分と」の会話の形式で少し。



問題は何ですか?



アスタリスクをたくさん調整します。 多くの場合、顧客はアスタリスクを使用して実際に実現できる興味深いチップを必要とします。 さらに、必要な機能をさまざまな方法で実装することもできます。 しかし、多くの場合、この機能を追加するとアスタリスクダイヤルプランが非常に複雑になり、すべてのチップを動作状態に維持することが難しくなります。



さらに、ある人が何らかの方法で構成および調整された場合は、マニュアルを作成し、別の人がそれを把握して何かを修正または再構成する方法があります。



以下に、シングル再生用の優れたレシピの例を示します。 そして、私はチップを思いつき、開発し、テストし、その後クライアントを作業システムに、そして迅速かつ最小限の変更で配置したいと思います。 そして、他のすべてのクライアントに1本の小さな指を置く。



多くの人が、FreePBXやElastixなどの製品を使用しています。これらの製品では、典型的なことは典型的な方法で行われています。 しかし、何かが非標準の場合、「スクリプト」は「* _custom.conf」などのファイルで始まります



そして、あなたは何を提案しますか?



もちろん、「銀の弾丸」ではありません。 大まかに言えば、アスタリスクダイヤルプランは2つの部分に分けることができます。コール自体のルーティングと、それに基づいてコールのさらなるルートが依存する補助計算です。



したがって、これらの計算は、アスタリスクのダイヤルプランを超えて行う必要があります。



agi-number-archerおよびlcr-finderアプリケーションは、このアプローチを非常によく示しています。 入り口では電話番号を、出力では名前またはコードを取得します。



lcr-finder:結果として、着信番号の通話コストが最も低いオペレーターの名前を返します。

agi-number-archer:結果として、発信者の番号で地域を表示します。



このようなアプリケーションを使用するアスタリスクのダイヤルプランは、このサービスがどのように配置されているかをまったく知りません。node.jsまたはツイストで動作し、MySQLまたはMongoDBデータベースを使用します。 さらに、ダイヤルプランは、サービスからのデータがない場合にコールを渡すオプションを持つように作成する必要があります。



たとえば、lcr-finderでは、オペレーターを最低コストの検索から切断することが可能になりましたが、ダイアルプランの観点からは、アスタリスクは何も変更せず、アプリケーションは更新され、「ダイアルプランのリロード」さえ作業中のアスタリスクで実行する必要はありませんでした。



別の例。 voicerの最初のバージョンは、見つかった番号でアスタリスクを呼び出すコマンドを送信しました。 現在のバージョンのボイスャーは、見つかった番号を返すだけで、ダイヤルプランで結果を分析し、電話をかけ、完了した通話のステータスを処理できます。



OK、AGIはクールです。 スクリプトではなくサーバーなのはなぜですか?



それは完全に機能するサービスであるため、その作業に関するログを保持するAGI要求にいつでも応答する準備ができています。



また、私のネットワークではいくつかのアスタリスクが機能し、それぞれのサーバーを上げることは何らかの形で冗長であり、すべてのマシンでスクリプトを更新することも1つよりも時間のかかるタスクでした。



さらに、監視システムとプロセスマネージャの存在も役立ちます。 監視システムは動作中のサーバーを監視し、詳細なログは詳細を理解するのに役立ち、プロセスマネージャー(pm2など)は、リクエストの処理中にエラーが発生した場合に再起動します。



* 12因子適用翻訳 )のマニフェストがこのアプローチ全体に影響したことに注意してください。



良いサーバー。 なぜnode.jsなのか?



うーん、あなたはPHPを取る必要がありましたか? 真剣に、同じことをphpで行うことができます 。 しかし、npmを使用してアプリケーションを迅速に開発および配布することが好きでした。 当初、コールバック関数は緊張していましたが、現在ding-dongはプロミススタイルをサポートしているため、周期的なスクリプトを含むきちんとしたスクリプトを作成できます(音声コードを参照)。



おそらくnode.jsよりも生産的なものでしょうか? 私は毎秒数百万のリクエストを持っていませんが、すべてうまくいきます。 おそらく、より負荷の高いシステムでは、何か他のものを使用する必要があります(ただし、おそらくアスタリスクも変更する必要があります)。



ディンドンに代わるものはありますか?



もちろん、たとえば、js上のagiサーバーの優れたオプションが最近登場しました。 AGIへのマッパーリクエストがあります。 いくつかのスクリプトを記述して、同じポートの異なるuri_stringにハングさせることができます。phpにはphpagi、 fast-pagiがあります。 一般に、ポイントはプログラミング言語ではなく、アプローチです。



すでにAGIを使用してhelloWorldを作成できますか?



だから。 ding-dongがアプリケーションの迅速な開発にどのように役立つかを見てみましょう。



AGIを使用する主な機能は、ダイヤルプラン管理作業をサードパーティアプリケーションに転送することです。 サーバーに。 このような単純なダイヤルプランを書きましょう。



extensions.conf [default] exten => _X.,1,AGI(agi://localhost:3000) exten => _X.,n,Verbose(DIALPLAN_VARIABLE)
      
      







デフォルトコンテキストでの加入者の呼び出しは、AGIサーバーによって制御されます。 簡単なAGIサーバーを作成しましょう。



 var AGIServer = require('ding-dong'); var handler = function (context) { context.onEvent('variables') .then(function (vars) { return context.answer(); }) .then(function () { return context.streamFile('beep'); }) .then(function (result) { return context.setVariable('DIALPLAN_VARIABLE', 'helloWorld'); }) .then(function (result) { return context.end(); }); }; var agi = new AGIServer(handler); agi.start(3000);
      
      







ここでダイヤルプランを保存してリロードし、AGIサーバーを起動して、電話をかけます。 「ビープ音」が聞こえ、helloWorldがアスタリスクコンソールに詳細に表示されるはずです。



ポート3000で実行されるAGIサーバーでは、呼び出しを行うハンドラー関数を指定する必要があります。 チャネルと対話するためのコンテキストがあります。 呼び出しがAGIサーバーに到着すると、変数イベントが発生します。 呼び出すと、varsデータセットも送信されます。 時間、ダイヤル番号、ピア呼び出しなどが含まれます。



また、コンテキストを介して、コールチャネルにコマンドを送信できます。ここでは、コンテキストの例では、streamFileコマンドでビープ音が再生されます。



最後に、セッションを閉じるcontext.end()を作成します。 Dialplanのアスタリスクはさらに先に進みます。



この例には、context.setVariable()-dialplan変数を設定する関数もあります。 つまり 結果をダイヤルプラン変数に保存すると、ダイヤルプラン自体がその処理を決定します。 この変数は、ピアの名前、呼び出し先、注文番号、またはその他のものです。



また、コンテキストを使用して、DTMFの受信、ファイルへの書き込み、数字の発音、その他のアスタリスク機能のためのコマンドを送信できます。



そしてもちろん、ハンドラーでは、データベース内のデータの検索、音声認識など、AGIに呼び出し制御を送信したすべての有用な作業を行う必要があります。



このgithubの例: github.com/antirek/ding-dong-sample



欠点?



一般的に、非常に便利です。 おそらく、最も不便なことは、AGIを介してファイルを転送できないことです。 つまり アスタリスクがファイルを書き込んでからAGI経由で転送できる場合、ボイスャーの設定は少し簡単になります。



このアプローチで他に何が実現できますか?

たとえば、タスクの一部(1、2、3、4)は、bashでスクリプトを記述するのではなく、小さなAGIサーバーを記述してソリューションを検索することで解決できると考えています。 そして、それは使用する方が便利でしょう。



また、たとえば、DTMFが注文番号を入力したときに注文のステータスに関するアラートを実装し、アプリケーションで実行された作業に関する情報を収集し、ファイルをリッスンできます。 つまり 小さく、シンプルで機能的なスクリプトを作成するには十分です。



結論として?



もちろん、AGIは初日には存在しません。 そして、アスタリスクと対話し、タスクを共有するこの方法を使用する多くのスクリプトとアプリケーションが既にあります。 これらのアプリケーションと、このノートに記載されている情報が役立つことを願っています。



ding-dongvoiceragi -number-archerlcr-finder

AGIはアスタリスクのWebサイトで機能します



この記事、開発の提案、建設的な批判についてコメントさせていただきます。



All Articles