Grandstream HT813を使ってアナログ電話回線をAsteriskに収容する方法を解説します。
HT813はFXOとFXSをそれぞれ1個搭載しています。このFXOを使ってアナログ電話1回線をAsteriskに収容します。
機器の構成
HT813を選ぶ理由
DIYでPSTNをVoIPに変換しようとする場合に必要になるのがFXOを搭載した装置ですが、安価に手に入るものがありません。
現時点でアナログ回線の場合に選択できるのは以下の二つです。
- アイコム VE-AG1
- Grandstream HT813
VE-AG1はロングテールで信頼できる ATA(Analog Telephone Adapter)ですがDIY用途では高価であるのと、当方の試みにおいてファックス受信と併用することができませんでした。
一方、HT813は1万円前後で入手可能で、FXOに加えてFXSも備えており、ルーターとしても使えるイジリ倒して楽しいデバイスです。
加えてGrandstreamのSIP電話機を使うならHT813がなじみやすいといえます。
HT813の特徴
VE-AG1に対してHT813でハマるポイントは、HT813は「2 Stage Dialing」が基本というところだと思います。
HT813は癖があるデバイスと感じられるのは「1 Stage Dialing」にも設定できるように見えて「2 Stage Dialing」を完全に離れてくれないところです。
「2 Stage Dialing」ではFXOへの着信を直ちにピックアップして次の指示を待ちます。
内線番号が入力されるとHT813はその内線番号をAsteriskあてに発呼します。
「2 Stage Dialing」では不特定の着信を扱う一般的な用途では使えません。
1 Stage Dialing に設定する
「1 Stage Dialing」の設定は以下の通りです。
「FXO PORT」の「Stage Method (1/2):」を「1」に設定します。
「FXO PORT」の「Wait for Dial-Tone:」をNoに設定します。
「BASIC SETTINGS」の「Unconditional Call Forward to VOIP:」にFXO着信をどこに投げるのかを設定します。
HT813の不具合?
以上のような設定をすると、FXOへのPSTN着信をAsteriskに投げてくれますが、なぜか「Caller ID Scheme:」を「NTT Japan」に設定すると2~3コールしたあと「回線切断」します。
「NTT Japan」に設定しないとナンバーディスプレイが使えなくなりますのでもどかしいところです。
「Bellcore/Telcordia」であれば切断されることはありませんが日本ではナンバーディスプレイが使えません。
日本で端末認証されているにもかかわらずこのような不具合があるのは「故意」?
固定電話における0ABJ番号は、その番号が割り当てられている地域でのみ使用できるという規則があるので、これをVoIPにのせて飛ばすことは推奨されないということでしょう。
不具合の回避とファックス受信
HT813が2~3コールで回線を切断するのであれば、Asterisk側でHT813からの着呼に即座にAnswer()することで回線切断を回避することができます。
ファックス受信を検出するためにはAnswer()する必要があるので、ファックス受信を併用する場合にはこれは不都合ではなくなります。
ただしAnswer()すると発信者の課金が始まります。
ファックス受信が不要であれば VE-AG1 の方がしっくりくるかもしれません。
VE-AG1はSIPサーバーなのでAsteriskの設定はHT813とは全く異なるのでご注意ください。
HT813を「おうち」ATAとして使うためのその他の設定
DefaultではHT813のFXO回線切断をAsteriskに通知できないので、外線着信が切れた後もAsteriskにぶら下がっている電話が鳴り続けます。
つまり外線がワン切りしてもタイムアウトするまで電話が鳴動を続けます。
これを回避するために下記のように設定します。
「FXO PORT」「Disconnect Tone Detection:」 No -> Yes
ファックスは、当方の環境ではT.38を使っていないのでスルーしています。
「FXO PORT」「Fax Mode:」 Pass-Through
ナンバーディスプレイ検出のための遅延はなるべく短く設定します。
「Caller ID Scheme: NTT Japan」の設定ではナンバーディスプレイにFSKを使うはずです。
「FSK Caller ID」は、1回目のコールと2回目のコールの間に送信されます。
であれば「Number of Rings:」を「2」に設定するのが合理的です。
「FXO PORT」「Number of Rings:」 2
それ以外に次のような設定で意図した動作ができています。
[BASIC SETTINGS]
[ADVANCED SETTINGS]
[FXO PORT]
Asteriskの設定
Asteriskの「pjsip.conf」「extensions.conf」は以下のようになります。
Asteriskに必要なアプリやモジュールを有効にしたコンパイル、その他の設定もされていることが前提です。
pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
;;; fax out no fax_detect ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[faxout-7973422]
type=endpoint
;context=pstnincomming
context=internal
disallow=all
allow=ulaw
auth=7973422
aors=7973422
;language = ja
direct_media = no
fax_detect = no
;;; HT813 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[7973422]
type=endpoint
;context=pstnincomming
context=internal
disallow=all
allow=ulaw
auth=7973422
aors=7973422
language = ja
direct_media = no
fax_detect = yes
[7973422]
type=auth
auth_type=userpass
password=********
username=7973422
[7973422]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
[ht813-identify]
type=identify
endpoint=7973422
match=192.168.11.22
[ht813-faxout-identify]
type=identify
endpoint=faxout-7973422
match=192.168.11.22
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; 201 ;;;;;;;;;;
[201]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=201
aors=201
language = ja
direct_media = no
;fax_detect = yes
[201]
type=auth
auth_type=userpass
password=********
username=201
[201]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
;;;;;;;;;; 202 ;;;;;;;;;;
[202]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=202
aors=202
language = ja
direct_media = no
;fax_detect = yes
[202]
type=auth
auth_type=userpass
password=********
username=202
[202]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
;;;;;;;;;; 203 ;;;;;;;;;;
[203]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=203
aors=203
language = ja
direct_media = no
;fax_detect = yes
[203]
type=auth
auth_type=userpass
password=********
username=203
[203]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
;;;;;;;;;; 204 ;;;;;;;;;;
[204]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=204
aors=204
language = ja
direct_media = no
;fax_detect = yes
[204]
type=auth
auth_type=userpass
password=********
username=204
[204]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
;;;;;;;;;; 205 ;;;;;;;;;;
[205]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=205
aors=205
language = ja
direct_media = no
;fax_detect = yes
[205]
type=auth
auth_type=userpass
password=********
username=205
[205]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
;;;;;;;;;; 206 ;;;;;;;;;;
[206]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=206
aors=206
language = ja
direct_media = no
;fax_detect = yes
[206]
type=auth
auth_type=userpass
password=********
username=206
[206]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
;;;;;;;;;; 209 ;;;;;;;;;;
[209]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=209
aors=209
language = ja
direct_media = no
;fax_detect = yes
[209]
type=auth
auth_type=userpass
password=********
username=209
[209]
type=aor
max_contacts=1
qualify_frequency=60
remove_existing=yes
extensions.conf
[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
CALLERNUM=0447973422
CALLEENUM=200
PHONEALL=PJSIP/201&PJSIP/202&PJSIP/203&PJSIP/204&PJSIP/205&PJSIP/206
[internal]
exten => _[01].,1,NoOp(PJSIP_DTMF_MODE ${PJSIP_DTMF_MODE()})
same => n,NoOp(CALLERID(num)BEFORE: ${CALLERID(num)})
same => n,Set(CALLERID(num)=${CALLERNUM})
same => n,NoOp(CALLERID(num)AFTER: ${CALLERID(num)})
same => n,NoOp(From: ${PJSIP_HEADER(read,From)})
same => n,NoOp(To: ${PJSIP_HEADER(read,To)})
same => n,NoOp(Call-ID: ${PJSIP_HEADER(read,Call-ID)})
same => n,Dial(PJSIP/${EXTEN}@7973422)
exten => _2XZ,1,Dial(PJSIP/${EXTEN},,tT)
;[pstnincomming]
exten => 200,1,NoOp(PJSIP_DTMF_MODE ${PJSIP_DTMF_MODE()})
same => n,NoOp(From: ${PJSIP_HEADER(read,From)})
same => n,NoOp(To: ${PJSIP_HEADER(read,To)})
same => n,NoOp(Call-ID: ${PJSIP_HEADER(read,Call-ID)})
same => n,Answer()
same => n,Wait(2)
same => n,Dial(${PHONEALL},150,tT)
exten => fax,1,NoOp(Receiving Fax)
same => n,Set(FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})-${UNIQUEID}
same => n,ReceiveFax(/srv/FAX/FAXIN/${FILENAME}.tiff,d)
same => n,NoOp(FAXOPT(ecm): ${FAXOPT(ecm)})
same => n,NoOp(FAXOPT(filename): ${FAXOPT(filename)})
; same => n,NoOp(FAXOPT(headerinfo): ${FAXOPT(headerinfo)}) ; FaxSend only
; same => n,NoOp(FAXOPT(localstationid): ${FAXOPT(localstationid)}) ; FaxSend only
same => n,NoOp(FAXOPT(maxrate): ${FAXOPT(maxrate)})
same => n,NoOp(FAXOPT(minrate): ${FAXOPT(minrate)})
same => n,NoOp(FAXOPT(rate): ${FAXOPT(rate)})
same => n,NoOp(FAXOPT(remotestationid): ${FAXOPT(remotestationid)})
same => n,NoOp(FAXOPT(resolution): ${FAXOPT(resolution)})
same => n,NoOp(FAXOPT(statusstr): ${FAXOPT(statusstr)})
same => n,NoOp(FaxStatus: ${FAXOPT(status)})
same => n,NoOp(FaxError: ${FAXOPT(error)})
same => n,NoOp(FaxPages: ${FAXOPT(pages)})
same => n,Hangup()
exten => faxsend,1,NoOp(**** SENDING FAX ****)
same => n,Set(FAXOPT(headerinfo)=Tokyo Security Systems)
same => n,Set(FAXOPT(localstationid)=${CALLERNUM})
same => n,NoOp(FAXOPT(headerinfo): ${FAXOPT(headerinfo)}) ; FaxSend only
same => n,NoOp(FAXOPT(localstationid): ${FAXOPT(localstationid)}) ; FaxSend only
same => n,SendFAX(${FAXFILE},df)
; same => n,Wait(30)
same => n,Hangup()
まとめ
PSTNがVoIPに置き換わっている現在、NTTのひかり電話のようにVoIP回線を直収できれば安価で自由な音声のルーティングができるのですが、個人契約の回線ではアナログジャックで通話を受けるしかない場合が多いです。
これをVoIPに収容するためには再度アナログ音声をVoIPに変換する必要があります。
ところが現在は使える Voip ATA がありません。
DIYでは「HT813」がほぼ唯一の選択肢といえるでしょう。
にもかかわらずHT813にはバグが仕込まれています。
ではあるけれどこの陰謀にまさるイジリ甲斐がHT813にはあります。
テスト環境
*CLI> core show version
Asterisk 20.9.3 built by root @ DietPi on a aarch64 running Linux on 2024-09-26 07:19:44 UTC