「Asterisk」カテゴリーアーカイブ

CentOS7にAsterisk13その2

次は各種設定ファイル対応。

asterisk.conf
以下の設定のみ変更。

runuser=asterisk
rungroup = asterisk

pjsip.conf

;RT-400NEの内線3番に登録。
;ここでのRT-400NEのIPアドレスは192.168.0.2
[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0

[hikari-denwa]
type=registration
transport=simpletrans
outbound_auth=hikari-trunk
server_uri=sip:192.168.0.2
client_uri=sip:3@192.168.0.2
retry_interval=60

[hikari-trunk]
type=auth
auth_type=userpass
password=パスワード
username=0003

[hikari-trunk]
type=aor
contact=sip:192.168.0.2

[hikari-trunk]
type=endpoint
transport=simpletrans
context=from-hikari
disallow=all
allow=ulaw
outbound_auth=hikari-trunk
aors=hikari-trunk
direct_media=no
from_user=3
from_domain=192.168.0.2

[hikari-trunk]
type=identify
endpoint=hikari-trunk
match=192.168.0.2

; IP電話機の設定
[201]
type=endpoint
transport=simpletrans
disallow=all
allow=ulaw
aors=201
auth=auth201

[201]
type=aor
max_contacts = 1

[auth201]
type=auth
auth_type=userpass
password=パスワード
username=201

extensions.conf

[globals]
MYHIKARI => 電話番号

[default]
; 内線 201~209を使用
exten => _20Z,1,Dial(PJSIP/${EXTEN},20,tT)
exten => _20Z,n,Wait(1)
exten => _20Z,n,VoiceMail(${EXTEN})
exten => _20Z,n,Hangup

; 0発信
exten => _0.,1,Set(CALLERID(num)=${MYHIKARI})
exten => _0.,n,Set(CALLERID(name)=${MYHIKARI})
exten => _0.,n,Dial(PJSIP/${EXTEN}@hikari-trunk,60,tT)
exten => _0.,n,Hangup

; 9発信
exten => _9.,1,Set(CALLERID(num)=${MYHIKARI})
exten => _9.,n,Set(CALLERID(name)=${MYHIKARI})
exten => _9.,n,Dial(PJSIP/${EXTEN:1}@hikari-trunk,60,tT)
exten => _9.,n,Hangup

; 着信 (201を鳴らす)
[from-hikari]
exten => s,1,Dial(PJSIP/201,40,tT)
exten => s,n,Wait(1)
exten => s,n,VoiceMail(201)
exten => s,n,Hangup

設定が終わったらAsteriskを起動。
# systemctl start asterisk.service
# systemctl enable asterisk.service

CentOS7にAsterisk13その1

サーバーをリプレースしたので久しぶりにAsteriskのインストールです。
まずはvoip-info.jpを参考にして必要なパッケージを準備。(作業ディレクトリは/usr/local/src)

# yum groupinstall "Development Libraries" "additional Development"
# yum install gcc gcc-c++
# yum install libxml2 libxml2-devel openssl-devel ncurses-devel sqlite-devel newt-devel libuuid-devel uuid-devel
# yum install json-c json-c-devel
# yum install subversion

janssonのインストール

# wget http://www.digip.org/jansson/releases/jansson-2.7.tar.gz
# tar xzvf jansson-2.7.tar.gz
# cd jansson-2.7
# ./configure
# make && make install

Pjsip

# wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
# tar xvjf pjproject-2.4.tar.bz2
# ./configure --prefix=/usr/local --libdir=/usr/lib64 --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr CFLAGS='-O2 -DNDEBUG'
# make dep && make && make install
# ldconfig
# ldconfig | grep pj

Asterisk

# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
# cd asterisk-13.*.*
# ./bootstrap.sh
# ./configure --libdir=/usr/lib64
# make menuselect
# make && make install && make samples

make menu select で必要なものを選択してください。私はpjsipを使用するのでchan_sipを使わないように設定しました。

そして make config は CentOS7 に対応していないので実行しません。かわりに以下のようにsystemctlの起動用ファイルを作成します。

# vim /usr/lib/systemd/system/asterisk.service

[Unit]
Description=Asterisk PBX and Telephony Daemon
After=network-online.target

[Service]
Type=simple
Environment=HOME=/var/lib/asterisk
WorkingDirectory=/var/lib/asterisk
User=asterisk
Group=asterisk
ExecStart=/usr/sbin/asterisk -f -C /etc/asterisk/asterisk.conf
ExecStop=/usr/sbin/asterisk -rx 'core stop now'
ExecReload=/usr/sbin/asterisk -rx 'core reload'
PrivateTmp=true

[Install]
WantedBy=multi-user.target

ユーザー/グループをasteriskで動作させるための設定

# adduser -u 5000 asterisk -s /sbin/nologin -d /var/lib/asterisk
# chown -R asterisk:asterisk /var/lib/asterisk
# chown -R asterisk:asterisk /var/log/asterisk
# chown -R asterisk:asterisk /var/run/asterisk
# chown -R asterisk:asterisk /var/spool/asterisk
# chmod -R u=rwX,g=rX,o= /var/lib/asterisk
# chmod -R u=rwX,g=rX,o= /var/log/asterisk
# chmod -R u=rwX,g=rX,o= /var/run/asterisk
# chmod -R u=rwX,g=rX,o= /var/spool/asterisk

SELinux対応

# cd /var/lib
# ls -Z | grep asterisk
drwxr-x---. asterisk       asterisk       system_u:object_r:var_lib_t:s0   asterisk
# chcon -R system_u:object_r:asterisk_var_lib_t:s0 asterisk
# ls -Z | grep asterisk
drwxr-x---. asterisk asterisk system_u:object_r:asterisk_var_lib_t:s0 asterisk

# cd /var/run
# ls -Z | grep asterisk
drwxr-x---. asterisk       asterisk       system_u:object_r:var_run_t:s0   asterisk
# chcon -R system_u:object_r:asterisk_var_run_t:s0 asterisk
# ls -Z | grep asterisk
drwxr-x---. asterisk       asterisk       system_u:object_r:asterisk_var_run_t:s0 asterisk

# cd /var/spool
# ls -Z | grep asterisk
drwxr-x---. asterisk asterisk system_u:object_r:var_spool_t:s0 asterisk
# chcon -R system_u:object_r:asterisk_spool_t:s0 asterisk
# ls -Z | grep asterisk
drwxr-x---. asterisk asterisk system_u:object_r:asterisk_spool_t:s0 asterisk
# semanage fcontext -a -t asterisk_var_lib_t "/var/lib/asterisk/(/.*)?"
# semanage fcontext -a -t asterisk_var_run_t "/var/run/asterisk/(/.*)?"
# semanage fcontext -a -t asterisk_spool_t "/var/spool/asterisk/(/.*)?"

機種変更

最初はTouch Proにしようかと思っていましたが、Nokiaが日本から撤退するというので、記念に最後に発売された端末に機種変更しました。

N82

写真の画面には子供の予定まで表示されちゃっていますね。

Nokiaの場合何がいいかって言うと、OS がきちんと電話として機能するスマートフォンだということです。そして SIP スタックが標準で搭載されているというのが嬉しいですね。家の電話は Asterisk で構成されているので、家にいるときはひかり電話などの IP 電話、外では普通の携帯電話という使い方ができます。そしてこの N82 の素晴らしいところは、本体のどこにも「〓SoftBank」というダサいロゴが印刷されていないというところです。

さて Asterisk で使うための SIP の設定ですが、ちょっと分かりにくいので記載しておきましょう。

Asteriskが動いているサーバー名を mysipserver.mydomain.tld とし、sip.conf の設定は以下のとおりと仮定します。

realm=mydomain.tld
username=1001
secret=12345

まず「ツール」→「設定」→「接続」から「SIP設定」を選びます。「オプション」から「新規SIPプロファイル」を選択して以下の内容を入力して下さい。

・プロファイル名: 好きな名前を
・サービスプロファイル: IETF
・デフォルトアクセスポイント: WLANのアクセスポイントを選択
・公開するユーザ名: 1001@mysipserver.mydomain.tld
・圧縮を使用: いいえ
・登録: 常にオン
・セキュリティ使用: いいえ
・プロキシサーバ: →設定しません
・登録サーバアドレス: mysipserver.mydomain.tld
・領域: mydomain.tld (realmの値です)
・ユーザ名: 1001
・パスワード: 12345
・転送タイプ: 自動
・ポート: 5060

あとは「インターネット電話」の設定で新しくプロファイルを作成し、そのSIPプロファイルに上で作成したSIPプロファイルを選択するだけです。

1.4.22パッチ

ちょっと前に Nortel の安い電話を買って会社の Asterisk に登録して使い始めました。その頃からなのですが、他の電話を含めてすべての電話で、音がぶつ切れで会話ができない状態が3日に1度位の頻度で発生するようになりました。時期が一致したのが偶然なのか UNISTIM のモジュールを追加したからなのかわからないので、とりあえず Nortel の電話とモジュールを外して様子見です。

この原因を探そうと Asterisk のバージョンをあげてみたり試行錯誤をしていた産物で、1.4.22 用のセッションタイマーパッチを作りました。1.6 になるとセッションタイマーは含まれているので、これでもうパッチをつくることはないでしょう。最後のパッチは以下のリンクからどうぞ。

chan_sip.c.se-timer-20081018.diff

Snarlへの表示

AsteriskからUDPで着信通知するモジュールのWindows用インターフェースがあまりにもさびしいので自分で作ってみました。と言ってもアイコンが追加されているだけですけど……。

以下からインストールパッケージがダウンロードできます。

https://zzaj.net/download/AstNotify4SnarlSetup.msi

……………… 

全体を通して順番に何をすればいいかというと、

http://www.mezzo.net/asterisk/app_notify.html

からAsterisk用のモジュール

http://www.mezzo.net/asterisk/app_notify-2.0rc1.tgz

をダウンロードしてきてインストール。

extensions.conf の着信の部分に

exten => s,1000,Notify(${CALLERID(num)}|${CALLERID(name)}|${EXTEN}/通知先アドレス)

と記述。

Windows側では上のリンク先にあるNotifierServerを使わずに、AstNotify4SnarlSetup.msi をインストールして実行。そうすると着信時に以下のようなポップアップが表示されるようになります。なおスタートアップフォルダにも入るので、次回再起動時には自動的に実行されています。

astnotify4snarl.png

Snarl側では設定画面のApplicationsからAstNotify4Snarlをダブルクリックすると、以下のような画面が表示されます。AstNotify4Snarlを終わらせたい場合には「Terminate」をクリックして下さい。

astnotify4snarldialog.png

そうそう、AstNotiry4Snarlの初回起動時にファイアウォールでブロックするかどうかを尋ねられるのでブロックを解除してください。

 追記:

ちなみにSnarlはUTF-8の文字列を受け取るようになっているのですが、文字化けだらけでまともに日本語を表示できないために使い物になりません。そういう意味ではあまり使い道のないソフトなのかも。

電話がかかってきたときに…

Asteriskでは電話がかかって きたときに色々なことができるわけですが、今日見つけたのはいくつかの情報を指定されたIPアドレスにUDPで送るというツール。

http://www.mezzo.net/asterisk/app_notify.html

これをつかってWindowsのデスクトップにどこからかかってきたのかを表示するためにこれまたSnarlというツールをいれてみました。

Snarl

で、こんな感じに表示されます。

cdr-csvのタイムゾーン

マシンを入れ替えて、Asteriskの1.2.18から1.4.17に移行したわけですが、cdr-csvのMaster.csvに記録される時刻が GMT になっているのに気付きました。

以前はそんな設定をした記憶もないしと思って悩んでいたところ、 /etc/asterisk/cdr.confに「usegmtime=yes」となっている行を発見しました。デフォルトでnoなのに何故サンプルはyesにしたんでしょうか……。