Freeswitch 运行、配置及相关综合

*【备注:因新浪博客莫名其妙的自动加密博文,导致前面发布在新浪博客的博文无法浏览,故而我在优快云重发,以便需要的人参考】
*本文包含几个部分:
1、运行FS
2、WEB管理环境安装配置
3、FS客户端
4、自动启动FS及防火墙设置
5、FS配置及相关问题综合

运行FS

一般建议运行FS使用普通用户以便安全!,所以:
创建pid目录,因为下面是用普通用户运行FS,FS无法创建运行目录:
mkdir /var/run/freeswitch

直接启动: freeswitch
//可用参数,如: -log /var/log/freeswitch -conf /etc/freeswitch -db /usr/share/freeswitch

useradd freeswitch -g daemon -s /sbin/nologin -M

后台运行:freeswitch -u freeswitch -g daemon -nc -rp
修改权限,用freeswitch这个用户运行:
chown -R freeswitch:daemon /etc/freeswitch
chown -R freeswitch:daemon /var/lib/freeswitch
chown -R freeswitch:daemon /usr/share/freeswitch
chown -R freeswitch:daemon /var/log/freeswitch
chown -R freeswitch:daemon /var/run/freeswitch

安装配置WEB管理环境

(如果需要使用WEB的FS GUI管理图形界面,如本人的开源项目freeswitch GUI管理后台 FSlmx 需要有WEB+php环境,下面是安装和配置过程)
这是centos7的:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum -y install php72w php72w-common php72w-embedded php72w-fpm php72w-gd php72w-mbstring php72w-mysql php72w-opcache php72w-pdo php72w-xml

这是centos6的:
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
rpm -Uvh http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
yum -y install php71w php71w-common php71w-embedded php71w-fpm php71w-gd php71w-mbstring php71w-mysqlnd php71w-opcache php71w-pdo php71w-xml

yum -y install nginx mariadb mariadb-server
service nginx start #启动
chkconfig nginx on #设为开机启动

vi /etc/nginx/nginx.conf

location / {
root /var/www;
index index.html index.php;
}
location ~ .php$ {
root /var/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME d o c u m e n t r o o t document_root documentrootfastcgi_script_name;
include fastcgi_params;
}

vi /etc/php-fpm.d/www.conf
=======修改user和group
user = freeswitch
group = daemon

启动web服务:
service php-fpm start #启动
chkconfig php-fpm on #设为开机启动
/usr/sbin/nginx -s reload #修改配置文件后,平滑启动nginx

启动数据库:
service mariadb start
chkconfig mariadb on

mysql_secure_installation #初始数据库安装
vi /etc/my.cnf
在[mysqld]标签下添加
init_connect=‘SET collation_connection = utf8_unicode_ci’
init_connect=‘SET NAMES utf8’
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

vi /etc/my.cnf.d/client.cnf
在[client]中添加
default-character-set=utf8

vi /etc/my.cnf.d/mysql-clients.cnf
在[mysql]中添加
default-character-set=utf8

##如果nginx和php运行发现错误,运行 getenforce 如果结果为enforcing 那就是开启了 selinux,需要设置:
##临时关闭selinux: setenforce 0
##永久关闭:vi /etc/selinux/config 设置disabled

同步的权限:
1、web的user和group 修改为 freeswich daemon
2、chown -R freeswitch:daemon /var/lib/php
3、chown -R freeswitch:daemon /var/www (web的根路径)

=============================
编译php的命令:(线程安全模式,apache2.4下)
wget https://www.php.net/distributions/php-7.3.5.tar.bz2
tar xfv wget https://www.php.net/distributions/php-7.3.5.tar.bz2
cd php-7.3.5.tar.bz2
./configure --with-apxs2=/usr/local/httpd2.4.39/bin/apxs --enable-mysqlnd --with-mysqli=mysqlnd --with-openssl --with-pdo-mysql=mysqlnd --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-curl --enable-opcache --enable-sockets --enable-maintainer-zts
make && make install
cp php.ini-production /usr/local/lib/php.ini
需注意,php.ini中需要启用opcache模块,添加:
zend_extension=/usr/local/lib/php/extensions/no-debug-zts-20180731/opcache.so
修改httpd.conf,添加:
SetHandler application/x-httpd-php
/usr/local/httpd2.4.39/bin/apachectl restart

编译时出现错误 pthread_sigmask@@GLIBC_2.2.5’ is defined in DSO /lib64/libpthread.so.0 so try adding it to the …
vi /etc/ld.so.conf 添加一行:/lib64
make clean 后重新编译

FS的客户端:

客户端:fs_cli -rRS

设置自动启动服务:

