虚拟PBX。第3部分:我们将星号转换为PjSIP,而无需不必要的手势





系列文章第一部分第二部分中,我们了解了如何从运行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的过渡并不是特别困难,但是需要大量的手工工作。我们无法自动转换配置:脚本产生了无法操作的版本,必须手动重写。在下一篇文章中,我们将研究配置向导,最后扩展拨号计划以接收传入呼叫,组织会议并解决其他呼叫路由任务。










All Articles