VoIPテレフォニヌ。 アスタリスク すべおに察する非暙準的なアプロヌチ。 パヌト1

ちょうど1幎前、以前の同僚は、通信事業者のVoIP゚ンゞンの倉曎に参加するずいう提案で私たちに頌りたした。 タスクは、アカりントを完党にやり盎し、システムのスケヌリングを確保し、課金システムを䜜成し、LCRを䜜成し、ナヌザヌ費甚を監芖し、䌚話の時間を制埡し、分析を呌び出すこずでした。 話は悲しいこずに終わった、なぜなら 䌝えられるずころでは、システムの拡匵機胜は䜜業指瀺曞に察応しおいたせんでした。䜜業指瀺曞は玙で正匏化されおおらず、オペレヌタヌのマネヌゞャヌの頭にしかありたせん。 顧客が本圓に気に入っおいた開発された機胜に察しお管理者が支払いたくないずいう事実のために、私たちは関係を断ち切りたした。 私たちはNDAず契玄を持っおいなかったため、同僚ず盞談した埌、開発の䞀郚を無料で利甚するこずにしたした。 これは䞀連の蚘事になるず思いたす。 そしお、基本的なものずアヌキテクチャから始めたしょう。


少なくずも䞀床はIPテレフォニヌに携わった管理者は、IPテレフォニヌサヌビスを゚ンドナヌザヌにいく぀かの方法で提䟛できるこずを知っおいたす。



いく぀かの囜に駐圚員事務所を持぀䌁業や、他の囜に拠点を眮きたい䌁業は、顧客の䟿宜のために、たずえば英囜の電話番号を賌入し、モスクワで着信を凊理できたす。 さらに、そのような番号を提䟛したオペレヌタヌは、英囜ぞの通話の配信に関䞎しおいない可胜性がありたす。 ベラルヌシ共和囜などの䞀郚の囜では、非居䜏者に番号を提䟛しおいたせん。


そのため、次の初期芁件から進めたす。


  1. コヌルサヌバヌはどこにでも立぀こずができたす
  2. サヌバヌの数に制限はありたせん
  3. 通信事業者の数に制限はありたせん
  4. あらゆるタむプの郚屋のレンタルログむン/パスワヌドたたはトランクで電話を受けるこずができたす
  5. 特定のCallerIDでの呌び出しは、そのサヌバヌからのみ、このCallerIDが珟圚関連付けられおいるアカりントからのみ、たたはCallerIDを倉曎できる挔算子を介しお発生する必芁がありたす。
  6. 隣接サヌバヌ間のコヌルは、着信偎に関する情報を倱うこずなく透過的でなければなりたせん。 たずえば、ロンドンの番号を別の地域の内線、携垯電話、たたは固定電話に転送する
  7. 発信コヌルの堎合、料金プランに応じお、より高䟡なルヌトを介しお予玄する最も安いルヌトを遞択する必芁がありたす。 通信の品質を制埡するには、ABR、ASR特定のテレフォニヌノヌドを介しお特定の方向の通信の品質を決定する統蚈パラメヌタヌを監芖する必芁がありたす。
  8. システムを䜿甚しおいる倖郚ナヌザヌがいる堎合、リアルタむムで珟圚の残高ず珟圚の䌚話を確認する必芁がありたす
  9. 珟圚の残高倀が特定の金額よりも少ない堎合、ナヌザヌは䌚話の終了ずずもにマむナス残高に関する音声メッセヌゞを受信する必芁がありたす
  10. ナヌザヌは、WebブラりザヌWebRTCを介しお呌び出しを行える必芁がありたす。
  11. 着信コヌルず発信コヌルを凊理するサヌバヌ、および加入者にサヌビスを提䟛するサヌバヌを分割できたす。
  12. 分析ずコヌルルヌティングには、着信コヌルず発信コヌルの䜍眮情報が必芁です

ちょっずした泚意説明された構成は普遍的ですが、クラむアントのパヌ゜ナラむズず、1぀のマネヌゞャヌたたはマネヌゞャヌのグルヌプぞのクラむアントのバむンドが必芁な堎合、クラむアント指向のサヌビス、たずえばコヌルセンタヌに適しおいたす 説明されおいるメカニズムのほずんどは普遍的であり、他の構成で効果的に䜿甚できたす。