仅centos6下,在centos7下无效:
cd /etc/init.d
touch freeswitch
chmod a+x freeswitch

vi freeswitch

#! /bin/sh
#
# freeswitch:      Starts the freeswitch Daemon
#
# chkconfig: 345 96 02
# processname: freeswitch
# description: Freeswitch fedora init script \
# config:
# Author: gled

# Source function library.
. /etc/init.d/functions
. /etc/sysconfig/network

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="FreeSwitch Voice Switching System"
NAME=freeswitch
DAEMON=/usr/bin/$NAME
PIDFILE=/var/run/freeswitch/$NAME.pid

do_setlimits() {
ulimit -c unlimited
ulimit -d unlimited
ulimit -f unlimited
ulimit -i unlimited
ulimit -n 999999
ulimit -q unlimited
ulimit -u unlimited
ulimit -v unlimited
ulimit -x unlimited
ulimit -s 244
ulimit -l unlimited
return 0
}

base=${0##*/}

do_start() {
do_setlimits
$DAEMON -nc
RETVAL=$?
if [ $RETVAL = 0 ]; then
success $"$base startup"
else
failure $"$base startup"
fi
echo
return $RETVAL
}

do_stop() {
$DAEMON -stop
RETVAL=$?
[ $RETVAL = 0 ] && success $"$base shutdown" || failure $"$base shutdown"
rm -f $LOCKFILE
echo
return $RETVAL
}

# See how we were called.
case "$1" in
  start)
do_start
;;
  stop)
do_stop
;;
  restart)
do_stop
echo "Waiting for daemon to exit..."
sleep 5
do_start
;;
  *)
echo $"Usage: $0 {start|stop}"
exit 2
;;
esac

exit $RETVAL

下面是添加系统服务,以自动启动:
chkconfig --add freeswitch
chkconfig freeswitch on

centos7下面的自启动

vi /usr/lib/systemd/system/freeswitch.service

[Unit]
Description=FreeSWITCH
After=syslog.target network.target
After=mariadb.service

[Service]
Type=forking
PIDFile=/var/run/freeswitch/freeswitch.pid
User=root
Group=root
WorkingDirectory=/usr
#ExecStart=/usr/bin/freeswitch -u freeswitch -g daemon -nc
ExecStart=/usr/bin/fs.sh
ExecReload=/usr/bin/kill -HUP $MAINPID
ExecStop=/usr/bin/killall -9 freeswitch

[Install]
WantedBy=multi-user.target

vi /usr/bin/fs.sh

#!/bin/sh
mkdir /run/freeswitch
chown -R freeswitch:daemon /run/freeswitch
ulimit -c unlimited
ulimit -d unlimited
ulimit -f unlimited
ulimit -i unlimited
ulimit -n 999999
ulimit -q unlimited
ulimit -u unlimited
ulimit -v unlimited
ulimit -x unlimited
ulimit -s 244
ulimit -l unlimited
freeswitch -u freeswitch -g daemon -nc

下面是添加系统服务,以自动启动:
chmod +x /usr/bin/fs.sh
systemctl daemon-reload
systemctl enable freeswitch.service
systemctl start freeswitch.service

设置防火墙Centos7:
firewall-cmd --permanent --zone=public --add-port=1719/udp
firewall-cmd --permanent --zone=public --add-port=1720/tcp
firewall-cmd --permanent --zone=public --add-port=3478/udp
firewall-cmd --permanent --zone=public --add-port=3479/udp
firewall-cmd --permanent --zone=public --add-port=5002/tcp
firewall-cmd --permanent --zone=public --add-port=5003/udp
firewall-cmd --permanent --zone=public --add-port=5060/udp
firewall-cmd --permanent --zone=public --add-port=5060/tcp
firewall-cmd --permanent --zone=public --add-port=5070/tcp
firewall-cmd --permanent --zone=public --add-port=5070/udp
firewall-cmd --permanent --zone=public --add-port=5080/udp
firewall-cmd --permanent --zone=public --add-port=5080/tcp
firewall-cmd --permanent --zone=public --add-port=8021/tcp
firewall-cmd --permanent --zone=public --add-port=5066/tcp
firewall-cmd --permanent --zone=public --add-port=7443/tcp
firewall-cmd --permanent --zone=public --add-port=16384-32768/udp
firewall-cmd --reload

