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で始まる番号は東京とみなして発信する設定です。