安装freeswitch

为什么要写这个玩意儿

由于工作需要需要部署freeswitch,官网上的部署方式windows特别简单,直接下载一个安装程序一路向西即可,但是至于linux下的,特别是debian系统,则要去注册一个token,本人尝试了几次,无奈由于伟大的“墙”token一直获取不成功,因此决定自行源码编码安装。

前提

由于本人是mac,freeswitch的安装需要特定的目录权限,而mac在权限方面又限制的十分的死,同时,由于freeswitch需要大量的端口,如internal、public端口,rtp媒体端口,因此,决定用docker的host网络模式,让容器和宿主机共享网络,实现和直接在linux上安装同样的效果。假设本地已经有了一个名字叫debian的镜像,在进入容器后,执行apt-get update && apt-get install -y git vim 。(vim用来后期修改一些配置文件,后面用到再说.注意:此处经过多次尝试,最新版的fs编译会报和ffpneg相关的错误,因此我们安装v1.10版本的fs。

准备工作

确保已经进入容器,然后cd /usr/local/src。

基础依赖库:

apt-get install -y \
    subversion build-essential cmake automake autoconf libtool libtool-bin pkg-config wget \
    libssl-dev zlib1g-dev libdb-dev unixodbc-dev libncurses5-dev libexpat1-dev libgdbm-dev bison erlang-dev libtpl-dev libtiff5-dev uuid-dev \
    libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev nasm \
    libogg-dev libspeex-dev libspeexdsp-dev \
    libldns-dev \
    python3-dev \
    libavformat-dev libswscale-dev \
    liblua5.2-dev \
    libopus-dev \
    libpq-dev \
    libshout3-dev libmpg123-dev libmp3lame-dev \
    libsndfile1-dev libflac-dev libogg-dev libvorbis-dev

FreeSWITCH较新的源代码都已将Sofia-SIP和SpanDSP移出了FreeSWITCH代码仓库,分离到了独立的仓库中,在安装FreeSWITCH之前需要单独安装:

后面在make 编译fs的时候可能会和spandsp相关的错误,这个时候spandsp需要回滚一下版本,spandsp更新太快了也不是个好事儿(如果没报错就不要回滚)
git checkout -b finecode20230705 0d2e6ac65e0e8f53d652665a743015a88bf048d4,然后重新编译一下spandsp

另外verto模块的依赖也是单独维护的,

另外,需要安装一个signalwire-c,这个库依赖libks库,所以需要先安装libks库(当然这个库不是必须的,这是用于和fs官方平台通信的一个平台,其实国内搭建fs的人99%的都不需要这个模块,如果不需要,只需要注释掉这个模块,后面说)

  • https://github.com/signalwire/signalwire-c
    git clone https://github.com/signalwire/signalwire-c
    cd signalwire-c
    cmake . && make install && cd ..
    

安装freeswitch

  • https://github.com/signalwire/freeswitch.git

    git clone    https://github.com/signalwire/freeswitch.git
    

    在fs的源码目录下的modules.conf文件。
    在编译前最好先禁用mod_av模块(用于播放视频的,初学者基本用不到,执行./bootstrap.sh
    后才可以看到这个文件,得先执行.bootstrap 命令后才能看到这个文件)
    在这里插入图片描述

    禁用mod_signalwire模块
    在这里插入图片描述
    然后开始编译:

./bootstrap.sh
./configure
make
make install

ok,如果正常的话会看到一个成功的带着freeswitch的页面,我这忘了截图,就不贴图了。

安装完成之后,freeswitch会安装在/usr/local/freeswitch这。
然后我们创建两个软连接

cd /usr/bin/
ln /usr/local/freeswitch/bin/freeswitch freeswitch
ln /usr/local/freeswitch/bin/fs_cli fs_cli

安装声音文件:

进入源码目录下:
cd /usr/local/src/freeswitch
make cd-sounds-install
make cd-moh-install
上述命令会自动从fs官网下载声音文件


然后我们启动看看,再启动前,我们在编译的时候不是禁掉了mod_signalwire和mod_av模块么,
现在也需要禁用掉这两个模块。
进入目录
```shell
cd /usr/local/freeswitch/conf/autoload_configs

然后修改modules.conf.xml这个文件,注释掉mod_signalwire和mod_av的自动加载
在这里插入图片描述
在这里插入图片描述

最后,我们还需要删除掉ip6支持,当然,你是高手另当别论。

cd /usr/local/freeswitch/conf/sip_profiles

在这里插入图片描述

把和ipv6的都干掉
在这里插入图片描述

然后我们执行freeswitch命令启动服务,首次启动会比较慢,耐心等待一会儿,如果你能看到下面的样子,恭喜,编译成功了。
在这里插入图片描述

安装中文语音(可有可无)

  1. 获取中文语音包

    cd /usr/local/freeswitch/sounds
    git clone https://github.com/rts-cn/zh.git
    经测试,这个语音包是最全的,别的网络教程里的语音包不是缺这个就是缺那个,这个中文语音包是由国内freeswitch大佬杜金房的小樱桃公司上传的
    
  2. 编译中文say模块

cd /usr/local/src/freeswitch/src/mod/say# cd mod_say_zh/
make && make install
  1. 加载中文say模块(如果fs已经启动的了的话)
load mod_say_zh
  1. 启用中文模块
    找到/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml 文件, 找到这一行,取消注释
  2. 修改vars.xml中的配置
    找到/usr/local/freeswitch/conf/vars.xml文件,
    找到这个
     <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>
    注释掉或者删掉,注意,由于fs是采用预处理的方式加载的,所以这普通注释是不行的,我们只需要破坏这个结构改即可,比如我么可以改成这样:
    
    <X-PRE-PROCESS-broke cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>
    然后加入下面一行
    <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/link"/>
    下面三行可以加可不加
    <X-PRE-PROCESS cmd="set" data="default_language=zh"/>
    <X-PRE-PROCESS cmd="set" data="default_dialect=cn"/>
    <X-PRE-PROCESS cmd="set" data="default_voice=lin"/>
    
  3. 计入中文语音配置
/usr/local/freeswitch/conf/lang
 cp en zh -ra
 mv zh/en.xml zh/zh.xml

然后编辑zh.xml文件,把中文相关替换成中文相关
在这里插入图片描述
找到/usr/local/freeswitch/conf/freeswitch.xml文件,加入对zh中文的引用
在这里插入图片描述
最后重启fs或者reloadxml

打包镜像

最后的最后,如果想将自己的编译后的镜像打包,过程如下:

  1. 通过docker ps找到刚才编译fs的容器的容器id,简称$container_id
  2. 通过docker export -o debian_fs_builder.tar $container_id导出容器快照
  3. 通过docker import debian_fs_builder.tar把容器快照导出为镜像
  4. 通过docker images找到刚才倒出的镜像的id,简称$image_id
  5. 通过docker image tag $image_id fs:base给刚才倒出的镜像打个标签
  6. ok,现在你已经 有了个fs:base的镜像了
  7. 尝试这个镜像好使不:docker load -i fs-base.tar,如果能看到显示Loaded image: fs:base
    ,恭喜你,done
  8. 用刚才编译的镜像尝试启动:docker run --name fs -d -t fs:base /bin/bash…看看成功没有吧。
  9. 完结,撒花,我该去撸代码了

运行

ok,让我们尝试打一个电话吧。

让我们重新用我们自己打包的镜像开始吧
. 首先让我们编写一个docker-compose.yml文件吧

version: '3'
services:
  fs:
    image: fs:base
    ports:
      - 5060:5060/udp
      - 5060:5060/tcp
#      - 16384-32768:16384-32768/udp
    networks:
      - my-fs
    container_name: fs
    #    interactive: true
    tty: true
    #    detach: true
    command: bash
networks:
  my-fs:
    external: true

我们只映射了5060端口,5080没映射,rtp端口也没映射(用于音视频rtp流传输的,不映射我们听不到声音的,不过无所谓了,因为我们只是个简单的测试,之所以不映射是因为默认端口是16384-32768,由于我电脑垃圾的原因,映射太多导致容器启动失败,当然这个端口是可以改的,在/usr/local/freeswitch/conf/autoload_configs/switch.conf.xml这个文件里可以自行修改,然后怎么改了怎么重新启动容器不在此文范围内,请自己阅读docker相关文档)。

然后我们进入目录:

cd /usr/local/freeswitch/bin
./freeswitch

fs内置了一些账号,在/usr/local/freeswitch/conf/directory/default目录下
在这里插入图片描述
每个目录都代表一个账号,默认密码为1234,
我是mac,使用telephone这个软电话
在这里插入图片描述
在这里插入图片描述

域可以在fs内部通过执行命令获取,当然这个是可以配的,这是后话
在这里插入图片描述
在这里插入图片描述

如果幸运的话,这个时候你已经可以打电话了。让我们试一下。用1000的给1001打个电话试一下
在这里插入图片描述
注意,首次呼叫可能需要10秒左右才能接通,原因是我们使用的默认密码1234,当然,fs的日志也提示了:
在这里插入图片描述
这个时候我们只需要去提示的 /usr/local/freeswitch/conf/vars.xml,找到这个地方:
在这里插入图片描述
把默认密码改掉,然后重新启动或者执行reloadxml就可以了。然后把软电话的用户的密码改了重新连接。
重新拨打,ok,可以立即打通了。但是我们发现一个新的问题,电话30秒就自动结束了,为啥?
下期再说!!!

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值