RaspberryPiでスマートホーム 〜Asteriskで家庭内電話 その1 内線通話〜
Asteriskというソフトがあります。これは簡単に言うと電話の交換機(PBX)のソフトです。IP電話なら特殊な機器なしでオフィスの内線のシステムが簡単にできちゃいます。
しかもソフト制御ということもあって、とても柔軟な処理が可能です。簡単なプログラミング言語のようなものでダイヤルプランというものを作成し動作を設定できます。例えばサポートセンターにかけた時によくある”〇〇の場合は1を、□□の場合は2を”といったメニューやモーニングコールのような自動発信もできます。
さらに他のプログラムとも連携できますので、電話がかかってきたときにデータベースから照会して情報を表示するとか、電話操作の結果をデータベースに保存するなど、電話を使ったシステムを構築することが可能です。
とりあえず今回はインストールして、内線通話ができるところまでやってみます。
インストール
インストールは簡単です。
sudo apt-get install asterisk
こんだけ。
ただしバージョンは古いです。現時点での最新版はAsterisk16ですが、このapt-getで入るバージョンは11です。なので、最新版が欲しいときはソースからコンパイルする必要があります。
ソースからのインストールに関しては、以下のサイトがとても参考になります。
今回は11でも問題ないのでapt-getしたものを使用します。
設定
設定に関しては以下のサイトが非常にシンプルで分かりやすいです。
設定ファイルは/etc/asteriskフォルダにインストールされます。いっぱいファイルがあって圧倒されますが、さしあたっていじるのは2つだけです。
- sip.conf
- extensions.conf
元からあるやつは移動しておきます。
mv sip.conf sip.conf.bak
mv extensions.conf extension.conf.bak
4台で内線ごっこしようと思うので、101~104まで内線を4つ作ってみます。あと、つながると”Hello, World!”というアナウンスが流れてから切れる、というものを内線201に作っています。
sip.conf
こちらの設定ファイルではどういう内線番号があるかを記述します。101~104と201の5個です。なお各内線のdefaultuserとsecretはそれぞれの内線を使うためのユーザー名とパスワードですので適切に置き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
[general] context=default bindport=5060 bindaddr=0.0.0.0 language=ja localnet=192.168.0.0/255.255.255.0 [101] type=friend defaultuser=101 secret=pass101 canreinvite=no host=dynamic [102] type=friend defaultuser=102 secret=pass102 canreinvite=no host=dynamic [103] type=friend defaultuser=103 secret=pass103 canreinvite=no host=dynamic [104] type=friend defaultuser=104 secret=pass104 canreinvite=no host=dynamic [201] type=friend defaultuser=201 secret=pass201 canreinvite=no host=dynamic |
extensions.conf
こちらのファイルでは各内線につながった時の動作、ダイヤルプランを記述していきます。
まずベタに書くと以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[default] exten => 101,1,Dial(SIP/101,30,r) exten => 101,2,Hangup() exten => 102,1,Dial(SIP/102,30,r) exten => 102,2,Hangup() exten => 103,1,Dial(SIP/103,30,r) exten => 103,2,Hangup() exten => 104,1,Dial(SIP/104,30,r) exten => 104,2,Hangup() exten => 201,1,Answer() exten => 201,2,Playback(hello-world) exten => 201,3,Hangup() |
まず”[default]”でコンテクストを指定しています。このコンテクストはsip.confの”context=default”で指定されています。
各行はexten => ではじまり、エクステンション(基本的には押された番号),行番号,アプリケーション(コマンド)が並びます。行番号はきっちりと1ずつ増えてないといけません。
なおダイヤルプランではパターンマッチングが使えるので、以下のようにまとめられます。
1 2 3 4 5 6 7 |
[default] exten => _10Z,1,Dial(SIP/${EXTEN},30,r) exten => _10Z,2,Hangup() exten => 201,1,Answer() exten => 201,2,Playback(hello-world) exten => 201,3,Hangup() |
”_”で始まるとパターンマッチングのしるしです。
Zは1~9までにマッチするそうです。なので、上記の書き方だと_10Zは101~109が対象になります。
$EXTENにはかかってきた内線番号が格納されています。つまり101~109に着信した場合は、それぞれの内線にDial()します。ただしsip.confのほうでは101~104までしか定義してませんので、105以降にかけてもつながりません。
で、もう少しだけコンパクトにできます。
1 2 3 4 5 6 7 |
[default] exten => _10Z,1,Dial(SIP/${EXTEN},30,r) same => n,Hangup() exten => 201,1,Answer() same => n,Playback(hello-world) same => n,Hangup() |
前の行とエクステンションが同じ場合は ”same => ”と記述することで、エクステンションを省略できます。また行番号はnと書くことで前の行の次の番号になります。ただ最初の行だけは”1”と書く必要があります。
ファイルを作成したら、Asteriskを再起動して設定を反映させます。
sudo systemctl restart asterisk
あと、ラズパイ起動時に自動実行されるようにしておきます。
sudo systemctl enable asterisk
ダイヤルプランに関しては、英語ですがAsterisk Projectのサイトが詳しいです。
レフトバーの”Configuration”→”Dialplan”以下がダイヤルプランの説明になります。
他にも”Fundamentals”ではAsteriskの構成が、”Deployment”→”Basic PBX Functionality”では実際に内線を作成して使ったり、電話のボタンを押して選択するメニュー(IVR Menu)を作る例があります。
テスト
実際に通話してみます。うちにはWindowsとMacとiPhoneとAndroidがあるので、それぞれにIP電話のソフトを入れて試してみました。
Windows
MicroSIPというソフトをインストールしました。
起動します。右上の三角を押したら、メニューがでるので”アカウント編集”を選びます。
アカウントの設定画面が出るので入力します。
ドメインにはAsteriskが起動しているラズパイのアドレスを入れます。ユーザー名とパスワードはsip.confのdefaultuserとsecretで設定したものです。
内線101に割り当てました。
Mac
その名もTelephoneというソフトをAppStoreからインストールしました。
起動して、メニューから”Preferences”を選びます。
設定画面がでるので画面上のタブで”Accounts”選び、左下の”+”ボタンを押します。
Full Name、Domain、User Name、Passwordを入力します。Full Nameは分かれば何でもいいので、内線番号と同じにしました。
内線102に割り当てました。
Android
CSipSimpleというソフトをPlayストアからインストールしました。
起動します。
画面左下のボタンを押すと、アカウント登録画面がでるので”アカウント追加”ボタンを押します。
”Basic”を選び、アカウント名、ユーザー名、サーバー、パスワードを入力していきます。アカウント名は自分で分かりやすい名前を付けます。ここでは”local”にしました。
内線103に割り当てました。
iPhone
ZoiperというソフトをApp Storeからインストールしました。
起動します。
右下の”settings”ボタンを押します。次の画面ではAccountsを選びます。
”SIP account”を選び、Account Name、Domain、User name、Passwordを入力します。Account Nameは任意の名称です。ここでも”local”にしています。
内線104に割り当てました。
テスト
実際にかけてみます。WinからMacにかけたり、Androidにかけたり、iPhoneからWinにかけたりしましたが、すべて問題なく着信しました。スマホではちゃんと電話のようになりました。
201にかけると、”Hello, World!”とねちっこい感じのしゃべりでアナウンスも流れました。
とりあえず目標達成です。
感想
あっけないほど簡単に内線を作ることができました。これだけでも自宅がめっちゃ広い人や、2階・3階がある人には便利ですね。Wifiさえあればスマホで内線通話できます。
サーバーをインターネット上におけば、どこにいてもネットさえあれば、内線ができちゃいます。バーチャルオフィスですね。もちろんセキュリティには注意ですが。
Asteriskはまだまだ色んなことができそうなので、あれこれ試してスマートホームにどう活かしていこうか考えてみます。