Asteriskでひかり電話と050番号をまとめる。

オープンソースであるIP-PBXのAsteriskを使用して、自宅のひかり電話と、プロバイダで契約している050番号(IP電話)をまとめ、内線毎に鳴り分ける方法を書いてみたいと思います。

筆者の環境として、

・RT-200KI(NTT東日本レンタル)
・YAMAHA RT57
・FreeBSD6.0 + Asterisk1.2.4

を使用し、zaptel(物理的な外線接続、電話機接続)は使用せず、SIP通信だけを行わせます。

接続は、以下の通り。

{接続図}
(internet)——(ONU)—-[RT-200KI]====[YAMAHA RT57]—–ClientPCなど

※2009/9/22追記 – 上記接続図では説明が不十分のため、図解を入れました。

設定は以下の通りです。

RT-200KI(NTT東日本rental)
IPアドレスは、192.168.11.253とする。

[電話設定→IP端末1]
電話番号:024-xxx-xxxx
内線番号:3
端末属性:IP端末(音声)
ユーザ名:0003
パスワード:password
[電話設定→内線番号一覧]
上記の内線番号3を、「収容端末選択」にて「有効」にすること。

Asterisk1.2.6
IPアドレスは、192.168.11.2 とします。

{sip.conf}

[general]
language=jp
context=default
bindport=5060
bindaddr=0.0.0.0
srvlookup=no
disallow=all
allowguest=no
allow=ulaw
allow=alaw
allow=gsm
dtmfmode=inband
defaultexpirey=3600
externip=(固定IPを利用している場合はIPを書くか、)
externhost=(またはダイナミックDDNS名を書く)
nat=never

; ひかり電話(RT-200KI)で設定した内容にてレジストする
register => 3:password:0003@192.168.11.253/024938xxxx

; プロバイダのIP電話(我が家の場合はso-net)の設定内容でレジストする
register => 050ABCD1234@so-net.ne.jp:PASSWORD:USERNAME@voipAA.so-net.ne.jp/050ABCD1234

[ntttel]
type=friend
username=0003
secret=password
host=192.168.11.253
canreinvite=no
dtmfmode=inband
disallow=all
allow=ulaw
allow=alaw
context=fromntttel
insecure=very

[iptel]
type=friend
username=USERNAME
secret=PASSWORD
host=voipAA.so-net.ne.jp
fromdomain=so-net.ne.jp
fromuser=050ABCD1234
canreinvite=no
dtmfmode=inband
disallow=all
allow=ulaw
allow=alaw
context=fromiptel
insecure=very

[201]
type=friend
username=201
secret=password
host=dynamic
canreinvite=no
dtmfmode=inband

[202]
type=friend
username=202
secret=password
host=dynamic
canreinvite=no
dtmfmode=inband
{extension.conf}

[general]
static=yes
writeprotect=yes


[globals]
Clock=117
IPTEL=050xxxxyyyy
NTTTEL=024xxxyyzz
NTTRT=3

[fromiptel]
exten => ${IPTEL},1,Ringing
exten => ${IPTEL},2,Wait,5
exten => ${IPTEL},3,Answer
exten => ${IPTEL},4,Wait,1
exten => ${IPTEL},5,Background(vm-enter-num-to-call)
exten => ${IPTEL},6,WaitExten(5)
exten => ${IPTEL},7,Goto(${IPTEL},4)


include => inner


exten => i,1,Wait(1)
exten => i,2,Playback(pbx-invalid)
exten => i,3,Goto(${IPTEL},6)


[fromntttel]
exten => ${NTTTEL},1,Dial(SIP/201&SIP/202,30)
exten => ${NTTTEL},2,HangUp

;
;

[ipout]
exten => _050.,1,SetCallerId,${IPTEL}
exten => _050.,2,Dial(SIP/${EXTEN}@iptel,60,r)
exten => _050.,3,Congestion
include => nttout

[nttout]
exten => _0.,1,SetCallerId,${NTTRT}
exten => _0.,2,Dial(SIP/${EXTEN}@ntttel,60,r)
exten => _0.,3,Congestion


