VTL-TA02X を Asterisk 配下で使う

一部で投売り状態の VoIP TA : VTL-TA02X を Asterisk と組み合わせて使う方法についてのメモ。

注: 本ページに記載されている方法は、メーカの想定範囲外の使い方になります。自己責任でお願いします。

関連リンク

やりたいこと

  • アナログ回線からの着呼を、Asterisk 配下のIP電話とアナログ電話の両方で着信する
  • IP電話からの着呼を、IP電話とアナログ電話の両方で着信する。
  • アナログ電話からの発信を IP 電話で実施する。
JATE認定が通っている比較的安価な機器で、アナログ回線を Asterisk に収容できる 機器というのは意外と無かったりするので、結構貴重だと思います。 (これ以外のものだと SR-5200VoIP や VE-AG1 くらいしかなさげ)

ただ、IP 電話からの発信をアナログ回線からできるようにもしたいのですが、これは無理な模様。 まあ、私の場合は 050 で発呼するのでこれは不要なのですが。

構成

以下のような構成で組み上げました。

                               Internet
                                 |
 Line                       +----------+
 (NTT)                      |  Router  |
  |                         +----------+
  |                              |
+---------+    Ether        +----------+
|VTL-TA02X|-----------------| Asterisk |
----------+                 +----------+
  |                              |
 FAX                          IP Phones
  |
 TEL

概要は以下の通り。

  • アナログ回線は VTL-TA02X に引き込む。
    • VTL-TA02X は Asterisk に対して Register し UA として動作。
    • アナログ着信は、アナログ端末を鳴動させると共に Asterisk にも Forward。Asterisk 配下の IP 電話も鳴動させる。
  • IP電話は G-LEX Personal を契約、050番号あり。Asterisk から Register して使う。
    • IP電話着信は、IP電話と同時に VTL-TA02X 側のアナログ端末も鳴動させる。
    • IP電話/アナログ端末からの発信は、G-LEX 側から発呼させる。

番号計画

以下のようにしています。
  • 外線発信は 0 プレフィクスを使用。
  • 内線番号は 3XXX を使用
    • 3000 : 代表番号、全端末が鳴動します。
    • 3001 : アナログ電話。VTL-TA02X に割り当てる Extension です。
    • 3002~3005 : IP電話の Extension
    • 3099 : VTL-TA02X からの転送専用の番号
  • G-LEX の番号体系は 2XXXXXX。

VTL-TA02X の設定

最初に VTL-TA02X を設定します。

設定は、http://192.168.192.200:9999 にアクセスして行います。 (ちなみに、Windows Vista でアクセスすると、なぜか上部のメニューが一部隠れてアクセスできません。 この場合は http://192.168.192.200:9999/top.htm を使うと全てアクセスできたりします)

  • Management → Firmware Upgrade
    • FTP Server IP を削除しておきます。こうしないと設定が勝手に上書きされてしまいます。
  • User Setting → Network Setting
    • IPアドレスなどを環境に合わせて設定します
  • User Setting → Call Setting
    • M2X Address に、転送先の Extension を記述します。これは、 アナログ側で着信があったときに、それを Asterisk 側に INVITE するために使います (何も書いてないと転送しません)。ウチの環境では 3099 としました。
      ちなみに、この転送は Asterisk 側から着信した場合も実施してしまうので、このままだとループ状態に陥ります。この対処方法は後述します。
  • Dialing Plan → PSTN
    • ここではアナログ電話のダイヤルプランを設定します。一番下の行を見ると、0発信をした場合は強制的にアナログ発信するようになっていますので、これを削除します。 これで 0 発信が Asterisk 側に送られるようになります。 ちなみに 8888 を付けると強制的にアナログ回線で発呼できるようになっています(下から2行目)。
  • Administrator Setting → SIP Setting
    • ここで SIP の設定を行います。
    • Display Name, Request-URI, Login Name は VTL-TA02X に割り当てた Extension を指定します。ウチの環境では 3001 としました。
    • Password は Asterisk の sip.conf に設定したパスワードを記載します。
    • Register Server, Outbound Proxy には Asterisk の IP アドレス/ポート番号を設定します。
    • Register Port Keep Alive は Enable でもいいのですが、無駄なので Disable にしました。
    • 他はデフォルトのままです。
  • Administrator Setting → Port Setting
    • 使用しているアナログ回線の契約に合わせて、Line Type, Loop Service Type を指定します。この手順は添付のマニュアルに書いてあるはずです
以上で VTL-TA02X 側の設定は終わりです。

Asterisk 側の設定 : extensions.conf

ウチで使っている extension.conf から必要部分だけ抜粋しました。

[general]
static=yes
writeprotect=no
clearglobalvars=no
Set(LANGUAGE()=jp)

[globals]
GLEX=2006xxxx        ; ここは G-LEX の番号にあわせてください
ALL_IP_INT=SIP/3002&SIP/3003&SIP/3004&SIP/3005	; VTL-TA02X除く全端末に着信
ALL_INT=SIP/3001&${ALL_IP_INT}			; 全端末に着信
IGNORE_VOIPTA=0                                 ; ループ防止用の変数

;;;;
;;;; G-LEX 着信
;;;;
[g-lex-in]
exten => _X.,1,Goto(all-int,s,1)

