雲の上はいつも青空 -22ページ目

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

IP電話システムの拡張として、工場等で使われる館内放送システムと連動するシステムを構築してみましょう。この場合は、館内放送システムが既にあるのか、もしくは新設するのかによって多少変わりますが、今回は新設する場合です。
この連携により、決められた内線番号へ電話することで自動的に館内放送システムへ接続され、全員への連絡や離席者への外線保留の連絡等を行うことが出来ます。

ポイントは2つあります。
1.IP電話システムからどうやって音響システムへ音声を流すのか?
2.館内放送システムを構築するための基本知識

それでは順番に書いていきます。

$雲の上はいつも青空IP電話システムから音響システムへ音声を流す方法はいくつかありますが、今回はiCOM社製のVE-PG1という放送連携ユニットを使うことにします。
この製品は、設定した内線番号に電話をかけるとワンコールで自動的に応答し、つながった後は話している声をアナログ音声へ変換して、館内放送システムのアンプへ伝送してくれます。
またPoEに対応しているので、IP電話システムの為にPoE対応スイッチを使っていると電源は不要となります。

設定は簡単で、工場出荷時のIPアドレスが192.168.0.1となっているので、最初はクロスケーブルを使いPCと一対一で接続し、PC側は192.168.0.2とかにしておきます。
接続したら、http://192.168.0.1 で設定画面が開きます。

まずは画面左のメニューよりページャー設定を選びます。
ページャー設定が『ページング』になっていることを確認します。
次に詳細設定を選びます。
仮に、内線番号を600番 IPアドレスは192.168.1.20 とすると設定は以下のようになります。

放送機能設定
着信用SIP URI sip:600@192.168.1.20
放送音 前置音 短音1
後置音 なし
応答待機時間(秒) 1.5
自動切断タイマー 120
入出力端子 AUX入力 使用しない
後面LEVEL調整 音声放送時 使用する
AUX入力時
放送出力音量調整 3
放送出力モニター 両方

$雲の上はいつも青空この設定で一度登録し、次に『ネットワーク設定』でIPアドレスやネットマスク等の情報を設定し、『登録して再起動』をクリックしてください。

以上でVE-PG1の設定は終了です。IP電話システムのネットワークへ接続してください。
上記の設定では放送出力モニターをONにしてますので、アンプにつながない状態でも本体内蔵のスピーカーから音が出ます。

さて、次はAsteriskの設定です。
この機器はsipサーバへのレジストは必要ありません。単純にextensions.confの発信動作のセクションに下記を追加するだけで動作します。

exten => 600,1,Dial(SIP/600@192.168.1.20)
exten => 600,n,Congestion


上記の追加が終わったら、asterisk -r でコマンドモードに入り、dialplan reload で新しいxtensions.confを有効にします。

新しい内線600番を呼び出すと、まず『プー!』という発信音が聞こえます。その後は電話機に話した声がVE-PG1の内蔵スピーカーから流れてきます。スピーカーの音量は、設定画面の『放送出力音量調整』で1~10まで調整出来ます。

放送音の前置音を変更すると、デパートのような『ポンポンポンポ~ン♪』という4音upや、後置音を設定すると放送後の流れるチャイムも設定できます。

■ちょっと長くなってきたので、館内放送システム構築の基礎知識と連携についてはページを改めることにします。
iPhoneで稼働するソフトフォンのバックグラウンド待ち受けの『その2』です。
Wi-Fi環境であれば、VoIPが使う帯域についてはさほど気にする必要はないのですが、3G回線経由時にはVoIPパケットの優先制御が行われませんので、なるべくビットレートを下げて通信品質が音声の品質に影響が出ないようにしたいところです。

VoIP機器でよく使われるG.711(μLow)はビットレートが64Kbpsですが、GSMが13Kbps、G.729aではなんと8Kbpsという低ビットレートです。
※実際に使う帯域はIPヘッダー部とフレーム部がありますから、G.711 で約150Kbps、G.729aでは約75Kbpsになります。ここに詳しいレポートがありました。

GSMは無料で使えますが、G.729aは特許のからみで有料です。
実際に使ってみると、GSMを使うことで3G回線経由でソフトフォンを使っても音質劣化は許容範囲だと思います(G.711 だとちょっと辛い)。

しかし、G.729aを使ってみるとGSMとの違いはよく分かります。電話がつながった最初の2~3秒が不安定になる事(毎回ではなく、たまに)を除けば、音質は問題ないと言えます。非常に安定しており、音が途切れたり、妙なエコーが発生することもありません。
※十分実用範囲に入っていると断言できます。
※iPhone用のAdd-onが1,200円、asterisk用のバイナリーcodecが$10、これが高いか安いかは微妙ですが、あの音質と一度きりの費用であると考えると、それほどコストパフォーマンスが悪いとは思いません。
$雲の上はいつも青空

それでは、G.729aを使うための設定方法です。
1-1.setting -> Add-ons で、G.729 Annex A Codecを購入する。
iTunesのパスワードを入力すると、iPhone上で購入できます。
ただし、結果が反映されて使えるようになるまで30分くらいかかります。

1-2.G729aがつかえるようになりましたら、
setting -> SIP Accounts -> [設定したいアカウントを選択] ->
Advanced settings -> Codec for 3Gを選び、G.729aを表の一番上にドラッグする。

これでiPhone側の設定は終了です。
$雲の上はいつも青空

次に、asteriskにG,729aのCodecを導入します。

まずは、astersikの開発元でもあるdigium社のWebサイトへ行き、オンラインストアからG.729aのCodecを購入します。クレジットカードかPaypalで購入が可能です。
購入自体はすぐに終わり確認のメールもすぐにやってくるのですが、ライセンスキーの発行は人力らしく、時差も手伝って次の日に送られて来ると思った方が良いです。
※オンラインストアのアカウント登録は電子メールの認証があるので、単に登録しただけではサインイン出来ません。登録後すぐにメールが送られてくるので、そこに書かれているURLをクリックすることで認証が終わり、やっとサインイン出来るようになります。

