Asteriskの研究



日本語化 その1:数字や日付をちゃんとしゃべらせるには

STEP1. Asteriskは多言語に対応しちょるよ

その1. Asteriskのソースをmakeしたフォルダのsoundsという
フォルダに、Asteriskが利用するメッセージファイルが入っていますので、
そのフォルダへ移動してください。

その2. ここに「jp」という名前のフォルダを作って、soundsに入っている全ての
gsmファイルを日本語化したものをそこへ格納します。

soundsフォルダの下には、digits、letters、phonetic
というフォルダがありますので、これらの下にも「jp」フォルダを作って
日本語化したgsmファイルを入れておきます。

その3. 次に、sip.confを編集して各ユーザーのセクションの始まりのところに

「language=jp」

という行を追加します。

その4. これでシステムがしゃべるメッセージはほぼすべて日本語化できるわけですが、
数字をしゃべらせるときに不具合が生じます。

100などの場合、英語の文法ですと、one hundred というように1を発音
してしまいますので、ファイルを単に日本語しただけではイチ・ヒャクのように
おかしな発声をしてしまいます。

その5. そこで、FRITZはちゃんと日本語の文法で数字をしゃべらせるように
Asteriskのプログラムを修正してパッチを作ってみました。

日本語化パッチ(1.0.9版用)
日本語化パッチ(最新バージョン用)

まず、Asteriskが停止していることを確認します。
次に、Asteriskのソースが入っているフォルダの1つ上のフォルダに
上記のパッチを保存してから、Asteriskのソースフォルダへ移動します。
そして、以下のコマンドを投入します。

patch -p1 < ../asterisk-saynumber_jpn-1.0.patch
make
make install

これでOKです。

その6. では、試してみましょう。
Asteriskを起動して、extensions.conf ファイルを編集して以下ような感じで
エントリを追加して、その番号をSIPフォンからダイヤルします。

exten => 1000, SayNumber(12345,m)

上に戻る


ManagerAPIを試す

概要

  Asterisk Manager API は、Asteriskサーバに対してリモートマシンから コマンドを送ってAsteriskの動作を制御したいときに便利です。
Fritzは、SIPの端末番号が別の端末ですでにRegisterされていないかを 確認する際にこのManagerAPIを利用したりしています。

ManagerAPIの準備

  AsteriskManagerAPIは、テキスト文字列をやりとりすることによって情報の伝達を行います。
AsteriskManagerAPIを利用するには、/etc/asterisk/manager.confを適宜変更する必要があります。

[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
displayconnects = yes
debug=on
[astmgr]
secret = pass_astmgr
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
deny=0.0.0.0/0.0.0.0
permit=192.168.100.10/255.255.255.0
permit=127.0.0.1/255.255.255.0

port AsteriskManagerAPIの受付ポート番号です
permit クライアントのIPを指定します
[astmgr] クライアントのユーザーIDを指定します
secret クライアントのパスワードを指定します

まずはじめに

  AsteriskManagerAPIを利用するには、まずログインコマンドを送信して、AsteriskManagerAPIのサーバに自分を登録します。

Action:Login\r\nUsername: astmgr\r\nSecret: pass_astmgr\r\n\r\n

ログインコマンドを送信すると、それに対する応答がAsteriskサーバから返ってきます。

Asterisk Call Manager/1.0\r\nResponse: Success\r\nMessage: Authentication accepted\r\n\r\n

次にAsterisk側からイベントを受け取るかどうかを指定します。

Action: Events\r\nEventmask: On\r\n\r\n

イベントマスクコマンドには、応答メッセージが返ってきません。
最後に、AsteriskManagerAPIを終了するには、接続していたソケットを切断します。


Asterisk Manager API一覧

  詳細は(http://www.voip-info.org/wiki/view/Asterisk+manager+API)にて 確認してください。
様々なコマンドが用意されています。

さんぷるぷろぐらむ

  AsteriskManagerAPIを利用して『sip show peers』を実行するプログラムを書いてみました。

ダウンロードはここ→

redHatLinuxES4で実行確認しました。

適当なフォルダにパッケージを解凍してください。
[root@asterisk1 asterisk_manager_api]# make
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c program_main.c -o program_main.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_signal.c -o sub_signal.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_read_config.c -o sub_read_config.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_read_args.c -o sub_read_args.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_logput.c -o sub_logput.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_strdate.c -o sub_strdate.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_strip_enter.c -o sub_strip_enter.o
gcc -g -Wall -DLINUX_REDHAT -DFVERSION='"VER.1.20070324"' -I. -c sub_nettools.c -o sub_nettools.o
gcc -g program_main.o sub_signal.o sub_read_config.o sub_read_args.o sub_logput.o sub_strdate.o sub_strip_enter.o sub_nettools.o -o asterisk_srv -lm -lnsl -ldl

次に、設定ファイル(astmgr.cfg)を編集します。
dir_logdir ログを出力する場所
ast_host asteriskのIPアドレス
ast_port ManagerAPIのポート番号(5038)

これで、実行できます。やってみましょう。
[root@asterisk1 asterisk_manager_api]# ./asterisk_srv -cfg astmgr.cfg
2007/03/24 12:14:31 [D] ( program_main.c:0045) NORMAL 9233 : ===== Asterisk Server Control (VER.1.20070324) Start ================
2007/03/24 12:14:31 [D] ( program_main.c:0046) NORMAL 9233 : Asterisk Host: 127.0.0.1
2007/03/24 12:14:31 [D] ( program_main.c:0047) NORMAL 9233 : Asterisk Port: 5038
2007/03/24 12:14:31 [D] ( program_main.c:0070) NORMAL 9233 : connected to asterisk (127.0.0.1,5038)
2007/03/24 12:14:31 [D] ( program_main.c:0105) NORMAL 9233 : SEND:(Action: Login Username: astmgr Secret: astmgr )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Asterisk Call Manager/1.0 )
== Parsing '/etc/asterisk/manager.conf': Found
== Manager 'astmgr' logged on from 127.0.0.1
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Response: Success )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Message: Authentication accepted )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: ( )
2007/03/24 12:14:31 [D] ( program_main.c:0227) NORMAL 9233 : socket read complete
2007/03/24 12:14:31 [D] ( program_main.c:0131) NORMAL 9233 : SEND:(Action: Events Eventmask: On )
2007/03/24 12:14:31 [D] ( program_main.c:0150) NORMAL 9233 : SEND:(Action: Sippeers )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Response: Success )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Message: Peer status list will follow )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: ( )
2007/03/24 12:14:31 [D] ( program_main.c:0227) NORMAL 9233 : socket read complete
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Event: PeerEntry )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Channeltype: SIP )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ObjectName: 5002 )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ChanObjectType: peer )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (IPaddress: -none- )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (IPport: 0 )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Dynamic: yes )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Natsupport: yes )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ACL: no )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Status: UNKNOWN )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: ( )
2007/03/24 12:14:31 [D] ( program_main.c:0227) NORMAL 9233 : socket read complete
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Event: PeerEntry )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Channeltype: SIP )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ObjectName: 5001 )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ChanObjectType: peer )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (IPaddress: -none- )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (IPport: 0 )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Dynamic: yes )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Natsupport: yes )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ACL: no )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Status: UNKNOWN )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: ( )
2007/03/24 12:14:31 [D] ( program_main.c:0227) NORMAL 9233 : socket read complete
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (Event: PeerlistComplete )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: (ListItems: 2 )
2007/03/24 12:14:31 [D] ( program_main.c:0197) NORMAL 9233 : Received: ( )
2007/03/24 12:14:31 [D] ( program_main.c:0227) NORMAL 9233 : socket read complete
== Manager 'astmgr' logged off from 127.0.0.1
上に戻る


