FreeSwitch LUA Briding two calls with retry带重试次数的两个呼叫的桥接

2024-05-11 13:08

本文主要是介绍FreeSwitch LUA Briding two calls with retry带重试次数的两个呼叫的桥接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于:以下的代码先进行一次呼叫,并重试max_retries1次,并且有两个不同的网关。其中一个呼叫被确定,它将播放一个问候消息,然后将进行二次拨号,重试max_retries2次,第一个呼叫也确定时,将桥接这两个呼叫。当然也有包含激活立体声的呼叫记录的两行代码。

注意:

1.参数uuid可以通过查找事件套接字中对应的呼叫/信道变量来识别呼叫。

2.参数dialstrXY的格式必须为:sofia/gateway/gateway_name/dial_number或者类似于这样的格式。根据想呼叫的类型可已设置不同呼叫(originate)命令格式

3.参数greeting_snd是可选的,如果未传递该参数,第一个呼叫确定后问候信息将不会被播放。

4.根据给定的greeting_snd文件的格式,可能需要安装并激活mod_shout模块

5.如果你要将这个代码保存到一个文件中,需命名类似于bridge.lua,即一定要带后缀.lua,并用以下命令执行

luarun bridge.lua uuid dialstr1 dialstr2 dialstr12 dialstr22 [greeting_snd]" (greeting_snd is optional)
可以在FreeSWITCH控制台或者是freeSWITCH事件套接字中执行

uuid = argv[1];
dialstr1 = argv[2];
dialstr2 = argv[3];
dialstr12 = argv[4];
dialstr22 = argv[5];
greeting_snd = "";
if (#argv > 6 and not argv[6] == "") thengreeting_snd = "/tmp/audio/"..argv[6];
end
max_retriesl1 = 5;
max_retriesl2 = 3;
connected = false;
timeout = 45;
freeswitch.consoleLog("notice", "*********** STARTING Call ***********\n");
freeswitch.consoleLog("notice", "*********** DIALING "..dialstr1.." ***********\n");
originate_base1 = "{ignore_early_media=true,originate_timeout=90,hangup_after_bridge=true,uuid="..uuid..",leg=1}";
originate_str1 = originate_base1..dialstr1;
originate_str12 = originate_base1..dialstr12;
session1 = null;
retries = 0;
ostr = "";
repeat  retries = retries + 1;if (retries % 2) then ostr = originate_str1;else ostr = originate_str12; endfreeswitch.consoleLog("notice", "*********** Dialing Leg1: " .. ostr .. " - Try: "..retries.." ***********\n");session1 = freeswitch.Session(ostr);local hcause = session1:hangupCause();freeswitch.consoleLog("notice", "*********** Leg1: " .. hcause .. " - Try: "..retries.." ***********\n");
until not ((hcause == 'NO_ROUTE_DESTINATION' or hcause == 'RECOVERY_ON_TIMER_EXPIRE' or hcause == 'INCOMPATIBLE_DESTINATION' or hcause == 'CALL_REJECTED' or hcause == 'NORMAL_TEMPORARY_FAILURE') and (retries < max_retriesl1))
if (session1:ready()) then-- log to the consolefreeswitch.consoleLog("notice", "*********** Leg1 ("..ostr..") CONNECTED! ***********\n");-- Play greeting messageif (not greeting_snd == "") thenfreeswitch.consoleLog("notice", "*********** Playing greeting sound: "..greeting_snd.." ***********\n");--session1:execute("sleep", 100);session1:execute("playback", greeting_snd);endoriginate_base2 = "{ignore_early_media=true,originate_timeout=90,hangup_after_bridge=true,uuid="..uuid..",leg=2}";originate_str2 = originate_base2..dialstr2;originate_str22 = originate_base2..dialstr22;-- Set recording: uncomment these two lines if you'd like to record the call in stereo (one leg on each channel)-- session1:setVariable("RECORD_STEREO", "true");-- session1:execute("record_session", "/tmp/"..uuid..".wav");-- Set ringbacksession1:setVariable("ringback", "%(2000,4000,440,480)");retries = 0;session2 = null;repeat  -- Create session2retries = retries + 1;if (retries % 2) then ostr2 = originate_str2;else ostr2 = originate_str22; endfreeswitch.consoleLog("notice", "*********** Dialing: " .. ostr2 .. " Try: "..retries.." ***********\n");session2 = freeswitch.Session(ostr2, session1);local hcause = session2:hangupCause();freeswitch.consoleLog("notice", "*********** Leg2: " .. hcause .. " Try: " .. retries .. " ***********\n");until not ((hcause == 'NO_ROUTE_DESTINATION' or hcause == 'RECOVERY_ON_TIMER_EXPIRE' or hcause == 'INCOMPATIBLE_DESTINATION' or hcause == 'CALL_REJECTED' or hcause == 'NORMAL_TEMPORARY_FAILURE') and (retries < max_retriesl2))if (session2:ready()) thenfreeswitch.consoleLog("notice", "*********** Leg2 ("..ostr2..") CONNECTED! ***********\n");freeswitch.bridge(session1, session2);-- Hangup session2 if session1 is overif (session2:ready()) then session2:hangup(); endend-- hangup when doneif (session1:ready()) then session1:hangup(); end
end

注:本人翻译水平有限,如有误请指明

翻译出处:https://freeswitch.org/confluence/display/FREESWITCH/Lua+example+Bridging+two+calls+with+retry


这篇关于FreeSwitch LUA Briding two calls with retry带重试次数的两个呼叫的桥接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979617

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相