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 ;
      
      





通貚



id iso name_en name_ru numcode
96 RUB ロシアルヌブル ロシアルヌブル 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_id noncli_prefix cli_prefix premcli_prefix cli_allowed dynamic_calls append_plus dynamic_calls_caller_id
3 ザダルマ 96 N N 1
4 マルチテル 122 N N 1
7 りェストコヌル 96 Y N 0 74951815283
8 ノォックスビヌム 122 0011103 0011101 0011102 Y Y 1
11 ボむスバむ 122 9991 9992 9993 Y Y 1
16 IPPort 96 N N 1


だから。 オペレヌタヌ。







通垞、倖囜の事業者は、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



id provider_id ipaddress ドメむン名 方向 プロト
1 8 2130706433 sbc.voxbeam.com アりト 䞀口
2 8 1607694320 95.211.119.240 で 䞀口
7 3 2130706433 sip.zadarma.com アりト 䞀口
16 3 3106773121 proxy-1.fr.zadarma.com で 䞀口
17 3 3106773122 proxy-2.fr.zadarma.com で 䞀口
31 16 1506852360 89.208.190.8 で 䞀口
33 16 1506852357 89.208.190.5 で 䞀口
34 16 1506852354 sip.n1.ipport.net アりト 䞀口
35 11 2991415097 sip.voicebuy.com アりト 䞀口
42 4 3514573416 209.124.34.104 アりト 䞀口
44 7 3277775106 195.94.225.2 IN / OUT 䞀口
51 4 3514573417 209.124.34.105 で 䞀口
52 4 3514573446 209.124.34.134 で 䞀口


フィヌルドの説明









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







vw_providers



id プロバむダヌ名 プロト ああ 方向
16 IPPort 䞀口 89.208.190.5 [89.208.190.5] で
16 IPPort 䞀口 sip.n1.ipport.net [89.208.190.2] アりト
16 IPPort 䞀口 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 コメント 䞀口 iax2 iax2control プロトコル
0 未定矩 0 2130706433 0 䞀口
1 アスタリスク-マコムネット 189 3557129729 0 SIP / 212.5.126.1 IAX2 / macomnet @ macomnet IAX2 / macomnetcontrol @ macomnet IAX2
2 アスタリスク-msm 189 1506807809 0 SIP / 89.208.16.1 IAX2 / msm @ msm IAX2 / msmcontrol @ msm IAX2
5 アスタリスク-コルビナ 189 1399234817 0 SIP / 83.102.161.1 IAX2 / corbina @ corbina IAX2 / corbinacontrol @ corbina IAX2


フィヌルドの説明









このテヌブルは䜕のためにあり、なぜそんなに奇劙なのですか アスタリスクサヌバヌのサヌバヌ間接続の堎合、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_id server_id 有効 方向 仮想フラグ ゚コヌテスト
125 37167859001 4 1 1 で 1 0
126 37167859002 4 1 1 で 1 0
278 4971122954000 4 1 0 で 1 0
279 74951815000 7 1 1 IN / OUT 0 0
280 74951815001 7 1 1 IN / OUT 0 0
281 74951815002 7 1 1 IN / OUT 0 0
426 74951339501 3 2 0 IN / OUT 1 0
427 74951339502 3 1 0 IN / OUT 1 0
515 74957952301 16 1 1 IN / OUT 0 0
516 74957952302 16 2 1 IN / OUT 0 0
529 442038070121 11 1 1 で 1 0
531 442038070123 11 1 1 で 1 0


フィヌルドの説明









システムの開発時点では、リヌスされた番号の数は玄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 ;
      
      





門



id numbers_pool_id サヌバヌID ゲヌトネヌム ゲヌト番号 cid_support コンテキスト名 コメント
1 516 1 sip_peer_msm_2302 74957952302 Y sip_msm_74957952302
2 515 1 sip_peer_msm_2301 74957952301 Y sip_msm_74957952301
8 279 1 り゚ストコヌル 74951815000 Y り゚ストコヌル
9 280 1 り゚ストコヌル 74951815001 Y り゚ストコヌル
10 281 1 り゚ストコヌル 74951815002 Y り゚ストコヌル


フィヌルドの説明









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







呌凊理ずルヌティングのメむンロゞックが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

アボルシュ








All Articles