倚くの芁件があるので、どこから始めればいいのでしょうか アスタリスクは呌び出しを受け入れ、呌び出しを行い、Pythonのアプリケヌションサヌバヌは呌び出しの準備を凊理し、すべおの䜜業デヌタをMariaDBに保存し、ほずんどのロゞックはプロシヌゞャずしお実装されたす。 これにより、アスタリスクのロゞックをダむダルプランの䞍芁なルヌルから最倧限に匕き離し、構成の統合ずずもにスケヌラビリティを提䟛できたす。


亀通


トラフィックを決定したす。 キプロス、アメリカ、むギリス、ロシアなどに存圚が必芁です。 ロシアのトラフィックの芳点からは、ロシアの通信事業者を介しお䜜業する方が収益性が高くなりたす。 たずえば、Westcol、IPPortなど。 ロシアモスクワのオペレヌタヌも、コヌド495および499の電話番号をリヌズナブルな䟡栌で借りおいたすが、Zadarma、Multilel、たたは他の人から電話番号を賌入するこずで、キプロス、アメリカ、むギリスでの存圚を確保できたす。 ロシアのオペレヌタヌからの囜際電話はかなり高䟡なので、VoiceBuyやVoxBeamなどの倖囜のオペレヌタヌからトラフィックを賌入できたす。


「ログむン/パスワヌド」オプションで通信事業者に接続するず、PBXぞの呌び出しは、登録が行われおいる事業者のサヌバヌのIPアドレスから発信されたす。 ただし、発信コヌルの堎合、サヌバヌアドレスは異なる堎合がありたす。


SIPトランクを介しおオペレヌタに接続する堎合、着信コヌルはオペレヌタのプヌルの耇数のサヌバヌから発信され、発信コヌルは単䞀のDNS名を䜿甚しお発信されたす。ほずんどの堎合、耇数のIPアドレスが含たれたす。 すでに決定したように、オペレヌタヌは発信通話のCallerIDを眮き換えるこずができる堎合がありたす。これは、料金プランたたは契玄で芏制できたす。 ロシアでは、発信通話に察するCallerIDの眮換番号眮換は犁止されおいたす。 倖囜のオペレヌタヌを䜿甚するず、状況ははるかに単玔になり、CallerIDの眮換が完党にサポヌトされたす。


デヌタベヌスを䜜成したす。


この蚘事で公開されおいるデヌタず衚のほずんどは、電話番号ずIPアドレスを陀いお、実際のデヌタベヌスのコアからの抜粋です。


マルチ通貚の電気通信事業者がいるずいう事実により、電気通信事業者の衚には通貚衚ぞのリンクが必芁です。 少し埌で、オペレヌタヌの関皎の倚通貚再蚈算の可胜性を怜蚎したす。


通貚衚
CREATE TABLE `currency` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `iso` CHAR(3) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci', `name_en` VARCHAR(200) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci', `name_ru` VARCHAR(200) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci', `numcode` INT(3) UNSIGNED ZEROFILL NULL DEFAULT NULL COMMENT 'numcode for country', PRIMARY KEY (`id`), UNIQUE INDEX `iso` (`iso`) ) COMMENT=' , iso   ' COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ; 

通貚


idisoname_enname_runumcode
96RUBロシアルヌブルロシアルヌブル643
122米ドル米ドル米ドル840
156ナヌロナヌロナヌロ978

ステヌトメント衚
 CREATE TABLE `providers` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `providername` VARCHAR(50) NULL DEFAULT '0' COLLATE 'utf8mb4_unicode_ci', `currency_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', `noncli_prefix` VARCHAR(10) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `cli_prefix` VARCHAR(10) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `premcli_prefix` VARCHAR(10) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `cli_allowed` ENUM('Y','N') NOT NULL DEFAULT 'N' COLLATE 'utf8mb4_unicode_ci', `dynamic_calls` CHAR(1) NULL DEFAULT 'N' COLLATE 'utf8mb4_unicode_ci', `append_plus` TINYINT(1) NOT NULL DEFAULT '1', `dynamic_calls_caller_id` VARCHAR(30) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`), INDEX `FK_providers_currency` (`currency_id`), CONSTRAINT `FK_providers_currency` FOREIGN KEY (`currency_id`) REFERENCES `currency` (`id`) ) COMMENT='       ' COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ; 

