【Asterisk16】centos8 で内線通話まで

# Asterisk16 内線通話まで

## 初めに
[前回](https://qiita.com/SunHarut/items/7b77f96e2eba7d1f2da5)はAsterisk16にインストールまでをまとめましたので今回は内線通話までを纏めたいと思います。
内線の設定はSIPチャンネルドライバとPJSIPチャンネルドライバーが存在しますが、今回は新しい方であるPJSIPドライバの設定について記述します。

## 環境とバージョン
```
os: Linux(centos8)
Asterisk: 16.23.0
```

## ソフトフォン
ソフトフォンとは固定電話や専用機器を使用せず、パソコンなどにインストールしてインターネットを介して通話する電話になります。
有料のものや無料のものがあります。

今回は無料のソフトフォンであるZ[oiper](https://www.zoiper.com/)を使用します。

通話するためには2つの端末にそれぞれインストールしておく必要があります。


# 設定ファイルの確認

```
/etc/asterisk/
```
上記フォルダに一式まとまっています。

- asterisk.conf
- extensions.conf
- pjsip.conf

上記3つのファイルを書き換えるだけで基本的な内線通話が可能です。

### asterisk.conf
主にAsterisk全般の設定を指定します。
例えば設定ファイルのパスなどや、Asteriskを起動するユーザーの指定です。

### extensions.conf
ダイヤルプランの設定を記述します。
ダイヤルプランとは電話の発信時や着信時にどのような動作をするかを定めたものを指します。
今回の内線通話に関してもこちらを設定していくことで内線通話を可能とします。
このダイヤルプランはとても柔軟に様々なことが出来ますので、奥が深いです。

### pjsip.conf
こちらには内線番号自体を記述します。

# 内線番号設定
今回は内線番号を2つ用意して、それぞれが通話できる状態にしたいと思います。

- 内線番号
    - 0001
    - 0002

まずは内線番号の記述ファイルである pjsip.conf を編集していきたいと思います。
中身にサンプル設定が記述されていると思いますが、それは全て削除してください。

```/etc/asterisk/pjsip.conf

; トランスポートの設定
[udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060

; エンドポイントの設定
[0001]
type = endpoint
context = from-internal
dtmf_mode = rfc4733
disallow = all
allow = ulaw
timers = no
direct_media = no
language = ja
auth = 0001
outbound_auth = 0001
aors = 0001

[0002]
type = endpoint
context = from-internal
dtmf_mode = rfc4733
disallow = all
allow = ulaw
timers = no
direct_media = no
language = ja
auth = 0002
outbound_auth = 0002
aors = 0002

; Auth(認証の設定)
[0001]
type = auth
username = 0001
password = 0001

[0002]
type = auth
username = 0002
password = 0002

; Aorの設定
[0001]
type = aor
max_contacts = 1
qualify_frequency = 10

[0002]
type = aor
max_contacts = 1
qualify_frequency = 10
```

上記設定を記述しましたら、保存してAsteriskを再起動します。

```
/etc/init.d/asterisk restart
```

Asterisk cliに接続し、内線設定が反映しているかを確認します。
ポートはUDPの5060を使用しますので、ファイアーウォールなどの設定を確認して、ポートを開けるようにしておいてください。

> asterisk -vvvr

```

Asterisk 16.23.0, Copyright (C) 1999 - 2021, Sangoma Technologies Corporation and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 16.23.0 currently running on localhost (pid = 8347)
```

asteisk cli内でエンドポイントの一覧を表示します。
> *CLI> pjsip show endpoints

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

 Endpoint:  0001                                                 Unavailable   0 of inf
    OutAuth:  0001/0001
     InAuth:  0001/0001
        Aor:  0001                                               1

 Endpoint:  0002                                                 Unavailable   0 of inf
    OutAuth:  0002/0002
     InAuth:  0002/0002
        Aor:  0002
```

エンドポイントが二つ生成されてれば成功です。

## レジストしてみる
レジストとはSIPサーバー（Asterisk）にソフトフォンを登録し、使える状態にすることを言います。
今回は内線番号0001にレジストしてみます。
ここではじめてソフトフォンを使用します。
Zoiperを使用して設定しますが、他のソフトフォンでも基本的に接続できると思います。

>settigs -> Accounts -> SIP -> SIP Credentials
![7fa3c4e34fd1cbca8ad71f36e501d960.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512460/40caa9a7-6f15-00a2-2641-49b03d0d00d4.png)
![d2d3ae2894208975816cd681b0bfaece.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512460/044955fc-37e1-f9e8-8c55-1e5db27adff3.png)


ここで

- Doamin:
- Username:
- Password:

を設定します。 DomainはそのAsterskサーバーのIPアドレスとレジストに使用するポートをコロンを入れて設定してください({IPアドレス}:{ポート番号})。
Usernameは今回は内線番号ですので、そのまま入力してください。
Passwordはpjsip.confで設定したpasswordを設定してください。

```例
Domain: localhost:5060
Username: 0001
Password: 0001
```

設定が終わりましたら右上の Register をクリックしてください。
左のSIP以下にチェックが入れば成功です。
またAsteriskCliにもレジストした旨が表示されます。

```
 -- Added contact 'sip:0001@10.0.2.2:42822;rinstance=e7e5fd4e1106313f' to AOR '0001' with expiration of 60 seconds
  == Endpoint 0001 is now Reachable
    -- Contact 0001/sip:0001@10.0.2.2:42822;rinstance=e7e5fd4e1106313f is now Reachable.  RTT: 12.141 msec
```

同じように0002でレジストをしてください。

# ダイヤルプランの設定
次にダイヤルプランを設定します。
ダイヤルプランは
extensions.confファイルを編集します。
内線設定と同様にサンプルは削除してください。

ダイヤルプランについてはまた別にまとめたいと思います。

```/etc/asterisk/extensions.conf
; コメントはセミコロンで記述できます。

; このセクション単位で記述します。
; このセクションはpjsip.confでcontextで指定した部分が最初に呼ばれます。

[from-internal]
; 0002に架電する
exten => 0002, 1, Dial(PJSIP/0002, 15, r)
exten => 0002, n, HangUp()
```
とりあえず上記だけで設定が完了です。

ダイヤルプランに関しまして詳しくは
以下サイト
http://st-asterisk.com/archives/category/%e3%83%80%e3%82%a4%e3%83%a4%e3%83%ab%e3%83%97%e3%83%a9%e3%83%b3%e5%85%a5%e9%96%80
を参考にしてください。

少し解説しますと、レジストしている端末で 0002をコールすると、 Dial(PJSIP/0002, 15, r)　が発動して 0002に15秒ダイヤルするという動きになります。
例えば逆に0001に架電して0001に着信したい場合は

```/etc/asterisk/extensions.conf
[from-internal]
; 0001に架電する
exten => 0002, 1, Dial(PJSIP/0002, 15, r)
exten => 0002, n, HangUp()
```

のように設定することもできます。
両方記述する場合は同じセクションに書くこともできます。

```/etc/asterisk/extensions.conf
[from-internal]
; 0001に架電する
exten => 0001, 1, Dial(PJSIP/0001, 15, r)
exten => 0001, n, HangUp()

; 0002に架電する
exten => 0002, 1, Dial(PJSIP/0002, 15, r)
exten => 0002, n, HangUp()
```

内線番号が増えてきた場合に変数を使ったり、正規表現を使ったりなども出来ますが、今回はとりあえずこの設定で通話をしたいと思います。

上記記述が終わりましたら、保存してAsteriskをリロードします。
Asterisk cli内で
> reload
を実行してください。

リロード後に
> dialplan show from-internal


を実行し、ダイヤルプランが適応されているか確認できます。

```例
localhost*CLI> dialplan show from-internal
[ Context 'from-internal' created by 'pbx_config' ]
  '0001' =>         1. Dial(PJSIP/0001, 15, r)                    [extensions.conf:3]
                    2. HangUp()                                   [extensions.conf:4]
  '0002' =>         1. Dial(PJSIP/0002, 15, r)                    [extensions.conf:7]
                    2. HangUp()                                   [extensions.conf:8]

-= 2 extensions (4 priorities) in 1 context. =-

```

# 内線通話
いよいよ内線通話を開始します。
使用ポートはUDPの10000-20000です。
この設定は
>/etc/asterisk/rtp.conf

に記述されていますので、変更する事も可能です。

では内線番号0001及び0002がレジストしていることを確認したら、0001のレジストしているソフトフォンで0002をコールしてみてください。

```
localhost*CLI>
    -- Executing [0002@from-internal:1] Dial("PJSIP/0001-00000001", "PJSIP/0002, 15, r") in new stack
    -- Called PJSIP/0002
    -- PJSIP/0002-00000004 is ringig
```
どうでしょうか。 0002の端末が着信したかと思います。
0002側でコールを取るとその二つの端末が通話できる状態になると思います。

以上で内線通話までの設定です。

# 最後に
今回は内線の設定と内線通話のダイヤルプランまでをまとめました。
ダイヤルプランは使い方によってはいろいろな事ができるので、いろいろ触ってみると良いと思います。

またAsteriskにはダイヤルプラン中にPHPやPythonなどのプログラムを動かすことも可能ですので、それもまとめられたらと思います。