设置防火墙Centos6:
iptables -A INPUT -p udp --dport 1719 -j ACCEPT
iptables -A INPUT -p tcp --dport 1720 -j ACCEPT
iptables -A INPUT -p udp --dport 3478 -j ACCEPT
iptables -A INPUT -p udp --dport 3479 -j ACCEPT
iptables -A INPUT -p tcp --dport 5002 -j ACCEPT
iptables -A INPUT -p udp --dport 5003 -j ACCEPT
iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
iptables -A INPUT -p udp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp --dport 5070 -j ACCEPT
iptables -A INPUT -p udp --dport 5070 -j ACCEPT
iptables -A INPUT -p tcp --dport 5080 -j ACCEPT
iptables -A INPUT -p udp --dport 5080 -j ACCEPT
iptables -A INPUT -p tcp --dport 8021 -j ACCEPT
iptables -A INPUT -p tcp --dport 5066 -j ACCEPT
iptables -A INPUT -p tcp --dport 7443 -j ACCEPT
iptables -A INPUT -p udp --dport 16384:32768 -j ACCEPT
/etc/rc.d/init.d/iptables save
service iptables restart

FS配置及相关问题综合

fs命令测试(在FS控制台或客户端运行):
FS> sofia status profile internal (显示整体信息,含多少用户已注册;)
FS> originate user/1000 &echo (拨打1000并执行echo程序)
FS> originate sofia/profile/internal/1000 9999 (相当于在软电话1000上拨打9999)
FS> originate sofia/profile/internal/1000 9999 XML default (同上)
FS> sofia status profile internal reg 查看注册用户

编译安装后的系统目录:
prefix: /usr
exec_prefix: /usr
bindir: ${exec_prefix}/bin
confdir: /etc/freeswitch
libdir: /usr/lib
datadir: /usr/share/freeswitch
localstatedir: /var/lib/freeswitch
includedir: /usr/include/freeswitch

 certsdir:       /etc/freeswitch/tls
 dbdir:         /var/lib/freeswitch/db
 grammardir:     /usr/share/freeswitch/grammar
 htdocsdir:      /usr/share/freeswitch/htdocs
 fontsdir:       /usr/share/freeswitch/fonts
 logfiledir:     /var/log/freeswitch        /usr/local/freeswitch/log
 modulesdir:     /usr/lib/freeswitch/mod
 pkgconfigdir:   /usr/lib/pkgconfig
 recordingsdir:  /var/lib/freeswitch/recordings
 imagesdir:      /var/lib/freeswitch/images
 runtimedir:     /var/run/freeswitch
 scriptdir:      /usr/share/freeswitch/scripts
 soundsdir:      /usr/share/freeswitch/sounds
 storagedir:     /var/lib/freeswitch/storage
 cachedir:       /var/cache/freeswitch

测试号码 | 说明

9664 | 保持音乐
9196 | echo,回音测试
9195 | echo,回音测试,延迟5秒
9197 | milliwatte extension,铃音生成
9198 | TGML 铃音生成示例
5000 | 示例IVR
4000 | 听取语音信箱
33xx | 电话会议,48K(其中xx可为00-99,下同)
32xx | 电话会议,32K
31xx | 电话会议,16K
30xx | 电话会议,8K
2000-2002 | 呼叫组
1000-1019 | 默认分机号

“F1” value=“help”
“F2” value=“status”
“F3” value=“show channels”
“F4” value=“show calls”
“F5” value=“sofia status”
“F6” value=“reloadxml”
“F7” value=“console loglevel 0”
“F8” value=“console loglevel 7”
“F9” value=“sofia status profile internal”
“F10” value=“sofia profile internal siptrace on”
“F11” value=“sofia profile internal siptrace off”
“F12” value=“version”

配置管理

  • **设置语音编码

vars.xml可以设置系统默认使用的编码,为全局设置,下面两个变量,一个表示呼入,一个表示呼出。
默认没有用729,所以729编码通讯会报错,需启用

<X-PRE-PROCESS cmd="set" data="global_codec_prefs=G722,G729,G723,PCMA,PCMU,GSM"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=G722,G729,G723,PCMA,PCMU,GSM"/>
  • **设置中文语音

复制中文语音到 /usr/share/freeswitch/sounds,语音目录树为 zh/cn/yy/…
修改vars.xml,屏蔽英文音频资源的路径设置,添加(注意中文音频资源的路径设置,这是举例而已)

<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/yy"/>
<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=yy"/>

修改语音配置:
cd /etc/freeswitch/lang
cp -fr en zh
cd zh
mv en.xml zh.xml

vi zh.xml

<language name="zh" say-module="zh" sound-prefix="$${sounds_dir}/zh/cn/yy" tts-engine="cepstral" tts-voice="yy">

vi /etc/freeswitch/freeswitch.xml
section name=“languages” 节点中增加一行

<X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>

cd /usr/local/src/freeswitch/src/mod/say/mod_say_zh
make && make install

