Raspberry Pi 4B でAsteriskを構築し、iPhoneを固定電話の内線にする(～音声通話編～)

みなさんおはようございます。
アドベントカレンダーに参加しましたので、8日目の担当記事を投稿します。
いつもと趣向を変えてAzureは無関係な趣味で触っているRaspberry Piネタです。
[私のQiita最初の記事](https://qiita.com/hidekko/items/acbe00c6c3a940411b91)でもこの記事を書こうかなと言っていて1年半かかってしまいましたが、やっと書けました。

#Asteriskとは？
皆さまAsteriskはご存知でしょうか？
殆どの方はご存じないと思います。
では質問を変えて、内線電話はご存知でしょうか？
こちらは逆に殆どの方がご存知だと思います。
ちょっとしたオフィスでお仕事したことがある方はご存知でしょう。
ここ1~2年はコロナ禍でオフィスに出勤することも減ったので新卒の方はご存じないかもしれませんね。
大阪であれば06番号、東京であれば03番号に代表される固定電話番号にかかってきた電話を、社内の複数の電話機で発信、着信、保留、転送、できるあの内線電話です。
ああいう電話機って元々今のNTTさんが電電公社さんだった頃は独占だったんですが、徐々に自由化で沖電気さんや富士通さん、日本電気(NEC)さん、岩通さんなど、様々なオフィス用電話交換機(Private Branch eXchange、以下、PBX)が出てきました。
PBXとしては最低5つの機能を有しています。
前述の発信、着信、保留、転送に加え、内線通話の5つです。
これらはPBXや小型のボタン電話機と言われる専用の機器が必要でした。
しかし2000年代にひかり電話が登場し、VoIP(Voice over Internet Protocol)という技術が発展した結果、パソコンなどのソフトウェア上で再現できるIP-PBXとして再登場しました。
このIP-PBXのOSSがAsteriskです。
最近個人宅であれば旧来のメタル回線(銅線)を引いて電話を使っている家庭は少ないでしょう。
殆どがFTTH(Fiber to the Home、光回線を自宅内まで引き込む、ということ)を利用し、インターネット回線のついでに、付帯サービスとして電話を利用していると思います。
06番号や03番号のことを0ABJ(ぜろ、えー、びー、じぇー)番号と言います。
本来は06-xxxx-xxxxという11桁なので、0A-BCDE-FGHIという0AB~I(ぜろ、えー、びー、あい)番号なのですが、アルファベットのIが数字の1と誤認しやすいため欠番とし次のアルファベットJを使ったことから0AB~J番号となり、～も無くなり0ABJ番号と言います。
そしてまたこの0ABJ番号を銅線でなく光回線で利用する方式が先述のVoIPであり、現在スマートフォンで使われている4G、LTE回線ではVoLTEという形式が使われています。
4Gまでの3Gではあくまで「音声回線にインターネットのパケットを流している」という、音声回線が技術の根幹だったのですが、今では「LTE回線(インターネット専用の回線)に音声データをパケット化して流す」という逆転現象が起きています。
これは移動体通信(携帯電話)、でのVoIPです。
技術の基本的な仕組みは同じですね。

前置きが長くなりましたがAsteriskを使えばこの0ABJ番号をiPhoneで発着信できるようにし、なんなら同一ネットワーク内にあるiPhone同士を内線の子機として相互呼び出し、通話もできるようになります。

#Asteriskの使いどころ
・0ABJ番号をスマートフォンから利用可能
・Asteriskと同一ネットワーク内のスマートフォン同士が内線化できる
が主な用途ですが、たまにフリーダイヤルで固定電話の番号からしか発信できない、なんてこともありますが、これもAsteriskを使えばスマートフォンからフリーダイヤルに電話できます。

また地味に困るのがFAXですが、AsteriskでFAXも対応可能です。
FAX送信はFAX用のドライバをWindowsなどのパソコンにインストールし、FAX用ドライバ上の設定でFAX機を指定する箇所があるのですが、ここでFAX機にAsteriskを指定すればWindowsから印刷せずにデータをそのままFAXできるようになります。
FAX受信はAsterisk上でメールアドレスを設定し、受信したFAXを設定されたメールアドレスを用いて指定されたメールアドレス宛に添付ファイルとして送信します。

#前提条件
元々Softbank回線の光電話を使っていてAsteriskで電話、FAXの利用ができました。
ここから番号ポータビリティでNTT Docomoの光コラボレーションサービスに移行し、そこから更にBiglobeの光コラボレーションサービスを利用していますが、どの環境でも問題なく、設定変更なくAsteriskを利用できています。
根本的な技術がVoIPであれば設定変更なしで継続して利用が可能ですが、この部分が変わってしまうような音声通信サービスを利用するとAsteriskが使えなくなるかもしれませんのでご注意ください。

:::note warn
全ての音声電話サービスで検証したわけではございませんので、ご利用の際は現環境をご確認ください。
:::

#構成図
全体の構成図としてはこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/b429fdef-bbf3-514a-e859-3ebee0a18c4c.png)
インターネット接続時の経路はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/bd225cd8-1c2f-e01c-6fc4-77fab8ea8b21.png)
音声通信の経路はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/4245b268-fd99-7ea5-e0aa-7d1c56cf76b4.png)
わざわざ音声通信の経路をインターネット接続と分けた理由は、音声はUDP通信なのでTCP通信と混在しない方が良いからです。
なぜならTCP通信は通信の確実性を向上するために制御系の通信が多く、通常の設定ではUDP通信よりも優先して処理されます。
これではただでさえ通信品質が低いUDP通信である音声は劣化が激しくなり使い物になりません。
ですのでRaspberry Piは無線NICをデータ系とし、有線NICを音声系として2つの経路を持たせています。
アクセスポイントから出力しているSSIDも音声通信用に設定し、スマートフォンはこの音声通信用のSSIDに接続しています。