[dtmf-debug]
exten => s,1,Ringing
exten => s,2,Wait,10
exten => s,3,Answer
exten => s,4,WaitExten(1)

exten => _X,1,SayDigits(${EXTEN})
exten => _X,2,Goto(s,4)
exten => t,1,Goto(s,4)


[default]
include => ipout
include => nttout
include => inner

[inner]
; ip-in-debug
exten => 111,1,Goto(fromiptel,${IPTEL},1)

; 386 dtmf test
exten => 386,1,Goto(dtmf-debug,s,1)

; Speaking Clock
exten => ${Clock},1,Answer()
exten => ${Clock},2,Wait(1)
exten => ${Clock},3,setvar(FutureTime=$[${EPOCH} + 5])
exten => ${Clock},4,SayUnixTime(${FutureTime},,PHM)
exten => ${Clock},5,playback(beep)
exten => ${Clock},6,Goto(${Clock},3)


; 200: Exho test
exten => 200,1,Answer()
exten => 200,2,Wait(1)
exten => 200,3,Playback(demo-echotest)
exten => 200,4,Playback(beep)
exten => 200,5,Echo
exten => 200,6,Playback(beep)
exten => 200,7,playback(vm-goodbye)
exten => 200,8,Hangup


; Local SIP Telephones 201-208
exten => 201,1,Dial(SIP/201,30,tT)
exten => 201,2,Answer()
exten => 201,3,Voicemail(${EXTEN})
exten => 201,4,Hangup
exten => 201,102,Answer()
exten => 201,103,Voicemail(${EXTEN})
exten => 201,104,Hangup


exten => 202,1,Dial(SIP/202,30,tT)
exten => 202,2,Answer()
exten => 202,3,Voicemail(${EXTEN})
exten => 202,4,Hangup
exten => 202,102,Answer()
exten => 202,103,Voicemail(${EXTEN})
exten => 202,104,Hangup


exten => 203,1,Dial(SIP/203,60,tT)
exten => 203,2,Answer()
exten => 203,3,Voicemail(${EXTEN})
exten => 203,4,Hangup
exten => 203,102,Answer()
exten => 203,103,Voicemail(${EXTEN})
exten => 203,104,Hangup


exten => 204,1,Dial(SIP/204,60,tT)
exten => 204,2,Answer()
exten => 204,3,Voicemail(${EXTEN})
exten => 204,4,Hangup
exten => 204,102,Answer()
exten => 204,103,Voicemail(${EXTEN})
exten => 204,104,Hangup


exten => 205,1,Dial(SIP/205,60,tT)
exten => 205,2,Answer()
exten => 205,3,Voicemail(${EXTEN})
exten => 205,4,Hangup
exten => 205,102,Answer()
exten => 205,103,Voicemail(${EXTEN})
exten => 205,104,Hangup


; For Voicemail Recording
exten => 201*1,1,Answer()
exten => 201*1,2,Voicemail(201)
exten => 201*1,3,Hangup


exten => 202*1,1,Answer()
exten => 202*1,2,Voicemail(202)
exten => 202*1,3,Hangup


exten => 203*1,1,Answer()
exten => 203*1,2,Voicemail(203)
exten => 203*1,3,Hangup


exten => 204*1,1,Answer()
exten => 204*1,2,Voicemail(204)
exten => 204*1,3,Hangup


exten => 205*1,1,Answer()
exten => 205*1,2,Voicemail(205)
exten => 205*1,3,Hangup


; For Voicemail Playback
exten => 298,1,Answer()
exten => 298,2,VoicemailMain()
exten => 298,3,Hangup


exten => 299,1,Answer()
exten => 299,2,VoicemailMain(s${CALLERIDNUM])
exten => 299,3,Hangup

; MeetMe
exten => 300,1,Ringing
exten => 300,2,Wait,5
exten => 300,3,Answer()
exten => 300,4,Meetme(300|M)
exten => 300,5,Hangup

exten => 301,1,Ringing
exten => 301,2,Wait,5
exten => 301,3,Answer()
exten => 301,4,MeetMe(|scdpM)
exten => 301,5,Hangup