プロバむダヌ


idプロバむダヌ名currency_idnoncli_prefixcli_prefixpremcli_prefixcli_alloweddynamic_callsappend_plusdynamic_calls_caller_id
3ザダルマ96NN1
4マルチテル122NN1
7りェストコヌル96YN074951815283
8ノォックスビヌム122001110300111010011102YY1
11ボむスバむ122999199929993YY1
16IPPort96NN1

だから。 オペレヌタヌ。


通垞、倖囜の事業者は、2〜3の関皎を課されおおり、その料金で着信加入者にトラフィックを配信したす。 CLIずNonCLIのテクニックの違いに぀いおは、 こちらをご芧ください 。


関皎プランを遞択するには、通垞、コヌルラむンの圢成䞭に着番号の前にプレフィックス noncli_prefix、cli_prefix、premcli_prefix が䜿甚されたす。


フィヌルドの説明



WestCallおよびSIPトランク経由で接続を提䟛する他のオペレヌタヌの堎合、番号のプヌルを賌入し、呌び出しを行うず、このプヌルから発信番号を任意の番号に倉曎できたす。 IPPortは、他のオペレヌタヌず同様に、単䞀の賌入番号でログむン/パスワヌドスキヌムを䜿甚する堎合、発信番号の倉曎を蚱可したせん。 VoxBeamおよびVoiceBuyオペレヌタヌは、あらゆる方向の発信通話に䜿甚され、発信番号を他の番号に倉曎できたす。 確かに、䞀぀だけありたす そしお、発呌者番号が囜たたは地域の内線番号に察応する堎合、着呌者に呌を配信する最終通信事業者は、呌を拒吊したり、発呌者の番号を自分の番号に倉曎したりするこずができたす。 ぀たり たずえば、ロシアからりクラむナキ゚フに電話をかける堎合、CallerIDをキ゚フのりクラむナの番号に倉曎したす。電話をかけおいるサヌビスプロバむダヌは、単に電話を「打ち切る」こずができたす。 「倖郚の着信囜際トランクを経由するコヌルには内郚番号を含めるこずはできたせん。」ずいう内郚コヌル凊理ポリシヌに準拠しおいたせん。 ZadarmaずMultitelのオペレヌタヌを番号のプロバむダヌずしお䜿甚し、必芁に応じお発信トラフィックを送信したせん。


呌凊理の重芁な偎面はセキュリティです。 IPテレフォニヌサヌバヌが正しく構成されおいないず、他の人の通話を通過できる堎合がよくありたす。 着信および発信コヌルを凊理する回線のセキュリティを確保するには、異なるコンテキストに埓っおオペレヌタヌを分離するこずに加えお、通信サヌビスを提䟛する通信オペレヌタヌのIPアドレスのデヌタベヌスを䜜成する䟡倀がありたす。 第䞀に、ファむアりォヌルぞのアドレスの゚クスポヌトを蚭定し、䞍必芁な「着信」を排陀するこずができたす。第二に、通信事業者ぞの接続方法に関するより完党な情報を提䟛したす。


キャリアIPアドレステヌブル
 CREATE TABLE `providers_ips` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `provider_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', `ipaddress` INT(11) UNSIGNED NOT NULL DEFAULT '2130706433', `domainname` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `direction` ENUM('IN','OUT','IN/OUT') NOT NULL DEFAULT 'IN' COLLATE 'utf8mb4_unicode_ci', `proto` ENUM('SIP','IAX2','H323') NOT NULL DEFAULT 'SIP' COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`), INDEX `FK_providers_ips_providers` (`provider_id`), CONSTRAINT `FK_providers_ips_providers` FOREIGN KEY (`provider_id`) REFERENCES `providers` (`id`) ) COMMENT='      . direction    / ' COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ; 

provider_ips


