1. Ubuntu20.04 下編譯和運(yùn)行 FreeSWITCH的問題匯總
1.1. 環(huán)境
- Ubuntu20.04.2 LTS (Linux 5.4.0-152-generic x86_64 GNU/Linux)
- FreeSWITCH-1.10.9-release
1.2. 結(jié)論
根據(jù)配置和編譯過程中的錯(cuò)誤提示,基本上就是一些依賴庫的缺失問題,根據(jù)提示給出的依賴庫及其版本要求,只要能在apt源中有可用的直接安裝,不然就下載對(duì)應(yīng)的庫手動(dòng)編譯安裝。
由于筆者的機(jī)器系統(tǒng)環(huán)境之前可能已經(jīng)存在一些開發(fā)庫,下文中列出的問題可能未涵蓋其他可能的情況,具體情況需要對(duì)照各類日志排查解決。
1.2.1. 可以直接通過apt源安裝的依賴庫
apt install libpq-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libavformat-dev libswscale-dev liblua5.2-dev libopus-dev libsndfile-dev libpng-dev
1.2.2. 其他需要手動(dòng)下載源碼編譯和安裝的庫
- spandsp
- sofia-sip
- libks
signalwire-c
1.3. 配置問題
在源碼根目錄中執(zhí)行
./bootstrap.sh
因此系統(tǒng)中需要安裝有 autotool
工具鏈。
生成configure
文件后執(zhí)行
./configure
這一步可能會(huì)出現(xiàn)以下問題:
1.3.1. 缺少 PostgreSQL 庫
apt install libpq-dev
1.3.2. 缺少 spandsp 庫
因?yàn)?freeswitch 版本比較新,需要的 spandsp 庫版本是3,在 apt 源中的庫版本是2,不滿足要求,需要手動(dòng)下載 spandsp源碼編譯(可能需要依賴庫 libtiff-dev
,可以在apt源中直接安裝)并安裝。
切換到git提交:e59ca8f (HEAD) Fix crash when FCD frame has bad length but CRC is OK.
依次執(zhí)行以下命令
git checkout e59ca8f
./bootstrap.sh
./configure
make && make install
1.3.3. 缺少 sofia-sip-ua 庫
因?yàn)?freeswitch 要求的這個(gè)依賴庫的版本需要在1.13.12及以上版本,apt源中版本為1.12.11,無法滿足要求,因此也需要手動(dòng)下載sofia-sip源碼包編譯并安裝。
創(chuàng)建對(duì)應(yīng)版本的新分支,并編譯安裝。
git checkout -b 1.13.12 v1.13.12
./bootstrap.sh
./configure
make && make install
1.3.4. 缺少 speex、speexdsp 庫
apt install libspeex-dev libspeexdsp-dev
1.3.5. 缺少 ldns 庫
apt install libldns-dev
1.3.6. 缺少 libks 庫
下載并安裝 libks-dev,版本在1.8.2及以上即可。
必須要在源碼根目錄下cmake,不能創(chuàng)建臨時(shí)文件夾編譯,否則安裝時(shí)會(huì)報(bào)錯(cuò)!
git checkout -b 1.8.2 v.1.8.2
cmake -DCMAKE_BUILD_TYPE=Release .
make && make install
1.3.7. Signalwire 模塊缺失
freeswitch中的這個(gè)模塊是用于和Signalwire云服務(wù)通信相關(guān)的,我用不到,所以直接在freeswitch源碼根目錄下的 modules.conf
中禁用該模塊即可。
同時(shí),在后續(xù)運(yùn)行freeswitch時(shí)也要在 conf/autoload_configs/modules.conf.xml
中注釋掉 <load module="mod_signalwire"/>
1.3.8. 缺少 libedit 庫
apt install libedit-dev
1.4. 編譯問題
在上一步配置通過后,編譯時(shí)仍然會(huì)遇到一些依賴錯(cuò)誤,因此這一步可以在編譯前都解決掉,再從配置步驟開始編譯和安裝。
1.4.1. mod_av 編譯報(bào)錯(cuò)
缺少依賴庫 avformat
和swscale
,這兩個(gè)庫屬于ffmpeg組件??梢灾苯釉赼pt源中獲取安裝。
apt install libavformat-dev libswscale-dev
1.4.2. lua.h 頭文件查找失敗
因?yàn)槲蚁到y(tǒng)中安裝的是lua5.3,但是freeswitch-1.10.9中會(huì)查找lua5.0、lua5.1、lua5.2,而lua5.3即使安裝也無法識(shí)別,正好apt源中也有l(wèi)ua5.2的版本可以安裝。
apt install liblua5.2-dev
1.4.3. 缺少 opus 庫
apt install libopus-dev
1.4.4. 缺少 sndfile 庫
apt install libsndfile-dev
1.5. 安裝問題
上一步編譯成功后,會(huì)出現(xiàn)安裝提示:
+---------- FreeSWITCH Build Complete ----------+
+ FreeSWITCH has been successfully built. +
+ Install by running: +
+ +
+ make install +
+ +
+ While you're waiting, register for ClueCon! +
+ http://m.ythuaji.com.cn/uploads/allimg/24mu3yw2dxj.com +
+ +
+-----------------------------------------------+
按照提示安裝完成后,會(huì)出現(xiàn)安裝聲音文件的提示:
+---------- FreeSWITCH install Complete ----------+
+ FreeSWITCH has been successfully installed. +
+ +
+ Install sounds: +
+ (uhd-sounds includes hd-sounds, sounds) +
+ (hd-sounds includes sounds) +
+ ------------------------------------ +
+ make cd-sounds-install +
+ make cd-moh-install +
+ +
+ make uhd-sounds-install +
+ make uhd-moh-install +
+ +
+ make hd-sounds-install +
+ make hd-moh-install +
+ +
+ make sounds-install +
+ make moh-install +
+ +
+ Install non english sounds: +
+ replace XX with language +
+ (ru : Russian) +
+ (fr : French) +
+ ------------------------------------ +
+ make cd-sounds-XX-install +
+ make uhd-sounds-XX-install +
+ make hd-sounds-XX-install +
+ make sounds-XX-install +
...
直接安裝最高質(zhì)量的聲音文件,這會(huì)同時(shí)安裝其他質(zhì)量的聲音文件,這個(gè)過程會(huì)從freeswitch官方網(wǎng)站上下載聲音文件并解壓到安裝目錄的sound子目錄下。
make cd-sounds-install
1.6. 運(yùn)行問題
1.6.1. 配置修改
index b5a58d1..d77f585 100644
--- a/conf/autoload_configs/modules.conf.xml
+++ b/conf/autoload_configs/modules.conf.xml
@@ -50,7 +50,7 @@
<load module="mod_verto"/>
<!-- Applications -->
- <load module="mod_signalwire"/>
+ <!-- <load module="mod_signalwire"/> -->
<load module="mod_commands"/>
<load module="mod_conference"/>
<!-- <load module="mod_curl"/> -->
diff --git a/conf/sip_profiles/internal.xml b/conf/sip_profiles/internal.xml
index eb07779..aa8f768 100644
--- a/conf/sip_profiles/internal.xml
+++ b/conf/sip_profiles/internal.xml
@@ -135,6 +135,11 @@
<!--<param name="dtmf-type" value="info"/>-->
+ <!--沒有這些設(shè)置jssip呼叫時(shí)freeswitch會(huì)響應(yīng)488-->
+ <param name="apply-candidate-acl" value="rfc1918.auto"/>
+ <param name="apply-candidate-acl" value="localnet.auto"/>
+ <!-- <param name="apply-candidate-acl" value="wan_v4.auto"/> -->
+
<!-- 'true' means every time 'first-only' means on the first register -->
<!--<param name="send-message-query-on-register" value="true"/>-->
@@ -293,8 +298,9 @@
auto - Use guessed ip.
auto-nat - Use ip learned from NAT-PMP or UPNP
-->
- <param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
- <param name="ext-sip-ip" value="$${external_sip_ip}"/>
+ <!-- 解決呼叫后30s左右就自動(dòng)掛斷的問題 -->
+ <!-- <param name="ext-rtp-ip" value="$${external_rtp_ip}"/> -->
+ <!-- <param name="ext-sip-ip" value="$${external_sip_ip}"/> -->
<!-- rtp inactivity timeout -->
<param name="rtp-timeout-sec" value="300"/>
diff --git a/conf/vars.xml b/conf/vars.xml
index 8948d17..be9ab07 100644
--- a/conf/vars.xml
+++ b/conf/vars.xml
@@ -12,7 +12,7 @@
WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
-->
- <X-PRE-PROCESS cmd="set" data="default_password=1234"/>
+ <X-PRE-PROCESS cmd="set" data="default_password=123456"/>
<!-- Did you change it yet? -->
<!--
The following variables are set dynamically - calculated if possible by freeswitch - and
默認(rèn)密碼若不修改,呼叫時(shí)可能有10s左右的延時(shí),若想沿用默認(rèn)密碼,可以修改以下地方去掉呼叫時(shí)的延時(shí)
index c3edafc..e36dda7 100644
--- a/conf/dialplan/default.xml
+++ b/conf/dialplan/default.xml
@@ -132,7 +132,7 @@
<action application="log" data="CRIT Open $${conf_dir}/vars.xml and change the default_password."/>
<action application="log" data="CRIT Once changed type 'reloadxml' at the console."/>
<action application="log" data="CRIT WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING "/>
- <action application="sleep" data="10000"/>
+ <!-- <action application="sleep" data="10000"/> -->
</condition>
<!--
This is an example of how to auto detect if telephone-event is missing and activate inband detection
因?yàn)槭窃趦?nèi)網(wǎng)下部署的,不需要用到nat。
freeswitch -nonat -nc
1.6.2. 運(yùn)行時(shí)的報(bào)錯(cuò)
筆者在呼叫時(shí),雖然可以成功,但是一直有一個(gè)報(bào)錯(cuò)
[ERR] switch_core_video.c:3099 This function is not available, libpng not installed
后來重新安裝了 libpng-dev
,然后重新配置編譯安裝后解決
1.6.3. tryit-jssip 與 freeswitch 對(duì)接呼叫遇到的問題
-
tryit-jssip使用websocket方式與freeswitch交互,所以需要使用ws或者wss,參考freeswitch的
conf/sip_profile/internal.xml
中開通的ws和wss的端口設(shè)置。 -
在上述freeswitch修改的配置中有針對(duì)jssip的修改,否則呼叫時(shí)會(huì)收到488,在freeswitch日志中可以看到如下信息:
no suitable candidates found
,按照上述修改之后可解決。 -
tryit-jssip默認(rèn)的會(huì)話刷新時(shí)間是90s,若直接呼叫freeswitch的話,會(huì)收到422,提示最小刷新時(shí)間是120s,所以需要修改下tryit-jssip源碼,將會(huì)話刷新時(shí)間調(diào)整為120s及以上或者干脆禁用Session Timers。
具體修改可參考:fs-tryit-jssip
關(guān)于 tryit-jssip 的使用參考:tryit-jssip 本地部署
1.6.4. 寶利通呼叫一段時(shí)間后被掛斷并且無法再次被呼叫
RealPresenceDesktop 3.5.1 UDP下會(huì)出現(xiàn)此問題,換成TCP即可。
1.7. 參考資料
FreeSWITCH: FreeSWITCH-Explained
FreeSWITCH權(quán)威指南-杜金房 張令考
FreeSWITCH 中文文檔
Ubuntu下freeSwitch安裝指導(dǎo)
FreeSWITCH 常見問題(個(gè)人整理匯總)
通過JsSip使用WebRTC與FreeSwitch進(jìn)行交互
JsSIP-JsSIP.UA
解決freeswitch30s就掛掉的問題
freeswitch對(duì)接WEBRTC的一個(gè)candidate問題