FreeSWITCH常用API

1,075 阅读6分钟

FreeSWITCH常用API汇总

FreeSWITCH有很多的endpoint,这些endpoint作为出入口,可以接受来话与处理外呼。当产生一个channel也就是常说一条腿之后,我们可以通过不同的APP组合来实现不同的功能。

什么是APP?一般路由里执行的就是APP,例如:answer bridge echo playback conference callcenter set等等,这些都可以直接写到dialplan中。

那什么是API?API就是用来控制FreeSWITCH或者通话的,fs_cli大家都应该熟悉,fs_cli可以执行的就是API,例如:status uuid_bridge bgapi sched_api等等。

核心相关的API

status

查看FreeSWITCH运行状态,包括启动的时间,session及sps统计,空闲CPU等。

version

版本号及对应Git hash。

show

showAPI包含很多参数,常用的有:

  • show channels:显示正在通话的channel信息,支持like参数过滤
  • show api:显示FreeSWITCH支持的API列表,包含API的参数及说明,其实知道这个命令就不用阅读下文了,按照参数操作就可以了
  • show application:显示APP列表,刚接触FreeSWITCH可以通过该命令查看支持的APP,并对感兴趣的进行测试

global_getvar & global_setvar

设置或者查询全局变量,如果不确定全局变量名字,可以直接输入global_getvar并回车,会显示所有的全局变量。

module_exists

检查某个模块是否已经加载,当然也可以通过reload来验证,如果TAB能补全就说明已经加载了。

load & unload & reload

加载、卸载或者重载模块。

regex

正则校验,比如regex 1234|^1234$,注意|不能省略。

reloadxml

重载配置文件,修改dialplan记得reloadxml,修改模块的配置一般需要reload模块。

reloadacl

重载acl。

sched_api & unsched_api

延迟执行API,例如:sched_api +3 group1 log helloworld,单位为秒,执行sched_api会返回task id,unsched_api指定task id可以取消。

sched_hangup

类似sched_api原理,延迟一段时间后挂断sched_api +3 uuid

bgapi

后台执行API,就是在新的线程中执行,有些操作是阻塞的,不想死等就bgapi

shudown

停止FreeSWITCH。

fsctl

参数众多,感兴趣的可以输入fsctl并回车,会有详细的参数说明,这里只列举常用的:

  • send_sighup:核心fire TRAP事件,订阅该事件的模块执行模块逻辑,logfile模块会rotate一个新的log文件,这样复现问题下载日志时会比较干净,同样cdr模块也会类似动作。
  • sps:限制呼叫速率
  • max_sessions:限制最大并发
  • sync_clock sync_clock_when_idle:同步FreeSWITCH clock,发现时间不对了sync试试
  • loglevel:参数0-7,对应日志级别从CONSOLE-DEBUG
  • debug_level:参数0-10,小心日志刷屏,代码种很多log级别类似DEBUG1,正常看不到的,不过可以很多细节的处理流程,或者能直接发现音视频不通的问题点

originate

重点来了,FreeSWITCH就是用来打电话的,originate需要非常熟练才可以。直接在fs_cli执行originate发现命令半天没有反应是怎么回事?originate是阻塞的,直到对方应答或者有early media才会返回,如果不想阻塞可以搭配bgapi使用。

originate参数众多,其实就是呼叫字符串与APP的组合,这里举一些常用的例子:

# 呼叫注册用户并执行echo
originate user/1000 &echo
# 呼叫注册用户并播放视频
originate user/1001 &playback(/tmp/tmp.mp4)
# 呼叫并bridge
originate user/1001 &bridge(user/1006)
# 呼叫并转到路由
originate user/1006 9196 XML default

上面都是最简单的呼叫场景,稍微复杂一点,呼叫时可以指定不同的参数(通道变量)从而控制呼叫的一些行为,只需要加到呼叫字符串前面即可,比如:{execute_on_answer='record_session /tmp/tmp.mp4'}

需要说明的是{}之间不同的参数以逗号分隔,如果参数本身带逗号需要\转义,比如:{absolute_codec_string=PCMA\,PCMU\,H264}

