アスタリスクの例:チャネルバランシング

テレフォニーのために選択している組織は、天文学的に高価で、非常に混乱し、既製のATC機能が制限されていませんが、Linuxディストリビューションにインストールできる最新の拡張可能な完全に無料のソフトウェアです。 最も有名で普及しているLinuxテレフォニーソリューションは、もちろんアスタリスクです。



システム管理者にとって残念なことに、アスタリスクはセットアップの容易さという点で企業のPBXからそれほど遠くありません。 もちろん、アスタリスクはおそらく想像できるすべてのものですが、価格は些細な設定とはほど遠いものです。



アスタリスクでの作業中に、多くの異なる構成例を蓄積しました。 任意のアプリケーションからワンクリックで送信できる完全デジタルファックス、インテリジェントな通話録音、IVRを使用したあらゆる種類の機能など など 関心があります-やがて私はレイアウトします。



同じ投稿で、チャネルの「重み」に基づいて発信接続の単純なバランスをとるシステムを共有したいと思います 。 これが必要な理由の最も簡単な例は、無制限の料金で複数のオペレーターの通常のSIMを介した呼び出しです。 すべての事業者には分単位の一定の最大値があり、これは月額料金の一部として無料で使用できます。 そのため、発信コールを一定の割合でSIMカードに分配したいと思います。



基本的な方法でアスタリスクを構成できること、ダイヤルプランの使用方法などを知っていることを前提としています。 Asteriskのインストール方法のように、初心者向けに別の記事を書くのは愚かなことです。



一方、分数に基づいたバランスの問題に対する本格的なソリューションには、通話時間、AGIスクリプト、およびその他のかなり複雑で重い付加機能に関する統計情報を含むデータベースのセットアップが含まれます。 完全に包括的なソリューションではありませんが、よりシンプルなソリューションについて説明します。



そのため、2つのSIP回線があり、それぞれが独自のGSMチャネルにつながっています。 Tele2およびMegaphoneオペレーター。 Tele2では300分、メガホンでは150分なので、Tele2では2倍の通話を受信する必要があります。 さらに、発信コールは使用されていないSIMカードを通過する必要があり、両方のチャネルがビジーの場合、親切な叔母はこれについて発信者に通知する必要があります。



したがって、 sip.confには、次のような行の説明が含まれています。



; ################################ ; GSM  ; ################################ [gsm-lines](!) deny=0.0.0.0/0 permit=10.42.42.42/32 type=friend secret=******* qualify=yes host=dynamic callcounter=yes ;    DEVICE_STATE call-limit=1 ;  1    group = 1 context = from-gsm ;     insecure=invite canreinvite=no nat=no ;  [gsmline1](gsm-lines) ; Tele2 [gsmline2](gsm-lines)
      
      





ここで重要なのは、パラメータcallcountercall-limitおよびcontextです。 それらはすべて明確だと思います。



実際、 extensions.confでは、指定されたコンテキストは次のように記述されます。



 ;   GSM  [from-gsm] ;  ( ) exten => +79310000000,1,Set(GROUP(gsm)=public) ;  ,     exten => +79310000000,n,Goto(to-internal,queue,1) ; Tele2 exten => +79520000000,1,Set(GROUP(gsm)=public) ;  ,     exten => +79520000000,n,Goto(to-internal,queue,1)
      
      





もちろん、異なる内線名があります(簡単にするために、対応する電話の番号を使用しました)。 これらは、各チャネルのSIP接続設定のGSMゲートウェイで構成されます。



ここでは、着信コールごとに、 パブリックグループがgsmカテゴリに設定されていることが重要です。 これは、占有チャネルの現在の数を計算するために必要です。



楽しい部分はアウトバウンドコンテキストです。



 ;    [to-gsm] ; ,     exten => _89XX.,1,GotoIf($["${GROUP_COUNT(public@gsm)}" >= "2"]?noline) ;    ... exten => _89XX.,n,Set(GROUP(gsm)=public) ;  ,     ; Ok,  -     ? exten => _89XX.,n,Set(PR=${EXTEN:1:3}) exten => _89XX.,n,GotoIf($[$["${PR}"="921"] | $["${PR}"="931"] | $["${PR}"="929"]]?prefer-megafon) ;    : ;  Tele2   300  ,   - 150. ;    ,     300 -    tele2,  -  exten => _89XX.,n,Set(BALANCE=${RAND(0,450)}) exten => _89XX.,n,GotoIf($[${BALANCE}<=300]?prefer-tele2:prefer-megafon) ;  Tele2  ,      exten => _89XX.,n(prefer-tele2),GotoIf($["${DEVICE_STATE(SIP/gsmline2)}" = "NOT_INUSE"]?tele2:megafon) ;    ... exten => _89XX.,n(prefer-megafon),GotoIf($["${DEVICE_STATE(SIP/gsmline1)}" = "NOT_INUSE"]?megafon:tele2) ;        . exten => _89XX.,n(tele2),Dial(SIP/gsmline2/${EXTEN},120,Tg) exten => _89XX.,n,Goto(after-dial,${EXTEN},1) ;   -  exten => _89XX.,n(megafon),Dial(SIP/gsmline1/${EXTEN},120,Tg) exten => _89XX.,n,Goto(after-dial,${EXTEN},1) ;   -  ;     exten => _89XX.,n(noline),Set(__CALLED_GSM_NUM=${EXTEN}) ;    exten => _89XX.,n,Goto(ivr-gsm,no-line,1) ;          exten => h,1,Goto(after-dial,h,1)
      
      





一般に、すべての操作についてコメントがあります。 ディストリビューション自体が、トリッキーなランダムトリックの原因となります。 私はすぐに言わなければならない-実際には、バランスを取るためのそのような非常に近似したソリューションは、各コールの継続時間の計算を備えた本格的なデータベースより悪い結果を示さなかった。 結局のところ、あなたは余裕を持って無料の議事録を購入する、私は願っていますか? つまり バランスを保つ必要があるだけで、提案されたソリューションが成功します。



通話の後処理には、 ダイヤル後のコンテキストが必要です。 記録に関するあらゆる種類のアクション、継続時間の同じ計算などがあります。 この記事では、これはすべて無関係です。



しかし、 ivr-gsmは興味深いものです。



 ; IVR  GSM  [ivr-gsm] ;         exten => no-line,1,Background(no-gsm-line,,custom) exten => no-line,n,Wait(10) ;     -     exten => no-line,n,GotoIf($["${CALLED_GSM_NUM}" != ""]?to-gsm,${CALLED_GSM_NUM},1) ;  -    exten => no-line,n,Hangup()
      
      





GSMラインなしのファイルでは、女の子は次のような心地よい声で話す必要があります。すべての発信ラインがビジーです。 しばらく待つか、後でコールバックしてみてください。



原則として、上記で提案されたダイヤルプランは、非常に単純に多数の回線に拡張されます。 DEVICE_STATEを確認した直後に、目的の行がビジーの場合、それを何らかの拡張機能に送信する必要があります。これは、最初に使用されていないものを探すだけです。



記事が需要がある場合は、シリーズを継続して、たとえばデジタルファックスの構成をレイアウトしようとします。



All Articles