こんにちは。インフラエンジニアのTYです。普段はAWS,GCPなどのクラウドを扱ったサービスの検証・開発を行っています。

実は以前「Asterisk入門~SIPフォンで通話してみる~」というブログを書かせていただきました。今回はAsteriskの別の機能についてお話ししたいと思います。

1. 概要

AsteriskはオープンソースのPBXです。PBXとは”Private Branch Exchange”の略で日本では”電話交換機”と訳すのが一般的です。1つの親番号に着信した通話をコールセンターやオフィス内線の様に適切な端末に振り分けます。

そんなPBXであるAsteriskですが、PSTNやSIPでの通話もちろんWebRTCでの通話も可能です。

Asteriskの情報は思っているよりも少なく、自分で構築した際にはWebRTCで通話できるようにするだけでも少し苦労しました。本記事では、私自身の備忘録もかねてAsteriskでWebRTC通話ができるようにしてみたいと思います。

2. 構築

AWS EC2インスタンスにUbuntuをセットアップし、そこにAsterisk,WebRTC通話で利用するブラウザアプリをインストールして構築していきます。

2.1 EC2

EC2インスタンスにUbuntuをセットアップし起動します。インスタンスタイプは小さいもので問題ないです。

2.1.1 セキュリティグループ

セキュリティグループは以下のようにします。

セキュリティグループ

※アクセスするIPが制限できる場合は制限しましょう。

2.2 Asterisk導入

2.2.1 Asteriskインストール

EC2にsshでログインし、Asteriskを導入します。
まずはシステムが更新されているか確認してください。

shell-session
$ sudo apt-get update

Asteriskをインストールします。

shell-session
$ cd ~
$ wget <http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz>
$ tar -xvf asterisk-18[tab]
$ cd asterisk-18.[tab]
$ sudo su
# contrib/scripts/install_prereq install
# ./configure --with-pjproject-bundled
# make menuselect
# make && make install && make config
# exit
$ cd ~

次にAsteriskの設定ファイルをインストールします。

