令和3年度最新版 asterisk で電話であそぶ(その1)

以前より、自宅の電話はひかり電話を使っています。 これ、IP電話なので、普通にスマホと接続したり転送したりすることができます。 そのまま使っても別段問題ないのですが、せっかくなので asterisk とつないで遊んでみます。

例によって例のごとく、環境は FreeBSD-12.2 Release 上に、qjail で 専用の jail を作って、そこに環境を構築します。 こうしておけば、バックアップも簡単に取れますし、バージョン上げるのも安心です。 Linux の場合は Docker でも使うといいんじゃないかな?

まずは asterisk 本体のインストール。 最近はパッケージから入れることが多くなりました。 設定ファイル書き換えるのに vim も入れておきます。これはコンソール版だけでいいよね。 そして日本語音源のインストール。これはパッケージがないのでportsから入れます。

# pkg install asterisk18 vim-tiny # cd /usr/ports/japanese/asterisk-sounds/ # make install clean
さっくり。 あとは自動起動するように /et/rc.conf を変更します。
# sysrc asterisk_enable="YES"
あとは設定です。 まずはひかり電話との接続です。 以前は chan_sip をごりごり書いたのですが、最近では pjsip というのが主流になっています。 この辺は asterisk の日本語の情報が集まっている、voip-info.jp に詳しく乗っていますので ありがたく参考にします。 https://www.voip-info.jp/index.php/Asterisk_pjsip https://www.voip-info.jp/index.php/%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1HGW_Pjsip ありがたやありがたや。
# vim pjsip.conf [transport-udp] type = transport protocol = udp bind = 0.0.0.0:5070 local_net = 192.168.0.0/16

[acl] type=acl deny=0.0.0.0/0.0.0.0 permit=192.168.0.0/16

;ひかり電話HGW

[hikari-hgw] type = aor ; sip:内線番号@HGWのIPアドレス contact = sip:3@192.168.100.1 qualify_frequency = 30 authenticate_qualify = no

[hikari-hgw] type = auth auth_type = userpass ;内線のユーザ名(4桁数字) username = 0003 ;内線のパスワード password = <ひかり電話の内線番号3のパスワード>

[hikari-hgw] type = identify endpoint = hikari-hgw ;HGWのIPアドレス match = 192.168.100.1

[hikari-hgw] type = registration transport = transport-udp outbound_auth = hikari-hgw ; sip:HGWのIPアドレス server_uri = sip:192.168.100.1 ; sip:内線番号@HGWのIPアドレス client_uri = sip:3@192.168.100.1 retry_interval = 60

[hikari-hgw] type = endpoint transport = transport-udp context = from-hikari-hgw dtmf_mode = inband disallow = all allow = ulaw direct_media = no send_pai = yes inband_progress = yes ; HGWの内線番号 from_user = 3 ; HGWのIPアドレス from_domain = 192.168.100.1 language = ja outbound_auth = hikari-hgw aors = hikari-hgw

これでつながります。あとは子機の設定とダイヤルプランです。

この辺は好みの問題もあるのですが、うちの運用方針としては子機は IAX2 プロトコルで接続するようにして、基本的にSIPでは つなぎません。Android のクライアントは zoipher 一択です。

# vim iax.conf

[general] bindport=4569 bindaddr=<asterisk の jail に割り振った IPアドレス> iaxcompat=yes language=ja bandwidth=medium disallow=all allow=ulaw allow=gsm allow=speex jitterbuffer=no ;dropcount=2 ;maxjitterbuffer=500 ;maxexcessbuffer=80 ;minexcessbuffer=10 ;jittershrinkrate=1 ;tos=lowdelay ;mailboxdetail=yes calltokenoptional=0.0.0.0/0.0.0.0 minregexpire = 300 maxregexpire = 300

[201] type=friend username=201 secret=<秘密のパスワード> host=dynamic callgroup=1 pickupgroup=1 mailbox=201

[201] 以降のエントリを適当に増やしてあげると、無限に子機をぶら下げられます。まあ逸般の誤家庭ではそんなに台数無いとおもうけど、二桁程度はいっても大丈夫。 そして最後にダイヤルプラン。ここはいろいろ凝りだすときりがないので、まずは最低限の電話を受けて、かけられるとこまで。

# vim extensions.conf [globals] MYNUMBER=03xxxxxxxx ALLMEMBERS=IAX2/201&IAX2/212 ;ALLMEMBERS=IAX2/212

[from-hikari-hgw] exten => s,1, Dial(${ALLMEMBERS},12,Tt) exten => s,n, Hangup

[default] exten => _0.,1,Set(CALLERID(num)=${MYNUMBER}) exten => _0.,n,Set(CALLERID(name)=${MYNUMBER}) exten => _0.,n,Dial(PJSIP/${EXTEN}@hikari-hgw) exten => _0.,n,Hangup

; local IAX2 phone exten => _2XZ, 1, Dial(IAX2/${EXTEN},5, Ttr) exten => _2XZ, n, NoOp(${DIALSTATUS}) exten => _2XZ, n, NoOp(${EXTEN})

これで、ひかり電話でかかってきた電話をうけて、0で始まる番号でかけたら外線にかけて、20x番にかけると個別に呼び出せます。

ひとまずここまでやったら保存して、asterisk を起動します

# service asterisk start # asterisk -vvvvr
これで、asterisk の cui が起動しますので、いろいろ確かめてみましょう
*CLI> pjsip show endpoints

Endpoint: <Endpoint/CID……………………………….> <State…..> <Channels.> I/OAuth: <AuthId/UserName…………………………………………………..> Aor: <Aor……………………………………..> Contact: <Aor/ContactUri……………………..> <Hash….> <RTT(ms)..> Transport: <TransportId……..> <BindAddress………………> Identify: <Identify/Endpoint…………………………………………………> Match: <criteria…………………….> Channel: <ChannelId………………………………..> <State…..> <Time…..> Exten: <DialedExten………..> CLCID: <ConnectedLineCID…….>

Endpoint: hikari-hgw Not in use 0 of inf OutAuth: hikari-hgw/0003 Aor: hikari-hgw 0 Contact: hikari-hgw/sip:3@192.168.100.1 7ae9714816 Avail 1.967 Transport: transport-udp udp 0 0 0.0.0.0:5070 Identify: hikari-hgw/hikari-hgw Match: 192.168.100.1/32

Objects found: 1

*CLI> pjsip show registrations

<Registration/ServerURI…………………………> <Auth……….> <Status…….>

hikari-hgw/sip:192.168.100.1 hikari-hgw Registered

Objects found: 1

ちゃんと、ひかり電話とつながってますね。めでたしめでたし。 同様にして、子機ともつながっているか確認します。
*CLI> iax2 show peers Name/Username Host Mask Port Status Description 201/201 192.168.100.106 (D) (null) 59928 Unmonitored 212/212 192.168.100.209 (D) (null) 57341 Unmonitored 2 iax2 peers [0 online, 0 offline, 2 unmonitored]
おけおけ。ばっちり。 あとは電話をかけたりうけたりを実際にしてみましょう。問題なければひとまずはおっけーです。 これでスマホを自宅で子機にして使うことができるようになりました。 ここでいったん環境を保存しておきましょう。jail の外で作業します。
> sudo qjail stop phone > sudo qjail archive phone > sudo qjail start phone
自動でasterisk が起動して、スマホがつながっていることを確認してください。

とりあえず、動くようになったのでいったんここまで。

タグ: FreeBSD Asterisk Jail ひかり電話