本文章介紹如何在Centos環(huán)境下配置Asterisk,WebRTC和網(wǎng)關(guān),實現(xiàn)通過WebRTC呼叫外部手機號碼,外部電話呼入,WebRTC接聽的功能。同時,內(nèi)部SIP分機和WebRTC之間實現(xiàn)互打撥號。很多用戶可以通過WebRT
實現(xiàn)和企業(yè)內(nèi)部應(yīng)用集成,方便企業(yè)用戶對業(yè)務(wù)方面的支持,同時極大降低了業(yè)務(wù)集成的開發(fā)難度。
實現(xiàn)和企業(yè)內(nèi)部應(yīng)用集成,方便企業(yè)用戶對業(yè)務(wù)方面的支持,同時極大降低了業(yè)務(wù)集成的開發(fā)難度。
測試環(huán)境:
- 系統(tǒng)CentOS-7
- 環(huán)境asterisk-15.7.2
- 客戶端 sipML5網(wǎng)頁端、eyeBeam
- 谷歌瀏覽器
- 內(nèi)網(wǎng)呼叫:SIP,WebRTC在同一內(nèi)網(wǎng)環(huán)境
安裝步驟:
CentOS安裝asterisk依賴包和附加支持包:
yum install -y gcc gcc-c++ lynx bison mysql-devel mysql-server php php-mysql php-pear php-mbstring tftp-server httpd make ncurses-devel libtermcap-devel sendmail sendmail-cf caching-nameserver sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel subversion kernel-devel git subversion kernel-devel php-process crontabs cronie cronie-anacron wget vim php-xml uuid-devel libtool sqlite-devel unixODBC mysql-connector-odbc bzip2 patch libedit-devel
下載環(huán)境包:
cd/usr/local/src //選擇下載路徑
wget //使用wget + 下載鏈接,下載asterisk包

完成后如上圖表示,以下下載圖省略
wget //下載srtp包,WebRTC加密通話需要
wget //asterisk編譯需要
wget //下載opus包,為WebRTC提供高質(zhì)量的通話編碼
注:上述鏈接不確定長久有效,在鏈接失效的情況下,請自行查找下載鏈接。
在下載完成后,你的usr/local/src目錄下應(yīng)該有這幾個壓縮包,接下來就是要解壓縮和編譯。

- //tar -zxvf +壓縮包名,進(jìn)行解壓操作
- tar -zxvf asterisk-15-current.tar.gz
- tar -zxvf jansson-2.11.tar.gz
- tar -zxvf opus-1.3.1.tar.gz
- tar -zxvf v1.5.4.tar.gz
解壓完成后,在文件夾/usr/local/src目錄下應(yīng)該成功的多出了4個文件夾,使用ls查看,大概如下圖所顯示

接下來進(jìn)行編譯步驟,必須先編譯除asterisk以外的包,再對asterisk進(jìn)行編譯
在/usr/local/src目錄下:
- cd libsrtp-1.5.4
- ./configure
- make
- ake install
在/usr/local/src目錄下:
- cd opus-1.3.1
- ./configure
- make
- make install
在/usr/local/src目錄下:
- cd jansson-2.11
- ./configure
- make
- make install
現(xiàn)在已經(jīng)安裝好了Asterisk前置包,接下來進(jìn)行asterisk的安裝
在/usr/local/src目錄下:
- cd asterisk-15.7.3
- ./configure
注意:在編譯過程中,會下載一個。bz2格式包,下載時間可能會比較長,等待時間由網(wǎng)速而定

出現(xiàn)asterisk的星號標(biāo)識,就代表asterisk編譯的第一步成功了,接下來在該目錄下使用
make
make install
make samples
一步一步的進(jìn)行編譯
在編譯完成后通過命令我們就可以啟動asterisk了
asterisk -vvvvvvvvvvvvvvvvgc //v代表等級,v越多顯示信息越多
接下來,我們檢查一下asterisk模塊的加載是否正常,其中最重要的模塊主要有以下幾個,
- res_crypto.so
- res_http_websocket.so
- res_pjsip_transport_websocket.so
- codec_opus.so
在CentOS下使用asterisk -r進(jìn)入asterisk cil頁面,cli頁面下輸入“!”退出

進(jìn)入前

進(jìn)入后
使用module show like + 模塊名 查看模塊

