Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总

1. Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总

1.1. 环境

1.2. 结论

根据配置和编译过程中的错误提示,基本上就是一些依赖库的缺失问题,根据提示给出的依赖库及其版本要求,只要能在apt源中有可用的直接安装,不然就下载对应的库手动编译安装。

由于笔者的机器系统环境之前可能已经存在一些开发库,下文中列出的问题可能未涵盖其他可能的情况,具体情况需要对照各类日志排查解决。

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. 其他需要手动下载源码编译和安装的库

1.3. 配置问题

在源码根目录中执行

./bootstrap.sh

因此系统中需要安装有 autotool 工具链。

生成configure文件后执行

./configure

这一步可能会出现以下问题:

1.3.1. 缺少 PostgreSQL 库

apt install libpq-dev

1.3.2. 缺少 spandsp 库

因为 freeswitch 版本比较新,需要的 spandsp 库版本是3,在 apt 源中的库版本是2,不满足要求,需要手动下载 spandsp源码编译(可能需要依赖库 libtiff-dev,可以在apt源中直接安装)并安装。

切换到git提交:e59ca8f (HEAD) Fix crash when FCD frame has bad length but CRC is OK.

依次执行以下命令

git checkout e59ca8f
./bootstrap.sh
./configure
make && make install

1.3.3. 缺少 sofia-sip-ua 库

因为 freeswitch 要求的这个依赖库的版本需要在1.13.12及以上版本,apt源中版本为1.12.11,无法满足要求,因此也需要手动下载sofia-sip源码包编译并安装。

创建对应版本的新分支,并编译安装。

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,不能创建临时文件夹编译,否则安装时会报错!

git checkout -b 1.8.2 v.1.8.2
cmake -DCMAKE_BUILD_TYPE=Release .
make && make install

1.3.7. Signalwire 模块缺失

freeswitch中的这个模块是用于和Signalwire云服务通信相关的,我用不到,所以直接在freeswitch源码根目录下的 modules.conf 中禁用该模块即可。

同时,在后续运行freeswitch时也要在 conf/autoload_configs/modules.conf.xml中注释掉 <load module="mod_signalwire"/>

1.3.8. 缺少 libedit 库

apt install libedit-dev

1.4. 编译问题

在上一步配置通过后,编译时仍然会遇到一些依赖错误,因此这一步可以在编译前都解决掉,再从配置步骤开始编译和安装。

1.4.1. mod_av 编译报错

缺少依赖库 avformatswscale,这两个库属于ffmpeg组件。可以直接在apt源中获取安装。

apt install libavformat-dev libswscale-dev

1.4.2. lua.h 头文件查找失败

因为我系统中安装的是lua5.3,但是freeswitch-1.10.9中会查找lua5.0、lua5.1、lua5.2,而lua5.3即使安装也无法识别,正好apt源中也有lua5.2的版本可以安装。

apt install liblua5.2-dev

1.4.3. 缺少 opus 库

apt install libopus-dev

1.4.4. 缺少 sndfile 库

apt install libsndfile-dev

1.5. 安装问题

上一步编译成功后,会出现安装提示:

 +---------- FreeSWITCH Build Complete ----------+
 + FreeSWITCH has been successfully built.       +
 + Install by running:                           +
 +                                               +
 +                make install                   +
 +                                               +
 + While you're waiting, register for ClueCon!   +
 + https://www.cluecon.com                       +
 +                                               +
 +-----------------------------------------------+

按照提示安装完成后,会出现安装声音文件的提示:

 +---------- 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           +
 ...

直接安装最高质量的声音文件,这会同时安装其他质量的声音文件,这个过程会从freeswitch官方网站上下载声音文件并解压到安装目录的sound子目录下。

make cd-sounds-install

1.6. 运行问题

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"/>-->
 
 
+    <!--没有这些设置jssip呼叫时freeswitch会响应488-->
+    <param name="apply-candidate-acl" value="wan"/>
+    <param name="apply-candidate-acl" value="rfc1918.auto"/>
+    <param name="apply-candidate-acl" value="localnet.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左右就自动挂断的问题,公网下需要这两行!! -->
+    <!-- <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

默认密码若不修改,呼叫时可能有10s左右的延时,若想沿用默认密码,可以修改以下地方去掉呼叫时的延时

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

因为是在内网下部署的,不需要用到nat。

freeswitch -nonat -nc

1.6.2. 运行时的报错

笔者在呼叫时,虽然可以成功,但是一直有一个报错

[ERR] switch_core_video.c:3099 This function is not available, libpng not installed

后来重新安装了 libpng-dev,然后重新配置编译安装后解决

1.6.3. tryit-jssip 与 freeswitch 对接呼叫遇到的问题

  • tryit-jssip使用websocket方式与freeswitch交互,所以需要使用ws或者wss,参考freeswitch的 conf/sip_profile/internal.xml 中开通的ws和wss的端口设置。

  • 在上述freeswitch修改的配置中有针对jssip的修改,否则呼叫时会收到488,在freeswitch日志中可以看到如下信息:no suitable candidates found,按照上述修改之后可解决(需重启 FreeSwitch 才能生效,只使用 reloadxml 无效!)。

  • tryit-jssip默认的会话刷新时间是90s,若直接呼叫freeswitch的话,会收到422,提示最小刷新时间是120s,所以需要修改下tryit-jssip源码,将会话刷新时间调整为120s及以上或者干脆禁用Session Timers。
    具体修改可参考:fs-tryit-jssip

    或者可以修改fs端配置文件 conf/sip_profiles/internal.xml

    <param name="minimum-session-expires" value="60"/>
    

关于 tryit-jssip 的使用参考:tryit-jssip 本地部署

1.6.4. 宝利通呼叫一段时间后被挂断并且无法再次被呼叫

RealPresenceDesktop 3.5.1 UDP下会出现此问题,换成TCP即可。

1.6.5. 从外部访问 esl

ESL 模块默认只能在本机访问,若想从外部访问,特别是当 FreeSWITCH 部署在公网机器上时。

修改 esl 配置文件 conf/autoload_configs/event_socket.conf.xml

<param name="password" value="xxxxx"/>
<param name="apply-inbound-acl" value="lan"/>

修改默认密码,防止攻击。将apply-inbound-acl设置为lan。

1.7. 参考资料

FreeSWITCH: FreeSWITCH-Explained
FreeSWITCH权威指南-杜金房 张令考
FreeSWITCH 中文文档
Ubuntu下freeSwitch安裝指导
FreeSWITCH 常见问题(个人整理汇总)
通过JsSip使用WebRTC与FreeSwitch进行交互
JsSIP-JsSIP.UA
解决freeswitch30s就挂掉的问题
freeswitch对接WEBRTC的一个candidate问题

posted @ 2023-08-11 14:25  never715  阅读(1531)  评论(1编辑  收藏  举报