内線電話 + 050plus 作業メモ

Googleと、いろいろでてくるので、今更感がありありですが、せっかく立てたので、作業メモを残します。

#目的

- 050電話の外線番号を、複数のスマホで待ち受けできること
- 着信を受けたスマホから、ほかのスマホへ転送できること
- どのスマホからでも、050電話から発信できること
- スマホ同士で、内線通話ができること

複数のスマホで待ち受けするなら、050plusソフトを複数インストールすればいいのですが、自分宛ではないものをピックした場合、正しい宛先へ転送したいので、ひと工夫することにしました。

ここの例は、[16.3.0](https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-16.3.0.tar.gz)を使っています。

#asteriskそのもののセットアップ

見栄え上、以下の順序で記載していますが、本当は以下の順番でビルドを進める。

- bcg729
- asterisk本体
- asterisk-g72x

g72xをビルドする際、asterisk本体が必要。また、asterisk本体をビルドする際は、bcg729があったほうがよいため。

##asterisk本体のインストール

本家からgit cloneした後、以下の手順

```
$ git clone -b 16.3 https://github.com/asterisk/asterisk.git
$ ./configure --with-jansson-bundled
$ make
$ sudo make install
```

apt-getでも入りますが、後述の通り、g729を入れるためには、asteriskのヘッダファイルが必要なので、どのみちビルドすることになります。

### ビルドツールが必要な場合

まっさらな環境ですと、以下のパッケージたちが必要

```
$ sudo apt-get install git curl wget libnewt-dev libssl-dev libncurses5-dev subversion  libsqlite3-dev build-essential libjansson-dev libxml2-dev  uuid-dev libedit-dev libtool autoconf
```

##その他ツールのインストール
コーデックg729がないと、050plusでは通話できないので、g729をインストールします。

###bcg729

```
$ wget http://download-mirror.savannah.gnu.org/releases/linphone/plugins/sources/bcg729-1.0.2.tar.gz
$ tar zxvf bcg729-1.0.2.tar.gz 
$ cd bcg729-1.0.2/
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
$ sudo ldconfig -p | grep 729
```

###asterisk-g72x

```
$ wget http://asterisk.hosting.lv/src/asterisk-g72x-1.4.3.tar.bz2
$ bunzip2 asterisk-g72x-1.4.3.tar.bz2 
$ tar vxf asterisk-g72x-1.4.3.tar 
$ cd asterisk-g72x-1.4.3
$ ./autogen.sh 
$ ./configure --with-bcg729 --with-asterisk-includes=/home/debian/src/asterisk/include
$ make
$ sudo make install
```



##確認

**core show codecs**コマンドで確認できます。

```
*CLI> core show codecs
Disclaimer: this command is for informational purposes only.
        It does not indicate anything about your configuration.
      ID TYPE  NAME         FORMAT           DESCRIPTION
------------------------------------------------------------------------------------------------
(snip)
      20 audio g729         g729             (G.729A)
(snip)
```

#asterisk運用に関するセットアップ

## 050plusのアクセス情報入手

執筆時(2020年1月)では、googleに落ちている情報は、古いものが多くなっておりました。
情報を調べるwebサイトがありましたので、そちらを利用して入手します。ブラウザからアクセスして、**ソースコードを見る**で、必要な情報が出てきます。

##証明書の作成

```
$ sudo mkdir /etc/asterisk/keys
$ sudo ast_tls_cert -d /etc/asterisk/keys
```

途中、パスフレーズが聞かれるので、適当に入力。4文字以上だそうです。

##Confファイルの設定

### sip.conf

```
[general]
context=default
maxexpirey=3600
defaultexpirey=3600
bindaddr=0.0.0.0
bindport=5060
localnet=192.168.0.0/24
nat=force_rport,comedia
srvlookup=yes
disallow=all
allow=ulaw
allow=alaw
allow=g729  ;<== 050plusに必要。ただし、g729だけだと、VoIPクライアントの制約を受けるので、ulawほかも生かしておく
allow=gsm
language=ja

tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/keys/asterisk.pem   ; <==ast_tls_certで作成したものを指定する
tlscafile=/etc/asterisk/keys/ca.crt           ; なにもしなければ、デフォルトでOK
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
register => tls://xxxxxxxx:xxxxxxxx:xxxxxxxx@kar2-f2fcp.050plus.com:443/1

[050plus]   ; <==extensions.confのDialで"@050plus"としている由来
type=friend
defaultuser=xxxxxxxx
secret=xxxxxxxx
fromuser=xxxxxxxx
host=kar2-f2fcp.050plus.com
port=443
fromdomain=050plus.com
context=default
insecure=invite,port
dtmfmode=inband
canreinvite=no
callgroup=1
transport=tls
encryption=yes

[10]
type=friend
username=10
secret=password
canreinvite=no
host=dynamic
dtmfmode=rfc2833
callgroup=1
pickupgroup=1
mailbox=10

[11]
type=friend
username=11
secret=password
canreinvite=no
host=dynamic
dtmfmode=rfc2833
callgroup=1
pickupgroup=1
mailbox=11

[12]
type=friend
username=12
secret=password
canreinvite=no
host=dynamic
dtmfmode=rfc2833
callgroup=1
pickupgroup=1
mailbox=12
```