#構築
それでは構築していきましょう。
構築部分は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/d2fec843-3c97-1c88-c49e-55707e9f4874.png)
<font color="red">赤枠部分</font>が終っている前提で、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/68b9ddc9-6b4c-61ef-e68e-51402147cb00.png)
<font color="blue">青枠部分</font>の構築になります。

##ひかり電話用ルータの設定
弊社環境ではRT-500MIなので参考画像もRT-500MIの画面になります。
まずはRT-500MIにログインし、[電話設定]をクリックし、[内線設定]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/33fdc764-dea9-af82-d732-219787c6e8ff.png)
内線番号[11]と[12]はデフォルトで値が入っているので、[13]の[編集]をクリックします。
ニックネームは既に変更済みなだけなので無視してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/a628adaf-d285-d686-8d10-ddd1a151b82e.png)
はい。
ここで大事なのは
[内線番号]、[ダイジェスト認証]、[ユーザID]、[パスワード]です。
私は追加で[MACアドレス認証]を行っています。
ここでの認証に利用するMACアドレスはRasopberry Piの<font color="red">***有線NICのMACアドレス***</font>です。
全てのパラメーターは変更可能なのですが、[内線番号]、[ユーザID]、[パスワード]の3つはRaspberry PiのAsterisk側で利用する設定値なので控えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/81a1d81d-7d78-47d8-ed6e-85cf5d67a5e2.png)
これでひかり電話用の設定は完了です。
続いてRaspberry Pi側の設定に移ります。

##Raspberry Pi(Asterisk)の設定
Raspberry Piというか、Asteriskの設定です。
弊社で構築した環境では、Asterisk単体ではなく、Free PBXというアプリケーションでGUIを提供し、Free PBX経由でAsteriskの設定を行うという構成になっています。
このFree PBX＋Asteriskで動作するRaspberry Pi用のイメージも近々Git Hubで公開しようと考えております。
現時点ではまだ公開できておりませんので、Raspberry PiにFree PBXとAsteriskがインストールされている前提で進めていきます。

Raspberry Piの無線NIC側IPアドレスにブラウザでアクセスすると、以下のような画面が出てきますので[FreePBX管理ページ]をクリックし、ログインID、パスワードを入力し、ログインします。
画面左上やフッターにあるカエルの顔がかわいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/11b6accf-cb9e-d1c5-b906-5d057cc0ff23.png)

ログインするとこのような画面が出てきます。
グラフもあったりするので、とても使いやすそうなインターフェースです。
事実左上にある[システム一覧]の更新情報やエラー内容にはよくお世話になります。
これから設定を行っていきますが、画面上部の[Dashboard]をクリックすればこの画面に戻ってこれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/aaa79801-f082-22f1-ce3c-3219736e09d9.png)

###トランク設定
ここから実際の設定です。
まずは[トランク設定]と言われる<font color="red">ひかり電話用ルーターとAsteriskとの接続を確立させる設定</font>を行います。