FS> load mod _say_zh 动态加载
永久加载:/etc/freeswitch/autoload_configs/modules.conf.xml 中 load <module=“mod_say_zh”/>前的注释去掉

  • **修改ivr

根据实际来 修改 /etc/freeswitch/ivr_menus ,配置ivr语音:
greet-long为进入ivr后首先播放的语音信息,若在timeout 时间内用户未输入信息,系统会播放greet-short信息,若用户一直未输入信息,系统在播放max-timeouts-1次greet-short语音后关闭该ivr。如果用户在timeout时间内输入了错误信息,系统会播放invalid-sound语音

  • **允许外部IP连接到event_socket 配置ESL

vi /etc/freeswitch/autoload_configs/event_socket.conf.xml
=允许任意IP===============

 <configuration name="event_socket.conf" description="Socket Client">
  <settings>
  <param name="nat-map" value="false"/>
  <param name="listen-ip" value="::"/>
  <param name="listen-port" value="8021"/>
  <param name="password" value="newpassword"/>
  <param name="apply-inbound-acl" value="any_v4.auto"/>   
  </settings>
 </configuration>

或者=按域授权===============

  1. event_socket.conf.xml 加入允许的域,默认是domains,可以是自己的域:
<param name="apply-inbound-acl" value="domains"/>
  1. acl.conf.xml 按域加入ip地址或ip地址段:
<list name="domains" default="deny">
<node type="allow" domain="$${domain}"/>
<node type="allow" cidr="192.168.1.0/24"/>
<node type="allow" cidr="127.0.0.1/24"/>
</list>

**注:如果是仅仅要外部ip连接FS进行通话,直接让外部ip使用external端口即可,无需修改任何配置

  • **修改fs使用mysql

这是ODBC模式,FS1.10开始已经内置了mysql的支持!
安装mysql:
yum install mysql-server
/usr/bin/mysql_secure_installation
chkconfig mysqld on

cd /usr
/usr/bin/mysqld_safe &
service mysqld start

mysql 修改默认数据引擎到 innodb,提高log文件大小,在centos6里面用新的innodb(ha_innodb_plugin,默认的innodb在centos6里面不可用):

[mysqld]
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-storage-engine=INNODB 
innodb_log_file_size = 512M

安装odbc:
yum install unixODBC-devel mysql-connector-odbc
vi /etc/odbc.ini
添加dsn,如freeswitch,注意路径和用户账号

[freeswitch]
Driver         = /usr/lib64/libmyodbc5.so
SERVER      = localhost
PORT          = 3306
DATABASE    = freeswitch
USER           = root
PASSWORD   = limaoxiang
OPTION = 67108864

===!修改 /etc/odbcinst.ini 检测驱动路径是否正确
===! OPTION = 67108864 即打开 FLAG_MULTI_STATEMENTS (如果是windows,需要在设置dsn时启用 MULTI_STATEMENTS)
检测是否正常:
isql -v freeswitch

在/etc/freeswitch目录, grep -ir dsn 而后修改相应的dsn配置,都可以修改为mysql:
vi autoload_configs/db.conf.xml
(修改odbc-dsn,后面的value部分修改为实际内容,如 value=“freeswitch:root:limaoxiang” )、
vi autoload_configs/switch.conf.xml
(修改core-db-dsn,添加odbc-dsn)、
vi autoload_configs/voicemail.conf.xml
(修改odbc-dsn)、
vi autoload_configs/callcenter.conf.xml
(修改odbc-dsn)、
vi sip_profiles/internal.xml
(修改odbc-dsn)、
vi sip_profiles/internal-ipv6.xml
(修改odbc-dsn)、

vi autoload_configs/cidlookup.conf.xml
vi autoload_configs/nibblebill.conf.xml
vi autoload_configs/directory.conf.xml
vi autoload_configs/lcr.conf.xml
vi autoload_configs/easyroute.conf.xml
vi jingle_profiles/server.xml
vi skinny_profiles/internal.xml

!每次修改xml后都需要重新在freeswitch控制台或者fs_cli下执行reloadxml,使得修改生效

!第一次启动,会自动创建数据库;多启动几次,一次可能不会全部创建完,尤其是使用了dsn后,需注意,如果数据库用的utf8格式,创建数据库会出错,最好用默认数据字符集!!必须开启MULTI_STATEMENTS

  • **CDR 存放到mysql中

cd /usr/local/src/freeswitch/src/mod/event_handlers/mod_odbc_cdr
make && make install
配置odbc_cdr.conf.xml:
vi /etc/freeswitch/autoload_configs/odbc_cdr.conf.xml

