在系列文章的第一部分和第二部分中,我们了解了如何从运行Ubuntu的RuVDS在VPS上安装IP-PBX(IP-PBX),以及如何使用chan_sip通道驱动程序配置基本功能。不建议使用此方法,并且在将来的Asterisk版本中将不再提供chan_sip支持。最好改用开源的PjSIP多媒体库。尽管配置文件存在巨大差异,但过渡并不像乍看起来那样困难。
什么是PjSIP?
重要的是要理解,PjSIP并不是一个新协议,而是一个用于处理提供语音通信的协议堆栈的完整库:SIP,RTP,SDP,STUN等。它是一堆模块,反映在pjsip.conf配置文件中(代替了传统的sip.conf)。该文件分为几个部分,并且res_pjsip模块主要与该文件一起工作,每个部分定义某些对象的配置。节名称传统上用方括号括起来,并且节必须包含定义其类型的“ type =“结构。
部分的类型如下:
ENDPOINT -sip.conf中对等方的模拟,它定义了SIP协议以及与AOR,AUTH和TRANSPORT交互的选项。至少链接到一个AOR部分;
AOR-描述如何联系ENDPOINT;
运输-本节介绍了传输层协议设置,WebSocket和加密方法(如sip.conf中的常规方法)。对于不同的ENDPOINT可以是一个,对于一个点可以是唯一的;
注册-负责传出注册,例如到提供商的中继;
AUTH-包含入站和出站注册的选项和权限。与之相关的是ENDPOINT和REGISTRATIONS;
IDENTIFY-在这里您可以设置ENDPOINT的源IP;
ACL-由res_pjsip用于控制传入连接,不绑定到ENDPOINT;
DOMAIN_ALIAS-域别名;
联系-不需要在Dialplan中明确指定SIP URI;
系统-系统选项;
全局-全局选项;
段名称在大多数情况下可以是任意的,但是例如,ENDPOINT和AOR必须与SIP URI标头相同地命名。
我们的帮助很难被认为是详尽无遗的,因为在幕后还留下了许多有趣的芯片,例如PjSIP配置向导:在我们谈论迁移到鲜为人知的新库时。您可以稍后处理细微差别。
将sip.conf转换为pjsip.conf
由于模块性,pjsip.conf配置文件的结构分散在许多部分的薄层中-它比旧的sip.conf复杂得多。 Asterisk开发人员想到了简单的管理员,并创建了一个转换脚本。它是用Python编写的,如果您从源代码构建软件,则它已经在发行版中:contrib / scripts / sip_to_pjsip /目录中。我们从Ubuntu库中包含的二进制软件包中安装了Asterisk,因此必须从GitHub下载 脚本。
尽管不同版本的IP-PBX的配置文件格式没有太大变化,但最好从已安装的Asterisk版本中选择脚本,而不要使用最新的默认版本-在我们的示例中为16.2。
可以使用core show version命令在IP-PBX控制台中查看Asterisk版本,
您将需要GitHub信息库中ontrib / scripts / sip_to_pjsip /目录中的所有Python文件。需要将它们添加到本地目录,使用Asterisk配置(通常为/ etc / asterisk)转到目录,并以超级用户权限运行sip_to_pjsip.py脚本。它的主要任务是读取输入的sip.conf文件并创建一个新的pjsip.conf(有关详细信息,请参见Asterisk Wiki)。
该脚本将生成pjsip.conf,然后您必须手动对其进行抛光。如果根据我们的文章安装了Asterisk,则还必须在/etc/asterisk/modules.conf中配置模块的加载,并在Dialplan(/etc/asterisk/extensions.conf)中更改对Dial应用程序的调用。实际上
,转换器生成的文件/etc/asterisk/pjsip.conf无效:
pjsip.conf
;--
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[general]
allowoverlap = no
[office]
call-limit = 2
[sipnet]
remotesecret =
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Non mapped elements end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--;
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0
[sipnet]
type = aor
contact = sip:@sipnet.ru
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru
[sipnet]
type = endpoint
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user =
from_domain = sipnet.ru
aors = sipnet
[1001]
type = aor
max_contacts = 1
[1001]
type = auth
username = 1001
password =
[1001]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid = <1001>
auth = 1001
outbound_auth = 1001
aors = 1001
[acl]
type = acl
permit = XXX.XXX.XXX.XXX
deny = 0.0.0.0/0.0.0.0
[1002]
type = aor
max_contacts = 1
[1002]
type = auth
username = 1002
password =
[1002]
type = endpoint
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
callerid = <1002>
auth = 1002
outbound_auth = 1002
aors = 1002
它的语法很简单,详细信息可以在Asterisk Wiki中找到。这将需要手动编辑才能使配置文件整洁。
更正了/etc/asterisk/pjsip.conf(与sip.conf中一样,可以在其中使用模板):
更正了/etc/asterisk/pjsip.conf
;===============TRANSPORT
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0
;===============ACL
[acl]
type = acl
deny = 0.0.0.0/0.0.0.0
permit = XXX.XXX.XXX.XXX
;===============SIPNET TRUNK
[sipnet]
type = registration
transport = transport-udp
outbound_auth = sipnet
server_uri = sip:sipnet.ru
client_uri = sip:@sipnet.ru
retry_interval = 60
[sipnet]
type = auth
auth_type = userpass
password =
username =
[sipnet]
type = aor
contact = sip:@sipnet.ru
[sipnet]
type = endpoint
transport = transport-udp
; Dialplan
context = sipnet-trunk
dtmf_mode = rfc4733
disallow = all
allow = alaw,ulaw
direct_media = no
from_user =
from_domain = sipnet.ru
outbound_auth=sipnet
aors = sipnet
[sipnet]
type = identify
endpoint = sipnet
match = sipnet.ru
;===============USER TEMPLATES
[endpoint-template](!)
type = endpoint
transport = transport-udp
context = homeoffice
dtmf_mode = rfc4733
disallow = all
allow = ulaw
allow = alaw
allow = g729
allow = g723
allow = g726
allow = h261
allow = h263
allow = h264
allow = h263p
[auth-template-userpass](!)
type = auth
auth_type = userpass
[aor-template-single-reg](!)
type = aor
; PjSIP
max_contacts = 1
;===============User 1001
[1001](endpoint-template)
auth = auth1001
aors = 1001
callerid = <1001>
[auth1001](auth-template-userpass)
username = 1001
password =
[1001](aor-template-single-reg)
;===============User 1002
[1002](endpoint-template)
auth = auth1002
aors= 1002
callerid = <1002>
[auth1002](auth-template-userpass)
username = 1002
password =
[1002](aor-template-single-reg)
使用模板,可以减少文书工作,但是还有一种更有趣的方式可以简化管理员的工作-配置向导。也许这是最方便的PjSIP技巧之一,我们将在下一篇文章中处理。
改写拨号计划
最简单的部分:在Dial应用程序的调用中,用PJSIP替换SIP就足够了。虽然我们对上一篇文章中最简单的测试Dialplan进行了稍微的修改,但稍后我们将处理更复杂的事情。
配置文件/etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no
priorityjumping=no
autofallthrough=yes
clearglobalvars=no
;
[default]
exten => _X.,1,NoOp()
same => n,Busy()
same => n,HangUp()
; homeoffice
[homeoffice]
;
exten => _1XXX,1,Dial(PJSIP/${EXTEN})
; SIPNET
exten => _.7XXXXXXXXXX,1,Dial(PJSIP/${EXTEN:1}@sipnet)
; sipnet-trunk, SIPNET
[sipnet-trunk]
;
从chan_sip到PjSIP的过渡并不是特别困难,但是需要大量的手工工作。我们无法自动转换配置:脚本产生了无法操作的版本,必须手动重写。在下一篇文章中,我们将研究配置向导,最后扩展拨号计划以接收传入呼叫,组织会议并解决其他呼叫路由任务。