不管是呼叫的参数还是执行的APP的参数如果有空格需要用''引起来。

如果想在originate成功后执行多个APP呢,使用inlinedialplan即可,多个APP用,分隔,APP的参数用:分隔,比如:

originate user/1006 playback:a.mp4,playback:2.mp4 inline

sofia相关的API

SIP的endpoint模块,相关的配置直接影响到SIP的注册呼叫行为。

  • sofia status:查看sofia profile以及gateway的状态
  • sofia status profile default:查看profile的详细信息,包含监听的ip port和ext ip还有编解码信息等
  • sofia status gateway gw1:查看gateway的详细信息
  • sofia_contact 1000:获取注册账号的contact信息,返回的值是可以直接当作呼叫字符串用的
  • sofia global siptrace on:打开信令日志,默认log或控制台中看不到SIP信令
  • sofia loglevel all 9:打开底层协议栈sofia-sip的日志
  • sofia profile default restart:重启profile
  • sofia profile default rescan:重新扫描profile,修改了profile,又不想重启可以直接rescan

以上的参数比较常用,其他的可以根据前缀TAB补全查看,记得多用TAB

通话相关的API

呼叫通了只是第一步,我们可以通过FreeSWITCH丰富的API来对通话进行监控或控制,常用的API如下:

  • uuid_dump:可以查看指定uuid的channel的详细信息,记不住的通道变量可以从这里查找,并且还支持json格式
  • uuid_bridge:可以把两个uuid对应的通话桥接起来
  • uuid_broadcast:执行APP,作者一般用来对通话的双方进行放音或播放视频,uuid_broadcast uuid x.mp4
  • uuid_replace:通过media bug方式替换掉或者mux音频
  • uuid_hold:保持
  • uuid_kill:挂掉通话,可以指定cause,对应不同的挂断码
  • uuid_media_reneg:重协商编解码re-INVITE
  • uuid_phone_event:NOTIFY hold talk
  • uuid_record:录音或录像
  • uuid_send_dtmf:发送按键dtmf
  • uuid_send_info/uuid_send_message:INFO/MESSAGE
  • uuid_debug_media:查看通话的音视频收发情况,呼叫中没有声音或视频,可以通过该命令检查收发是否有问题
  • uuid_setvar/uuid_getvar:设置或获取指定通话的通道变量

conference相关的API

conference的API这里只考虑mux融屏模式的,命令格式为conference name args,常用args如下:

  • list/json_list:列出会议的成员列表,包含member id和状态信息等
  • mute/unmute:对指定的成员进行静音,也可以mute all
  • deaf/undeaf:不让指定的成员听到会议音频,跟mute是不同的方向
  • vmute/unvmute:关闭成员的视频
  • tmute/tvmute:翻转,之前为mute,执行tmute相当于执行unmute,视频类似
  • vid-layout:设置画布的布局,比如1x1 2x2 group:grid,布局可以自行配置,参见conferece/layouts/default.xml
  • vid-floor:layout中可以带floor属性,一般用在一大N小的布局中,大的位置为floor,这样可以直接把指定的成员放到最大的位置上
  • vid-layer:布局都有索引,比如2x2从左上到右下依次为1 2 3 4,这样可以调整显示位置
  • vid-res-id:布局可以带reservation_id属性,这相当于工位,给成员指定res-id会显示在对应的位置上。
  • vid-canvas:会议支持多画布,需要修改会议profile中canvas-count,该指令可以把成员放到指定的画布上
  • vid-watching-canvas:多画布模式,指定成员观看指定的画布,某个成员可以在画布1但是看画布2
  • agc/volume_in:音频增益及调整成员音量

后面有机会再详细介绍conference的配置及使用。

最后

前期用FreeSWITCH API记不住怎么办,可以fs_cli -x "show api" | grep xxx大体搜一下,API参数不知道又不想看代码,可以查看show api或者输入API直接回车,一般都有参数说明。

孰能生巧,其实日常中常用的就那几个。