それでは画面上部にある[接続]をクリックし、[トランク]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1166d409-d7d5-379a-d4df-1cc7f32ff85a.png)
[トランクの追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/2eddf4a8-dd83-748a-383e-8dadc5062f4d.png)
[＋SIP(chan_pjsip)トランクを追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1a232bc5-5d62-f0a0-59d6-7a515265f1a9.png)
まずは[General]のタブから。
[トランク名]は適当でいいですが、[アウトバウンドCID]の値は大事です。
これは<font color="red">***ひかり電話で契約している0ABJ番号***</font>になります。
ひかり電話で利用可能な0ABJ番号をハイフン抜きで11桁続けて入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0b482452-c98a-a85f-e5bd-819e287b2811.png)
続いて[pjsip設定]のタブです。
ここも大事です。
[ユーザー名]にひかり電話用ルーターの内線設定で確認した[内線番号]
[Auth username]にひかり電話用ルーターの内線設定で確認した[ユーザID]
[Secret]にひかり電話用ルーターの内線設定で確認した[パスワード]
[SIP Server]にひかり電話用ルーターのローカルIPアドレス
をそれぞれ入力します。
念のため表にまとめます。

|ひかり電話用ルーター  |Asterisk  |
|---|---|
|内線番号  |ユーザー名|
|ユーザID|Auth username|
|パスワード|Secret|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/99a512c7-ea38-84ab-38c8-463eaf561b6d.png)

続いて[高度な設定]のタブに移ります。
ここも大事です。
[From Domain]にひかり電話用ルーターのローカルIPアドレス、[From User]に[内線番号]、[クライアントURI]に[sip:(ひかり電話用ルーターの内線番号)@ひかり電話用ルーターのローカルIPアドレス]という情報を入力します。
特に[クライアントURI]が独特の記載形式ですので間違わずに入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/eab42d3e-430c-098f-dda9-29edd2a7ca1f.png)
以上で画面下部にある[送信]をクリックします。
ここまででトランク設定は完了です。

####トランク設定の確認
トランクの設定がうまくいくと、Raspberry Piがひかり電話用ルーターにログインしていることが確認できます。
RT-500MIにログインし、[電話設定]内の[内線設定]にある[登録状態]という項目に<font color="red">登録済み</font>という文言と、[IPバージョン]という項目に[IPv4]という文言がが確認できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/c42d74c0-f861-c9ca-53fa-76c398eb1ef5.png)
こうなっていればRaspberry Piがひかり電話の子機として登録されており、ここまでの設定が正しいことが確認できます。

###アウトバウンドルート
続いてアウトバウンドルートの作成です。
このアウトバウンドルートは、アウトバウンド、つまり発信を意味します。
このAsterisk配下から発信する際のルートを設定していきます。

トランク設定が終っていることも確認しつつ、トランク設定と同じく[接続]内の[アウトバウンドルート]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/de3f021d-b2a0-fff0-2f97-e0c2357071b9.png)
まずは[経路設定]のタブです。
ここも名前は適当でいいのですが、[一致したルートのトランクシーケンス]で、一つ前の手順で作成したトランクを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/f9b96f85-23a1-1e11-eddb-6126477f0bd7.png)
次に[Dial Patterns]のタブですが、***ここも大事です。***
ここの設定は何に関連するかというと、***電話のかけ方***に関連します。
多くのPBXでは内線は受話器を上げてからそのまま相手先内線番号を入力し、外線は外線切り替え用に[0]を押してから外線電話を入力する、所謂[0発信]を設定しています。
私自身、0発信がしたくてここの設定でハマりました。
0発信の0は[前に付与]はブランクで、その後にある[プリフィックス]に[0]を入力します。
そしてその後にある[一致パターン]に入力する電話番号のパターンを入力します。
Xは0~9までの10番号が入り、Nは2~9までの0と1を除いた8番号、Zは1~9までの0を除いた9番号が入ります。
最上段の0120XXXXXXは0120のフリーダイヤルを想定、2段目の0N0XXXXXXXXは携帯電話番号やIP電話の050番号、0ZZXXXXXXXは10桁の電話番号、3段目の0ZZXXXXXXXXは11桁の0ABJ番号、最後の1XXは110や119、117などの特殊番号を想定しています。
これらに全て発信時に0を付けて発信する、という設定値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/17b2e22f-800d-4835-bce5-94f434772c74.png)
以上でアウトバウンドルートの設定は完了です。

