Установка Asterisk с SIP и CURL

Установка по ссылка из репозитория Nux Misc

Посмотреть описание всех пакетов Asterisk

Добавить EPEL репозиторий

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Установка пакетов: Основного, SIP, CURL

# yum install http://li.nux.ro/download/nux/misc/el7/x86_64/asterisk-13.0.2-1.el7.nux.x86_64.rpm
# yum install http://li.nux.ro/download/nux/misc/el7/x86_64/asterisk-curl-13.0.2-1.el7.nux.x86_64.rpm
# yum install http://li.nux.ro/download/nux/misc/el7/x86_64/asterisk-sip-13.0.2-1.el7.nux.x86_64.rpm

Файлы конфигурации по умолчанию расположены /etc/asterisk

Необходимо настроить файл конфигурации phoneprov.conf

[general]
; IP сервера
serveraddr=xxx.xxx.xxx.xxx
; Интерфейс
serveriface=eth0
; Порт
serverport=5060
default_profile=polycom

Запуск

# systemctl start asterisk

Добавление в автозапуск

# systemctl enable asterisk

Для подключения к Asterisk CLI — интерфейс командной строки

# asterisk –rvvvvv

 

Создание внутренних абонентов

В sip.conf указываем сначала общие параметры SIP для Asterisk:

[general]
transport=udp
udpbindaddr=0.0.0.0:5060
tcpenable=no
localnet=192.168.1.0/24
allowguest=no
match_auth_username=yes
maxexpiry=3600
dtmfmode=rfc2833
minexpiry=60
defaultexpiry=120
registerattempts=0
registertimeout=20
videosupport=no
disallow=all
allow=ulaw,alaw,gsm,h261,h263,h263p,h264
notifyringing=yes
notifyhold=yes
tos=0x68
permit = 0.0.0.0/0.0.0.0
allowoverlap=yes
allowsubscribe=yes
allowtransfers=yes
alwaysauthreject=yes
subscribecontext=default
autodomain=no
callevents=yes
compactheaders=no
dumphistory=yes
g726nonstandard=no
ignoreregexpire=no
pedantic=no
promiscredir=no
recordhistory=no
relaxdtmf=no
rtcachefriends=no
rtptimeout=1800
rtsavesysname=no
rtupdate=no
sendrpid=no
sipdebug=no
srvlookup=no
trustrpid=no
usereqphone=no
progressinband=no
useragent=Asterisk PBX
maxcallbitrate=384
tos_sip=cs3
tos_audio=ef
tos_video=af41
cos_sip=3
cos_audio=5
cos_video=4
constantssrc=yes
nat=yes
session-timers=accept
session-expires=1800
session-minse=90
session-refresher=uas

описание опций sip.conf в общей [general] секции

В users.conf добавляем пользователей. Шаблоны для пользователей указываются «[name_template](!)» а пользователя сослать на шаблон с настройками «[user_name](name_temlate)».

[general]
userbase=600
hasvoicemail=yes
vmsecret=123456
hassip=no
hasiax=no
hasmanager=no
callwaiting=yes
threewaycalling=yes
callwaitingcallerid=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
host=dynamic
localextenlength=3
qualify=yes
vmexten=*2
subscribecontext=hintcontext
language=ru

[office](!)
secret=123456
cid_number= 
vmsecret=no
nat=yes
dtmfmode=rfc2833
callgroup=
pickupgroup=1
callwaiting=no
hasmanager=yes
hasvoicemail=no
hasagent=no
mailbox=no
hassip=yes
registersip=no
transfer=yes
host=dynamic
threewaycalling=yes
insecure=port
call-limit=100
compensate=yes
transport=udp
srtpcapable=no
qualify=yes
remoteregister=yes

[1001](office)
username=1001
context=voip-acc-1001

[1002](office)
username=1001
context=voip-acc-1001

[1003](office)
username=1001
context=voip-acc-1001

При помощи шаблонов в записях для регистрации будут указаны только отличительные настройки.

Конфигурируем extensions.conf

[general]
static = yes
writeprotect = no
autofallthrough = yes
clearglobalvars = yes
priorityjumping = no
extenpatternmatchnew = no

