アナログ電話回線を FXO ATA、Grandstream HT813 を使って Twilio に収容
要は、03 や 06、052 といった NTT、KDDI、SoftBank、ISP各社の光電話サービスで使っている番号(0AB~J)を、Twilio からも使えるようにする、という内容。
Grandstream HT813 とは
アナログ電話機を SIPサーバで使うためのアダプタが FXS ATA、アナログ回線を SIP電話機で使うためのアダプタが FXO ATA、いつもどちらがどちらかわからなくなってしまう。
前者、FXS ATA は各社から様々な製品がでていてある程度選択できるが、FXO ATA はほとんど製品がない。
以前だと、Linksys が SPA3000(SPA3102 など)というシリーズを出していて使いやすかったがいまは Linksys 自体が Cisco に買収されてなくなってしまって後継機も出ていないので入手難になっている。中国製のコピー製品はあるものの、コピー製品のコピー製品まで出回ってる状態で品質も仕様も不明なので無いものとして考える。(認証を取っていない製品なので、加入電話の回線には接続できない)
2022年5月現在、現実的に入手可能な FXO ATA は Grandstream の HT813 になると思う。先代の Handy Tone HT503 はとても使いやすい FXO ATA だったようで使っていた人も多いと思うが、後継機になる HT813 はクセが多くて HT503 の代替にはなりにくいようだ。為替レートにもよるが、1万円弱で購入できる。(初期の頃は 5,000円ちょっとで買えたが、値上がりしてきた)
特に、日本のナンバーディスプレイとの相性が悪く、ナンバーディスプレイがうまくとれない、ナンバーディスプレイが動いていると回線を取れない、といった問題が出ていた。
しかしファームウェアがバージョンアップされ、執筆現在最新版のファームウェアである 1.0.13.3 ではナンバーディスプレイも取得できている。一つ古いバージョン、1.0.13.1 のころは動作していなかった。
HT813 は単なる FXO ATA というわけでなく、FXS ATA としても動作させることができ、FXOポートから FXSポート、逆の FXSポートから FXOポートへのスルーもできることから、入力2出力2 の各マトリックス、計4経路で使えるようになっている。
この便利機能のおかげで、SIPサーバにつながらないときにアナログ回線へフォールバックする、といった機能が動くが、反面、設定が煩雑で動作がわかりにくくなっている。
既存のアナログ回線(PSTN)を HT813 の FXO ATA 機能を使って、SIP としてゲートウェイさせてやれば、Twilio で発着信を扱うことができる。ただし現時点では、着信(PSTN -> Twilio SIP)については問題なく動作しているものの、発信(Twilio SIP -> PSTN)についてはクセがあってカンタンに動作させることは難しい。Twilio ではなく、自前の Asterisk なら収容可能だが Twilio に収容する場合は発信するにあたってルータの設定が要る。
Twilio に 0AB~J番号を収容したいと考えたとき、HT813 を使わない場合は、フォースネット社の vBOX(定価5万円前後)を設置するか、vBOX を使ったクラウドサービスFC-GW を使うしかなかった。本記事で紹介する HT813 は vBOX の代わりとなる機器で価格が安い。ただし、Grandstream社製品全般に言えることだが、安いなりのチャチさがあり、クセも強く、安定度にも難アリのためコールセンターなどで高可用で運用する場合は、HT813 より vBOX のほうがよいかもしれない。(筆者は vBOX の使用経験が無いため比較はできない)
HT813 は安いので、2台買っておいて、まったく同じ設定を入れ込んで、予備機としておいておいて不通時には物理的に差し替える、という運用が可能であれば HT813 x 2台のほうが安く上がる。
Twilio での設定
Twilio と HT813 を使うにあたって、いくつか Twilio 側で事前に設定が必要になる。まず、Programming Voice の SIP Domain を 3つ作成する。1つが HT813 との接続に使うための SIPドメイン。もう 1つが通話に使うための SIPクライアント(電話機、GS Wave など)で使うための SIPドメイン。最後が HT813 から発信するために使うための SIPドメイン。1つの SIPドメインであれこれがんばって収容することもできるが、設定が面倒なので 3つ作ってしまったほうがラクになる。
HT813 を収容するための SIPドメインは、052xxxxxxx.sip.twilio.com とした。(識別しやすいように、PSTN回線で使う電話番号にしてある)
SIPクライアントで使う SIPドメインは、client.052xxxxxxx.sip.twilio.com とした。
052xxxxxxx.sip.twilio.com の Credential List にユーザを追加する。これは以後、この記事で HT813 に設定するなど登場する。
client.052xxxxxxx.sip.twilio.com にもユーザを追加する。これは既存の電話機や GS Wave で SIP REGISTER できればよいので過去記事などを参照して作成して欲しい。
最後に、HT813 が着信した通話を受け取るための SIPドメインは pstn.052xxxxxxx.sip.twilio.com とした。
SIP Register は行わないので、SIP Registration は DISABLED のままでよい。A CALL COMES IN は後ほど内容を紹介するが、作成されていない段階では選択できないので空欄のまま SIPドメインを作っておいて、あとで追加する。
アナログ回線から Twilio で着信
まず PSTN から着信の場合のシーケンスをまとめておく。HT813 の FXOポートは PSTN から着信があると、設定した回数だけ FXSポートに接続されたアナログ電話機のベルを鳴らし、応答がなければ設定した SIPクライアントから指定の SIP URI に発信、電話を転送する。
TwiML Bin で実装する場合は、例のようになる。(SIP電話機が SIP REGISTER するときに使った URI が、sip:052xxxxxxx@client.052xxxxxxx.sip.twilio.com の場合)
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial answerOnBridge="true" ringTone="jp">
<Sip>sip:052xxxxxxx@client.052xxxxxxx.sip.twilio.com;region=jp1</Sip>
</Dial>
</Response>
作った TwiML Bin を着信用の SIP Domain(pstn.052xxxxxxx.sip.twilio.com) の A CALL COMES IN設定に紐づける。
これで HT813 からの INVITE を TwiML Bin で受けて(より複雑な処理をしたければ、Studio で受けても良い)適当な処理へルーティングしてやれば良い。このとき、SIP INVITE のヘッダの From には、ナンバーディスプレイで取得した番号が入っている。
Grandstream GS Wave の設定
上記で作成した TwiML Bin から転送されてくる通話を SIP で受け取るため、スマホのアプリ GS Wave にアカウントを設定する。
GS Wave の Settings、Account Settings に進み、右上の + を押して、GENERIC ACCOUNTS の SIP Account を選択する。
SIP Server はクライアント用に作った SIP Domain(のローカライズURI)を設定する。この例では、client.052xxxxxxx.sip.tokyo.twilio.com:5061 とする。(5061 とするのは、TLS で接続するため)
SIP User ID は Credential で作成したユーザ。パスワードは作成したパスワード。
ここまで入力したら、一旦、右上の ✓ をクリックして設定を保存する。
いま作成したアカウントをクリックして、残りの設定を行う。変更するのは、Transmission Protocol を TLS に、Register Expiration(m) を 10 にする。
SRTP Mode はEnabled But Not Force にする。
これで、GS Wave を Twilio に SIP Register できるようになる。
Twilio からアナログ回線で発信
SIP側から PSTN へ発信する場合は、2通りのシーケンスがある。1つ目が、1-Stage dialing という、SIP INVITE のヘッダで To に宛先を指定して掛ける方法。もう一つが、2-Stage dialing という、一旦、HT813 の FXOポートに設定された SIP URI を呼び出し、DTMFトーンで通話先を指定して掛ける方法。
後者の 2-Stage dialing は決まった SIP URI を呼び出すだけなのでとてもカンタンに使えるが、番号を打ってから通話を開始する、という慣れた方法で通話を開始することができず、HT813経由で呼び出し音を聞いてからダイヤル操作が必要になる。ここは、Asterisk を介することで DTMFトーンを発することができるのが、Twilio には SIPアカウント宛に DTMFトーンを発する手段が用意されていないので、Twilio 単体で実装するのは難しい。Twilio でも、PSTN から発信する場合(Numberタグの digitsオプション)や、TwiML の Play などを使うことで DTMFトーンを発することができるが、SIPアカウント宛に接続する場合は容易に実装できない。(もちろん、SDK を使って Conference などを実装してしまえば実現できなくはないが、、、)
今回は、Twilio だけで HT813 を収容したいので、すこし作業が煩雑になるが、1-Stage dialing で実装する方法を紹介する。
HT813 の設定
HT813 を設定する上で、いくつかの注意点があるので一つずつ紹介していく。
ADVANCED SETTINGS の、STUN server is に stun.l.google.com:19302 と入力。
Automatic Upgrade を No にする。
ペイジ最下部の Apply をクリックして変更内容を適用する。
BASIC SETTINGS の Unconditional Call Forward to VOIP に、着信用の SIP URI を設定する。ユーザID はなんでもよいが、Sip Server は着信用に作った SIPドメイン、pstn.052xxxxxxx.sip.twilio.com を使用する。(この SIP URI宛に転送すると、TwiML Bin の incoming-ata-gateway が発動する)
FXO PORT のタブを開き、Primary SIP Server に Twilio で設定する SIP Domain名(052xxxxxxx.sip.tokyo.twilio.com:5060)を入力する。
SIP Transport は UDP を選択。Twilio は TLS にも対応しているので、TLS を使いたくなるが、ここで TLS を設定した場合、REGISTER だけでなく、自身の LISTEN も同時に TLS になるらしく(設定が連動していて個別に設定できない)、Twilio から SIP URI に、;transport=tls を追加してもうまく動作しなかったため TLS を使うことはあきらめて UDP を使用する。
NAT Traversal は STUN を選択。
SIP User ID に Twilio で作成したユーザ名を入力する。
Authenticate Password に Twilio で作成したパスワードを入力する。
Register Expiration は Twilio側の仕様で、10~3,600(単位、分)しか指定できないので一番小さい 10 にする。(使用するルータの NAPT 設定によっては、900秒 = 15分でテーブルが破棄されるものがある。コンシューマ用ルータだと 300秒 = 5分といった機種もある)
Local SIP Port は 5062 に。(好きなポートで良い。後述する、ルータの NAPT 設定と合わせる)
Validate Incoming SIP Message は Yes を選択。テストしてみたが、どういう挙動を設定するための項目か、不明。
Check SIP User ID for incoming INVITE は Yes を選択。こちらもテストしてみたが挙動が不明。
Authenticate Incoming INVITE は No を選択。余談だが、他人に勝手に使われないよう、本来は Authenticate を有効にしたい。しかし、ここを有効にして Twilio側から有効な Authorization Digest を送っても、なぜか HT813 が 401 Unauthorized を返してしまう。
Allow Incoming SIP Messages from SIP Proxy Only は No を選択。これも SIP spam の排除を考えると、Proxy Server からの INVITE のみを受け取りたいところだが、Twilio 側はいくつかある IPアドレス(公開されている)からランダムに INVITE を送ってくるため、No にせざるをえない。(仕方ないのでルータの ip filter を使って対処する)
SIP REGISTER Contact Header Uses は WAN Address を選択。ここに関しては、Twilio はうまいこと処理しているのでどちらでも動作すると思われる。(SIP では本来、SIP Message の中で IPアドレスなどを指定して通信する先を決めていくが、Twilio は SIP Message で書かれた IPアドレス(自称アドレス)より、実際のパケットを送ってきた元の IPアドレスを優先して処理する)
特に設定が必要な項目なし。(デフォルトのままでよい)
Preferred Vocoder は choice 1 を必ず PCMU とする。Twilio は PCMU(ITU-T G.711μ) と PCMA(ITU-T G.711A)しか対応していない。日本や米国ではほぼ PCMU が使われているので、PCMU を有線とする。ヴォコーダーとは音声のパケット化に使うコーデックの種類のことで、PCMU や PCMA はビットレートが高い(安定して通話するには 80kbps 以上必要)代わりに音域がある程度確保されていて遅延が少ない。G.729 は圧縮率を上げてビットレートを低く(20kbps 程度でも会話できる)保てるが、遅延が大きくなる。
SRTP Mode は Disabled を選択。メディアパケットを暗号化するかどうかの設定だが、よほど盗聴などが気になる環境でなければ必要ない。(もちろん、Enabled にしても構わない。Twilio側でも設定が必要)
Caller ID Scheme は NTT Japan を選択。Caller ID とは発信元番号のこと。日本でいわゆるナンバーディスプレイを取得するための方式のこと。
Caller ID Transport Type は Relay via SIP From を選択。取得した Caller ID をどの方法で伝えるかという設定で、他にも SIPヘッダに埋め込む方法がある。今回は、1回線、1台の HT813(FXS) で構築しているが、複数回線からの着信を受ける場合、どの番号宛への着信かを知りたい場合など、From ヘッダは着信した回線の識別に使用し、発信者は P-Asserted-Identity を使って処理する、といった使い方が考えられる。(複数回線からの着信を識別するには SIP Domain を分ける、転送先の SIP URI を変えるなど、他の手段もある)
Disable Line Echo Canceller は No を選択。
Number of Rings は 2 を入力。ここは、PSTN から着信する際に、ベルが何回鳴ってから、SIP へつなぎこむか、という設定項目で、最小で 1 から設定できるが、これを 1 にするとナンバーディスプレイの取得がうまくいかないバグがある。2以上にすることでナンバーディスプレイの取得もできるが、2 より大きい数字にすると発信側の呼び出しが長くなるだけなので、ナンバーディスプレイが取得できる最小値を設定すれば良い。私の環境では 2 だったが、もし 1 でもナンバーディスプレイが正常に取得できる場合は、1 で良い。また、2 でも取得できない場合は、3 以上も試してみる。
PSTN Ring Thru FXS は No を選択。PSTN から着信したときに、FXSポートにつないだ電話機も鳴らすかどうかの設定。使わないのでトラブル防止のために No にした。ここを Yes にする場合、次の 3項目のパラメータも調整が必要になる。
Stage Method は 1 を入力。前述の、SIP Header の To欄を使って発信先を指定するのが 1-Stage dialing、HT813 自体が SIP通話を受けて、DTMFトーンを使って発信先を指定して発信するのが 2-Stage dialing。
Twilio を使う場合、DTMFトーンの発信が難しいので、1-Stage dialing を使用する。Asterisk などを使える場合は、DTMFトーンの発出ができる(Dialコマンドの Dオプション)ので、2-Stage dialing でもよい。
Twilio で発信用の Studio を作成
HT813 の準備ができたので、今度は Twilio に戻って発信のための Studio を作成する。
作成する Studio は単純なもので、今回は outgoing-ata-gateway という名称にした。
SET VARIABLES と CONNECT CALL TO をそれぞれ追加し、Trigger から順に接続する。
SET VARIABLES の名称は、setToNumber とした。Variable の Key は ToNumber、Value は {{ trigger.call.To | remove_first: 'sip:' | split: '@' | first }} とする。
これは、GS Wave から発信するとき電話番号を入れると、自動で宛先が SIP URI として作成されるため、ここから電話番号部分だけを抜き出すためだ。例えば GS Wave から 050-1234-5678 へ発信しようとすると GS Wave 内部で To として、sip:05012345678@client.052xxxxxxx.sip.tokyo.twilio.com が設定される。使いたいのは電話番号部分だけなので、上記のフィルタを通すことで電話番号部分だけを抜き出している。
CONNECT CALL TO の名称は outgoingSip とした。CONNECT CALL TO は SIP Endpoint、SIP ENDPOINT は、sip:{{ flow.variables.ToNumber }}@[HT813 のグローバルIPアドレス]:5062;region=jp1、CALLER ID は {{ contact.channel.address | remove_first: 'sip:' | split: '@' | first }} とした。
CALLER ID は発信元となる設定で、SIP URI のままでも良い気がするが、SIP URI を From に設定すると HT813 から Reject されるのでフィルタを使って @ の前だけを文字列として送る。(文字列の中に数字以外があっても問題ない)
ここまで入力したら、Publish をクリックしてデプロイする。
いま作った Studio は発信に使う設定なので、SIPクライアントに使っている client.052xxxxxxx.sip.twilio.com の A CALL COMES IN に紐づける。
ルータの設定
最後に、Twilio から HT813 へ接続するための設定をルータに設定する。今回は、HT813用として、UDP 5062ポートを外部に公開し、ルータのグローバルIPアドレス UDP 5062ポート宛のパケットを、LAN内部の HT813 へ転送する。ブロードバンドルータなどでポート転送、静的マスカレードと呼ばれる設定を使う。
ip filter で、Twilio が使っている IPアドレスからのパケットのみを許可し、その他 IPアドレスから 5062ポート宛に送られてくるパケットは破棄する。(総あたり攻撃で SIPパケットを送ってくる spam があるため)
Twilio が使用する IPアドレスは、https://www.twilio.com/docs/sip-trunking/ip-addresses で公開されている。下記設定では、North America Virginia と North America Oregon と Asia-Pacific Tokyo のみ設定しているが、他の拠点から送られる可能性もある場合は適宜追加する。
注意点としては、不特定多数の SIP Spam は排除できるが、Twilioユーザからの INVITE は正規の通話として受け付けてしまう点だ。ポート番号を知られないようにランダム化するなどの手法である程度回避できるものの、完全に排除できないので、SIP Auhenticate がちゃんと使えるようにファームウェアが改善されるのを待ちたい。
各ルータの細かい設定方法は割愛するが、YAMAHA RT1200 を使う場合の config例は以下の通り。LAN(lan1) は 172.30.128.0/24 を使用しており、HT813 に 172.30.128.152 を割り当てている。
pp select 1
ip pp secure filter in 42001 42002 42003 42011 42012 42021 42022 42023 42031 42041 42051 49997 49998 49999
ip pp nat descriptor 1
netvolante-dns hostname host pp server=1 ht813.aa0.netvolante.jp
pp select none
ip filter 42001 pass 54.172.60.0/30 172.30.128.152/32 udp * 5062-5063
ip filter 42002 pass 54.172.60.0/23 172.30.128.152/32 udp * 10000-20000
ip filter 42003 pass 34.203.250.0/23 172.30.128.152/32 udp * 10000-20000
ip filter 42011 pass 54.244.51.0/30 172.30.128.152/32 udp 5062-5063
ip filter 42012 pass 54.244.51.0.24 172.30.128.152/32 udp 10000-20000
ip filter 42021 pass 54.65.63.192/30 172.30.128.152/32 udp * 5062-5063
ip filter 42022 pass 54.65.63.192/26 172.30.128.152/32 udp * 10000-20000
ip filter 42023 pass 3.112.80.0/24 172.30.128.152/32 udp * 10000-20000
ip filter 42031 pass 54.172.60.0/30 172.30.128.152/32 tcp * 5062-5063
ip filter 42041 pass 54.244.51.0/30 172.30.128.152/32 tcp * 5062-5063
ip filter 42051 pass 54.65.63.192/30 172.30.128.152/32 tcp * 5062-5063
ip filter 49997 reject * * udp * 5060-5063
ip filter 49998 reject * * udp * 10000-20000
ip filter 49999 pass * * * * *
nat descriptor type 1 masquerade
nat descriptor address outter 1 ipcp
nat descriptor address inner 1 auto
nat descriptor sip 1 on
nat descriptor masquerade static 1 21 172.30.128.152 udp 5062-5063
nat descriptor masquerade static 1 22 172.30.128.152 udp 10000-20000
ここまで設定すれば、GS Wave から電話番号を入れて発信すれば、HT813 を収容した回線から発信され、HT813 を収容した回線宛に掛けた電話を GS Wave で受けられるようになる。
動いている例
(GS Wave から Twilio経由で)HT813 から発信。
発信の流れとしては、GS Wave(に設定した SIPアカウント、052xxxxxxx@client.052xxxxxxx.sip.tokyo.twilo.com)から、GS Wave が内部的に生成した SIP URI(sip:090yyyyyyyy@client.052xxxxxxx.sip.tokyo.twilio.com)宛に発信。
Twilio の A CALL COMES IN に紐づいていた Studio、outgoing-ata-gateway を呼び出し。outgoing-ata-gateway の中で宛先などを整えて、HT813宛に発信。
グローバルIP の UDP 5062宛に届いたパケットをルータに設定した静的マスカレードが適用されて HT813 の UDP 5062ポートに転送。HT813 の FXS PORT設定が発動して、PSTN回線から 090yyyyyyyy宛に発信。
実際の回線は NTT の加入電話ではなく、SoftBank の光BBユニットの FXSポートに接続しているが、規格的には NTT と同じなので加入電話を使っても同じように発信されるはずである。
携帯電話から HT813 が収容した PSTN 回線あてに通話した場合。
着信の流れとしては PSTN回線からの着信を HT813 が検知。Unconditional Call Forward to VOIP に設定された SIP URI (sip:052xxxxxxx@pstn.052xxxxxxx.sip.twilio.com:5060)宛に発信。
Twilio の pstn.052xxxxxxx.sip.twilio.com に設定された A CALL COMES IN に紐づいた TwiML Bin、incoming-ata-gateway を呼び出し。TwiML によって SIP URI(sip:052xxxxxxx@client.052xxxxxxx.sip.tokyo.twilio.com)宛に発信、ブリッジ。
この SIP URI は GS Wave が SIP Register しているので、GS Wave に着信。
HT813 の技術適合認定
加入電話に機器を接続する場合、回線の反対側は交換機なので技術適合認定を受けた機器かどうか確認する必要がある。(市販の電話機は、いずれも技術適合認定を受けている)
Grandstrema HT813 の現物を確認すると、認証番号ADE180037211 の記載があり、これを総務省の技術基準適合認定等及び技術基準適合自己確認の公示で公開されている PDF で確認すると正しい認証番号であることが確認できる。
似たような ATA Gateway である Yeastar の製品などは認証を受けていないので、加入電話回線に接続することはできない。
まとめ
Twilio では SIP同士の通話の場合は、0.51円/分・ch と非常に安い利用料でリソースを使うことができる。今回の設定の場合、HT813 <=> Twilio と、Twilio <=> GS Wave のそれぞれでチャンネルを使うので、発信着信とも 1.02円/分の利用料が掛かる。(発信時には別途、PSTN回線の通話料が発生する)
Twilio は基本料などがかからない代わりに、割高な通話料(固定回線宛で 5.5円/分、携帯電話回線宛で 16.5円/分)を設定しているので着信する分には便利に使えるものの(そのため、着信の比率が高いコールセンターでよく使われる)、発信を積極的に行うような使い方だと通話料が気になってくる。(もちろん、Twilio社はそこで利益を出すビジネスモデルなので仕方ない)
他社IP電話回線などを使えば高くても固定回線宛で 8.8円/3分、17.6円/1分くらいで通話できるので特に固定回線宛へ通話する時は他社回線経由で発信したくなる。Twilio にも他社回線を収容するための BYOC Trunk といった仕組みが用意されている。(設定してやれば HT813 とも接続できるかもしれない)
今回紹介した設定は、けっこう煩雑な上に Grandstream H813 というクセの強い ATA Gateway を使わざるをえないので、正直、この通話料の差異だけで導入するかどうかは迷うところだが、会社の電話、自宅の電話、ISP から割り当ててもらって 050 IP電話番号、といった住所と紐づいてしまって動かせない回線を、LTE/5G回線経由でスマホで発着信する仕組みが作れるので外出時にもこれら回線を使いたい、という方はぜひ使ってみて欲しい。
関連記事:
0AB~J電話回線を Yeastar TA410 FXO ATA を使って Twilio に収容
さいごに
技術的な小難しい話題でしたが、最後まで読んでいただいてありがとうございました。
よければ ↓ にある、♡ をクリックしていただけると励みになります。質問のコメントも歓迎です。
目次
twilio に SIPクライアントを追加するときの注意(特にスマホ)
クラウドPBX、twilio を VoIPフォンで使う(Panasonic KX-UT248)
twilio + GRANDSTREAM VoIPフォンでカスタム保留音
アナログ電話回線を FXO ATA、Grandstream HT813 を使って Twilio に収容 (この記事)
この記事が気に入ったらサポートをしてみませんか?