shell-session
$ git clone <https://github.com/InnovateAsterisk/S2E2.git>
$ sudo cp ~/S2E2/config/* /etc/asterisk

2.2.2 Asterisk設定(http.conf)

AsteriskでWebRTC通話を行うにはAsteriskのhttpサーバー機能を有効化します。
/etc/asterisk/http.confを以下の様に変更します。

shell-session
$ sudo vim /etc/asterisk/http.conf

[general]
enabled=yes ; HTTP 
bindaddr=127.0.0.1 
bindport=8080 
tlsenable=no ; HTTPS 
enablestatic=no 

Asteriskを再起動します。

shell-session
$ sudo service asterisk restart

2.3 apacheインストールと構成

WebRTC通話で利用するブラウザアプリを用意します。今回はブラウザアプリもAsteriskと同じサーバーに配置します。

まずはapacheをインストールし設定します。

shell-session
$ cd ~
$ sudo su -
# apt-get install apache2
# a2enmod ssl
# a2enmod proxy
# a2enmod proxy_http
# a2enmod proxy_wstunnel

必要なポートを開放します。

shell-session
# vim /etc/apache2/ports.conf

Listen 0.0.0.0:80
Listen 0.0.0.0:443
Listen 0.0.0.0:4443

Webアプリで利用する設定を行います。この時にDNSサーバーにAsteriskサーバーのIPアドレス指すエントリファイルを作成する必要があります。DNSサーバーは何でもいいですが、AWSだとroute53を利用できます。

shell-session
# vim /etc/apache2/sites-enabled/000-default.conf 

<VirtualHost 0.0.0.0:80>
        ServerName <Asteriskサーバーのドメイン>
        DocumentRoot /var/www/html
</VirtualHost>

apacheを再起動します。

shell-session
# service apache2 restart

snapとcertbotをインストールし、証明書を発行します。

shell-session
# snap install --classic certbot
# ln -s /snap/bin/certbot /usr/bin/certbot
# certbot --apache

certbotが完了すると、新しい設定ファイルが作成されるので、それを開いてws/ホストを追加します。

shell-session
# vim /etc/apache2/sites-enabled/000-default-le-ssl.conf 

<VirtualHost 0.0.0.0:4443>
        ServerName __copy_from_above__
        DocumentRoot /var/www/html

        SSLCertificateFile __copy_from_above__
        SSLCertificateKeyFile __copy_from_above__
        Include /etc/letsencrypt/options-ssl-apache.conf

        ProxyRequests off
        ProxyPreserveHost On
        ProxyPass /ws ws://127.0.0.1:8080/ws
        ProxyPassReverse /ws ws://127.0.0.1:8080/ws
</VirtualHost>

apacheの設定はこれでOKなのでapacheを再起動し、設定を反映します。

shell-session
# service apache2 restart
# exit
$ cd ~

2.4 ブラウザアプリインストール

WebRTC通話で利用するブラウザアプリをインストールし、ドキュメントルートに配置します。

shell-session
$ git clone <https://github.com/InnovateAsterisk/Browser-Phone.git>
$ sudo cp -r Browser-Phone/Phone/* /var/www/html/

2.5 Asteriskユーザー設定(pjsip.conf/extensions.conf)

ここまでで利用するWebRTCアプリの設定が完了しました。最後にAsteriskサーバーの設定を行います。

まずはpjsip.confでWebRTCで利用するユーザーを作成します。/etc/asterisk/pjsip.confを編集します。githubから設定ファイルをインストールしているためそこに以下を追記します。
このconfファイルでAsteriskで使用するユーザーを定義します。

※パスワードはお好きな文字列に変更してください。

shell-session
$ sudo vim /etc/asterisk/pjsip.conf

; == Users

[User1](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="One Hundred" <100>
auth=User1
aors=User1
[User1](single_aor)
type=aor
mailboxes=User1@default
[User1](userpass_auth)
type=auth
username=User1
password=1234

[User2](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="Two Hundred" <200>
auth=User2
aors=User2
[User2](single_aor)
type=aor
[User2](userpass_auth)
type=auth
username=User2
password=1234

[User3](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="Three Hundred" <300>
auth=User3
aors=User3
[User3](single_aor)
type=aor
[User3](userpass_auth)
type=auth
username=User3
password=1234

次に/etc/asterisk/extensions.confを編集します。こちらもgithubからインストールしているため以下を追記してください。

このconfファイルでダイヤル番号とユーザー紐づけます。

shell-session
$ sudo vim /etc/asterisk/extensions.conf

[subscriptions]
exten => 100,hint,PJSIP/User1
exten => 200,hint,PJSIP/User2
exten => 300,hint,PJSIP/User3

[from-extensions]
exten => 100,1,Dial(PJSIP/User1,30)
exten => 200,1,Dial(PJSIP/User2,30)
exten => 300,1,Dial(PJSIP/User3,30)

exten => _[*0-9].,1,NoOp(Music On Hold)
exten => _[*0-9].,n,Ringing()
exten => _[*0-9].,n,Wait(2)
exten => _[*0-9].,n,Answer()
exten => _[*0-9].,n,Wait(1)
exten => _[*0-9].,n,MusicOnHold()

exten => e,1,Hangup()

ここまでで設定出来たらAsteriskを再起動します。

shell-session
$ sudo service asterisk restart

ここまででAsteriskサーバーおよびWebRTCアプリの構築は完了です。実際に動作を確認してみましょう。

3.動作確認

動作確認のためWebRTCアプリに接続します。Chromeで以下のURLにアクセスします。

shell-session
https://<Asteriskサーバーのドメイン>

アクセスすると以下のようなサイトが表示されます。

WebRTCアプリ

アカウントをクリックし、Asteriskサーバーに登録します。赤枠内にはAsteriskサーバーのドメインを入力します。パスワードにはpjsip.confで設定した値を入力します。

Asterisk登録
Asterisk登録2

そのほかはデフォルトのままで保存します。

シークレットウィンドウや別ブラウザなどでもう一つWebRTCアプリを表示し、そちらは別のアカウントで登録します。本記事の内容だとUser2 or User3があるはずです。

アカウントが2つ登録出来たらどちらかのアカウントから発信してみましょう。右上の電話マークをクリックし発信先にダイヤルします。ダイヤル番号はUser1なら100、User2なら200といったようになっています。このダイヤル先の設定はextensions.confで行っています。

WebRTCダイヤル

うまく設定できていればブラウザ同士で通話ができるはずです!

4.さいごに

今回はオープンソースのPBXであるAsteriskをWebRTCの通話ができるように構築しました。音声のみの通話だけでなくビデオ通話も可能になっています。また、AsteriskはPBXであるため、通話の転送や着信をキューに入れて待機させておくことも可能です。

本記事でインストールしたWebRTCアプリには”SIPJS”というライブラリが使用されています。これはjavascriptでAsteriskを利用できるようにするためのライブラリでこのライブラリを利用すれば自作のWebRTアプリでAsteriskを利用することも可能です。私はまだそこまでチャレンジできていませんがそのあたりにもチャレンジしていきたいと思います。

ありがとうございました。

SHARE

  • facebook
  • twitter

SQRIPTER

AGEST Engineers

AGEST

記事一覧

AGESTのエンジニアが情報発信してます!
AGESTのサービスやソリューションのお問い合わせページはこちらです。

株式会社AGEST

Sqriptsはシステム開発における品質(Quality)を中心に、エンジニアが”理解しやすい”Scriptに変換して情報発信するメディアです

  • 新規登録/ログイン
  • 株式会社AGEST