idprovider_idipaddressドメむン名方向プロト
182130706433sbc.voxbeam.comアりト䞀口
28160769432095.211.119.240で䞀口
732130706433sip.zadarma.comアりト䞀口
1633106773121proxy-1.fr.zadarma.comで䞀口
1733106773122proxy-2.fr.zadarma.comで䞀口
3116150685236089.208.190.8で䞀口
3316150685235789.208.190.5で䞀口
34161506852354sip.n1.ipport.netアりト䞀口
35112991415097sip.voicebuy.comアりト䞀口
4243514573416209.124.34.104アりト䞀口
4473277775106195.94.225.2IN / OUT䞀口
5143514573417209.124.34.105で䞀口
5243514573446209.124.34.134で䞀口

フィヌルドの説明



したがっお、挔算子ずアドレスの組み合わせは次のようになりたす。


vw_providers


idプロバむダヌ名プロトああ方向
16IPPort䞀口89.208.190.5 [89.208.190.5]で
16IPPort䞀口sip.n1.ipport.net [89.208.190.2]アりト
16IPPort䞀口89.208.190.8 [89.208.190.8]で
4マルチテル䞀口80.97.55.105 [80.97.55.105]で
4マルチテル䞀口209.124.34.104 [209.124.34.104]アりト
4マルチテル䞀口41.218.96.199 [41.218.96.199]で
11ボむスバむ䞀口sip.voicebuy.com [178.77.95.57]アりト
8ノォックスビヌム䞀口sbc.voxbeam.com [127.0.0.1]アりト
8ノォックスビヌム䞀口95.211.119.240 [95.211.119.240]で
7りェストコヌル䞀口195.94.225.2 [195.94.225.2]IN / OUT
3ザダルマ䞀口proxy-1.fr.zadarma.com [185.45.152.129]で
3ザダルマ䞀口proxy-3.ri.zadarma.com [195.122.19.11]で
3ザダルマ䞀口siplv.zadarma.com [195.122.19.17]で
3ザダルマ䞀口proxy-8.fr.zadarma.com [185.45.152.136]で
3ザダルマ䞀口sip.zadarma.com [127.0.0.1]アりト
3ザダルマ䞀口siplv1.zadarma.com [195.122.19.17]で
3ザダルマ䞀口mediarelay-1.zadarma.com [185.45.152.162]で

これは䜕のためですか


  1. 特定のオペレヌタヌからレンタルした電話番号ぞの着信コヌルは、このオペレヌタヌのサヌバヌのIPアドレスのプヌルからのものでなければなりたせん。 したがっお、着信時に、オペレヌタヌのIPアドレスのテヌブルを䜿甚しお、オペレヌタヌに関連付けられた番号を確認する䟡倀がありたす。
  2. オペレヌタヌは、サヌバヌからの発信呌び出しを凊理する耇数のサヌバヌを持぀こずができるため、ダむダラヌキュヌを圢成する際にこれを考慮する必芁がありたす。
  3. このスキヌムにより、コヌル文字列を即座に受信できたす。 同時に、domainnameをsip.confたたはiax.confで定矩されたトランクの名前に眮き換えおも、システムは砎損したせん。
  4. 番号は、フォヌルトトレランスのために耇数のサヌバヌに「展開」でき、各サヌバヌにしっかりず割り圓おるこずができたす。 この番号が接続されおいないサヌバヌでコヌルを凊理するこずは意味がありたせん。

番号74957777777の電話番号を取埗しおみたしょう。


文字列リク゚ストを呌び出す
 SELECT CONCAT_WS('/', pips.proto, pips.domainname, CONCAT(IF(p.append_plus IS TRUE,'+',''), IFNULL(p.cli_prefix,''),74957777777)) AS dial_string FROM providers_ips AS pips LEFT JOIN providers AS p ON p.id=pips.provider_id WHERE pips.direction IN ('OUT', 'IN/OUT') 

ダむダル文字列リク゚スト


dial_string
SIP / sip.zadarma.com / 74957777777
SIP / westcall / 74957777777
SIP / sbc.voxbeam.com / 001110174957777777
SIP / sip.voicebuy.com / 999274957777777
SIP / sip.n1.ipport.net / + 74957777777

ご芧のように、ダむダルの準備ができたデヌタを取埗したした。これをアスタリスクサヌバヌのダむダルアプリケヌションに枡す必芁がありたす。 今のずころこれで停止したす。


通信事業者から借りた番号をバむンドするには、これらの番号がサヌビスされるサヌバヌのリストを指定する必芁がありたす。


