freeswitch通过lua脚本实现多方会话功能,包括会议录音自动外呼等

freeswitch 会议模块

freeswitch 自带有多方会议功能,在安装目录下的conf/autoload_configs/modules.conf.xml中,开启会议功能,通常默认是启用的,默认的 dialplan 配置下,注册分机拨3000即可进入默认配置的会议功能。这里的 3000 指的是会议号码,多个分机都拨这个号码即可进入同一个会议。

会议模块相关配置

会议模块同样也有对应的全局配置,例如配置特定类型的会议的按键规则和其他规则等。这些都可以在配置文件conf/autoload_configs/conference.conf.xml中实现。

下面将对按键规则和定制会议功能做详细介绍。
首先是按键规则,这里配置的按键规则适用于 default 类型的所有会议。在conference.conf.xml中的<caller-controls>中。其中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 类型的会议为例,同样的你可以配置其他类型的会议的定制功能,只需要在使用会议时指定是什么类型的会议即可。这些配置都在<profiles>标签下。

以 default 类型的会议为例,详细参数介绍和配置内容参见官方文档

<profile name="default">
    <param name="domain" value="$${domain}"/>
    <!-- Sample Rate-->
    <param name="rate" value="8000"/>
    <!-- Number of milliseconds per frame -->
    <param name="interval" value="20"/>
    <!-- Energy level required for audio to be sent to the other users -->
    <param name="energy-level" value="300"/>
    <!-- 会议中2人及以上时开始录音 -->
    <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"/>
    <!-- File to play to acknowledge muted -->
    <param name="muted-sound" value="conference/conf-muted.wav"/>
    <!-- File to play to acknowledge unmuted -->
    <param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
    <!-- File to play if you are alone in the conference -->
    <param name="alone-sound" value="conference/conf-alone.wav"/>
    <!-- File to play endlessly (nobody will ever be able to talk) -->
    <!--<param name="perpetual-sound" value="perpetual.wav"/>-->
    <!-- File to play when you're alone (music on hold)-->
    <param name="moh-sound" value="$${hold_music}"/>
    <!-- File to play when you join the conference -->
    <param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
    <!-- File to play when you leave the conference -->
    <param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
    <!-- File to play when you are ejected from the conference -->
    <param name="kicked-sound" value="conference/conf-kicked.wav"/>
    <!-- File to play when the conference is locked -->
    <param name="locked-sound" value="conference/conf-locked.wav"/>
    <!-- File to play when the conference is locked during the call-->
    <param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
</profile>

dialplan配置

dialplanfreeswitch作为呼叫系统的一个中枢,所有会话的方向都由它决定,它的配置文件是在 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 的值是 3000domain_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="ringback=${us-ring}"/> -->  
    
    <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>

配置说明:

  1. conference_auto_outcall_caller_id_nameconference_auto_outcall_caller_id_number表示会议室在外呼时的外显号码。
  2. conference_set_auto_outcall是会议室中发起外呼的应用,通过配置 data 值可以自动发起外呼。这里的号码源自主叫所拨的好号码中,例如主叫拨打95126_1234567_2345678这个号码进入会议室,同时会议室会呼叫12345672345678这两个号码。
  3. 在配置会议室时,这里也用到了 default 默认配置。并且通过 flag 配置了两个新的参数,其中 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 来对这通会话做一些配置或者操作。

上面的例子中,表示的是通过主叫号码从数据库查询得到两个被叫号码,并且形成会议自动呼叫被叫号码的功能。

  1. 通过 session:getVariable() 方法,我们可以拿到这通会话的一些基础信息,如主被叫等。具体有哪些值请参考官方文档
  2. 在通过 freeswitch.Dbh(“freeswitch”, “root”, “123456”) 获取数据库连接的时候,参数分别为数据库名称,账号和密码,需要注意的是,这里的数据库名称并不是 MySQL 中的数据库名称,而是配置在 /etc/odbc.ini 中的数据库名称(方括号内的)
  3. 数据库连接成功后,通过 query 方法执行 SQL 语句,并且通过回调函数对拿到的数据进行处理,其中 dbh:release(); 是释放数据库连接资源。
  4. 与 dialplan 中不同的是,这里配置拨号计划需要使用 session 的 execute 方法,参数第一个对应 application,第二个对应 data。
  5. 在发起外呼的时候,这里所配置的是呼叫 freeswitch 内部分机的形式,即 user/+分机号+@IP 的形式,如果有对接外部网关,则应该这样配:sofia/gateway/+网关名+/+号码。
  6. lua 语法上,变量前加 local 为本地变量,不加 local 为全局变量。
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值