FC-GW(エフシー・ゲートウェイ)で全国の地域番号(0ABJ番号)をTwilioで利用する

2021.08.20

Twilioで既存の03や050などの番号(0ABJ番号)を使用したい場合、ボイスワープなどの転送サービスを利用することで、既存の電話番号で着信を受けてTwilioの番号へ転送することができます。

ただし、この場合下記は実現できません。

例)既存の番号が03-1234-5678で、それをTwilioに転送している場合

  • 発信者番号をTwilioで取得すること
  • 転送元の番号(03-1234-5678)を着信番号として取得すること
  • Twilioからの発信者番号を転送元の番号(03-1234-5678)にすること

この課題を解決するための唯一のソリューションとして、 ひかり電話 継続利用サービス (FC-GW) がございます。

FC-GW(エフシー・ゲートウェイ)とは

※FC-GW(エフシー・ゲートウェイ)のウェブサイト( https://www.fcgw.jp/toku/ )の図を引用いたします。

冒頭に記載した通り、既存の0ABJ番号をTwilioなどで利用できるサービスです。

ボイスワープなどの転送サービスの場合、転送元からTwilioなどのサービスへの転送料金は事業者側の負担になります。

また、発信者番号をTwilio側で取得できないと、CRMシステムなどで発信者番号をキーとした顧客検索をすることができなくなります。

FC-GW(エフシー・ゲートウェイ)を利用することで、これらの課題を解決することが可能です。

セットアップ手順

事前準備

Twilioで使用したいIPひかり回線をvBOX機器で収容し、Twilio用のFCGWサービスの環境を準備します。 これはFC-GW(エフシー・ゲートウェイ)を運営されているフォースネット社の作業になります。

Twilioの設定

フォースネット社より提供される情報を元に下記の設定を行います。

Elastic SIP Trunkingの設定

Twilio管理コンソールメニューの Elastic SIP Trunking を選択します。

Trunks を選択し、画面上の Create new SIP Trunk を押します。

FRIENDLY NAME は任意の名前にします。

Termination メニューに移動します。 Termination SIP URI にフォースネット社より受領した値を設定します。

Authentication 欄に移動します。Credential Lists 横のプラス(+)ボタンを押します。

FRIENDLY NAME は任意の名前にします。

USERNAMEPASSWORD にフォースネット社より受領した値を設定し、 Create ボタンを押します。

Credential ListsFRIENDLY NAME が設定されていることを確認します。

Origination メニューに移動します。Origination URIs 欄のプラス(+)ボタンを押します。

Origination SIP URI にフォースネット社より受領した値を設定し、 Add ボタンを押します。

Origination SIP URI 欄に登録したURIが表示されていることを確認します。

SIP Domain(Programmable Voice)の設定

Twilio管理コンソールメニューの Programmable Voice を選択します。

SIP Domains を選択し、画面上の プラス(+)ボタンを押します。

FRIENDLY NAMESIP URI にフォースネット社より受領した値を設定します。

Voice Authentication 欄に進み、 CREDENTIAL LISTS のプルダウンメニューを押して、上記の「Elastic SIP Trunkingの設定」の手順で登録したクレデンシャルリストを選択します。

SIP Registration 欄に進み、 ENABLED にします。

CREDENTIAL LISTS のプルダウンメニューを押して、上記の「Elastic SIP Trunkingの設定」の手順で登録したクレデンシャルリストを選択します。

Save ボタンを押します。一覧に作成したSIP Domainが表示されていることを確認します。

動作確認

着信

FC-GWを経由して着信していることを確認したかったので、 こちらの記事で使用したサンプルアプリsrc/handler.js に一部手を加えて、下記のようにいたしました。

  // If the request to the /voice endpoint is TO your Twilio Number, 
  // then it is an incoming call towards your Twilio.Device.
  if (requestBody.To == config.callerId) {
    console.log("requestBody.To = " + requestBody.To);
    dial = twiml.dial();

    // This will connect the caller with your Twilio.Device/client 
    console.log("identity = " + identity);
    dial.client(identity);

  // FC-GW経由での着信の場合、Twilioデバイス(=ブラウザ)に着信させる
  } else if (requestBody.To == "sip:03xxxxxxxx@***-fcgw03xxxxxxxx.sip.tokyo.twilio.com") {
    console.log("requestBody.To = " + requestBody.To);
    dial = twiml.dial();

    // This will connect the caller with your Twilio.Device/client 
    console.log("identity = " + identity);
    dial.client(identity);

  } else if (requestBody.To) {
    console.log("requestBody.To = " + requestBody.To);
    // This is an outgoing call

    // set the callerId
    dial = twiml.dial({ callerId: config.callerId });

    // Check if the 'To' parameter is a Phone Number or Client Name
    // in order to use the appropriate TwiML noun 
    const attr = isAValidPhoneNumber(toNumberOrClientName)
      ? "number"
      : "client";
    dial[attr]({}, toNumberOrClientName);
  } else {
    twiml.say("Thanks for calling!");
  }

  return twiml.toString();
};

FC-GWのSIP Domainの着信設定にサンプルアプリを設定しました。

このように着信します。 発信者番号と着信番号がTwilio側で取得できております。

{
  AccountSid: '************************',
  ApiVersion: '2010-04-01',
  CallSid: '************************',
  CallStatus: 'ringing',
  Called: 'sip:03xxxxxxxx@xxx-fcgw03xxxxxxxx.sip.tokyo.twilio.com', ←FC-GWを経由して着信させる既存の電話番号(=着信先の電話番号)
  Caller: 'sip:050xxxxxxxx@***.***.***.***', ←私の携帯電話番号(=発信者)
  Direction: 'inbound',
  From: 'sip:050xxxxxxxx@***.***.***.***', ←私の携帯電話番号(=発信者)
  SipCallId: '************************@***.***.***.***:5060',
  SipDomain: 'xxx-fcgw03xxxxxxxx.sip.twilio.com',
  SipDomainSid: '************************',
  SipSourceIp: '***.***.***.***', ←FC-GWの接続先IPアドレス
  To: 'sip:03xxxxxxxx@xxx-fcgw03xxxxxxxx.sip.tokyo.twilio.com' ←FC-GWを経由して着信させる既存の電話番号
}

発信

下記のようにして自分の携帯に発信できることを確認いたしました。 本当はサンプルアプリから発信したかったのですが、うまくいかなかったため、今後実現できましたら追記いたします。

exports.handler = function (context, event, callback) {
    const VoiceResponse = require('twilio').twiml.VoiceResponse;
    const response = new VoiceResponse();
    const callTo = "架電先の電話番号";
    const callerId = "テスト用の電話番号";    
    const dial = response.dial({
        callerId: callerId
    });

    dial.sip({
      username: 'SIPユーザー名',
      password: 'SIPパスワード'
    }, 'sip:' + callTo + '@接続先FC-GW');
  
    console.log(response.toString());    
    callback(null, response);
  };

関連情報