部屋に眠っている中古PCとAsteriskを使って内線電話を0円で作る

# ◆必要なもの
* VoIPによる内線通話を行うためには、電話交換機の役割をする「呼制御サーバ」・実際に通話を行う電話機となる「端末」が必要になる。  
    * 今回は部屋でホコリを被っている中古PCたちを使って組んでみた。

## 1. 呼制御サーバ
* 電話交換機の役割をする。端末（電話機）同士の通話開始・切断等の制御を行うサーバ。
    * 今回呼制御プロトコルはSIPを使う。
* ThinkPad X240
    * CPU: Intel Core i5 4210U 1.7GHz
    * RAM: 4GB
    * SSD: 250GB
    * OS: Ubuntu18.04

## 2. 端末1
* 電話機その1。内線番号として「2001」を割り当てる。
* ThinkPad X61
    * CPU: Intel Core2 DuoT8300 2.4GHz
    * RAM: 4GB
    * HDD: 250GB
    * OS: Ubuntu18.04

## 3. 端末2
* 電話機その2。内線番号として「2002」を割り当てる。
* ThinkPad T530
    * CPU: Intel Core i5 3230M 2.6GHz
    * RAM: 8GB
    * SSD: 512GB
    * OS: Ubuntu18.04

# ◆呼制御サーバの準備

## Asteriskのインストール
* Digium社開発のオープンソースのPBXソフトウェアであるAsteriskを使う。
    * [https://www.asterisk.org/](https://www.asterisk.org/)
* 呼制御サーバ上でAPTを使ってインストールする。  
`$ sudo apt-get install asterisk`

## 内線番号情報の作成（sip.conf）
* 通話を行う端末の内線番号情報を記述する。  

```:/etc/asterisk/sip.conf
[general]
context=default
port=5060
bindaddr=0.0.0.0
language=ja

[2001]
type=friend
defaultuser=2001
secret=password01
host=dynamic
canreinvite=no

[2002]
type=friend
defaultuser=2002
secret=password02
host=dynamic
canreinvite=no
```

* 「secret」は各内線番号のパスワードなので、必要に応じて変更する。

## ダイアルプランの作成（extensions.conf）
* ダイアルプランを記述する。
    * ダイアルプランとは、ある内線番号に電話がかかってきた際にどのように処理を実行するか、という決まり事のこと。

```:/etc/asterisk/extensions.conf
[default]
exten => 2001,1,Dial(SIP/2001,30,r)
same => 2001,2,Hangup()

exten => 2002,1,Dial(SIP/2002,30,r)
same => 2002,2,Hangup()
```
* 上記の設定では、各内線番号宛に電話がかかってくるとまず内線番号を呼び出し（Dial）、会話が終了したら最後に通話を切断する（Hangup）、という処理になる。

## ポート設定の変更
* 呼制御サーバはデフォルトで呼制御データに5060番ポート、通話データ（RTPパケット）のやり取りに10000-20000番ポートを使用する。
    * 通話データのやり取りに使用するポートを変更したい場合（例: 10000-10010番ポートにしたい）は以下のようにrtp.confの記述を変更する。

```:/etc/asterisk/rtp.conf
rtpstart=10000
rtpend=10010
```

* 使用するポートの範囲を決めたらファイアウォールの設定を変更する。

```
$ sudo ufw allow 5060
$ sudo ufw allow 10000:20000/udp
```

## Asterisk再起動
* すべて設定を保存したらAsteriskを再起動させる。  
`$ sudo systemctl restart asterisk`

以上で呼制御サーバ側の設定は完了。

# ◆端末の準備
## Linphoneのインストール

* 通話にはオープンソースのSIPクライアントである「Linphone」を使用する。
    * https://www.linphone.org/
* 以下のコマンドで端末にインストール。  
`$ sudo apt-get install linphone`

## Linphoneの設定
* Ubuntuのアプリケーションメニューから「Linphone」を選択し起動する。
* 初回起動時のウィザードから次へ進む。  
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/459f1b05-e5db-5b22-ab3e-d9af29bfc4b5.png)

* 「I have already a sip account and I just want to use it」を選択し次へ進む。  
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/58e8e19d-9a92-5498-eb5e-d9ce8baa0551.png)

* UsernameとPasswordにAsteriskで設定した内線番号・パスワードを入力し、Domainに呼制御サーバのIPアドレスを入力する。  
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/12d42f7e-cbe2-b2d1-a843-030d708a659d.png)

* 設定が終わると「My current identity」に`sip:端末の内線番号@呼制御サーバのIPアドレス`の書式で端末のアドレスが表示される。  
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/b2c8bdaa-6822-d639-cdf1-9d05ff8b5d37.png)


以上で端末側の設定は完了。
※Linphoneは音声データのやり取りにデフォルトで7078番ポート（UDP）を使用するので、必要に応じて端末側のファイアウォール設定もufwコマンド等で変更しておく。

# ◆通話する

* AsteriskとLinphoneの設定が終わったらいよいよ電話をかけてみる。

## 電話をかける（2001→2002の場合）
* 内線番号2001の端末でLinphoneの「SIP address or phone number」に宛先内線番号の2002を入力してダイヤルボタンを押す。
* しばらくすると2002の端末のLinphoneに通知が来るので、「Answer」をクリックする。

これにより通話が開始される。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181632/87a57020-944f-cf38-f429-f609f6746bbf.png)

## 電話を切る
* 通話中のLinphoneの画面で「Hang up」をクリックすると通話を切ることができる。

<!--
# ◆その他
* Asterisk周りがうまく動かない、等あった場合は`/var/log/asterisk/messages`からログを見てみると解決に結びつくかもしれない。
-->

# ◆参考ページ
* 5分で絶対に分かるSIP
    * https://www.atmarkit.co.jp/ait/articles/0711/16/news146.html
* もうハマらない！Twilio × Asteriskで普通の外線電話を作る
    * https://qiita.com/sgrowd/items/dd1fc682718a2a623e4c
* asterisk をインストールして初期設定＆050plus を外線に使う
    * http://takuya-1st.hatenablog.jp/entry/2013/09/24/033704
* Asteriskのお勉強－ダイヤルプランとは
    * http://www.ne.jp/asahi/davinci/code/asterisk/extensions/index1.html
* フリーIP電話Linphoneのインストール - Ficus Online
    * https://ficus.myvnc.com/ja/blog/%E3%83%95%E3%83%AA%E3%83%BCIP%E9%9B%BB%E8%A9%B1Linphone%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_b40