### extensions.conf

```
[globals]
usevoicemail=yes
writeprotect=yes
priorityjumping=no
OCNNUMBER=050AAABBBB

[default]
exten => 1,1,Dial(SIP/10&SIP/11&SIP/12,120,rt)
exten => 1,2,Hangup()

exten => 10,1,Dial(SIP/10,120,rtT)
exten => 10,2,Hangup()
exten => 10,102,Busy()

exten => 11,1,Dial(SIP/11,120,rtT)
exten => 11,2,Hangup()
exten => 11,102,Busy()

exten => 12,1,Dial(SIP/12,120,rtT)
exten => 12,2,Hangup()
exten => 12,102,Busy()

exten => _0.,1,Set(CALLERID(num)=${OCNNUMBER})
exten => _0.,2,Set(CALLERID(name)=${OCNNUMBER})
exten => _0.,3,Dial(SIP/${EXTEN}@050plus,180,rT)
exten => _0.,4,Congestion
```

r:着信音を鳴らす
t:呼び出し元ユーザに、転送操作を許可する
T:呼び出し先ユーザに、転送操作を許可する
_0: 0からスタートする呼び出しがトレースするコマンド群


### features.conf

転送関係、あるいはダイアル操作を司る設定を行います。こだわりがなければ、デフォルトの設定でも、行けそう。
いくつかの操作は、Dialコマンドのオプション指定が必要です。

|キーアサイン   |コマンド|動作                                          |注意事項|
|:------------|:-------|:--------------------------------------------|:-----------------------|
|*2           |atxfer      |保留にしたうえで、転送先と会話する。転送先が切ると転送される|"Tもしくはt"が"DialもしくはQueue"に設定されていること|
|#            |blindxfer   |問答無用で転送 (転送後、転送元は勝手に切れる)             |"Tもしくはt"が"DialもしくはQueue"に設定されていること|
|*8            |pickupexten|ほかの内線が鳴っているのを取る|なし|
|*(アスタリスク)|disconnect  |Disconnect        |"Hもしくはh"が"DialもしくはQueue"に設定されていること|


#運用

asteriskのビルドの最後に、以下のコマンドを入力すると、サービスとして登録されます。

```
$ sudo make config
```

Android/iPhone/iPadなどに、Zoiperをいれて使っています。(複数のサーバを設定しない限り、無料版で十分です)
3台あれば、内線転送の試験までできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/c852ef0e-5754-2535-bbda-3e0727333326.png)


## 接続確認

**sip show peers**で確認することが可能。一番上に050plusが登録されていて、11番にスマホが登録されていることが見える。10番はつないでいないので、未登録(Unspecified)で見えている。

```
CLI> sip show peers
Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                      
050plus/XXXXXXXX          XXX.XX.XXX.XX                               Yes        Yes            443      Unmonitored                                  
10/10                     (Unspecified)                            D  Yes        Yes            0        Unmonitored                                  
11/11                     192.168.0.XXX                            D  Yes        Yes            4XXX7    Unmonitored
```

#最後に

外部環境を利用したお試しコール、通話確認まですると、課金されるので注意が必要です。


#おまけ

ついでに、ひかり電話も収容しました。

##変更点

###NTTルータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/9f73d383-41e2-9a40-2bc2-3fc88023d04b.png)

トップページ ＞ 電話設定 ＞ 内線設定 と進んで、IPhoneとなっているところの1つを利用します。
ユーザIDとパスワードは、sip.confで使うことを意識して設定します。

###asteriskの設定

####sip.conf

```
;for HikariD
register => 3:0003:0003@192.168.x.x/3
(snip)
[HikariD]
context=default
type=friend
username=0003
secret=0003
fromuser=3
host=192.168.x.x
fromdomain=192.168.x.x
insecure=invite,port
dtmfmode=inband
canreinvite=no
callgroup=1
```

####extensions.conf

```
(末尾に)
exten => _9.,1,Set(CALLERID(num)=${NTTNUMBER})
exten => _9.,2,Set(CALLERID(name)=${NTTNUMBER})
exten => _9.,3,Dial(SIP/${EXTEN:1}@HikariD,180,rT)
exten => _9.,4,Congestion
```

"EXTEN:1"の":1"をつけると、9発信の"9"を取ってくれる。上述の050回線の発信は、"EXTEN"なので、0発信だけど、"00..."と0を2回入れる必要はない。


[おしまい]