[from-internal]
exten => _100X,1,NoOp(DATETIME= ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _100X,2,Dial(SIP/${EXTEN})

В файле ari.conf параметр «enabled» меняем на no т.к. не используем данный модуль

enabled=no

Настройка Firewall:

firewall-cmd --zone=public --add-port=5060/udp --permanent
firewall-cmd --zone=public --add-port=5061/udp --permanent
firewall-cmd --zone=public --add-port=5160/udp --permanent
firewall-cmd --zone=public --add-port=5161/udp --permanent
firewall-cmd --zone=public --add-port=10000-20000/udp --permanent
firewall-cmd --zone=public --add-port=4569/udp --permanent
firewall-cmd --reload

 

Несколько команд внутри в Asterisk CLI — интерфейс командной строки

Для подключения к Asterisk CLI

# asterisk –rvvvvv

Порог отображаемой информации

*CLI> set verbose <0-9>

Перезагрузить Asterisk немедленно

*CLI> core restart now

Перезагрузить Asterisk если нет разговоров

*CLI> restart when convenient

Перезагрузить Asterisk по завершению всех текущих вызовов (свободные каналы закрываются)

*CLI> restart gracefully

Перечитать все конфиги

*CLI> reload

Показать существующие SIP екстеншены и их статус

*CLI> sip show peers

Отображает информацию о конкретном SIP екстеншене

*CLI> sip show peer 1001

Отображает состояние зарегистрированных транков

*CLI> sip show registry

Для использования GSM шлюза GOIP8


Настройка звуковых файлов

Скачать звуковые файлы на русском

В директории «/usr/share/asterisk/sounds» создать директорию «ru» в нее поместить скаченный архив и разархивировать.

Правим sip.conf в группу [general] добавляем

language=ru

Правим asterisk.conf в группу [options] добавляем

defaultlanguage=ru

Перезагружаем Asterisk

*CLI> reload

 

Перевод звонка («слепой» перевод)

Данный вариант описывает пример на основе «Настройка шлюза GOIP8 для Asterisk«. В данном описании был использован контекст [from-goip] в файле extensions.conf.

Открываем extensions.conf и правим контекст [from-goip].

[from-goip]
exten => _.,1,NoOp(DATETIME= ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _.,n,Dial(SIP/1001,45,tT)
exten => _.,n,Hangup()

В «Dial» добавились еще два параметра, второе указывает время гудгов пока не поднята трубка, если это время прошло то код пойдет дальше, в третье указывается два параметра «t» и «T» позволяет осуществить перевод звонка при разговоре.

 

Отправка данных о звонках на WEB-сервер

Данный вариант описывает пример на основе «Настройка шлюза GOIP8 для Asterisk«. В данном описании был использован контекст [from-goip] в файле extensions.conf.

Открываем extensions.conf и добавляем контекст для отлавливания события поднятой трубки

[from-goip-answer-script]
exten => s,1,Set(foo=${CURL(https://example.com/call/,state=offhook&phone=${ARG1})})
same => n,Return

Добавляем перед «Dial» отправку об осуществленном звонке

exten => _.,n,Set(foo=${CURL(https://example.com/call/,state=ringing&phone=${CALLERID(num)})})

Правим контекст [from-goip]. К «Dial» в третий параметр добавляем функцию «U()» которая сработает после поднятия трубки.

exten => _.,n,Dial(SIP/1001,45,tTU(from-goip-answer-script,${CALLERID(num)}))

В данном примере в функцию передается первым параметром «from-goip-answer-script» (наименование контекста который запустить) и вторым параметром номер входящего абонента (можно через запятую еще передавать данные)

И на завершение звонка в начало контекста добавить отправку

exten => h,1,Set(foo=${CURL(https://example.com/call/,state=idle&phone=${CALLERID(num)})})
exten => h,n,Hangup()

В итоге должно получится

[from-goip]
exten => h,1,Set(foo=${CURL(https://example.com/call/,state=idle&phone=${CALLERID(num)})})
exten => h,n,Hangup()
exten => _.,1,NoOp(DATETIME= ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _.,n,Set(foo=${CURL(https://example.com/call/,state=ringing&phone=${CALLERID(num)})})
exten => _.,n,Dial(SIP/1001,45,tTU(from-goip-answer-script,${CALLERID(num)}))
exten => _.,n,Hangup()

[from-goip-answer-script]
exten => s,1,Set(foo=${CURL(https://example.com/call/,state=offhook&phone=${ARG1})})
same => n,Return

 

В итоге все затронутые файлы при настройке Asterisk

Обновляю как только какуой-либо конфиг правлю (последнее обновление 23.11.2019)

Скачать звуковые файлы на русском

В директории «/usr/share/asterisk/sounds» создать директорию «ru» в нее поместить скаченный архив и разархивировать.

/etc/asterisk/ari.conf

[general]
enabled = no

/etc/asterisk/asterisk.conf

[directories](!)
astetcdir => /etc/asterisk
astmoddir => /usr/lib64/asterisk/modules
astvarlibdir => /usr/share/asterisk
astdbdir => /var/spool/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /usr/share/asterisk
astagidir => /usr/share/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /run/asterisk
astlogdir => /var/log/asterisk
astsbindir => /usr/sbin

[options]
documentation_language = ru_RU
defaultlanguage=ru

/etc/asterisk/extensions.conf

[general]
static = yes
writeprotect = no
autofallthrough = yes
clearglobalvars = yes
priorityjumping = no
extenpatternmatchnew = no

[from-internal]
exten => h,1,Hangup()
exten => _100X,1,NoOp("from-internal_100X")
exten => _100X,n,NoOp(${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _100X,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)}-${CALLERID(number)}-${EXTEN})
exten => _100X,n,MixMonitor(/var/log/asterisk/records/${fname}.wav)
exten => _100X,n,NoOp(${DEVICE_STATE(SIP/${EXTEN})})
exten => _100X,n,GotoIf($[${CALLERID(number)}:"^100[0-9]$"]?intern1:extern1)
exten => _100X,n(extern1),Set(typecall=extern)
exten => _100X,n,Goto(dial1)
exten => _100X,n(intern1),Set(typecall=intern)
exten => _100X,n,NoOp(${DIALSTATUS})
exten => _100X,n(dial1),Dial(SIP/${EXTEN},60,tTg)
exten => _100X,n,GotoIf($[${typecall}=intern]?end:)
exten => _100X,n,GotoIf($[${DIALSTATUS}=ANSWER]?end:)
exten => _100X,n,Dial(SIP/1001&SIP/1002,60,tTg)
exten => _100X,n(end),Hangup()
exten => _[78][89]XXXXXXXXX,1,NoOp("from-internal_[78][89]XXXXXXXXX")
exten => _[78][89]XXXXXXXXX,n,NoOp(${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _[78][89]XXXXXXXXX,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)}-${CALLERID(number)}-${EXTEN})
exten => _[78][89]XXXXXXXXX,n,MixMonitor(/var/log/asterisk/records/${fname}.wav)
exten => _[78][89]XXXXXXXXX,n,GotoIf($[${CALLERID(number)}=1003]?label12:label11)
exten => _[78][89]XXXXXXXXX,n(label11),GotoIf($[${CALLERID(number)}=1006]?label12:label13)
exten => _[78][89]XXXXXXXXX,n(label13),GotoIf($[${CALLERID(number)}=1004]?label12:label14)
exten => _[78][89]XXXXXXXXX,n(label14),Dial(SIP/500001/18${EXTEN:1},60)
exten => _[78][89]XXXXXXXXX,n,Hangup()
exten => _[78][89]XXXXXXXXX,n(label12),Dial(SIP/500003/38${EXTEN:1},60)
exten => _[78][89]XXXXXXXXX,n,Hangup()
exten => _+79XXXXXXXXX,1,NoOp("from-internal_+79XXXXXXXXX")
exten => _+79XXXXXXXXX,n,NoOp(${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _+79XXXXXXXXX,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)}-${CALLERID(number)}-${EXTEN})
exten => _+79XXXXXXXXX,n,MixMonitor(/var/log/asterisk/records/${fname}.wav)
exten => _+79XXXXXXXXX,n,GotoIf($[${CALLERID(number)}=1003]?label22:label21)
exten => _+79XXXXXXXXX,n(label21),GotoIf($[${CALLERID(number)}=1006]?label22:label23)
exten => _+79XXXXXXXXX,n(label23),Dial(SIP/500001/18${EXTEN:2},60)
exten => _+79XXXXXXXXX,n,Hangup()
exten => _+79XXXXXXXXX,n(label22),Dial(SIP/500003/38${EXTEN:2},60)
exten => _+79XXXXXXXXX,n,Hangup()

[from-goip]
exten => h,1,Set(foo=${CURL(https://domain/call/new/,code=101&callState=idle&phone=${CALLERID(num)})})
exten => h,n,Hangup()
exten => _.,1,NoOp("from-goip_.")
exten => _.,1,NoOp(${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _.,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)}-from-${CALLERID(number)})
exten => _.,n,MixMonitor(/var/log/asterisk/records/${fname}.wav)
exten => _.,n,Set(foo=${CURL(https://domain/call/new/,code=101&callState=ringing&phone=${CALLERID(num)})})
exten => _.,n,GotoIf($[${EXTEN}=1001]?label0:label4)
exten => _.,n(label0),GotoIf($[${DEVICE_STATE(SIP/1001)}=INUSE]?label3:label1)
exten => _.,n(label1),Dial(SIP/1001,10,tTgU(from-goip-answer-script,${CALLERID(num)}))
exten => _.,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:)
exten => _.,n(label2),Dial(SIP/1001&SIP/1002&SIP/500004/489183738324,60,tTg)
exten => _.,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:label1)
exten => _.,n(label2),Dial(SIP/1001&SIP/1002,60,tTg)
exten => _.,n,Hangup()
exten => _.,n(label3),Dial(SIP/1001&SIP/1002,60,tTgU(from-goip-answer-script,${CALLERID(num)}))
exten => _.,n,Hangup()
exten => _.,n(label4),Dial(SIP/1003&SIP/1006,15,tTgU(from-goip-answer-script,${CALLERID(num)}))
exten => _.,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:)
exten => _.,n,Dial(SIP/1001&SIP/1002&SIP/1003&SIP/1006,60,tTg)
exten => _.,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?end:label4)
exten => _.,n,Dial(SIP/1001&SIP/1002&SIP/1003&SIP/1006,60,tTg)
exten => _.,n(end),Hangup()

[from-goip-answer-script]
exten => s,1,Set(foo=${CURL(https://k.24bm.ru/call/new/,code=101&callState=offhook&phone=${ARG1})})
same => n,Return

/etc/asterisk/features.conf

[general]

[featuremap]
atxfer => *2
blindxfer => ##

[applicationmap]

/etc/asterisk/sip.conf

[general]
language=ru
transport=udp
udpbindaddr=0.0.0.0:5060
tcpenable=no
localnet=192.168.1.0/24
allowguest=no
match_auth_username=yes
maxexpiry=3600
dtmfmode=rfc2833
minexpiry=60
defaultexpiry=120
registerattempts=0
registertimeout=20
videosupport=no
disallow=all
allow=ulaw,alaw,gsm,h261,h263,h263p,h264
notifyringing=yes
notifyhold=yes
tos=0x68
permit = 0.0.0.0/0.0.0.0
allowoverlap=yes
allowsubscribe=yes
allowtransfers=yes
alwaysauthreject=yes
subscribecontext=default
autodomain=no
callevents=yes
compactheaders=no
dumphistory=yes
g726nonstandard=no
ignoreregexpire=no
pedantic=no
promiscredir=no
recordhistory=no
relaxdtmf=no
rtcachefriends=no
rtptimeout=1800
rtsavesysname=no
rtupdate=no
sendrpid=no
sipdebug=no
srvlookup=no
trustrpid=no
usereqphone=no
progressinband=no
useragent=KREMEN-Office-Test
maxcallbitrate=384
tos_sip=cs3
tos_audio=ef
tos_video=af41
cos_sip=3
cos_audio=5
cos_video=4
constantssrc=yes
nat=yes
session-timers=accept
session-expires=1800
session-minse=90
session-refresher=uas

/etc/asterisk/users.conf

[general]
userbase=600
hasvoicemail=yes
vmsecret=123456
hassip=no
hasiax=no
hasmanager=no
callwaiting=yes
threewaycalling=yes
callwaitingcallerid=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
host=dynamic
localextenlength=3
qualify=yes
vmexten=*2
subscribecontext=hintcontext
language=ru

[tmp-local](!)
secret=123456
cid_number= 
vmsecret=no
nat=yes
dtmfmode=rfc2833
callgroup=
pickupgroup=1
callwaiting=no
hasmanager=yes
hasvoicemail=no
hasagent=no
mailbox=no
hassip=yes
registersip=no
transfer=yes
host=dynamic
threewaycalling=yes
insecure=port
call-limit=100
compensate=yes
transport=udp
srtpcapable=no
qualify=yes
remoteregister=yes
context=from-internal

[1001](tmp-local)
username=1001

[1002](tmp-local)
username=1002

[1003](tmp-local)
username=1003

[1004](tmp-local)
username=1004

[1005](tmp-local)
username=1005

[1006](tmp-local)
username=1006

[1007](tmp-local)
username=1007

[1008](tmp-local)
username=1008

[1009](tmp-local)
username=1009

[tmp-goip8](!)
secret=123456
dtmfmode=rfc2833
pickupgroup=1
callwaiting=no
hasmanager=yes
hasvoicemail=no
hasagent=no
mailbox=no
hassip=yes
registersip=no
transfer=yes
host=dynamic
threewaycalling=yes
insecure=port
call-limit=100
compensate=yes
transport=udp
srtpcapable=no
qualify=yes
remoteregister=yes
context=from-goip

[500001](tmp-goip8)
username=500001

[500002](tmp-goip8)
username=500002

[500003](tmp-goip8)
username=500003

[500004](tmp-goip8)
username=500004

GSM шлюз использовался GOIP8 и настроен по статье «Настройка шлюза GOIP8 для Asterisk«.