freeswitch 自带有多方会议功能,在安装目录下的conf/autoload_configs/modules.conf.xml
中,开启会议功能,通常默认是启用的,默认的 dialplan 配置下,注册分机拨3000
即可进入默认配置的会议功能。这里的 3000 指的是会议号码,多个分机都拨这个号码即可进入同一个会议。
会议模块同样也有对应的全局配置,例如配置特定类型的会议的按键规则和其他规则等。这些都可以在配置文件conf/autoload_configs/conference.conf.xml
中实现。
下面将对按键规则和定制会议功能做详细介绍。
首先是按键规则,这里配置的按键规则适用于 default 类型的所有会议。在conference.conf.xml
中的
中。其中action
表示按键后的功能,digits
表示按键。action
有多种,详见官方文档,例如mute
为静音等。
<caller-controls>
<group name="default">
<control action="mute" digits="0"/>
<control action="deaf mute" digits="*"/>
<control action="energy up" digits="9"/>
<control action="energy equ" digits="8"/>
<control action="energy dn" digits="7"/>
<control action="vol talk up" digits="3"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk dn" digits="1"/>
<control action="vol listen up" digits="6"/>
<control action="vol listen zero" digits="5"/>
<control action="vol listen dn" digits="4"/>
<control action="hangup" digits="#"/>
group>
caller-controls>
其次是会议相关的其他配置,这里依旧以 default 类型的会议为例,同样的你可以配置其他类型的会议的定制功能,只需要在使用会议时指定是什么类型的会议即可。这些配置都在
标签下。
以 default 类型的会议为例,详细参数介绍和配置内容参见官方文档
<profile name="default">
<param name="domain" value="$${domain}"/>
<param name="rate" value="8000"/>
<param name="interval" value="20"/>
<param name="energy-level" value="300"/>
<param name="min-required-recording-participants" value="2"/>
<param name="auto-record" value="$${base_dir}/recordings/${strftime(%Y-%m-%d-%H-%M-%S)}_${conference_name}.wav"/>
<param name="muted-sound" value="conference/conf-muted.wav"/>
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
<param name="alone-sound" value="conference/conf-alone.wav"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
<param name="locked-sound" value="conference/conf-locked.wav"/>
<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
profile>
dialplan
是freeswitch
作为呼叫系统的一个中枢,所有会话的方向都由它决定,它的配置文件是在 freeswitch
安装目录下的 conf/dialplan/default.xml
中,default.xml
是默认的 dialplan
配置,具体使用哪个 dialplan
可以在 conf/sip_profile
下的配置文件中配置。我们这里以 default.xml
为例。
每一通会话都有主叫和被叫号码,在 dialplan
配置中,通过 xml
配置规则,会话通过正则表达式的匹配来决定使用那个配置规则,从而得到会话的下一步走向。
例如,我们前面配置了会议室,那么可以在默认的 dialplan
配置中配置一个简单的会议室,号码为3000
的会议室,freeswitch
内部分机注册后可以拨打3000
进入会议室,具体限制和参数配置以前面会议室配置为主。
dialplan
配置,extension
标签外围由 include
标签和 context
标签包裹,这里不展示。具体参考 freeswitch
安装后默认的 dialplan
配置。
<extension name="nb_conferences">
<condition field="destination_number" expression="^(3000)$">
<action application="answer"/>
<action application="conference" data="$1-${domain_name}@default"/>
condition>
extension>
配置说明:
首先我们是要在dialplan
中配置一个拨号计划,即 extension
, 每个extension
下可以有多个condition
,即匹配规则。这里只有一个匹配规则,多个的情况下可以进行按顺序多次匹配。例子中我们是拿会话的被叫号码来做匹配(被叫号码就是输入的号码,自身的号码是主叫),destination_number
表示被叫号码。匹配成功后,进入内部执行 action
,首先是给予应答,然后创建会议室。其中 $1 的值是 3000
。domain_name
的值在 vars.xml 文件中,默认为本机 ip
。
至此,我们可以使用分机拨打 3000
进入会议室了,任何分机都可以通过拨打这个号码进入 3000
这个会议室。
通常在实际情况中更多的是由一个人创建会议室并且呼叫其他成员加入会议。因此我们需要会议室能够自己去呼叫需要呼叫的号码。
这同样是可以在dialplan
中配置的,如下:
<extension name="MY_Extension">
<condition field="destination_number" expression="^95126_(\d{7,15})_(\d{7,15})$">
<action application="answer"/>
<action application="set" data="conference_auto_outcall_caller_id_name=${caller_id_name}"/>
<action application="set" data="conference_auto_outcall_caller_id_number=${caller_id_number}"/>
<action application="set" data="conference_auto_outcall_timeout=60"/>
<action application="set" data="conference_auto_outcall_flags=none"/>
<action application="set" data="conference_auto_outcall_profile=default"/>
<action application="conference_set_auto_outcall" data="user/$1"/>
<action application="conference_set_auto_outcall" data="user/$2"/>
<action application="conference" data="ehby-$1-$2@default+flags{endconf|moderator}"/>
condition>
extension>
配置说明:
conference_auto_outcall_caller_id_name
和conference_auto_outcall_caller_id_number
表示会议室在外呼时的外显号码。conference_set_auto_outcall
是会议室中发起外呼的应用,通过配置 data 值可以自动发起外呼。这里的号码源自主叫所拨的好号码中,例如主叫拨打95126_1234567_2345678
这个号码进入会议室,同时会议室会呼叫1234567
和2345678
这两个号码。endconf
表示主持人挂机则停止会议。moderator
则标识了主持人,这里表示将主叫作为主持人。这样我们就可以通过输入呼叫的号码来形成会议室并且自动呼叫需要加入会议室的其他成员,但是这里的缺点就是要手动输入号码,并且输入的号码会很长。
lua
脚本实现从数据库获取被叫形成会议要使用 lua
脚本,则需要在 module.conf.xml
中打开对于 lua
脚本的支持。其次数据库使用MySQL
,但是 lua
脚本要连接数据库的话,需要安装 ODBC
来连接。
通过下面的操作来安装和配置 ODBC
yum install unixODBC-devel mysql-connector-odbc
/etc/odbc.ini
[freeswitch]
DRIVER = MySQL
SERVER = 127.0.0.1
PORT = 3306
DATABASE = freeswitch
USER = root
PASSWORD = 123456
OPTION = 3
测试连接,执行:isql freeswitch -v
测试连接成功后,就可以来编写 lua
脚本实现功能了,首先是脚本存放的位置,在 freeswitch
安装目录下的 script
文件夹下,而调用 lua
脚本的操作则配置在 dialplan
中。
假设我们要写的脚本名称叫做 meeting.lua
,则在 dialplan
中配置如下:
<extension name="nb_conferences">
<condition field="destination_number" expression="^(3000)$">
<action application="lua" data="meeting.lua"/>
condition>
extension>
这样一来,凡是呼叫 3000
号码的,都会执行该脚本。
其次是编写 lua
脚本,脚本如下:
local caller_id_number = session:getVariable("caller_id_number");
destination_number = session:getVariable("destination_number");
--自动呼叫被叫时的外显号码
display_number = "";
freeswitch.consoleLog("NOTICE", "形成会议室caller_id_number = " .. caller_id_number .. ",destination_number = ".. destination_number .."\n");
local dbh = freeswitch.Dbh("freeswitch", "root", "123456");
freeswitch.consoleLog("NOTICE","start connect mysql...\r\n");
local sql = "select count(*) as count, phone1 as firstcallee,phone2 as secondcallee from tb_number where phone = "..caller_id_number;
if(dbh:connected())
then
freeswitch.consoleLog("INFO","connect success!!!\r\n");
dbh:query(sql, function(row)
freeswitch.consoleLog("NOTICE","行数:" .. row.count .. ",会话被叫1:" .. row.firstcallee ..",会话被叫2:"..row.secondcallee.. "\r\n");
if(row.count == “0”)
then
session:hangup();
else
session:execute("set","conference_auto_outcall_caller_id_name=${"..display_number.."}");
session:execute("set","conference_auto_outcall_caller_id_number=${"..display_number.."}");
session:execute("set","conference_auto_outcall_timeout=60");
session:execute("set","conference_auto_outcall_flags=none");
session:execute("set","conference_auto_outcall_profile=default");
session:execute("conference_set_auto_outcall" data="user/"..row.firstcallee.."@127.0.0.1");
session:execute("conference_set_auto_outcall" data="user/"..row.secondcallee.."@127.0.0.1");
session:execute("conference", "ehby-${caller_id_name}-${destination_number}@default+flags{endconf|moderator}");
end
end);
dbh:release();
else
freeswitch.consoleLog("ERR","Unable to connect to mysql database\r\n");
session:hangup();
end
dialplan
中调用 lua
脚本时,会自动传入一个 session
表示当前这通会话,session
中包含了当前这通会话的所有信息,包括主被叫等,并且可以通过 session
来对这通会话做一些配置或者操作。
上面的例子中,表示的是通过主叫号码从数据库查询得到两个被叫号码,并且形成会议自动呼叫被叫号码的功能。