替换了主站并学会了饮后,决定将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