;;;;
;;;; アナログ回線着信、またはアナログ電話からの内線
;;;;   VTL-02X からループで戻ってくる場合があることに注意。GoToIf で loop ブロックする
;;;;
[analog]
; 転送。ループガードする。
exten => 3099,1,GoToIf($[${IGNORE_VOIPTA} = 1]?ignore:proceed)
exten => 3099,n(ignore),Hangup
exten => 3099,n(proceed),Dial(${ALL_IP_INT},60)

; 内線など
exten => _X.,1,Goto(internal,${EXTEN},1)

;;;;
;;;; 内部用のダイヤルプラン
;;;;
[internal]
; 外線発呼(G-LEX経由)
exten => _0.,1,Goto(g-lex-out,${EXTEN},1)

; 外部 IP 電話発呼
exten => _2.,1,Goto(g-lex-out,${EXTEN},1)

; 代表番号。全端末鳴動させる。
exten => 3000,1,Goto(all-int,s,1)

; VOIPTA 宛。ループガードが必要。
exten => 3001,1,Set(IGNORE_VOIPTA=1,g)
exten => 3001,n,Dial(SIP/${EXTEN},60,g)
exten => 3001,n,Set(IGNORE_VOIPTA=0,g)
exten => 3001,n,Hangup

; 内線
exten => _[3-8].,1,Dial(SIP/${EXTEN},60,g)
exten => _[3-8].,2,Hangup

;;;;
;;;; 全端末鳴動
;;;;   VTL-02X のループガードつき
;;;;
[all-int]
exten => s,1,Set(IGNORE_VOIPTA=1,g)
exten => s,n,Dial(${ALL_INT},60,g)
exten => s,n,Set(IGNORE_VOIPTA=0,g)
exten => s,n,Hangup

;;;;
;;;; G-LEX 発呼
;;;;
[g-lex-out]
exten => _X.,1,Set(CALLERID(name)=${GLEX})
exten => _X.,2,Dial(SIP/${EXTEN}@GLEX,180,g)
exten => _X.,3,Hangup

sip.conf のほうも一部抜粋します。

[general]
context=internal
allowoverlap=no
bindport=5060
bindaddr=0.0.0.0
srvlookup=yes
language=jp
maxexpiry=900
defaultexpiry=360

;----------------------------------------- OUTBOUND SIP REGISTRATIONS  ------------------------
; G-Lex (番号、パスワードは各自設定してください)
register => 2006xxxx:password@sip001.g-lex.net/2006xxxx

;----------------------------------------- NAT SUPPORT ------------------------
nat=yes
externip=(NAT外側のIPアドレスを記述)
localnet=192.168.0.0/255.255.0.0

;----------------------------------- MEDIA HANDLING --------------------------------
canreinvite=no

;------------------------------------------------------------------------------
; G-Lex

[GLEX]
type=friend
fromdomain=sip001.g-lex.net
host=sip001.g-lex.net
username=2006xxxx
fromuser=2006xxxx
secret=PASSWORD
insecure=very
context=g-lex-in

;------------------------------------------------------------------------------
; Definitions of locally connected SIP devices

;;; VTL-02X : ANALOG Line ---> analog context!
[3001]
context=analog
type=friend
host=dynamic
username=3001
secret=PASSWORD
mailbox=3001

;;; IP Phones
[3002]
type=friend
host=dynamic
username=3002
secret=PASSWORD
mailbox=3002

....

extension.conf に関しては、3つコンテキストを使います。

  • g-lex-in : G-LEX 側からの発着信に使います。
  • analog : アナログ回線からの着信、およびアナログ電話からの発信用です。
  • internal : 内部 IP 電話用のコンテキストです。
少々ややこしいのは、VTL-TA02X のループ防止のための処理です。 VTL-TA02X の M2X Address に exten を記述した場合、アナログ着信でも SIP 着信でも 必ず VTL-TA02X は指定された exten に対して発呼します。

アナログ回線から着信した場合はこれでいいのですが、問題は IP 電話で着信した場合です。 上記設定では、IP電話着信した場合はアナログ端末を含む全端末に着信させます。 この場合でも VTL-TA02X は呼を Asterisk 側に転送しようとするので、ループが発生します。 具体的には、各 IP 電話端末に対して INVITE が同時に2本来る事になってしまいます。

これを避けるために、IGNORE_VOIPTA というグローバル変数を導入しました。 Asterisk から VTL-TA02X に対して発呼する前にこの変数を 1 にセットし、通話終了したら 0 に戻すようにしておきます (Dial コマンドには 'g' オプションが必要)。

VTL-TA02X から Asterisk に発信があった場合(具体的には 3099 に発信があった場合)、 IGNORE_VOIPTA の値を調べ、この値が 0 ならそのまま全端末を鳴動させますが、1 の場合はループと見なして Hangup するようにして おきます。これでループを防止できます。

制限事項

  • Asterisk 側から VTL-02Xを経由してアナログ回線で発呼することはできません。 これは VTL-02X の仕様のようです。
  • ナンバーディスプレイは残念ながら使えない模様。
  • IP電話で着呼して通話中にアナログ回線側から着呼があった場合、アナログ電話機しか 鳴動しません。これは上記のループガードがかかっているため。もうちょっとスマートな方法が あればいいんですが。