星号1.8至16

大约10年前,我们公司的工作站没有饮酒支持,并且第一个Asterisk 1.6通过PRI流连接。随后,我想要使用数字替换和类别管理进行重定向,并从netfors找到了chan_ss7,将其提交文件后就可以完成所有操作。时间流逝,PJSIP在Aterisk的13版中发布,而chan_ss7仅在1.8版以下进行编译。而且每六个月定期出现一次中断问题,这在消失的声音中表现出来。他们自己出现并通过。



替换了主站并学会了饮后,决定将Asterisk升级到16。



安装是在干净的debian 10上进行的。存储库的版本为16.2.1,因此我们将从源代码进行构建。下载最新的Asterisk 16,我在16.12.0上安装了它:



cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz


将其解压缩到一个文件夹中,然后转到:



tar xzvf asterisk-16-current.tar.gz
cd asterisk-16.*


现在,让我们在debian中安装所有必需的依赖项。无需手动遍历它们。所有依赖项都收集在需要运行的脚本中。



contrib/scripts/install_prereq install


接下来,下载构建mp3模块所需的mp3源。



contrib/scripts/get_mp3_source.sh


所有依赖项都已安装,您可以继续进行组装。



./configure
make menuselect


在默认情况下,我添加:



  • 在第一个选项卡上,format_mp3。
  • 在“核心声音包”中,我表示俄语RU-WAV声音。
  • 在Extras Sound Packages中,我选择英语EN-WAV,但是很遗憾,没有俄语。


单击保存并退出,接受设置后继续。编译:



./configure
make


然后让我们使用checkinstall来构建和安装软件包:



checkinstall


我们填写版本,软件包名称等。我将软件包名称写为asterisk-16,以便与存储库中的软件包不冲突。



checkinstall


添加一个用户以运行Asterisk并授予文件夹权限:



adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk
usermod -a -G dialout,audio asterisk
chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk


我们将Asterisk配置为在该用户下运行。为此,请将参数添加到/ etc / default / asterisk配置中:



AST_USER="asterisk"
AST_GROUP="asterisk"


编辑/etc/asterisk/modules.conf之后。我们删除了不必要的内容,例如:



noload => chan_sip.so


我们在控制台中启动星号,并检查是否没有错误:



asterisk -cvvv


如果一切正常,则将服务添加到启动并运行:



systemctl enable asterisk
systemctl start asterisk


这样就完成了安装并继续进行设置。



在PJSIP中,语法已发生根本变化,仅复制配置将不起作用。在源文件夹contrib / scripts / sip_to_pjsip / sip_to_pjsip.py中有一个配置转换器,但是格式带有单独的aor,identify等。不方便,并且使用pjsip_wizard找到了输出。我们只需要在/etc/asterisk/pjsip.conf中创建一个传输,添加:



[transport-udp]
type = transport
protocol = udp
bind = x.x.x.x
external_media_address = x.x.x.x
external_signaling_address = x.x.x.x


将xxxx更改为您将收听的IP地址。



我们为用户创建一个模板:



[main-template](!)
type=wizard
transport=transport-udp
accepts_auth = yes
accepts_registrations = yes
aor/qualify_frequency = 100
aor/max_contacts = 1
aor/remove_existing = yes
inbound_auth/auth_type = userpass
endpoint/disallow = all
endpoint/allow = alaw
endpoint/dtmf_mode = rfc4733
endpoint/deny = 0.0.0.0/0
endpoint/context = city_out
endpoint/direct_media = no
endpoint/device_state_busy_at = 1
endpoint/language = ru
endpoint/sdp_session = MySDp


然后普通用户将已经具有配置:



[100](main-template)
endpoint/permit=192.168.100.1
inbound_auth/username=100
inbound_auth/password=P@$$Word123
endpoint/callerid='' <100>


这已经与chan_sip格式非常相似,我们通过替换单词来更改编辑器中参数的名称。



对于nat背后的客户,而不是nat = yes,我们将制作带有行的酒店模板:



endpoint/rtp_symmetric=yes
endpoint/force_rport=yes
endpoint/rewrite_contact=yes


为了让pjsip表现得像chan_sip,即 将一台对等设备添加到一台设备。当第一个启用时,某些中文电话有时会出于某种原因从另一个端口发送第二个注册,这使您可以绕过此错误。



aor/max_contacts = 1
aor/remove_existing = yes


PJSIP的功能之一是多​​重注册,chan_sip不支持该功能。将aor / max_contacts更改为所需的数量,然后在拨号计划中进行呼叫:



exten => _XXX,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})})


您可以通过名称而不是像以前那样通过数字来指定拦截组已经变得非常方便:



endpoint/named_call_group = aveks
endpoint/named_pickup_group = aveks


旧的chan_sip具有呼叫限制参数,该参数限制了对等会话的数量。新的chan_pjsip没有此功能,建议在所有聊天中通过GROUP参数限制呼叫。出于某种原因,在手册的任何地方都没有使用endpoint / device_state_busy_at参数,并将其添加到extensions.conf的传入和传出上下文中:



exten => _X.,1,GoSub(subDeviceBusy,s,1(${EXTEN},${CALLERID(num)}))
[subDeviceBusy]
exten => s,1,NoOp(PJSIP/${ARG1} has state ${DEVICE_STATE(PJSIP/${ARG1})})
exten => s,n,NoOp(CallerId is ${ARG2})
exten => s,n,ExecIf($["${DEVICE_STATE(PJSIP/${ARG1})}" = "BUSY"]?Hangup(17))
exten => s,n,Return


您可以在Asterisk控制台中查看以下行:



pjsip show endpoint 100
Endpoint:  100/100                                      Not in use    0 of 1
     InAuth:  100-iauth/100
        Aor:  100                                            3
      Contact:  100/sip:100@192.168.0.10:5062       c34b4c2d4d Avail         7.981
  Transport:  transport-udp             udp      0      0  192.168.0.1:5060


这里的0之1显示了可能的线路中有多少线路处于忙状态。



在16个星号宏中已过时,因此必须在Gosub上重写它们。



为了在呼叫时传输呼叫者的号码,请在呼叫时将Diversion头添加到INVITE:



exten => 2222222,n,Dial(PJSIP/8XXXXXXXXXX@trunk,,tTb(add_diversion^${EXTEN}^1)
[add_diversion]
exten => _XXXXXXX,1,Set(PJSIP_HEADER(add,Diversion)=<sip:XXX${EXTEN}@x.x.x.x>\;reason=unconditional\;screen=yes\;privacy=off)
exten => _XXXXXXX,n,Return()


在这里,2222222是要转发的城市号码,8XXXXXXXXXX是要转发的城市号码,如有必要,添加区号而不是XXX sip:XXX $ {EXTEN} @xxxx>



队列配置文件没有特别的问题,我们仅将成员从SIP更改为PJSIP。



不要忘记使用文档

pjsip_wizard.conf

pjsip.conf



All Articles