使用 Asterisk / FreeSWITCH 搭建企业级 SIP 电话系统,详解注册、呼叫路由与媒体协商全流程。
SIP(Session Initiation Protocol)是由 IETF 制定的应用层信令协议,用于建立、修改和终止多媒体会话(语音、视频、IM)。SIP 只负责"信令"——决定谁和谁通话,真正的语音数据由 RTP(Real-time Transport Protocol)承载。
在 IPTV 场景中,SIP 常用于机顶盒与软交换之间的呼叫控制、视频会议、IVR 语音菜单等。
| 项目 | Asterisk | FreeSWITCH | Kamailio |
|---|---|---|---|
| 定位 | PBX / IPPBX | 软交换平台 | SIP 代理 / 路由 |
| 开发语言 | C | C / Lua / JS | C |
| 配置方式 | .conf 文件 / ARI | XML / ESL / API | cfg.text / 脚本 |
| 并发能力 | 中等(数千) | 高(万级) | 极高(十万级) |
| 媒体处理 | 原生支持转码 | 原生支持转码 | 不处理媒体 |
| 适用场景 | 企业呼叫中心 | 大容量软交换 | 边缘代理 / 注册 |
终端向 SIP 服务器发送 REGISTER,带上账号密码完成鉴权。
主叫发起 INVITE 携带 SDP 描述媒体能力(编码、端口)。
被叫收到 INVITE,返回 100 Trying 与 180 Ringing。
被叫摘机,返回 200 OK 并附带自己的 SDP 应答。
双方按协商的端口用 RTP 直连传输音视频。
任一方发送 BYE,服务器转发并释放会话资源。
以 Debian/Ubuntu 为例,使用官方一键脚本安装:
# 添加官方仓库并安装
apt install -y gnupg2 wget lsb-release
wget -O - https://files.freeswitch.org/repo/deb/debian-release/fsstretch-archive-keyring.asc | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/debian-release/ `lsb_release -sc` main" > /etc/apt/sources.list.d/freeswitch.list
apt update && apt install -y freeswitch-meta-vanilla
# 启动并查看状态
systemctl enable --now freeswitch
fs_cli -x "status"
默认配置位于 /etc/freeswitch/,conf/dialplan/default.xml 是默认拨号计划。注册账号 1000~1019,密码 1234。
注册一个 SIP 分机(pjsip.conf):
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[1000]
type=endpoint
context=internal
disallow=all
allow=ulaw,alaw,h264
auth=1000
aors=1000
[1000]
type=auth
auth_type=userpass
username=1000
password=your_secure_password
[1000]
type=aor
max_contacts=1
在 extensions.conf 中添加一个简单的拨号计划,让 1000 拨打 1001:
[internal]
exten => 1001,1,Answer()
exten => 1001,n,Dial(PJSIP/1001)
exten => 1001,n,Hangup()
asterisk -rvvvvv 进入交互控制台,实时查看 SIP 消息流。FreeSWITCH 使用 fs_cli -x "sofia status" 查看注册状态。