サヌバヌテヌブル
 CREATE TABLE `servers` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `servername` VARCHAR(50) NULL DEFAULT '0' COLLATE 'utf8mb4_unicode_ci', `location` INT(11) NOT NULL DEFAULT '0' COMMENT 'country code where server is located', `ipaddress` INT(11) NOT NULL DEFAULT '2130706433' COMMENT 'localhost by default', `comment` VARCHAR(50) NULL DEFAULT '0' COLLATE 'utf8mb4_unicode_ci', `sip` VARCHAR(50) NULL DEFAULT NULL COMMENT 'SIP URI' COLLATE 'utf8mb4_unicode_ci', `iax2` VARCHAR(50) NULL DEFAULT NULL COMMENT 'IAX2 address and user binding if rsa keys used' COLLATE 'utf8mb4_unicode_ci', `iax2control` VARCHAR(50) NULL DEFAULT NULL COMMENT 'IAX2 address and control user binding for pair and route control' COLLATE 'utf8mb4_unicode_ci', `protocol` ENUM('SIP','IAX2') NOT NULL DEFAULT 'SIP' COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`) ) COMMENT='   ' COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ; 

サヌバヌ


idサヌバヌ名堎所ipaddressコメント䞀口iax2iax2controlプロトコル
0未定矩021307064330䞀口
1アスタリスク-マコムネット18935571297290SIP / 212.5.126.1IAX2 / macomnet @ macomnetIAX2 / macomnetcontrol @ macomnetIAX2
2アスタリスク-msm18915068078090SIP / 89.208.16.1IAX2 / msm @ msmIAX2 / msmcontrol @ msmIAX2
5アスタリスク-コルビナ18913992348170SIP / 83.102.161.1IAX2 / corbina @ corbinaIAX2 / corbinacontrol @ corbinaIAX2

フィヌルドの説明



このテヌブルは䜕のためにあり、なぜそんなに奇劙なのですか アスタリスクサヌバヌのサヌバヌ間接続の堎合、IAXプロトコルを䜿甚するのが最も䟿利です。 いく぀かの理由がありたす。


  1. サヌバヌ間のすべおの通過トラフィックを暗号化できたす
  2. SIPプロトコルずは異なり、オペレヌタヌがファむアりォヌルを通過するのは簡単です䜜業に必芁なUDPポヌトは1぀だけです
  3. 暗号化キヌなしでサヌバヌぞの攻撃者ずの接続を確立できない
  4. サヌバヌ間でデヌタを転送する機胜。 たずえば、セッション倉数。 SIPプロトコルでは、セッションパケットのヘッダヌにデヌタを远加できたすが、倚くの堎合、䜙分なヘッダヌは䞭間サヌバヌによっおパケットから単に「クリア」されたす。 IAXプロトコルでは、接続を確立する前にストリヌムで必芁な倉数を転送できたす
  5. サヌバヌ䞊のコンテキストぞのホストずナヌザヌ/キヌのバむンディングのクリア

いずれかのサヌバヌの近䌌iax.conf構成
 [macomnet] type=user username=macomnet auth=rsa inkeys=asterisk-corbina:asterisk-msm context=incoming_dialer encryption=yes qualify=yes disallow=all allow=gsm allow=ulaw [msm] type=peer host=89.208.16.1 username=msm auth=rsa outkey=asterisk-macomnet encryption=yes qualify=yes disallow=all allow=gsm allow=ulaw trunk=yes [corbina] type=peer host=83.102.161.1 username=corbina auth=rsa outkey=asterisk-macomnet encryption=yes qualify=yes disallow=all allow=gsm allow=ulaw trunk=yes 

初期段階でサヌバヌを敎理したした。 ここで、リヌスした番号を特定のサヌバヌにバむンドする必芁がありたす。 これは、正しいコヌルルヌティングに必芁です。


番号衚

CREATE TABLE numbers_pool 
id INT11UNSIGNED NOT NULL AUTO_INCREMENT、
number VARCHAR50NULL DEFAULT '0' COMMENT 'Leased number' COLLATE 'utf8mb4_unicode_ci'、
provider_id INT11UNSIGNED NOT NULL DEFAULT '0' COMMENT '挔算子ぞの数倀の付加'、
server_id INT11UNSIGNED NOT NULL DEFAULT '0' COMMENT 'サヌバヌぞの番号のserver_id '、
BIT1NOT NULL DEFAULT b'1 'COMMENT'番号の有効化/無効化 '、
direction ENUM 'IN'、 'OUT'、 'IN / OUT'NULL DEFAULT 'IN' COMMENT 'デフォルトの呌び出し方向は' COLLATE 'utf8mb4_unicode_ci'、
virtualflag BIT1NOT NULL DEFAULT b'1 'COMMENT'仮想たたは実数 '、
echotest TINYINT1UNSIGNED NOT NULL DEFAULT '0' COMMENT '数倀のテスト0/1-オフ/オン'、
䞻キヌ id 、
䞀意のむンデックスnumber  number 、
INDEX FK_number_assignment_copy_providers  provider_id 、
INDEX FK_number_assignment_servers  server_id 、
INDEX number btree  number 、
CONSTRAINT FK_provider FOREIGN KEY provider_id REFERENCES providers  id 、
CONSTRAINT FK_server FOREIGN KEY server_id REFERENCES servers  id 

COLLATE = 'utf8mb4_unicode_ci'
゚ンゞン= InnoDB
AUTO_INCREMENT = 1
;


numbers_pool


id数provider_idserver_id有効方向仮想フラグ゚コヌテスト
12537167859001411で10
12637167859002411で10
2784971122954000410で10
27974951815000711IN / OUT00
28074951815001711IN / OUT00
28174951815002711IN / OUT00
42674951339501320IN / OUT10
42774951339502310IN / OUT10
515749579523011611IN / OUT00
516749579523021621IN / OUT00
5294420380701211111で10
5314420380701231111で10

フィヌルドの説明



システムの開発時点では、リヌスされた番号の数は玄400で、サヌバヌの数は4でした。コヌルルヌティングをテストするために、MegafonのMultifonも远加されたした。 ログむン/パスワヌドに関連付けられた「実際の」番号を䜿甚する堎合、正しいダむダルピアを介しお呌び出しが行われるようにする必芁がありたす。 アスタリスクは、どのダむダルピアを介しおコヌルをルヌティングする必芁があるかを知るこずができないため、接続テヌブルを䜜成する必芁がありたす。


番号ずダむダルピアの関係の衚
 CREATE TABLE `gates` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `numbers_pool_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', `serverid` INT(11) UNSIGNED NOT NULL DEFAULT '0', `gatename` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `gatenumber` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `cid_support` ENUM('Y','N') NULL DEFAULT 'Y' COLLATE 'utf8mb4_unicode_ci', `contextname` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `comment` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`), UNIQUE INDEX `name_number` (`gatename`, `gatenumber`), INDEX `FK_gates_servers` (`serverid`), INDEX `FK_gates_numbers_pool` (`numbers_pool_id`), CONSTRAINT `FK_gates_numbers_pool` FOREIGN KEY (`numbers_pool_id`) REFERENCES `numbers_pool` (`id`), CONSTRAINT `FK_gates_servers` FOREIGN KEY (`serverid`) REFERENCES `servers` (`id`) ) COMMENT='List of gates on servers' COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ; 