自作アプリケーションを試す

自作!?

STEP 1. 概要
Asteriskのextensions.confに自分で勝手に作ったコマンドを登録して
実行してみようという試みです・・・。
拡張機能の一種だと思えばいいのかな・・・

STEP 2. ソース置き場
作成したソースは、Asteriskのソースフォルダのappsの下に入れます。
Asterisk1.2シリーズ用サンプルソースはこの章の末尾にあります。

STEP 3. コンパイル方法(準備)
asteriskが起動していないことを確認してください。
コンパイル準備は、appsフォルダ下のMakefileの『APPS=』に自分の
アプリケーションのファイルを追加するだけです。

STEP 4. コンパイル方法(コンパイル)
asteriskフォルダに戻って、make

STEP 5. インストール
asteriskフォルダでmake install


サンプルソース

STEP 1. 概要
変数名とその内容を指定すると、指定された名前の変数に
指定された内容を書き込み、
更に『FUNCTIONSTATUS』という名前の変数に『OK』と
書き込むというアプリケーションです。

STEP 2. 利用例
こんな感じで使います。
[macro-IVR-05-TESTAPP]
exten => s,1,NoOp("macro-IVR-05-TESTAPP")
exten => s,n,myappsample1(TVAL,TDATA)
exten => s,n,NoOp(${TVAL})
exten => s,n,NoOp(${FUNCTIONSTATUS})
exten => s,n,HangUp
上記の例では、自作した『myappsample1』に『TVAL』という名前の変数に『TDATA』という文字列を書き込むように
パラメータ設定しています。
同処理実行後に、変数『TVAL』と変数『FUNCTIONSTATUS』を表示させています。

STEP 3. 実行結果
上記のサンプルを実行すると以下のようになります。
  == Spawn extension (macro-IVR-05-TESTAPP, s, 5) exited non-zero on 'SIP/5004-2
    -- Executing Macro("SIP/5004-294d", "IVR-05-TESTAPP") in new stack
    -- Executing NoOp("SIP/5004-294d", ""macro-IVR-05-TESTAPP"") in new stack
    -- Executing myappsample1("SIP/5004-294d", "TVAL|TDATA") in new stack
    -- Executing NoOp("SIP/5004-294d", "TDATA") in new stack
    -- Executing NoOp("SIP/5004-294d", "OK") in new stack
    -- Executing Hangup("SIP/5004-294d", "") in new stack
  == Spawn extension (macro-IVR-05-TESTAPP, s, 5) exited non-zero on 'SIP/5004-2

STEP 4. ダウンロード

サンプルソースのダウンロードはここ→

C言語で書かれています。
パラメータのアクセスなどに専用のマクロが用意されており、それらを利用しています。

上に戻る

 戻る