注:筆者在安裝完asterisk發(fā)現(xiàn),oups模塊沒能正常的加載上,發(fā)現(xiàn)是在/usr/lib/asterisk/modules路徑下沒有oups.so的語言格式模塊,于是手動下載codec_opus.so模塊并加載,加載成功的可以省略該步驟。
轉(zhuǎn)到鏈接, http://downloads.digium.com/pub/telephony/codec_opus/ 在這里尋找所對應(yīng)asterisk版本的opus模塊。在本次測試環(huán)境中使用的是codec_opus-15.0_1.3.0-x86_64.tar.gz
cd /usr/local/src/
wget
tar -zxvf codec_opus-15.0_1.3.0-x86_64.tar.gz //解壓
cd codec_opus-15.0_1.3.0-x86_64 //進(jìn)入文件夾
cp codec_opus.so /usr/lib/asterisk/modules
//將codec_opus.so文件復(fù)制到Asterisk模塊目錄中
cp codec_opus_config-en_US.xml /var/lib/asterisk/documentation/thirdparty
//將codec_opus_config-en_US.xml文件復(fù)制到Asterisk外部文檔目錄中
asterisk -r //進(jìn)入asterisk
core restart now //重啟asterisk
asterisk -r
core reload //重新加載模塊
module show like codec_opus.so //查看模塊狀態(tài)

到此,asterisk環(huán)境正常搭建
創(chuàng)建證書:
在測試中,我們在網(wǎng)頁使用的是自簽證書,現(xiàn)在進(jìn)行證書的創(chuàng)建以及http服務(wù)器的搭建。Asterisk 在其 contrib / scripts 源目錄中提供了一個實用腳本ast_tls_cert。我們將使用它為我們的新權(quán)限簽署的Asterisk制作自簽名證書頒發(fā)機構(gòu)和服務(wù)器證書。
mkdir /etc/asterisk/keys //創(chuàng)建證書存放路徑,請記住你的證書路徑!
cd /usr/local/src/asterisk-15.7.3 //進(jìn)入asterisk源目錄
contrib/scripts/ast_tls_cert -C 192.168.1.49 -O hiastar -d /etc/asterisk/keys/
//創(chuàng)建證書 -C 后接asterisk的IP地址 -O后接組織名 -d后接存放路徑。
注意:腳本運行成功時,系統(tǒng)將提示您為CA密鑰設(shè)置密碼,之后系統(tǒng)會要求您重復(fù)輸入相同的密碼短語幾次。出現(xiàn)下圖提示后,證書創(chuàng)建成功

cd /etc/asterisk/keys/
ls //查看證書是否創(chuàng)建,你的文件夾中應(yīng)該有這幾個文件

接下來配置Asterisk的內(nèi)置HTTP守護(hù)進(jìn)程
cd /etc/asterisk/
vim http.conf
//配置文件如下
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/asterisk/keys/asterisk.crt //你的證書路徑
tlsprivatekey=/etc/asterisk/keys/asterisk.key //你的證書路徑
現(xiàn)在我們將asterisk重新啟動,之后查看tls服務(wù)器是否運行
asterisk -vvvvgc
http show status
出現(xiàn)了紅框內(nèi)的提示,則代表tls服務(wù)器正常運行

之后驗證是否能訪問證書頁面:

點擊高級

點擊繼續(xù)前往

到現(xiàn)在,證書的創(chuàng)建,及瀏覽器加載完成
接下來,我們將創(chuàng)建wss的通道以及pjsip.conf的賬號,供sipML5登陸:
現(xiàn)在,我們需要創(chuàng)建一個pjsip的通道,以及PJSIP賬號
注意:“//”及后接內(nèi)容記得刪除
cd /etc/asterisk
vim pjsip.conf
//配置文件如下
[transport-wss]
type=transport
protocol=wss
bind=0.0.0.0
[600]
type=aor
max_contacts=5
remove_existing=yes
[600]
type=auth
auth_type=userpass
username=600 //分機賬號
password=600 //分機密碼
[600]
type=endpoint
aors=600
auth=600
use_avpf=yes
webrtc=yes
media_encryption=dtls
dtls_ca_file=/etc/asterisk/keys/ca.crt
dtls_cert_file=/etc/asterisk/keys/asterisk.pem
dtls_verify=fingerprint
dtls_setup=yes
ice_support=yes //ice功能確保打開
use_avpf=yes
force_avp=yes
media_use_received_transport=yes
rtcp_mux=yes
context=li3 //這邊選擇引用的extension撥號規(guī)則
allow=opus,ulaw
//在官網(wǎng),有對各參數(shù)進(jìn)行詳細(xì)說明,請自行查閱

