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

相关文章

剑指offer(C++)--和为S的两个数字

题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 class Solution {public:vector<int> FindNumbersWithSum(vector<int> array,int sum) {vector<int> result;int len = array.size();if(

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

两个基因相关性CPTAC蛋白组数据

目录 蛋白数据下载 ①蛋白数据下载 1,TCGA-选择泛癌数据  2,TCGA-TCPA 3,CPTAC(非TCGA) ②蛋白相关性分析 1,数据整理 2,蛋白相关性分析 PCAS在线分析 蛋白数据下载 CPTAC蛋白组学数据库介绍及数据下载分析 – 王进的个人网站 (jingege.wang) ①蛋白数据下载 可以下载泛癌蛋白数据:UCSC Xena (xena

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version

剑指offer—编程题7(用两个栈实现一个队列)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 代码如下: [java]  view plain copy print ? public class Test07 {       /**       * 用两个栈模拟的队列       *

算法9—两个巨大正整数相加

两个巨大整数相加,可能会造成溢出,或者它的大小已经超出基本数据类型的范围,所以,我们对巨大整数进行相加时,可以把它们转换成字符串,然后通过字符串的处理进行整数相加。 这里有两种做法:第一种,把整数存在一个字符数组里进行处理。代码如下: [java]  view plain copy public static String addThroughArray(String

算法8—不通过比较,找出两个数的最大值

问题: 比如:给定两个值 5和10,不通过比较,直接找出最大值。 分析: 一旦涉及到不用比较找最大值,想都不用想,一般只能通过位运算来实现。  max = a - ((a-b)&((a-b)>>31)) 或者 max = ((a+b)+|a-b|)/2 如果找最小值,我们只需把两个值相加,减去max即可。

算法6— 判断两个链表是否相交

问题: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针。时间复杂度控制在O(n)。 分析: 如果两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是: (1)先找到h1,h2的最后一个节点L1和L2,同时记录节点数量a,b;(这里假设 a > b) (2)判断最后一个节点是否相同

SpringBoot中如何监听两个不同源的RabbitMQ消息队列

spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在同事的帮助下,成功实现了监听多个MQ。下面我给大家一步一步讲解下,也为自己做个笔记; 详细步骤: 1. application.properties 文件配置: u.rabbitmq.ad

pytest测试框架flaky插件重试失败用例

Pytest提供了丰富的插件来扩展其功能,本章介绍下插件flaky ,用于在测试用例失败时自动重新运行这些测试用例。与前面文章介绍的插件pytest-rerunfailures功能有些类似,但是功能上不如pytest-rerunfailures插件丰富。 flaky官方并没有明确python和pytest版本限制。 flaky安装 使用pip命令安装: pip install flaky