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

相关文章

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

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

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

由Lua 粘合的Nginx生态环境

转自:http://blog-zq-org.qiniucdn.com/pyblosxom/oss/openresty-intro-2012-03-06-01-13.html -- agentzh tech-club.org 演讲听录 免责聲明 Lua 粘合的 Nginx 生态环境 2.1. openresty 2.2. 配置小语言 2.3. ngx_drizzle 2.4.

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a