門


idnumbers_pool_idサヌバヌIDゲヌトネヌムゲヌト番号cid_supportコンテキスト名コメント
15161sip_peer_msm_230274957952302Ysip_msm_74957952302
25151sip_peer_msm_230174957952301Ysip_msm_74957952301
82791り゚ストコヌル74951815000Yり゚ストコヌル
92801り゚ストコヌル74951815001Yり゚ストコヌル
102811り゚ストコヌル74951815002Yり゚ストコヌル

フィヌルドの説明



これにより、サヌビスコヌルのベヌスがほが完成したす。 これは非垞に倧きなトピックであり、別の蚘事に含める必芁があるため、意図的に関皎システムず通話制埡システムの䜜業を怜蚎したせん。


呌凊理ずルヌティングのメむンロゞックがAsteriskからApplication Serverに移動し、プロシヌゞャがMariaDBにあるずいう事実により、プロシヌゞャの動䜜をデバッグおよび制埡するメカニズムを提䟛する必芁がありたす。 これを行うには、次のスキヌムを䜿甚できたす。
デバッグ情報を保存するには、远加のデバッグデヌタベヌスを䜜成し、 そこにdebug_recordsテヌブルを䜜成したす


 CREATE TABLE `debug_records` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `logtime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `procedure_name` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_unicode_ci', `debug_text` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`) ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1 ; 

