originate 是一个命令(Command),它用于控制 FreeSWITCH 发起一个呼叫。
FreeSWITCH 的命令不仅可以在控制台上使用,也可以在各种嵌入式脚本、Event Socket (fs_cli 就是使用了 ESL库)或 HTTP RPC 上使用,所有命令都遵循一个抽像的接口,因而这些命令又称 API Commands。
echo() 则是一个程序(Application,简称 APP),它的作用是控制一个 Channel 的一端。我们知道,一个 Channel 有两端,在上面的例子中,alice 是一端,别一端就是 echo()。电话接通后相当于 alice 在跟 echo() 这个家伙在通话。另一个常用的 APP 是 park()
originate user/alice &park() 复制代码
我们初始化了一个呼叫,在 alice 接电话后对端必须有一个人在跟也讲话,否则的话,一个 Channel 只有一端,那是不可思议的。而如果这时 FreeSWITCH 找不到一个合适的人跟 alice 通话,那么它可以将该电话“挂起”,park()便是执行这个功能,它相当于一个 Channel 特殊的一端。
park() 的用户体验不好,alice 不知道要等多长时间才有人接电话,由于她听不到任何声音,实际上她在奇怪电话到底有没有接通。相对而言,另一个程序 hold()则比较友好,它能在等待的同时播放保持音乐(MOH, Music on Hold)。
originate user/alice &hold() 复制代码
当然,你也可以直接播放一个特定的声音文件:
originate user/alice &playback(/root/welcome.wav) 复制代码
或者,直接录音:
originate user/alice &record(/root/voice_of_alice.wav) 复制代码
以上的例子实际上都只是建立一个 Channel,相当于 FreeSWITCH 作为一个 UA 跟 alice 通话。它是个一条腿(one leg,只有a-leg)的通话。在大多数情况下,FreeSWITCH 都是做为一个 B2BUA 来桥接两个 UA 进行通话话的。在 alice 接听电话以后,bridge()程序可以再启动一个 UA 呼叫 bob:
originate user/alice &bridge(user/bob) 复制代码
终于,alice 和 bob 可以通话了。我们也可以用另一个方式建立他们之音的通话:
originate user/alice &park() originate user/bob &park() show channels uuid_bridge <alice_uuid> <bob_uuid> 复制代码
在这里,我们分别呼叫 alice 和 bob,并把他们暂时 park 到一个地方。通过命令 show channels 我们可以知道每个 Channel 的 UUID,然后使用 uuid_bridge 命令将两个 Channel 桥接起来。与上一种方式不同,上一种方式实际上是先桥接,再呼叫 bob。
上面,我们一共学习了两条命令(API),originate 和 uuid_bridge。以及几个程序(APP) - echo、park、bridge等。细心的读者可以会发现,uuid_bridge API 和 bridge APP 有些类似,我也知道他们一个是先呼叫后桥接,另一个是先桥接后呼叫,那么,它们到底有什么本质的区别呢?
简单来说,一个 APP 是一个程序(Application),它作为一个 Channel 一端与另一端的 UA 进行通信,相当于它工作在 Channel 内部;而一个 API 则是独立于一个 Channel 之外的,它只能通过 UUID 来控制一个 Channel(如果需要的话)。
这就是 API 与 APP 最本质的区别。通常,我们在控制台上输入的命令都是 API;而在 dialplan 中执行的程序都是 APP(dialplan 中也能执行一些特殊的 API)。大部分公用的 API 都是在 mod_commands 模块中加载的;而 APP 则在 mod_dptools 中,因而 APP 又称为拨号计划工具(Dialplan Tools)。某些模块(如 mod_sofia)有自己的的 API 和 APP。
某些 APP 有与其对应的 API,如上述的 bridge/uuid_bridge,还有 transfer/uuid_transfer、playback/uuid_playback等。UUID 版本的 API 都是在一个 Channel 之外对 Channel 进行控制的,它们应用于不能参与到通话中却又想对正在通话的 Channel做点什么的场景中。例如 alice 和 bob 正在畅聊,有个坏蛋使用 uuid_kill 将电话切断,或使用 uuid_broadcast 给他们广播恶作剧音频,或者使用 uuid_record 把他们谈话的内容录音等。