<configuration name="odbc_cdr.conf" description="ODBC CDR Configuration">
  <settings>
    <param name="odbc-dsn" value="freeswitch:root:limaoxiang"/>
    <!---->
    <!-- global value can be "a-leg", "b-leg", "both" (default is "both") -->
    param name="log-leg" value="both"/>
    <!-- value can be "always", "never", "on-db-fail" -->
    <param name="write-csv" value="on-db-fail"/>
    <!-- location to store csv copy of CDR -->
    <param name="csv-path" value="/var/log/freeswitch/odbc_cdr"/>
    <!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" -->
    <param name="csv-path-on-fail" value="/var/log/freeswitch/odbc_cdr/failed"/>
    <!-- dump SQL statement after leg ends -->
    <param name="debug-sql" value="false"/>
  </settings>
  <tables>
    <!-- only a-legs will be inserted into this table -->
    <table name="cdr_table_a_leg" log-leg="a-leg">
      <field name="CallId" chan-var-name="call_uuid"/>
      <field name="orig_id" chan-var-name="uuid"/>
      <field name="term_id" chan-var-name="sip_call_id"/>
      <field name="ClientId" chan-var-name="uuid"/>
      <field name="IP" chan-var-name="sip_network_ip"/>
      <field name="IPInternal" chan-var-name="sip_via_host"/>
      <field name="CODEC" chan-var-name="read_codec"/>
      <field name="directGateway" chan-var-name="sip_req_host"/>
      <field name="redirectGateway" chan-var-name="sip_redirect_contact_host_0"/>
      <field name="CallerID" chan-var-name="sip_from_user"/>
      <field name="TelNumber" chan-var-name="sip_req_user"/>
      <field name="TelNumberFull" chan-var-name="sip_to_user"/>
      <field name="sip_endpoint_disposition" chan-var-name="endpoint_disposition"/>
      <field name="sip_current_application" chan-var-name="current_application"/>
    /table>
    <!-- only b-legs will be inserted into this table -->
    <table name="cdr_table_b_leg" log-leg="b-leg">
      <field name="CallId" chan-var-name="call_uuid"/>
      <field name="orig_id" chan-var-name="uuid"/>
      <field name="term_id" chan-var-name="sip_call_id"/>
      <field name="ClientId" chan-var-name="uuid"/>
      <field name="IP" chan-var-name="sip_network_ip"/>
      <field name="IPInternal" chan-var-name="sip_via_host"/>
      <field name="CODEC" chan-var-name="read_codec"/>
      <field name="directGateway" chan-var-name="sip_req_host"/>
      <field name="redirectGateway" chan-var-name="sip_redirect_contact_host_0"/>
      <field name="CallerID" chan-var-name="sip_from_user"/>
      <field name="TelNumber" chan-var-name="sip_req_user"/>
      <field name="TelNumberFull" chan-var-name="sip_to_user"/>
      <field name="sip_endpoint_disposition" chan-var-name="endpoint_disposition"/>
      <field name="sip_current_application" chan-var-name="current_application"/>
    </table>
    <!-- both legs will be inserted into this table -->
    <table name="cdr_table_both">
      <field name="CallId" chan-var-name="uuid"/>
      <field name="orig_id" chan-var-name="Caller-Unique-ID"/>
      <field name="TEST_id" chan-var-name="sip_from_uri"/>
    </table>
  </tables>
</configuration>

FS> load mod_odbc_cdr 动态加载
永久加载:/etc/freeswitch/autoload_configs/modules.conf.xml 中添加

利用mod_odbc_query 可以实现提取数据库的内容,动态配置fs,如动态路由
利用mod_callcenter 实现呼叫中心功能,如坐席、队列、自动分配

  • **多域
    internal配置中必须禁用:
    force-register-domain
    force-subscription-domain
    force-register-db-domain

  • **拨号计划

== 发送180 ring,开始振铃
== 暂停2秒,承上 这样才听得到振铃的声音,启下 让听2秒回铃音后回复200
== 发送200 OK 回应,摘机应答
== 前如有answer,再发200 OK并带SDP建立媒体通道播放。如没answer,则发送183,带SDP建立媒体通道,这时,播放媒体内容就成Early Media
== 发送 bye 挂机
==设置回铃音;准备给A-leg播放,播放前会发送183进行媒体协商;因为不确定播放时间,用set,等待后继动作
==桥接;如果桥接时B-leg给180,因为前面ringback的存在,会获得183回应
== 发送180 振铃
== 桥接;忽略B-leg的早期媒体(也就是183),回应其180
== 发送180 振铃
== 发送媒体,这两句就是典型的 pre_answer(播放彩铃)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值