Asteriskとひかり電話で外線接続

AsteriskはIP-PBXなのでひかり電話とつなぐのは簡単です。ひかり電話のゲートウェイ、通常は光回線の終端装置&ルータにAsteriskをregisterすればすぐ使えるようになります。ルータ側の設定は機種やファームウェアのバージョンによって少し違うようです。うちの環境はPR-200NEという機種でファームウェアのバージョンは6.38でした。

まずAsteriskをひかり電話に対応させるにはパッチを当てる必要があります。基本的にはAsteriskのソースにパッチを当てて再コンパイルすればOKです。パッチを当てる具体的な手順は以下のようなやり方になります。なお設定ファイルが初期化されてしまうのでmake configは実行しないでください。

cd asterisk-1.4.24
wget ftp://ftp.voip-info.jp/asterisk/patch/local/1.4/channels/chan_sip.c.rt200ne.070417-02.patch
patch -p0 < chan_sip.c.rt200ne.070417-02.patch ./channels/chan_sip.c
./configure
make
make install
cd

ここでは話を単純にするためにmake installするように書きましたが実は再コンパイル後にchannels/chan_sip.soを/usr/lib/asterisk/modules/に上書きするだけでも構いません。 次にブラウザでPR-200NEの管理画面にアクセスして「電話設定」→「内線設定」で内線の設定を行います。とりあえず3番から空いていたので3番にAsteriskを登録することにします。ユーザーIDに「0003」とパスワードに「1234」としました。内線番号とニックネームはそのまま。端末属性は必ず「音声専用端末」を選択してください。古いバージョンでは「音声端末」という表記らしいです。

ではAsteriskをPR-200NEに登録します。登録はsip.confのgeneralセクションに記述します。同時にPR-200NEのセクションを追加します。ルータの機種名はPR-200NEですがパッチがRT-200NE用なのでセクション名は「rt200ne-1」としました。 ちなみにdefaultexpireyとmaxexpireyの記述がないと「423 Interval Too Brief」というエラーでレジストできないそうなので必ず記述してください。なお使用するルータのIPアドレスは192.168.1.1というケースでの記述になります。環境に合わせて書き換えてください。

vi /etc/asterisk/sip.conf

#[general]セクションに以下を追加 
[general] 
maxexpirey=3600 
defaultexpirey=3600 
rt200ne=192.168.1.1 
register => 3:1234:0003@rt200ne-1/6000

[rt200ne-1] 
type=friend 
secret=1234 
username=0003 
fromuser=3 
fromdomain=192.168.1.1 
host=192.168.1.1 
context=default 
insecure=very 
dtmfmode=inband 
canreinvite=no 
disallow=all 
allow=ulaw

登録されたかどうかの確認は以下のようにします。

asterisk -vvvvvr
asterisk*CLI> ←Asterisk CLIが起動する
asterisk*CLI> sip show registry
rt200ne-1:5060    3     3585 Registered    Fri, 26 Mar 2009 10:00:10

さらにusers.confに6000をユーザとして記述します。また電話機側のユーザとして7000も追加します。

vi /etc/asterisk/users.conf

#以下を追加 
[6000] 
type=friend 
username=6000 
secret=1234 
canreinvite=no 
host=dynamic

[7000] 
type=friend 
username=7000 
secret=1234 
canreinvite=no 
host=dynamic

あとはextension.confで外線の発着信設定を記述するだけです。

vi /etc/asterisk/extensions.conf 

#[default]セクションに以下を追加 
[default] 
;;7000番台内線着信 
exten = _70XX,1,Dial(SIP/EXTEN,,tT)
exten=70XX, n, GotoIf([“${DIALSTATUS}”=“BUSY”]?busy) 
exten = _70XX,n,GotoIf($["${DIALSTATUS}“=”CONGESTION"]?busy) 
exten = _70XX,n,Hangup 
exten = _70XX,n(busy),Playback(vm-nobodyavail) 
exten = _70XX,n,WaitExten(90)

;;外線着信 
exten = 6000,1,Dial(SIP/7000,,tT) 
exten = 6000,n,Hangup

;;外線発信 
exten = *1XX,1,Dial(SIP/EXTEN@rt200ne − 1,,tT)
exten=1XX, n, Hangup
exten=0., 1, Dial(SIP/{EXTEN}@rt200ne-1,,tT) 
exten = 0.,n,Hangup 
exten = [3456]XXXXXXX,1,Dial(SIP/${EXTEN}@rt200ne-1,,tT) 
exten =* [3456]XXXXXXX,n,Hangup

外線着信はregisterで6000番が呼ばれるように設定したので6000に対してextenを記述します。ちなみに_1XXが117(時報)とか177(天気予報)などの特番、_0.はゼロ発信なので市外局番から押した番号全て、[3456]XXXXXXXは東京を市内通話でかけられる感覚で3、4、5、6で始まる番号は東京とみなして発信する設定です。