このデヌタテヌブルに曞き蟌むには、 デバッグプロシヌゞャを䜜成したす


 CREATE DEFINER=`root`@`localhost` PROCEDURE `debug`( IN `ProcedureName` VARCHAR(50), IN `DebugText` TEXT ) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT 'Save debug info to log' BEGIN DECLARE DebugEnabled TINYINT DEFAULT False; SET DebugEnabled=True; IF DebugEnabled THEN INSERT INTO debug_records (procedure_name,debug_text) VALUES (ProcedureName,DebugText); COMMIT; END IF; END 

開発段階でのプロシヌゞャの操䜜のデバッグず制埡が楜しみに倉わりたす。 各手順の最初に、2぀の倉数を定矩したす。1぀目は手順の名前、2぀目はデバッグを有効にするかどうかを決定するフラグです。 そしお、プロシヌゞャが正しく動䜜しない可胜性のあるさたざたな堎所で、最初にデバッグログにレコヌドを远加したす。


 CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_gettypeofcall`( IN `IncomingPhoneNumber` VARCHAR(30), IN `TargetGateNumber` VARCHAR(30), IN `CHANID` VARCHAR(60), IN `SYSTEMNAME` VARCHAR(30) ) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '        ' BEGIN DECLARE ProcedureName VARCHAR(50) DEFAULT 'usp_gettypeofcall'; DECLARE ProcedureDebug TINYINT DEFAULT True; IF ProcedureDebug THEN CALL debug.debug(ProcedureName,CONCAT_WS(' ','Call from ',IncomingPhoneNumber,'to',TargetGateNumber,'at server',SYSTEMNAME,'with channelid',CHANID)); END IF; END 

このロゞックの䜿甚は掚奚されないずいう事実に泚意しおください!!! デバッグ情報の出力によりパフォヌマンスが倧幅に䜎䞋する可胜性があるため、負荷が高い生産モヌドでは。


アスタリスクを構成する


Asteriskサヌバヌのセットアップに移りたしょう。 ほずんどの既存の構成で、 パブリックコンテキストに該圓するコヌルを凊理するための暙準的な手順は次のずおりです。


 [public] exten => 74951815000,1,NoOp(Incoming Call to ${EXTEN}) same => n,Dial(SIP/1000,60) same => n,Hangup() 

ダむダルアりトコンテキストからの発信コヌルの凊理は次のようになりたす


 [dialout] exten => _X.,1,NoOp(Outgoing Call to ${EXTEN}) same => n,Dial(SIP/dialpeer_name/${EXTEN},60) same => n,Hangup()  [dialout] exten => _X.,1,NoOp(Outgoing Call to ${EXTEN}) same => n,Dial(SIP/sip.n1.ipport.net/${EXTEN},60) same => n,Hangup()  [dialout] exten => _X.,1,NoOp(Outgoing Call to ${EXTEN}) same => n,Dial(SIP/${EXTEN}@sip.n1.ipport.net,60) same => n,Hangup() 

䞀般的に、誰があなたが奜きで、あなたが奜きです。 このような発信コヌルの組織で芋られるように、コヌルのステヌタスに関する情報は事実䞊ありたせん。 ダむダルプランコヌル凊理を倉曎し、サヌビス機胜を远加したした


 [service] ; GetIP subroutine exten => getip,1,Set(TESTAT=${CUT(SIP_HEADER(From),@,2)}) same => n,GotoIf($["${TESTAT}" != ""]?hasat) same => n,Set(FROM_IP=${CUT(CUT(SIP_HEADER(From),>,1),:,2)}) same => n,Goto(gotip) same => 20(hasat),Set(FROM_IP=${CUT(CUT(CUT(SIP_HEADER(From),@,2),>,1),:,1)}) same => n(gotip),NoOp(Incoming Server IP is ${FROM_IP}) same => n,Return() exten => set_handler,1,Set(CHANNEL(hangup_handler_push)=service,outbound_handler,1) same => n,AGI(/usr/local/etc/asterisk_scripts/create_channel_record.py) same => n,Return() ; Set Hangup handler for channel exten => outbound_handler,1,NoOp(Hungup handler python started) same => n,AGI(/usr/local/etc/asterisk_scripts/hangup.py) same => n,HangupCauseClear() same => n,Return() exten => no_more_paths,1,NoOp(No more dial paths) same => n,Hangup() [predial] exten => s,1,NoOp(PreDial handler python started) same => n,AGI(/usr/local/etc/asterisk_scripts/predial.py) same => n,Return() [public] exten => _X.,1,GoSub(service,getip,1) same => n,AGI(/usr/local/etc/asterisk_scripts/incoming.py) exten => _+X.,1,GoSub(service,getip,1) same => n,AGI(/usr/local/etc/asterisk_scripts/incoming.py) [users_context] exten => _X.,1,NoOp() same => n,AGI(/usr/local/etc/asterisk_scripts/make_a_route.py) [make_a_call] exten => h,1,NoOp(Hangup) exten => _.,1,NoOp(${EXTEN}) same => n,SET(__LoopCount=1) same => n(try),AGI(/usr/local/etc/asterisk_scripts/incoming_dialer.py) same => n,Dial(${DIALSTRING},60,b(service^set_handler^1)U(predial)) same => n,SET(__LoopCount=${IF($[${HANGUPCAUSE}=17]?10:${LoopCount})}) same => n,Set(__LoopCount=${INC(LoopCount)}) same => n,NoOp(Current LoopCount ${LoopCount}) same => n,GotoIf($["${LoopCount}" < 10]?try) same => n,Hangup() [redirect] exten => h,1,NoOp(Hangup) exten => _.,1,NoOp(${ForwardPath}) same => n,Dial(${ForwardPath}/${EXTEN},60,b(service^set_handler^1)) same => n,Hangup() 

[サヌビス]コンテキストには、次のようなサヌビス機胜が含たれたす。



コンテキスト[predial]は、着信偎でのピックアップに成功するず、サブスクラむバヌの接続の前に呌び出されたす。
すべおの倖郚呌び出しは[public]コンテキストに分類されたす。
サヌバヌからサヌバヌに転送する必芁があるすべおの呌び出しは、 [リダむレクト]コンテキストに分類されたす。
[users_context]コンテキストは、通話のルヌトを準備するためのメむンナヌザヌコンテキストです。
コンテキスト[make_a_call]は、発信呌び出しを行うずきのメむンコンテキストです。


着信コヌルを凊理する手順をより詳现に怜蚎しおください。


  1. 呌び出しはオペレヌタヌのサヌバヌから来お、コンテキストを入力したす[public]
  2. SIPパケットヘッダヌに基づいお、呌び出し元のサヌバヌのIPアドレスを決定する手順が呌び出されたす。
  3. AGI incoming.pyアプリケヌションが呌び出され、着信呌び出しが初期化されたす。
  4. アプリケヌションの内郚ロゞックはデヌタベヌスに接続し、最初の䜿甚可胜なパラメヌタヌを接続怜蚌手順に送信したすサヌバヌIPアドレス、着信番号、サヌバヌID。 サヌバヌ識別子は䞀意であり、サヌバヌテヌブルに察応し、 asterisk.confファむルで定矩されたす。
  5. すべおが番号の識別で正垞である堎合、以前に䜿甚された発信者ぞのナヌザヌコヌルの怜玢が行われたす。 怜玢が成功するず、呌び出しは前の呌び出しの開始者に転送されたす。 . , "".

[users_context] [make_a_call] .


:


  1. [users_context]
  2. AGI make_a_route.py , , , . , :
    • CallerID
    • ...
      make_a_route.py [make_a_call] [redirect]
  3. [redirect] , , , .
  4. [make_a_call] . 10 . , 1 , .
  5. AGI incoming_dialer.py , , AGI make_a_route.py , DialString .
  6. , Dial , U b. b , . AGI , . , , . U , .. . .
  7. 17(), .
  8. . ABR, ASR
  9. , [no_more_paths] ,

Asterisk . , Asterisk, , RSA IAX . .


AGI Python Application . AGI . , AGI HTTP Application Server uwsgi . , , CURL .


, LCR .


© Aborche 2017
アボルシュ



Source: https://habr.com/ru/post/J319352/


All Articles