配置完成圖
sipML5客戶端登陸:

點擊后,進(jìn)入下一個頁面

在配置完成后,點擊專家模式

按圖中所勾選選型,在第一行中輸入wss://asterisk ip地址:8089/ws,完成后點擊save!返回第二個頁面。

點擊login,若出現(xiàn)Connected則代表登陸成功。

登陸成功后,我們檢查后臺信息,若有紅框內(nèi)的內(nèi)容則代表登陸正常。
現(xiàn)在,我們說明登陸異常情況:

當(dāng)出現(xiàn)服務(wù)器不可達(dá)提升時,請檢查你是否添加了自簽證書,以及asterisk是否啟動,未添加自簽證書或者沒啟動asterisk是無法正常登陸的。同時在asterisk中不能看到報錯信息。

當(dāng)出現(xiàn)這個提升時,代表你的密碼輸入錯誤,在asterisk可以看到信息

現(xiàn)在我們以及成功了一大半了,現(xiàn)在我們進(jìn)行sipML5的通訊測試,在測試中我們將再創(chuàng)建一臺sipML5的分機,eyeBame進(jìn)行通訊測試。
cd /etc/asterisk
vim pjsip.conf
//配置文件如下
[601]
type=aor
max_contacts=5
remove_existing=yes
[601]
type=auth
auth_type=userpass
username=601
password=601
[601]
type=endpoint
aors=601
auth=601
use_avpf=yes
webrtc=yes
media_encryption=dtls
dtls_ca_file=/etc/asterisk/keys/ca.crt
dtls_cert_file=/etc/asterisk/keys/asterisk.pem
dtls_verify=fingerprint
dtls_setup=yes
ice_support=yes
use_avpf=yes
force_avp=yes
media_use_received_transport=yes
rtcp_mux=yes
context=li3
allow=opus,ulaw
//sipML5分機創(chuàng)建
軟電話分機創(chuàng)建:
//配置文件如下
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0
[777]
type=endpoint
context=li3
disallow=all
allow=alaw,ulaw
transport=udp-transport
auth=auth777
aors=777
[auth777]
type=auth
auth_type=userpass
password=777
username=777
[777]
type=aor
max_contacts=5

配置文件如圖所示。
現(xiàn)在我們編寫簡單的測試撥號規(guī)則:
cd /etc/asterisk
vim extensions.conf
//配置文件如下
[li3] //請與之前創(chuàng)建分機的contaxt名字保持一致
exten =>600,1,Dial(pjsip/600)
exten =>600,2,hangup()
exten =>601,1,Dial(pjsip/601)
exten =>601,2,hangup()
exten =>777,1,Dial(pjsip/777)
exten =>777,2,hangup()

配置完成后如圖
cd /etc/asterisk
vim rtp.conf
//配置文件如下

現(xiàn)在進(jìn)行通話測試,拓?fù)鋱D如下:

現(xiàn)在注冊eyebeam軟電話

點擊,之后選擇“sip賬號設(shè)定”進(jìn)入以下頁面

下一步配置賬號


現(xiàn)在軟電話注冊成功!可以登錄到asterisk cli下查看上線日志

軟電話上線日志
現(xiàn)在登錄sipML5客戶端

點擊login登錄,出現(xiàn)Connected代表登陸成功,在asterisk cli后臺查看上線日志

現(xiàn)在進(jìn)行sipML5呼叫軟電話的測試

在右邊輸入你要撥打的號碼,點擊call點擊Audio

記得在彈出的選型中,運行你的頁面使用麥克風(fēng)的權(quán)限!!
在右邊的提示中,你的撥號會有三個狀態(tài)的變更

這個狀態(tài)代表在尋找撥號規(guī)則

這個狀態(tài)代表撥號規(guī)則正常,正在振鈴,對端會收到提示

點擊接聽

當(dāng)對方摘機后,狀態(tài)會變成in call代表通話以及建立
在asterisk cli上可以查看到撥號信息

現(xiàn)在進(jìn)行sipML5客戶端之間的通話測試:
輸入601進(jìn)行撥號,

在601的頁面中會被振鈴,并提示有來自600的呼叫,點擊Answer呼叫建立


