1. 从一次客服转接的“翻车”说起:为什么你需要分清transfer和bridge
几年前,我帮一家公司搭建客服系统,用的是FreeSWITCH。上线第一天,就出了个不大不小的“事故”。客服小妹想把一个咨询技术问题的客户转给技术部的同事,她按了培训时教的“*3”加分机号。结果,客户那边的电话是挂断了,但技术同事那边接起来,却是一片寂静,两边谁也听不见谁。客户急了,以为被挂了电话,又打进来投诉。后来一查日志,发现客服小妹操作的是“bridge”,而不是“transfer”。就这一个命令的差别,让整个转接流程完全错乱。
这件事让我深刻体会到,在FreeSWITCH的世界里,transfer和bridge这两个看似简单的概念,背后是完全不同的通话处理哲学。很多刚接触FreeSWITCH的朋友,包括一些有经验的开发者,都容易把它们搞混。觉得不都是“把电话接过去”吗?其实不然。今天,我就结合SIP和MRCP协议的实际应用,掰开揉碎了给你讲讲,transfer和bridge到底有什么区别,以及你该在什么时候用哪个。
简单来说,你可以把transfer想象成“换乘”。比如你坐地铁从A站到C站,需要在B站下车,换乘另一条线路。这个过程是有中断的:你先从A-B线下来(原通话挂断),然后走到B-C线的站台(建立新连接),再坐上B-C线的车(接通新目标)。而bridge更像是“拉个微信群聊”。你把A和B直接拉进一个群里,他们就能开始对话,中间没有挂断再重连的过程,是直接的、持续的连接。
理解这个核心差异,是你用好FreeSWITCH进行任何通话控制(无论是普通语音通话,还是结合MRCP的语音识别合成)的基础。下面,我们就从它们各自的功能机制开始,一层层剥开来看。
2. 深入骨髓的机制差异:transfer是“重建”,bridge是“直连”
要真正理解区别,我们不能只看表面效果,得钻到FreeSWITCH的“肚子”里,看看它到底是怎么处理这两个命令的。这关系到SIP协议中的信令交互和媒体流走向。
2.1 transfer:一次优雅(或笨拙)的“通话重建”
当你执行一个transfer操作时,FreeSWITCH在后台干了一系列大事。我们以最常见的“代接转移”(Attended Transfer)为例,假设分机1000要把和分机1001的通话转给分机1002。
- 发起转移:分机1000(或IVR菜单)发送一个SIP REFER请求给FreeSWITCH,说:“请把我和1001的这场通话,转给1002。”
- 建立新腿:FreeSWITCH不会立刻动原来的通话(1000-1001)。它会先悄悄地创建一个全新的呼叫,去拨打目标1002。这个新呼叫是一条独立的“腿”(Leg)。
- 等待应答:分机1002振铃、接听。此时,FreeSWITCH内部的状态是:有一条活跃的腿(1000-1001),还有一条新建立的活跃腿(FreeSWITCH-1002)。但这两条腿之间还没有任何媒体流连接,1002听不到1000或1001的声音。
- 执行替换:关键一步来了。一旦1002接听,FreeSWITCH就会执行“替换”操作。它会释放(挂断)原来1000和1001之间的媒体连接,然后将1001的媒体流重新桥接到1002上。
- 完成转移:最终,1000退出通话(在代接转移中,1000通常挂机),剩下1001和1002在愉快地交谈。对于1001来说,感觉像是通话“跳”了一下,然后换了个说话对象。
整个过程中,原通话的SIP对话(Dialog)被终止,并基于REFER请求创建了新的SIP对话。媒体流路径发生了根本性的改变。这就是为什么我说它是“重建”。在FreeSWITCH的日志里,你会看到清晰的CHANNEL_EXECUTE中执行transfer,然后伴随旧通道的CHANNEL_HANGUP和新通道的CHANNEL_BRIDGE(注意,这里的BRIDGE是内部动作,不是我们讨论的bridge应用命令)。
一个容易踩的坑:如果转移的目标(1002)无人接听或忙线,转移就会失败。这时,根据配置,通话可能会回到1000,或者进入一个失败处理流程(比如播放忙音或转语音信箱)。这个“回退”逻辑需要你在拨号计划(Dialplan)里仔细设计。
2.2 bridge:一次无缝的“多方会议”
现在再看bridge。它的逻辑就直白多了。假设FreeSWITCH已经接通了分机1000(比如客户来电),现在需要把分机1001(客服)拉进来。
- 准备通道:FreeSWITCH呼叫分机1001。此时,它内部有两条独立


39

被折叠的 条评论
为什么被折叠?



