RasPBXの導入（ひかり電話編）

前回の記事（[RasPBXの導入（内線通話ができるまで）](http://qiita.com/katsumin/items/2882842f5da60ba7313c)）で、RasPBXに接続した２台のソフトフォン同士の内線通話ができるようにしました。
今回は、ひかり電話を外線として使えるようにします。

---

# ひかり電話とは

- [ひかり電話](https://flets.com/hikaridenwa/)は、光回線で使えるIP電話サービスで、NTT（フレッツ光）や光コラボ事業者との契約で使用可能となります。
- ひかり電話対応機器（ルータ）を宅内に設置しますが、このルータのLAN側に接続された端末からはSIPサーバに見えます。
    - このSIPサーバに、RasPBXをレジストして使用することになります。

---

# PJSIPのインストール
- 結論から言うと、必要ありませんでした。FreePBXの画面でPJSIPの設定が見えなかったのは、「高度な設定」で、「SIP Channel Driver」を「chan_sip」から「both」に変更していなかったからでした。
    - ウチで使っている2016-03-06版では、Asterisk11が組み込まれていて、別途PJSIP込みのAsterisk13をインストールする必要がありました。
    - 新しい2017−01-28版では、Asterisk13が組み込まれていて、PJSIPも組み込まれているようです。[前々回の記事](http://qiita.com/katsumin/items/22b13f780a37235d0b18#raspbx%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86)で、PJSIPが組み込まれているか不明としていたんですが、ちゃんと組み込まれていました。
- PJSIPを組み込んだAsterisk13のビルド手順も示しておきます。新しい版のRasPBXを使用している方は読み飛ばしてください。

---

# PJSIPのインストール（古いRasPBX向け）
- [ひかり電話HGWパッチ](http://www.voip-info.jp/index.php/%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1HGW%E3%83%91%E3%83%83%E3%83%81)をあてて、Asteriskをビルドする方法もありますが、PJSIPをインストールすることにします。
    - ウチでも、最初はパッチをあててたんですが、後でブラステルを使うことになって、結局はPJSIP必須となってしまいました。
- 手順は、以下の通り。

1. Asterisk13のソースをダウンロードして、解凍。
    
    ```
root@raspbx:~# cd /usr/src
root@raspbx:/usr/src# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
root@raspbx:/usr/src# tar zxvf asterisk-13-current.tar.gz
root@raspbx:/usr/src# ls
asterisk-13-current.tar.gz  asterisk-13.14.0
root@raspbx:/usr/src# 
```

1. インストール済みのAsterisk13を削除。

    ```
root@raspbx:/usr/src# apt-get purge asterisk13
パッケージリストを読み込んでいます... 完了
  :
root@raspbx:/usr/src# apt-get autoremove
パッケージリストを読み込んでいます... 完了
  :
root@raspbx:/usr/src# 
```

1. PJSIPを含む、依存ライブラリ群をインストール。
    - だいぶ試行錯誤したので、不要なライブラリもあるかもしれません。

    ```
root@raspbx:/usr/src# apt-get install ncurses-dev libxml2 libxml2-dev sqlite libsqlite3-dev libssl-dev
root@raspbx:/usr/src# apt-get install uuid uuid-runtime uuid-dev
root@raspbx:/usr/src# apt-get install libjansson4 libjansson-dev
root@raspbx:/usr/src# apt-get install libclalsadrv2 libclalsadrv-dev
root@raspbx:/usr/src# apt-get install libpjsip-simple2 libpjsip-ua2 libpjsip2 libpjproject-dev libsrtp-dev srtp-utils
root@raspbx:/usr/src# apt-get install subversion
root@raspbx:/usr/src# 
```

1. PJSIPを組み込むようにして、Makefileを作成。
    - 当初、pjproject-2.5.5.tar.bz2をダウンロードしようとして、失敗していました。
        - 原因は、UTMのせいでした。
        - ウチのネットワーク構成として、ルータ（ひかり電話対応）とLANの間に[Sophos UTM Home Edition](https://www.sophos.com/ja-jp/products/free-tools/sophos-utm-home-edition.aspx)を置いていますが、これを通さずに、ルータにラズパイを直結したら成功しました。同様の環境の方は多くないと思いますが、一応書き残しておきます。

    ```
root@raspbx:/usr/src# cd asterisk-13.14.0
root@raspbx:/usr/src/asterisk-13.14.0# ./configure --with-pjproject-bundled
checking build system type... armv7l-unknown-linux-gnueabihf
checking host system type... armv7l-unknown-linux-gnueabihf
  :
               .$$$$$$$$$$$$$$$=..      
            .$7$7..          .7$$7:.    
          .$$:.                 ,$7.7   
        .$7.     7$$$$           .$$77  
     ..$$.       $$$$$            .$$$7 
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7 
$$$       .7$$$$$$$$$$$$$$$$      :$$$. 
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.  
$$$        $$$   7$$$7  .$$$    .$$$.   
$$$$             $$$$7         .$$$.    
7$$$7            7$$$$        7$$$      
 $$$$$                        $$$       
  $$$$7.                       $$  (TM)     
   $$$$$$$.           .7$$$$$$  $$      
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$      
       $$$$$$$$$$$$$$$$.                
configure: Package configured for: 
configure: OS type  : linux-gnueabihf
configure: Host CPU : armv7l
configure: build-cpu:vendor:os: armv7l : unknown : linux-gnueabihf 
　:
configure: host-cpu:vendor:os: armv7l : unknown : linux-gnueabihf 
　:
root@raspbx:/usr/src/asterisk-13.14.0# 
```

1. Asrerisk13のビルドとインストール
    - まず、「make menuselect」で、組み込むモジュールを選択する。
        - 名称に「PJSIP」を含むものを組み込んでおけば間違いないと思います。
        - ついでに、日本語の音声を組み込んでおくとよいかもしれません。
            - 「Core Sound Modules」
                - CORE-SOUNDS-JA-ULAW
                - CORE-SOUNDS-JA-GSM

    ```
root@raspbx:/usr/src/asterisk-13.14.0# make menuselect
　:
Generating input for menuselect ...
menuselect changes saved!
make[1]: Leaving directory '/usr/src/asterisk-13.14.0'
root@raspbx:/usr/src/asterisk-13.14.0# make
CC="cc" CXX="g++" LD="" AR="" RANLIB="" CFLAGS="" LDFLAGS="" make -C menuselect CONFIGURE_SILENT="--silent" makeopts
　:
 +--------- Asterisk Build Complete ---------+
 + Asterisk has successfully been built, and +
 + can be installed by running:              +
 +                                           +
 +                make install               +
 +-------------------------------------------+
root@raspbx:/usr/src/asterisk-13.14.0# make install
CC="cc" CXX="g++" LD="" AR="" RANLIB="" CFLAGS="" LDFLAGS="" make -C menuselect CONFIGURE_SILENT="--silent" makeopts
　:
 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 + Asterisk has successfully been installed. +
 + If you would like to install the sample   +
 + configuration files (overwriting any      +
 + existing config files), run:              +
 +                                           +
 + For generic reference documentation:      +
 +    make samples                           +
 +                                           +
 + For a sample basic PBX:                   +
 +    make basic-pbx                         +
 +                                           +
 +                                           +
 +-----------------  or ---------------------+
 +                                           +
 + You can go ahead and install the asterisk +
 + program documentation now or later run:   +
 +                                           +
 +               make progdocs               +
 +                                           +
 + **Note** This requires that you have      +
 + doxygen installed on your local system    +
 +-------------------------------------------+
root@raspbx:/usr/src/asterisk-13.14.0# 
```

---
# ひかり電話対応機器の設定
- ウチでは、PR−400NEを使っています。違う機種の場合は、画面の表現が異なるかもしれません。
    - 画面左側の「電話設定」ー「内線設定」をクリック。
    - 端末属性が「IP端末(音声専用)」となっている行の「編集」をクリック。
    - ユーザIDとパスワードが設定されているので、それぞれ控えておいてください。
        - パスワードは、設定し直す方が望ましいかもしれません。
        - ここでは、ユーザIDを「0004」、パスワードを「0004pass」として説明します。

---
# RasPBXの設定（レジストと着信設定）
- WebブラウザでRasPBXにアクセスします。
- RasPBX Administrationをクリックして、管理者でログインします。 
    - デフォルト設定は、ユーザ名：admin、パスワード：admin
- 上部のボタンで、設定ー高度な設定
    - ダイヤルプランと操作可能
        - SIP Channel Driverを「both」に。
        - 画面右下の「送信」ボタンをクリック。
- 上部のボタンで、設定ーAsterisk SIP 設定
    - 「Chan PJSIP Settings」タブ
        - Show Advanced Settingsを「はい」
        - 「udp - 192.168.1.120 - eth0\」を「はい」（192.168.1.120はRasPBXのIPアドレス）
        - 「Port to Listen On」に「5061」
- 上部のボタンで、接続ートランク
    - 「トランクを追加」ボタンから、「SIP(Chan_PJSIP)トランクを追加」
        - 「General」、「ダイヤル番号の操作ルール」、「pjsip設定」の各タブを設定します。具体値は下表の通りです。特に明記していない設定項目は、デフォルトのままとしてください。
        - 右上の「設定適用」ボタンで設定内容を反映します。
        - ここまでで、ひかり電話対応機器にレジストできているはずです。（この後の設定完了まで通話はできません）

|タブ|設定項目|設定値|備考|
|---|---|---|---|
|General|トランク名|hikari_denwa(pj)|何でもよい|
|General|アウトバウンドCID|1234567890|ひかり電話の電話番号|
|General|最大チャネル数|1||
|pjsip設定|ユーザ名|0004|控えておいたユーザID|
|pjsip設定|Secret|0004pass|控えておいたパスワード|
|pjsip設定|SIP Server|192.168.1.1|ひかり電話対応機器（ルータ）のIPアドレス|
|pjsip設定|Transport|192.168.1.120-udp|192.168.1.120はRasPBXのIPアドレス|
|pjsip設定|From Domain|192.168.1.1||
|pjsip設定|From User|4||
|pjsip設定|クライアントURI|sip:4@192.168.1.1||

- 上部のボタンで、アプリケーションー着信グループ
    - 「着信グループを追加」ボタン
        - 具体値は下表の通りです。特に明記していない設定項目は、デフォルトのままとしてください。
        - 右上の「設定適用」ボタンで設定内容を反映します。

|設定項目|設定値|備考|
|---|---|---|
|着信グループ|600||
|グループの説明|hikari-grp(600)|何でもよい|
|内線リスト|101、102|右側にある「User Quick Select」ボタンで選択可能|
|応答がない場合の転送先|「通話終了」、「発信者が切電するまで呼出し音を再生します」||

- 上部のボタンで、接続ーインバウンドルート
    - 「インバウンドルートを追加」ボタン
        - 「General」、「高度な設定」、「プライバシー」、「Other」の各タブを設定します。具体値は下表の通りです。特に明記していない設定項目は、デフォルトのままとしてください。
        - 右上の「設定適用」ボタンで設定内容を反映します。
        - ここまでで、着信だけは可能になっているはずです。

|タブ|設定項目|設定値|備考|
|---|---|---|---|
|General|説明|hikari-in||
|General|ダイヤルイン番号|1234567890|ひかり電話の電話番号|
|General|宛先をセット|「着信グループ」、「600 hikari-grp(600)」|着信グループで設定したもの|
|高度な設定|RINGINGシグナル|はい||

---
# 着信確認
- 携帯電話などでひかり電話に電話をかけてみます。
    - なぜか、子機に着信せず、RasPBXの自動応答（英語音声）となってしまいます。
    - CDRレポートを見ても、「Playback」となっており、自動応答が働いたことがわかります。
    - 発信先が「s [from-pstn]」となっていて、着信グループが反応できていないことが原因だと思われます。
        - 着信グループは、対応するインバウンドルートで設定したダイヤルイン番号によって振り分けられるようです。
![スクリーンショット 2017-04-22 17.30.42.png](https://qiita-image-store.s3.amazonaws.com/0/166435/097db553-45f5-466d-5457-0872017b950b.png)

- 対処としては、extensions_custom.confを少しいじる必要があるようです。
    - [こちらのFreePBX情報](http://www.voip-info.jp/index.php/FreePBX:10:%E3%83%88%E3%83%A9%E3%83%B3%E3%82%AF:%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1(%E3%83%9B%E3%83%BC%E3%83%A0):Chan_PJSIP)を参考にしました。

- 上部のボタンで、アドミンーConfig Edit
    - 「Config Edit」はデフォルトでインストールされていないかもしれません。その場合は、「アドミンーモジュール管理」から追加してください。
    - extensions_custom.confを選択して、下記の通りに設定します。
        - 「保存」ボタンで保存します。

        ```
[from-pjsip-custom]
exten => _.,1,Goto(from-pstn,${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)},1)
```
        - さらに、トランク設定も必要となります。

- 上部のボタンで、接続ートランク
    - 「hikari_denwa(pj)」を編集
        - 下表の設定を追加し、「設定適用」ボタンで反映させます。

|タブ|設定項目|設定値|備考|
|---|---|---|---|
|pjsip設定|コンテキスト|from-pjsip-custom||

- ここで、再度ひかり電話に電話をかけてみると、今度は子機に電話がかかりました。
    - CDRレポートを見ると、発信先に「600」と着信グループ番号が入っています。
![スクリーンショット 2017-04-22 18.18.26.png](https://qiita-image-store.s3.amazonaws.com/0/166435/d8811719-021d-e7a0-02f7-70059f968aba.png)

---
# RasPBXの設定（発信設定）
- 上部のボタンで、接続ーアウトバウンドルート
    - 「アウトバウンドルートを追加」ボタン
        - 「経路設定」、「Dial Patterns」、「パターンをインポート・エクスポート」、「詳細設定」の各タブを設定します。具体値は下表の通りです。特に明記していない設定項目は、デフォルトのままとしてください。
        - 右上の「設定適用」ボタンで設定内容を反映します。

|タブ|設定項目|設定値|備考|
|---|---|---|---|
|経路設定|経路名|hikari-out|何でもよい|
|経路設定|一致したルートのトランクシーケンス|hikari-denwa(pj)|トランクとの紐付け|
|Dial Patterns|match patten|上から順に、「0120XXXXXX」「1XX」「0N0XXXXXXXX」「0ZZXXXXXXX」「0ZZXXXXXXXX」|このパターンに当てはまる電話番号に発信しようとした場合に、このアウトバウンドルートが使用される|

- ここまでの設定で、子機からの発信が可能となっているはずです。
    - ただし、上記match patterに合致する電話番号なので、国内に限ります。（いきなり、国際電話で実験しようとする方はあまり居ないとは思いますが、一応。）