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_clocksync_clock_when_idle:同步FreeSWITCH clock,发现时间不对了sync试试loglevel:参数0-7,对应日志级别从CONSOLE-DEBUGdebug_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:重启profilesofia 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.mp4uuid_replace:通过media bug方式替换掉或者mux音频uuid_hold:保持uuid_kill:挂掉通话,可以指定cause,对应不同的挂断码uuid_media_reneg:重协商编解码re-INVITEuuid_phone_event:NOTIFY hold talkuuid_record:录音或录像uuid_send_dtmf:发送按键dtmfuuid_send_info/uuid_send_message:INFO/MESSAGEuuid_debug_media:查看通话的音视频收发情况,呼叫中没有声音或视频,可以通过该命令检查收发是否有问题uuid_setvar/uuid_getvar:设置或获取指定通话的通道变量
conference相关的API
conference的API这里只考虑mux融屏模式的,命令格式为conference name args,常用args如下:
list/json_list:列出会议的成员列表,包含member id和状态信息等mute/unmute:对指定的成员进行静音,也可以mute alldeaf/undeaf:不让指定的成员听到会议音频,跟mute是不同的方向vmute/unvmute:关闭成员的视频tmute/tvmute:翻转,之前为mute,执行tmute相当于执行unmute,视频类似vid-layout:设置画布的布局,比如1x12x2group:grid,布局可以自行配置,参见conferece/layouts/default.xmlvid-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但是看画布2agc/volume_in:音频增益及调整成员音量
后面有机会再详细介绍conference的配置及使用。
最后
前期用FreeSWITCH API记不住怎么办,可以fs_cli -x "show api" | grep xxx大体搜一下,API参数不知道又不想看代码,可以查看show api或者输入API直接回车,一般都有参数说明。
孰能生巧,其实日常中常用的就那几个。