;

exten => i,1,Answer()
exten => i,2,Wait(1)
exten => i,3,Playback(pbx-invalid)
exten => i,4,Congestion

[YAMAHA RT57]
IPは、192.168.11.1とします。

sip use on
sip server 1 192.168.11.2 register udp sip:201@192.168.11.2 201 password
sip server display name 1 201
sip server 2 192.168.11.2 register udp sip:202@192.168.11.2 202 password
sip server display name 2 202
以下は、201がアナログポート1、202がアナログポート2、というように分けてます。
analog arrive number display 1 on
analog rapid call 1 off
analog sip call myname 1 sip:201
analog sip call display name 1 201
analog sip call myname 2 sip:202
analog sip call display name 2 202

以上で、YAMAHA RT57に接続した電話機毎に、ひかり電話と050番号を鳴り分けさせることができます。

PHP5.1.4にしますか。

早起きはなんだかのオ得って昔から言いますけれど、PHP5.1.3にバグがあるらしいことを教えて頂いたので対処してみます。(^^;

毎度の事ながら、PHPのconfigureは、

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-xml --enable-mbstr-enc-trans --enable-mbstring --with-pgsql=/usr/local/pgsql --with-tsrm-pth

としてコンパイル。

手始めに我が家のをやってみるけれど、時間かかるなー。

なお、PHP5.1.4はこちらからダウンロードできます。

kenti.jpがピンチ。バックアップしておかねば。

給料日前でそりゃ本人もピンチですが、なんてことはなく、このHPの置いてあるサーバ、我が家の屋根裏にて動いています。

しかし最近、よく落ちます。原因はたぶんHDD。IBMのHDDを使用しているものだから、早めにデータをバックアップしておかねば…。

ところで、PC-UNIX環境でバックアップはどうするんじゃいとよく質問されるのですが、私の場合は以下のようなシェルスクリプトを動作させています。
“kenti.jpがピンチ。バックアップしておかねば。” の続きを読む

[apache2] webサーバのインストール

webを公開するためにwebサーバをインストールします。webサーバには、プロバイダなどでもよく使われているApacheを使用します。

Apacheには2種類のバージョンがありますが、今回はver2系のほう(httpd2)を使用します。
もちろん、ver1系のほうでも同様に動作させることが可能です。
ではでは早速、ソースをダウンロードし、コンパイル、インストールまで行います。
途中、注意するところがありますので気をつけて下さい。

> fetch http://www.apache.jp/dist/httpd/httpd-2.0.47.tar.gz
Receiving httpd-2.0.47.tar.gz (6217401 bytes): 100% (ETA 00:00)

> tar xzf httpd-2.0.47.tar.gz
(ソースを展開します。カレントにhttpd-2.0.47フォルダができます)

> cd httpd-2.0.47
> su (rootになりましょう)
# ./configure –enable-so –enable-ssl ※1
checking for chosen layout… Apache
checking for working mkdir -p… yes
checking build system type… i386-unknown-freebsd5.1
……(省略)

# make (コンパイルします。気長に待ちましょう。)
# make install ※2

ここで気をつけるのは2点です。

※1
–enable-so (soモジュールを有効にする)
これは、後述するPHPを使用できるするために必要なので、つけました。
–enable-ssl (sslを利用可能にする)
SSLページ (https://〜で始まる暗号化されたページ)を利用可能にするために、必要です。
通常であれば必要ないですが、セキュアなページには必要でしょう。(^^;
※2
今回、デフォルトのままインストールしましたので、インストールされる場所は、
/usr/local/apache2 以下にインストールされます。
インストールする場所を変えるには、※1の時に
./configure –prefix=/usr/local/httpd2 …
のように記述すれば変更可能です。

インストールが完了したら、早速設定ファイルを編集しましょう。

[ /usr/local/apache2/conf/httpd.conf ]


(216行あたり・使用ポートの設定と、IPV6を使わなければ#を)
Listen 80
#Listen [::]:80

(275行あたり・管理者のメールアドレスを書く)
ServerAdmin info@kenti.jp

(289行あたり・webサーバの名前を指定)

ServerName www.kenti.jp:80

(305行あたり・ドキュメントルートの指定)
DocumentRoot “/home/www/html”

(315行あたり・オプションの設定)
<Directory>
Options FollowSymLinks Includes ExecCGI
AllowOverride None
</Directory>

(330〜360行あたり・ドキュメントルートのオプションなど)
<Directory “/home/www/html”>
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

(365〜385行あたり・ユーザディレクトリの設定)
UserDir public_html
AliasMatch ^/usrers/([^/]+)(.*) /home/$1/public_html/$2
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options ExecCGI MultiViews SymLinksIfOwnerMatch
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

(393行あたり・インデックスファイル名の指定)
DirectoryIndex index.php index.html index.htm index.shtml index.cgi

(794行あたり・デフォルトの文字コード)
AddDefaultCharset shift_jis

(857行あたり・.cgiや.phpファイルをCGIとして扱う設定云々)
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
AddType application/x-httpd-php .php

(.shtmlファイルでSSIを利用できるように指定する設定)
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

上記の設定では、SSI・CGIを使えるようにする他、後述するPHPを実行できるように設定しています。

(ちょっと手抜きですね…。ここは後ほど、もう少し詳しくツッコミを書きたいと思います。)

設定ファイルを書いたら、上記設定ファイルにおかしいところがないかどうか、チェックをします。

# /usr/local/apache2/bin/apachectl
configtest

Syntax OK

Syntax OKと出てくれば、設定ファイルに間違いはなさそうです。

あとは起動するべし…。

# /usr/local/apache2/bin/apachectl
start

今回、ドキュメントルートには /home/www/html と設定をしたので、その中に適当なhtmlファイル云々を入れてみて表示されるかどうか確認してみましょう。うまくいけば、http://www.kenti.jp
のように表示できるはずです。(^_^)v

[php4]phpのインストール

webでPHPのスクリプトを扱えるようにするため、インストールをしてみましょう。

今回の場合、前回のApacheをインストールする際に、soモジュールというものを利用できるようにしていたので、インストール後に少しだけhttpd.confの設定を変更するだけで、簡単に使用することができます。

[ ソースのダウンロード・展開 ]# fetch http://www.php.net/get/php-4.3.3.tar.gz/from/jp.php.net/mirror
# mv mirror php-4.3.3.tar.gz (mirrorという名前でダウンロードしてしまうので名前変更)
# tar xzf php-4.3.3.tar.gz (カレントディレクトリに展開)
# cd php-4.3.3

[ 環境チェック・コンパイル前準備]# ./configure ¥
? –with-apxs2=/usr/local/apache2/bin/apxs ¥
? –with-xml –enable-mbstr-enc-trans –enable-mbstring ¥
? –with-mysql=/usr/local/mysql –with-tsrm-pth
creating cache ./config.cache
checking host system type… i386-unknown-freebsd5.1
checking for gcc… gcc
checking whether the C compiler (gcc ) works… yes
…………(環境チェックなどが始まります)

[コンパイルして、インストールする]# make ; make install
gcc -Iext/ctype/ -I/Users/kenti714/Desktop/php-4.3.3/ext/ctype/
-DPHP_ATOM_INC
…(コンパイル後、インストールされます)

コンパイル前に、Apache2を使用する、xmlを使用する、mbstring(日本語などの2bytes文字)を使用する、などの設定をしています。今回は必要な物だけをつけましたが、他に欲しい物は ./configure –help と入力すれば一覧を表示することが出来ます。
インストールが終わった後、httpd.confに以下のsoモジュール記述があるかどうか確認します。

[ /usr/local/apache2/conf/httpd.conf ]( 230行あたり )
LoadModule php4_module modules/libphp4.so

あとは、Apacheを再起動させて、web領域に以下のテストファイルを作成し、表示できるか確認してみましょう。

[ test.php ]<? phpinfo(); ?>

たったこれだけの記述ですが、うまく表示させることが出来ればにぎやかな表示が出ると思います。これで、Perlの他にもPHPを使ったCGIが使用できるようになります。