在asterisk cli下查看通話記錄

現(xiàn)在,恭喜你,你已經(jīng)成功的配置好了sipML5的語音通話功能,實現(xiàn)了WebRTC的基礎(chǔ)功能
現(xiàn)在進(jìn)行進(jìn)一步的測試,asterisk對接語音網(wǎng)關(guān),讓W(xué)ebRTC可以呼入到運營商,運營商可以呼入到分機。

拓?fù)鋱D
網(wǎng)關(guān)設(shè)置:
點擊SIP服務(wù)器,進(jìn)入以下頁面主用SIP服務(wù)器地址設(shè)置為asterisk ip地址端口使用默認(rèn)的5060,你也可以中繼修改。

點擊端口,添加

進(jìn)入端口的設(shè)置中,在端口中,輸入運營商線路接入到網(wǎng)關(guān)的端口,并設(shè)置代撥號碼,保存

添加IP中繼,點擊呼叫和路由,點擊IP中繼

中繼配置,索引與名稱隨意配置,請記住,對端配置為asterisk ip地址和端口

Ip-tel路由配置:索引及描述隨意,呼叫來源選擇之前配置好的IP中繼,主叫和被叫前綴為any

Tel-ip路由配置:索引及描述隨意,呼叫來源選擇any或者運營商接入到網(wǎng)關(guān)的端口,主叫和被叫前綴為any,呼叫目標(biāo)選擇ip中繼

到此,網(wǎng)關(guān)側(cè)的配置完成
Asterisk側(cè)配置
中繼配置:同樣的,asterisk也需要配置中繼指向網(wǎng)關(guān)設(shè)備,配置如下
cd /etc/asterisk
vim pjsip.conf
//pjsip.conf
[pstn] //中繼名稱隨意,需要保持一致
type=aor
[pstn]
type=endpoint
transport=udp-transport
context=li3 //調(diào)用同一條撥號規(guī)則
disallow=all
allow=alaw,ulaw
aors=pstn
direct_media=no
[pstn]
type=identify
endpoint=pstn
match=192.168.1.33 //輸入網(wǎng)關(guān)ip地址
配置完成后,應(yīng)該如下圖所示

現(xiàn)在我們在li3條目下增加運營商呼入呼出的撥號規(guī)則:
cd/etc/asterisk
vim extensions.conf
[li3]
exten =>015500000000,1,Dial(PJSIP/${EXTEN}@pstn)
//exten=>運營商號碼,1,Dial(PJSIP/${EXTEN}@中繼名稱)
exten =>015500000000,2,Dial(PJSIP/pstn/sip:1000${EXTEN:1}@192.168.1.33)
//exten =>運營商號碼,2,Dial(PJSIP/中繼名稱/sip:代撥號碼${EXTEN:1}@網(wǎng)關(guān)地址)
exten =>015500000000,3,hangup()
exten =>1000,1,Dial(PJSIP/600)
//exten =>代撥號碼,1,Dial(PJSIP/接聽的分機號碼)
exten =>1000,2,hangup()
注:本地號碼
不需要加0,異地號碼需要加0
現(xiàn)在你的撥號規(guī)則配置文件應(yīng)該如下

配置保持后,記得重啟asterisk,使得配置生效
現(xiàn)在進(jìn)行呼叫測試:
登陸sipML5客戶端

當(dāng)你手機成功接通電話后,通話成功建立。

這個時候可以進(jìn)入asterisk cli頁面下,查看撥號信息

現(xiàn)在,你已經(jīng)成功的撥打了一個WebRTC呼叫到運營商的電話!
呼入測試:
在你的手機上,撥打網(wǎng)關(guān)所接入的pstn線路號碼,進(jìn)行呼入測試

當(dāng)你的sipML5客戶端收到撥號時,點擊answer接聽撥號,成功建立通話

這個時候可以進(jìn)入asterisk cli頁面下,查看信息

注意事項:
- 在每一步。conf文件修改后,記得重啟使得配置生效
- 測試時,建議直接關(guān)閉防火墻,避免rtp協(xié)商失敗導(dǎo)致無語音
- 以上配置撥號規(guī)則為簡單測試用撥號規(guī)則
- WebRTC對環(huán)境要求較高,在本次的測試環(huán)境語音通信成功,不保證其他環(huán)境下通信成功
SIPlab@知識星球
微信公眾號:asterisk-cn