さて、手元にライセンスキーが揃ったらインストール開始です。
まずは、このページを開きInstallation GuidesにあるREADMEをしっかり読んでください。
ステップbyステップで非常に丁寧に書かれており、その通りに操作することでさほど迷わずにインストールが完了します。

まずは、registerというプログラム(Linux上で動作する。32ビット版を選んでおけば無難)でユーザ登録を行い、同時にHDD上になにやらライセンス認証用のファイルができあがります。

次はバイナリーのCodecを選択する作業です。
バイナリーなのでCPU 種類毎用意されていますが、その中でどれを使ったらよいか簡単なベンチマークを走らせて一番成績のよいバイナリーを選んでくれます。
※私の場合はなぜかC3_2でしたww

あとはダウンロードサイトへ行って、このバイナリーをダウンロードしてきます。
※実際にはブラウザー上で見えるバイナリーCodecのURLをコピーして、Linux上でwgetするのが楽です。

最後にダウンロードしてきたバイナリーCodecを /usr/lib/asterisk/modules へコピーし、
# asterisk -rx "module load codec_g729a.so"
で、初期化して組み込んでください。
※このコマンドは一度だけ実行すれば良いです。

ちゃんと新しいCodecが動いているかは、
# asterisk -rvv
*CLI> g729 show licenses

とコマンドを打つと、
0/0 encoders/decoders of 1 licensed channels are currently in use

Licenses Found:
File: G729-2NJDXXXXXXXX.lic -- Key: G729-2NJDXXXXXXXX -- Host-ID: e5:3b:4b:84:cf:45:6a:fb:9a:58:2a:6a:ec:a5:e8:5f:ae:b0:df:60 -- Channels: 1 (Expires: 2030-07-26) (OK)

こんな感じで最後に(OK)と表示されていれば、正常に動いています。

あとはsip.confの中で、iPhoneの内線に割り当てられている部分に、
disallow=all
allow=g729
allow=g722
allow=gsm
allow=ulaw
allow=alaw

という設定を書きます。
いろいろ試してみましたが、Asterisk側では使うと思われるCodecを全て書いておき、アクセスするIP電話側で使うプロトコルを一つに絞った方が良いような気がします。両方で複数書いた場合、どうも実装によって並び順が優先順位だったり、そうでなかったりするので、トラブルが出たときに切り分けがややこしくなります。

個人的にはVoIP over 3GではG.729aを使い、LAN接続のように帯域に余裕があるときはG.722がお勧めです。音質の違いがはっきり体感できます。

■ちょっと長くなりましたが、手順に沿って作業を行えばさほど時間はかかりません。
 問題はバックグランドで待ち受けするので、電池の消耗です。
※簡単にテストしてみたところ、8時間待ち受け後の電池残量は68%でした。
※しばらく実地でテストしてみて、また報告してみます。
iPhoneがiOS4となりマルチタスク対応になってしばらくたちますが、やっとソフトフォン(sipフォン)でバックグラウンド待ち受けが出来るようになりました。これで、IP電話の内線延長が実用段階に入ったと言って良いと思います。

この機能を実現するには、大きく2つの作業が必要です。
・ソフトフォンをバックグラウンド待ち受けする為の設定(ソフトフォンとIP-PBX)
・3G接続時(無線LAN環境以外)における通話品質の確保


まずは、1の設定について書いてみます。
【環境】
・IP-PBX	asterisk 1.6.2.6-1, Debian GNU 6.0 squeeze
・ソフトフォン Acrobits Softphone Version 4.1
・iPhone iPhone 3GS, iOS4.0.1

1. iPhoneの設定
1-1.Incoming Callsの設定はpushは使わず、単にOnにする。
1-2.setting -> PreferencesのKeep iPhone awakeをAlwaysにセットする。
1-3.Accounts設定のAdvanced settingにあるTransport ProtocolをUDPからTCPへ変更する。
※詳しくはこの辺を読んでみてください。

2.IP-PBX:asteriskの設定
2-1.sipの待ち受けポートである5060番は基本UDPですが、TCPでもリッスンするようにsip.confのgeneralに以下の2行を追加する。
tcpenable=yes
tcpbindaddr=0.0.0.0

※追加したら、asterisk -r でCLIを呼び出し、sip reload後にnetstat -napで5060/TCPをリッスンしているかどうか確認して下さい。
※tcpenableはasterisk 1.4では使えません。もしlennyで行うなら1.6のソースからビルドするか、私のようにsqueezeへ上げてしまえば標準パッケージで1.6を選択出来るようになります。

1.4から1.6へ変更した場合、sip.confがシンタックスでひっかかります。
insecure=very は1.6では使えませんので、insecure=invite,port へ変更して下さい。
また、ルータ等でインバウンドの5060/UDPを内部にあるasteriskサーバへトンネリングしている場合、忘れずにTCPも通しておいて下さい。

【参考】YAMAHA系ルータの場合(xxxはasteriskサーバ)
nat descriptor type 1 masquerade
nat descriptor masquerade static 1 1 192.168.0.xxx udp 5060
nat descriptor masquerade static 1 2 192.168.0.xxx tcp 5060
nat descriptor masquerade static 1 3 192.168.0.xxx udp 10000-20000

■以上の設定変更で、iPhone上のソフトフォンがバックグラウンド待ち受けが出来るようになります。
asteriskの再起動と、iPhoneは一度電源を切ってコールドスタートしてから動作確認を行って下さい。

■3G回線を使ったときの音質改善についてはページを改めます。