freeswitch 写lua心得体会

文章讲述了如何使用Lua脚本来实现FreeSWITCH中的交互式语音应答(IVR)功能,包括播放语音、接收DTMF输入以及在拨号计划中调用Lua脚本。此外,还提到了在FreeSWITCH中设置事件回调和桥接前执行Lua脚本的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用ivr的时候,一般都是lua实现ivr。虽然fs提供了menu的配置,但是感觉不太灵活。要使用lua的ivr首先得 写一个lua的脚本。

--打印日志
session:consoleLog("info","--------------进入欢迎的语音菜单");
--要执行answer才能给对方播放语音菜单
session:answer();
--设置这一行才会在lua执行完毕之后不自动挂断
session:setAutoHangup(false)

--在死循环里面一定要判断当前会话还有没有效
while(session:ready()==true) do

        --播放语音,告诉对方,每一个拨号的选项
        session:streamFile("/usr/local/freeswitch/sounds/welcome.wav");

        --这里获取对端输入的dtmf信息,也就算按下的是多少
        local digit = session:getDigits(2, "#", 1000);
         --下面对数字逐一判断 选择执行
        if(digit == "0") then

                --如果匹配按下的是0,进入call center,call center是一个APP,默认没用call center模块,需要在源码自行安装并且 需要load mod_callcenter加载
                session:consoleLog("info","进入callcenter");
                session:execute("callcenter","necoagent");
        end
end

然后就需要在拨号计划里面指定给lua执行了。lua也是一个app.

  <extension name="default_1236">
         <condition field="destination_number" expression="^(1236)$">
        <action application="lua" data="脚本所在目录/脚本文件名"/>
      </condition>
    </extension>

这样,当我向fs拨号1236的时候就会执行我的脚本

lua在fs中应用非常广。还可以在lua里面监听某一个事件进而进行处理。在conf/autoload_configs/lua.conf.xml 里面可以设置事件回调的hook.

<hook event="CUSTOM" subclass="conference::maintenance" script="lua目录/lua文件名"/>

加上这样一句之后,当有事件自定义事件的conference::maintenance 发生的时候就会执行这个lua的脚本。当然有些事件也可以在拨号计划里面指定脚本

 <action application="set" data="bridge_pre_execute_aleg_app=lua"/>
   <action application="set" data="bridge_pre_execute_aleg_data=/usr/local/freeswitch/scripts/a.lua"/>

加上这两句,就会在桥接之前在a腿上执行lua. 

### 关于 FreeSWITCHLua 脚本的使用 在 FreeSWITCH 控制台中,可以通过两种方式运行 Lua 脚本:`lua` 和 `luarun` 命令。当使用 `lua` 命令时,控制台会被阻塞直到脚本完成执行[^1]。而通过 `luarun` 执行,则会在新线程中启动脚本,不会影响控制台操作,不过这种方式下脚本无法访问流对象。 #### 示例 1: 创建简单的 Lua 脚本并调用 假设我们希望编一个简单的 Lua 脚本来播放一段欢迎语音: ```lua -- welcome.lua session:answer() session:sleep(2000) session:streamFile("ivr/8000/wilkommen.wav") ``` 此脚本的功能如下: - 首先接听来电 (`session:answer()`)。 - 接着暂停两秒以便稳定连接状态 (`session:sleep(2000)`)。 - 最后播放预定义的声音文件 [`wilkommen.wav`](`session:streamFile()`)[^4]。 要让这个脚本生效,在拨号计划配置文件 `/etc/freeswitch/dialplan/default.xml` 中添加以下扩展名: ```xml <extension name="Welcome Call"> <condition field="destination_number" expression="^1234$"/> <action application="lua" data="welcome.lua"/> </extension> ``` 这样拨打号码 `1234` 的呼叫将会触发该 Lua 脚本。 #### 示例 2: 订阅事件 利用 Lua 脚本还可以实现更复杂的逻辑处理,比如监听特定类型的事件。下面是一个例子展示如何设置事件消费者来接收指定名称的事件通知: ```lua local event_name = "CUSTOM" local sub_class_type = "my_event" function handle_event(event) local body = event:getBody() print(body) end con = freeswitch.EventConsumer(event_name, sub_class_type) while true do local evt = con:popEvent() if evt then handle_event(evt) end end ``` 上述代码片段展示了如何订阅自定义事件,并在其发生时打印其主体内容[^2]。 #### 示例 3: 开发小游戏应用 另一个有趣的案例是在电话系统上开发一个小游戏。例如设计一个猜数字的游戏程序,用户输入一系列按键尝试猜测随机生成的目标数值。以下是简化版的设计思路概述: 修改默认拨号计划中的 XML 定义部分,增加一个新的条件分支指向我们的游戏脚本位置: ```xml <extension name="Number Guessing Game"> <condition field="destination_number" expression="^7890$"/> <action application="lua" data="/path/to/game.lua"/> </extension> ``` 随后创建对应的 Lua 游戏逻辑脚本 game.lua 来响应用户的交互行为[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值