Asterisk是一款基于SIP协议的开源PBX通信框架,下一代基于IP的电话拨号系统。在撰写本文的时候的最新版是 14.0,通过它我们可以在树莓派上搭建一个 SIP 服务器,实现 VoIP 功能。想对 SIP 协议有深入了解的话,可以参考这篇博文

手机端可用的比较多,有Zopier, LinPhoneLinPhone 也是一款开源软件,LinPhone 有比较完整的代码实现,甚至包括详细的UI,在 LinPhone基础上可以快速实现一款自己的 VoIP 应用。

安装Asterisk

Asterisk 的编译安装比较人性化。下载最新的 Asterisk 到树莓派。解压缩完成后可以看到文件中有 configure 文件,这个脚本是编译前环境监测,能帮助我们发现未安装的组件,还会提醒其名称然后就可以照着名称用 apt-get 来安装了。执行

1
./configure

如果遇到错误,根据错误信息安装必要的插件,如果你用的最新版可能大部分的需要是 dev 版,所以在下载的时候添加 -dev后缀就可以,比如需要 sqlite3,安装的时候使用 sudo apt-get install libsqlite3-dev

继续执行 ./configure 直到所有的条件都符合。树莓派可能需要的时间会长一些,

完成后会有一个大大的 Asterisk 的标志告诉你成功了

执行

1
make

需要耐心一些,树莓派需要的时间比较长,等成功后会提示你继续

1
make install

安装一般比较快,继续执行

1
2
make samples
make basic-pbx

这样一来就成功安装 Asterisk

运行 Asterisk

1
sudo asterisk -cvvvvv

执行如上命令可以看到 Asterisk 启动的日志,完成后会进入 CLI命令模式。

也可以输入

1
sudo asterisk

然后输入 sudo asterisk -r

添加用户

为了纪念第一次运行 Asterisk,我们先来个 Hello world 项目玩玩。

切换目录到 /etc/asterisk
备份一下 extensions.conf,sip.conf,pjsip.conf,我们新建一些新空白文件

先注册一个100的号码。新建一个空白 extensions.conf,输入

1
2
3
4
5
[from-internal]
exten = 100,1,Answer()
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()

当拨打 100 时候,Asterisk 会接通这个电话,等待一分钟,然后播放 hello-world语音,之后就挂断电话。

1 注册新用户

新建 sip.conf
然后保存如下内容

1
2
3
4
5
6
7
8
9
10
[general]
context=default

[6001]
type=friend
context=from-internal ;可以认为是通道
host=dynamic
secret=unsecurepassword ;你的密码
disallow=all
allow=ulaw ;编码

新建 pjsip.conf
然后保存如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6001
aors=6001

[6001]
type=auth
auth_type=userpass
password=unsecurepassword ;密码
username=6001

[6001]
type=aor
max_contacts=1

配置完成后重启服务

1
sudo asterisk -rx "core restart now"

配置客户端

下载一个 Linphone 到手机上,配置一下地址

完成后拨打 100 试试,你就可以听到自己搭建的第一台电话服务器诞生的声音啦。

用户之间拨打

为了简单起见,继续沿用以上的配置,依照6001的方法,重新添加一个6002的用户。需要注意的是在 sip.confpjsip.conf都要添加。完成之后打开 extensions.conf

1
2
exten = 6001,1,Dial(SIP/6001,20)
exten = 6002,1,Dial(SIP/6002,20)

保存后重启服务

1
sudo asterisk -rx "core restart now"

分别登陆 6001 和 6002(可以一个用手机,另一个用电脑),就可以相互拨打了。