Установка 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«.
жесть прикол!!