写点什么

一文读透,FreeSWITCH 的 originate 命令解析及示例

  • 2023-07-14
    福建
  • 本文字数:2573 字

    阅读完需:约 8 分钟

FreeSWITCH 版本:1.10.9

操作系统:CentOS 7.6.1810



originate 经常用于发起呼叫,在实际工作过程中用到的也比较多,今天总结下基本用法,也方便我以后查阅。


一、wiki 及源码介绍


该命令在 FreeSWITCH 官方 wiki 也有介绍,这里列下 wiki 地址。


wiki 首页:https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/


originate 相关 wiki 地址:


https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Dialplan/Freeswitch-IVR-Originate_9634753/#docusaurus_skipToContent_fallback



 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Examples/Originate-Example_10682745/#docusaurus_skipToContent_fallback



 源码文件:mod_commands.c


对应函数:originate_function



 二、命令格式及解释


命令使用的基础模板:


originate ALEG BLEG


 在 fs_cli 控制台使用的完整语法如下:


originate <call url> <exten>|&<application_name>(<app_args>) [<dialplan>][&lt;context>] [<cid_name>][&lt;cid_num>] [<timeout_sec>]
复制代码


其中,


originate 为命令关键字,为必选字段,用于定义 ALEG 的呼叫信息,也就是通常说的呼叫字符串,可以通过通道变量定义很多参数;


|&<application_name>(<app_args>)  为必选字段,用于指定 BLEG 的分机号码或者用于创建 BLEG 的 app(比如 echo、bridge 等);


[][<context>]  可选参数,该参数用于指定 dialplan 的 context,默认值:xml default ;


[<timeout_sec>] 可选参数,该参数用于指定 originate 超时,默认值:60 ;


 示例呼叫:


originate user/1000 9196 xml default 'mike' 18612345678 
复制代码


呼叫效果如下:


 

 三、常见使用方式


1、基础使用


  • echo 呼叫


示例如下:


originate user/1000 &echo
复制代码


先呼叫 1000 分机,1000 分机接听后,将 1000 分机所在的 channel 桥接到 echo 应用(将话筒传入的声音播放到听筒),以下命令具备同样效果:


originate user/1000 9196
复制代码


  • 分机互相拨打


示例如下:


originate user/1000 1001
复制代码


先呼叫 1000 分机,1000 分机接听后,再呼叫 1001 分机,1001 分机接听后,将 1000 分机所在的 channel 桥接 1001 的 channel,通话建立。 


  • bridge 到其它终端


这里以分机为例进行演示,具体如下:


originate user/1000 &bridge(user/1001)
复制代码


和分机互相拨打类似。


  • 分机共振


 使用逗号语法关键字,示例如下:


originate user/1000,user/1001 9196
复制代码


1000 分机和 1001 分机同时响铃,任意一个分机接听后,另外一个分机自动挂机。


  • 分机轮询


 使用 | 语法实现,这里需要注意下,有呼叫默认超时时间的设置,示例如下:


originate {originate_timeout=30}[leg_timeout=10]user/1000|[leg_timeout=10]user/1001 9196
复制代码


1000 分机先振铃,10 秒超时后呼叫 1001 分机。


  • 呼叫外线


通过 external 进行外线呼叫,示例如下:


originate  {origination_caller_id_number=00000000,origination_caller_id_name=000000000}sofia/external/18612345678@192.168.1.100:5060 &echo
复制代码


  • 播放音频给分机


使用 playback 命令进行声音播放:


originate user/1000 &playback(/tmp/test1.wav)
复制代码


播放 moh 音频:


originate user/1000 &playback(local_stream://moh)
复制代码


无限循环播放:


originate user/1000 &endless_playback(/tmp/test1.wav)
复制代码


使用 file_string 进行多个文件依次顺序播放:


originate user/1000 &playback(file_string:///tmp/test1.wav!/tmp/test2.wav)
复制代码


2、通道变量的使用


originate 字符串里面可以设置很多通道变量来定义呼叫参数,基本使用格式示例如下:


originate {var1=$value1,var2=$value2}/user/1000 9196originate {var1=$value1}[var2=$value2]/user/1000 9196
复制代码


其中,大括号用于定义呼叫的通道变量,中括号用来定义某条 leg 的局部通道变量。


这里列举下常见的通道变量。


  • origination_uuid


发起呼叫时,用于定义 leg 的 uuid,示例如下:


1)在呼叫时,指定 A 腿的 uuid


originate {origination_uuid=xxxxx}user/1000 1001
复制代码


2)在呼叫时,同时指定 A 腿和 B 腿的 uuid


originate {origination_uuid=xxxxx}user/1000 &bridge({origination_uuid=yyyyy}user/1001)
复制代码


  • origination_caller_id_name / origination_caller_id_number


用于设置主叫名称及号码,示例如下:


originate {origination_caller_id_name="mike",origination_caller_id_number=18612345678}user/1000 9196
复制代码


会在话机及 sip 协议中体现,具体如下:


 

  • ignore_early_media


该参数适用于 A leg,定义是否忽略 B leg 的 early media。


  • originate/bridge


用于定义 originate/bridge 过程中的呼叫时长,超过该时间后就呼叫超时。


示例参考分机轮询部分。


  • leg_timeout


用于定义 originate/bridge 过程中某条 leg 的呼叫时长,超过该时间后就呼叫超时。


示例参考分机轮询部分。


  • absolute_codec_string


用于指定语音编码,示例如下:


originate {absolute_codec_string=‘^^:PCMA:PCMU’}user/1000 &playback(local_stream://moh)
复制代码


其中,"^^"为转义符,后面跟冒号表示用冒号替代逗号。 


  • 自定义通道变量


在 originate 字符串中可以自定义通道变量,示例如下:


originate {var123="test123"}user/1000 9196
复制代码


效果如下:



 通道变量名称会自动添加 variable_ 前缀,具体来说就是 variable_var123



  • 更多通道变量


具体参考 switch_ivr_originate 函数(switch_ivr_originate.c 文件)




3、添加自定义 sip 头


在 originate 字符串中,可以自定义 sip 头,通过添加 sip_h_X 前缀来试下,示例如下: 


originate {sip_h_X-varTest='123456'}user/1000 &playback(local_stream://moh)
复制代码


会在 sip 协议中添加自定义的 header,具体效果如下:



4、特殊呼叫


  • loopback 呼叫


1)拨号方案自带的 loopback


示例呼叫:


originate user/1000 &bridge(loopback/wait)
复制代码


具体定义如下:



 2)自定义 loopback


dialplan 添加如下内容:


呼叫测试:

originate user/1000 &bridge(loopback/loopTest1)
复制代码


  • null 呼叫


呼叫示例:


originate null/1000 &echo
复制代码


具体效果:



 也可以和 bridge 一起使用:


originate user/1000 &bridge(null/1234)
复制代码


具体效果:



  • 其它 endpoint 呼叫


这里以 rtc 为例,演示其它 endpoint 呼叫:


bgapi originate {origination_uuid=111222}rtc/test &echo
复制代码


具体效果如下:



  • 指定 sip 使用 tcp 协议呼叫


需要使用 transport=tcp 来指定协议,示例如下:


originate {origination_caller_id_name=1111}user/1000;transport=tcp  &playback(local_stream://moh)
复制代码


效果如下:



文章转载自:Mike_Zhang

原文链接:https://www.cnblogs.com/MikeZhang/p/originate20230402.html

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
一文读透,FreeSWITCH的originate命令解析及示例_教程_快乐非自愿限量之名_InfoQ写作社区