###ユーザー管理
続いてユーザーを作成します。
このユーザー管理画面でユーザーを作成し、ユーザーを内線に関連付ける、という作業になります。
画面上部の[アドミン]をクリックし[ユーザ管理]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/9a318bee-6214-7094-9021-a983da3a43c6.png)
めちゃくちゃわかりにくいですが、最後の方にある[追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/14927bd4-2797-fac3-1f94-1cd12dd5ff70.png)
[ログイン]情報のタブですが、ここだけで設定は大丈夫です。
ここのログイン名とパスワードでAsteriskにログインできるようになりますが、あまり用途はないです。
内線を使いたい台数分ユーザーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/e483aa17-3876-4616-22c9-d9e526a71d28.png)
これでユーザー作成は完了です。

###内線作成
作成したユーザーを内線番号に関連付けていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0e008b39-ebef-8809-54f0-5e0e674178de.png)
[＋内線追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/a9b0c9fd-99ba-c240-0203-4a93962e815c.png)
[ディスプレイ名]は任意でOKですが、このディスプレイ名と[Secret]はスマートフォンがAsteriskに認証する際に利用するIDとパスワードの組み合わせになります。
パスワードは自動で複雑で長いパスワードを生成してくれます。
[Select User Directory]はデフォルトの[PBX Internal Directory]、つまり先ほど作成したユーザーが存在するディレクトリを指します。
[違うデフォルトユーザーと連動]で先ほど作成したユーザー名を選択します。
これにて内線番号とユーザーが関連付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/fe05cd3f-302f-17bc-4bed-3f0892197e21.png)

###着信グループ作成
続いて着信グループを作成します。
これはPBXにもある概念で、ある程度の規模の法人であれば大代表番号、営業部代表番号、経理部代表番号、など、部署や部門ごとで代表番号を持っていると思います。
この代表番号ごとに鳴音する電話機が決まっています。
営業部の代表番号にかかってきた電話を経理部で受けては、大きな会社だと内線で回せない、誰宛かわからない、なんてことも起こり得るからです。
そこで出てくるのがこの着信グループという概念で、営業部代表番号にかかってきた電話に対して営業部の内線電話だけ着信させる営業部用の着信グループを作成する、という考え方です。
ですので着信グループの設定内容は内線をグルーピングしている、ということです。

画面上部の[アプリケーション]をクリックし、[着信グループ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/3dae9b2d-e3e4-828a-8b33-8fd5edaaac21.png)
[+着信グループを追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7aa7445a-4558-2d2f-6708-dc4f53d6e3b3.png)
ここでは[内線リスト]が大事です。
この[内線リスト]に[内線作成]で作成した内線番号を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/13c21e4d-b827-6f8b-e73e-2d1f1bd3f57c.png)
これにて着信グループの作成が完了です。

###インバウンドルート作成
最後の作業です。
インバウンドルート、つまり着信時にどのような振る舞いをするか、を決定する設定項目です。
画面上部の[接続]をクリックし[インバウンドルート]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/25c653e5-6e00-9dd2-892e-91d160b38a18.png)
[+インバウンドルートを追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/46a61165-319f-91b3-cbae-48651f577bf7.png)
ここも[General]の設定だけで大丈夫です。
[説明]はそのままアウトバウンドルートの名前になりますので適当です。
[ダイヤルイン番号]が大事で、ここは<font color="red">***0ABJ番号***</font>をハイフンなしの11桁を続けて入力します。
[宛先をセット]も大事で、ここでまず[着信グループ]を選択し、先ほど作成した着信グループを選択します。
最後に[送信]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/47a8c7c0-c25e-64c7-46c4-c6a2a3e8a40b.png)

これにてAsterisk側の作業が終了になりますので、最後に画面上部の[Apply Config]をクリックします。

##iPhoneの設定
iPhoneは[AGEphone]というアプリを使います。
前提としてAsteriskと通信できる環境にないといけませんので、Asteriskと同じWi-Fi環境下にあることを前提として進めます。
設定はいたって簡単で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/6ab249dd-7815-204c-3c65-6ecb55f40992.png)
これだけです。
ユーザIDは[内線作成]で作成した内線番号、認証IDも同じです。
パスワードも[内線作成]で作成した、もしくは自動生成されたパスワード、唯一[ドメイン]が<font color="red">Raspberry PiのローカルIPアドレス</font>となります。

以上で構築は完了です。
通話テストとしてスマートフォンが2台あればそれぞれを発着信として内線通話、0発信での090や080での外線発信、0発信での特殊番号への外線通話を177などの番号で行えれば構築完了となります。
反響があればFAX編も作ります。

本日はこれまで。