User Tools

Site Tools


сервис_asterisk

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
сервис_asterisk [2021/11/09 11:19]
val [Реализация с использованием стандартного языка описания диалплана]
сервис_asterisk [2024/05/28 08:46]
val [Обработка статуса вызова]
Line 8: Line 8:
 ===== Установка ===== ===== Установка =====
  
 +  * [[https://​community.asterisk.org/​t/​install-asterisk-via-apt-or-from-source/​99713|Install Asterisk via apt or from source?]]
 ==== Debian/​Ubuntu ==== ==== Debian/​Ubuntu ====
 <​code>​ <​code>​
Line 38: Line 39:
 </​code><​code>​ </​code><​code>​
 [general] [general]
-;​udpbindaddr=0.0.0.0:​5061+;​udpbindaddr=0.0.0.0:​6050
 transport=udp transport=udp
 disallow=all disallow=all
Line 45: Line 46:
 directmedia=no ​          ; for webinar directmedia=no ​          ; for webinar
 nat=force_rport,​comedia ​ ; for webinar nat=force_rport,​comedia ​ ; for webinar
 +qualify=yes ​             ; for webinar
  
 ;​context=default ;​context=default
Line 72: Line 74:
 ;​disallow=all ;​disallow=all
 ;allow=gsm ;allow=gsm
-;​canreinvite=no ;1.4 
-;​directmedia=no ;1.6 
-;;;nat=yes 
-;​nat=force_rport,​comedia 
-;​qualify=yes 
 ;​call-limit=1 ;​call-limit=1
 ;​deny=0.0.0.0/​0.0.0.0 ;​deny=0.0.0.0/​0.0.0.0
 ;​permit=172.16.1.0/​255.255.255.0 ;​permit=172.16.1.0/​255.255.255.0
 +;​directmedia=no
 +;​nat=force_rport,​comedia
 +;​qualify=yes
  
 ;[user2] ;[user2]
Line 93: Line 93:
 ==== Использование шаблонов в именах CHAN_SIP каналов ==== ==== Использование шаблонов в именах CHAN_SIP каналов ====
 <​code>​ <​code>​
-root@server# cat /​etc/​asterisk/​sip.conf+server# cat /​etc/​asterisk/​sip.conf
 </​code><​code>​ </​code><​code>​
 ... ...
-;[office](!) +[office](!) 
-;type=friend +type=friend 
-;host=dynamic +host=dynamic 
-;deny=0.0.0.0/​0.0.0.0 +deny=0.0.0.0/​0.0.0.0 
-;permit=192.168.X.0/​255.255.255.0+permit=192.168.X.0/​255.255.255.0 
 + 
 +[internet](!) 
 +type=friend 
 +host=dynamic 
 +permit=0.0.0.0/​0.0.0.0 
 +nat=force_rport,​comedia 
 +qualify=yes 
 +directmedia=no 
 +;​call-limit=1 
 + 
 +[401](office) 
 +secret=tpassword401 
 + 
 +[402](internet) 
 +secret=tpassword402
  
-;[403](office) +[403](office) 
-;secret=tpassword403+secret=tpassword403
  
-;[404](office) +[404](office) 
-;secret=tpassword404+secret=tpassword404
 ... ...
 </​code>​ </​code>​
Line 131: Line 146:
 protocol=udp protocol=udp
 bind=0.0.0.0:​5060 bind=0.0.0.0:​5060
-;​local_net=192.168.X.0/​255.255.255.0 
-;​external_media_address=172.16.1.X 
-;​external_signaling_address=172.16.1.X 
 </​code>​ </​code>​
  
Line 227: Line 239:
 </​code><​code>​ </​code><​code>​
 ... ...
-; voip1.un и server.corp.un одна и та же система+; voip1.un и server.corp.un ​(курс CGP) одна и та же система
 ; приходится подключаться к ней с разных портов :) ; приходится подключаться к ней с разных портов :)
  
Line 234: Line 246:
 protocol=udp protocol=udp
 bind=0.0.0.0:​5062 bind=0.0.0.0:​5062
 +;​local_net=192.168.1.0/​255.255.255.0
 +;​local_net=192.168.X.0/​255.255.255.0
 +;​external_media_address=172.16.1.X
 +;​external_signaling_address=172.16.1.X
  
 [voip1_00000X] [voip1_00000X]
Line 343: Line 359:
 </​code><​code>​ </​code><​code>​
 [general] [general]
 +...
 +disallow=all
 +allow=alaw
 ... ...
 allow=h263 allow=h263
Line 352: Line 371:
  
 ==== Отладка работы Asterisk ==== ==== Отладка работы Asterisk ====
 +
 +  * [[https://​community.asterisk.org/​t/​help-new-installation-full-of-errors/​46614|HELP - New Installation Full of Errors]]
  
 === Сервисные сообщения === === Сервисные сообщения ===
Line 389: Line 410:
  
 ==== TimeBased контексты ==== ==== TimeBased контексты ====
 +
 +  * [[https://​wiki.asterisk.org/​wiki/​display/​AST/​Contexts%2C+Extensions%2C+and+Priorities#​Contexts,​Extensions,​andPriorities-Dialplansearchorder|Dialplan search order]]
  
   * [[https://​www.voip-info.org/​asterisk-tips-openhours/​|How to include contexts based on time and date]]   * [[https://​www.voip-info.org/​asterisk-tips-openhours/​|How to include contexts based on time and date]]
Line 653: Line 676:
  
 server*CLI>​ channel request hangup SIP/<​TAB>​ server*CLI>​ channel request hangup SIP/<​TAB>​
 +
 +# watch -d "​asterisk -x 'cdr show active'"​
  
 # curl -v -X GET "​http://​localhost:​8088/​ari/​channels?​api_key=asterisk:​asterisk"​ # curl -v -X GET "​http://​localhost:​8088/​ari/​channels?​api_key=asterisk:​asterisk"​
Line 819: Line 844:
 <​code>​ <​code>​
 http://​172.16.1.X/​asterisk-cdr-viewer/​ http://​172.16.1.X/​asterisk-cdr-viewer/​
 +</​code>​
 +
 +  * Спасибо Комлеву Александру Павловичу! ​
 +
 +<​code>​
 +Чтобы запись разговора воспроизводилась прямо на странице CDR Viewer, нужно в файле ​
 +/​var/​www/​html/​asterisk-cdr-viewer/​include/​functions.inc.php
 +заменить ​ строку:​
 +
 +echo " ​   <td class=\"​record_col\"><​a href=\"​download.php?​audio=$recorded_file.$system_audio_format\"​ title=\"​Listen to call recording\"><​img src=\"​templates/​images/​sound.png\"​ alt=\"​Call recording\"​ /></​a></​td>​\n";​
 +
 +на такую:
 +
 +echo " ​   <td class=\"​record_col\"><​a href=\"​download.php?​audio=$recorded_file.$system_audio_format\"​ title=\"​Listen to call recording\"><​img src=\"​templates/​images/​sound.png\"​ alt=\"​Call recording\"​ /></​a><​audio controls><​source src=\"​download.php?​audio=$recorded_file.$system_audio_format\"></​audio></​td>​\n";​
 </​code>​ </​code>​
 ===== Asterisk realtime ===== ===== Asterisk realtime =====
Line 1573: Line 1612:
 [general] [general]
 ... ...
-;featuredigittimeout = 1000+featuredigittimeout = 3000
 ... ...
 [featuremap] [featuremap]
Line 1663: Line 1702:
 ... ...
 pickupexten = *88 pickupexten = *88
-... 
-</​code><​code>​ 
-server# cat /​etc/​asterisk/​extensions.conf 
-</​code><​code>​ 
-... 
-exten => _8XXXXXXXXXX,​1,​Dial(SIP/​voip1_00000X/​${EXTEN},,​T) 
-... 
-exten => voip1_00000X,​1,​Dial(SIP/​401,,​t) 
 ... ...
 </​code><​code>​ </​code><​code>​
Line 1697: Line 1728:
  
 include => parkedcalls include => parkedcalls
 +...
 +exten => _8XXXXXXXXXX,​1,​Dial(SIP/​voip1_00000X/​${EXTEN},,​T)
 +...
 +exten => voip1_00000X,​1,​Dial(SIP/​401,,​t)
 ... ...
 </​code>​ </​code>​
Line 1771: Line 1806:
 ... ...
  
-;For IMAP/SMTP+;;;For IMAP/SMTP
 ;​charset=UTF-8 ;​charset=UTF-8
 ;​locale=ru_RU.UTF-8 ;​locale=ru_RU.UTF-8
Line 1780: Line 1815:
 ... ...
  
-;For IMAP +;;;For IMAP 
-;debian# apt install asterisk-voicemail-imapstorage +;;;debian# apt install asterisk-voicemail-imapstorage 
-;debian# cp /​etc/​dovecot/​private/​dovecot.pem /​usr/​local/​share/​ca-certificates/​dovecot.crt +;;;debian# cp /​etc/​dovecot/​private/​dovecot.pem /​usr/​local/​share/​ca-certificates/​dovecot.crt 
-;debian# update-ca-certificates +;;;debian# update-ca-certificates 
-;debian# service asterisk restart+;;;debian# service asterisk restart
 ;​imapserver=server.corpX.un ;​imapserver=server.corpX.un
 ;​imapfolder=INBOX ;​imapfolder=INBOX
  
-;For SMTP+;;;For SMTP
 ;debian# apt install postfix mailutils ;debian# apt install postfix mailutils
  
Line 1895: Line 1930:
 server*CLI>​ channel originate PJSIP/​89161234567@voip1_00000X extension voip1_00000X@default server*CLI>​ channel originate PJSIP/​89161234567@voip1_00000X extension voip1_00000X@default
  
-; сначала вызов обработчика (например - все телефоны в офисе),​ затем вызов абонента+; сначала вызов обработчика (например - все телефоны в офисе ​или оператор/​агент из членов очереди), затем вызов абонента
 server*CLI>​ channel originate Local/​voip1_00000X@default extension 89161234567@default server*CLI>​ channel originate Local/​voip1_00000X@default extension 89161234567@default
-server*CLI>​ channel originate Local/​601@default extension 89161234567@default 
 </​code><​code>​ </​code><​code>​
 # cat /​usr/​share/​originate_cli.sh # cat /​usr/​share/​originate_cli.sh
Line 1904: Line 1938:
  
 asterisk -x "​channel originate SIP/$1 extension $2@default"​ asterisk -x "​channel originate SIP/$1 extension $2@default"​
 +</​code><​code>​
 +# /​usr/​share/​originate_cli.sh 403 601
 </​code>​ </​code>​
 +
 ==== С использованием Call файлов ==== ==== С использованием Call файлов ====
  
Line 1911: Line 1948:
  
 <​code>​ <​code>​
-server# cat 1.call+# cat call.txt
 </​code><​code>​ </​code><​code>​
-Channel: ​sip/401 +Channel: ​Local/voip1_00000X@default 
-Extension: ​601+Extension: ​89161234567
 Context: default Context: default
-CallerId: ​Conferencia ​<601>+CallerId: ​CorpX<84992636363>
 </​code><​code>​ </​code><​code>​
-server# ​cat 2.call +server# ​grep astspooldir ​/etc/​asterisk/asterisk.conf 
-</code><​code>​ + 
-Channel: sip/402 +server# ​cp call.txt /var/​spool/​asterisk/​outgoing
-Extension: 601 + 
-Context: default +server# ​ls /​var/​spool/​asterisk/​outgoing_done
-CallerId: Conferencia <​601>​ +
-</​code><​code>​ +
-server# ​cat 3.call +
-</code><​code>​ +
-Channel: sip/403 +
-Extension: 601 +
-Context: default +
-CallerId: Conferencia <​601>​ +
-</​code><​code>​ +
-server# ​cp [123].call ​/​var/​spool/​asterisk/​outgoing/+
 </​code><​code>​ </​code><​code>​
 # cat /​usr/​share/​originate_call_file.sh # cat /​usr/​share/​originate_call_file.sh
Line 2023: Line 2050:
 ;[menu2] ;[menu2]
 ;exten => s,​1,​Background(silence/​8) ;exten => s,​1,​Background(silence/​8)
-;exten => s,1,​WaitExten(8) ​   ; работает только после Answer или Background+;exten => s,n,​WaitExten(8) ​   ; работает только после Answer или Background
 ;exten => _4XX,​1,​Goto(default,​${EXTEN},​1) ;exten => _4XX,​1,​Goto(default,​${EXTEN},​1)
 ;exten => t,​1,​Goto(menu,​s,​1) ​ ; timeout exceeded, работает только с WaitExten ;exten => t,​1,​Goto(menu,​s,​1) ​ ; timeout exceeded, работает только с WaitExten
Line 2255: Line 2282:
 ;​number=>​89162323232,​30 ;​number=>​89162323232,​30
 context=>​default context=>​default
 +;​context=>​to-pstn
 [401] [401]
 number=>​89162323232,​30 number=>​89162323232,​30
 ;​number=>​89163434345,​30 ;​number=>​89163434345,​30
 context=>​default context=>​default
 +;​context=>​to-pstn
 </​code><​code>​ </​code><​code>​
 server# cat /​etc/​asterisk/​extensions.conf server# cat /​etc/​asterisk/​extensions.conf
Line 2401: Line 2430:
 exten => s,​n,​ExecIf($["​${DIALSTATUS}"​="​${BUSY}"​]?​Bridge(SIP/​854)) exten => s,​n,​ExecIf($["​${DIALSTATUS}"​="​${BUSY}"​]?​Bridge(SIP/​854))
 exten => s,​n,​Dial(SIP/​854) exten => s,​n,​Dial(SIP/​854)
 +</​code>​
 +
 +Кузьмин Алексей предложил решение,​ если требуется только уведомить звонящего
 +
 +<​code>​
 +exten => _X.,​1,​Dial(PJSIP/​${EXTEN},​60)
 +exten => _X.,​n,​Goto(s-${DIALSTATUS},​1) ; Jump based on status (NOANSWER, BUSY, CHANUNAVAIL,​ CONGESTION, ANSWER)
 +exten => s-BUSY,​1,​Playback(ru/​custom/​busy_ru)
 +exten => s-BUSY,​n,​Hangup()
 +exten => s-NOANSWER,​1,​Playback(ru/​custom/​noanswer_ru)
 +exten => s-NOANSWER,​n,​Hangup()
 +exten => s-CHANUNAVAIL,​1,​Playback(ru/​custom/​invalid_ru)
 +exten => s-CHANUNAVAIL,​n,​Hangup()
 </​code>​ </​code>​
 ===== Организация Call центра ===== ===== Организация Call центра =====
Line 2418: Line 2460:
  
 [queue1] [queue1]
-;для демонстрации на многоканальном телефоне установить call-limit=1 +;​timeout=10 
-;member => SIP/401  ; ​в вебинаре ​(занять ​можно ​звонком на 311) + 
-;member => SIP/403  ​в классе+;для демонстрации на многоканальном телефоне установить call-limit=1  
 +;member => SIP/403  ; (можно ​занять звонком на 311) 
 + 
 +;member => SIP/user1@mailcgp 
 +;member => SIP/​user2@mailcgp 
 +;member => SIP/​user3@mailcgp
 </​code><​code>​ </​code><​code>​
 sever# cat /​etc/​asterisk/​extensions.conf sever# cat /​etc/​asterisk/​extensions.conf
Line 2471: Line 2518:
 strategy = rrmemory strategy = rrmemory
 musicclass = default musicclass = default
-timeout=10 
  
 announce = queue-markq announce = queue-markq
Line 2481: Line 2527:
 member => Local/​802@agents member => Local/​802@agents
 member => Local/​803@agents member => Local/​803@agents
- 
-;member => SIP/​user1@mailcgp 
-;member => SIP/​user2@mailcgp 
-;member => SIP/​user3@mailcgp 
 </​code><​code>​ </​code><​code>​
 server*CLI>​ queue show queue1 server*CLI>​ queue show queue1
Line 2509: Line 2551:
 ... ...
 </​code>​ </​code>​
-==== Приложение SHELL ====+==== Функция SHELL ====
  
   * !!! Название функции только ЗАГЛАВНЫМИ буквами   * !!! Название функции только ЗАГЛАВНЫМИ буквами
Line 2804: Line 2846:
 exten => _4XX,​n,​Hangup() exten => _4XX,​n,​Hangup()
  
-exten => _4XX,​n(busy),​Playback(tt-allbusy)+ 
 +exten => _4XX,​n(busy),​JabberSend(aster,​${MY-CALLED-USER-ID},​Вам звонил ${CALLERID(all)}) 
 +exten => _4XX,n,​Playback(tt-allbusy)
 exten => _4XX,​n,​Hangup() exten => _4XX,​n,​Hangup()
 ... ...
Line 3112: Line 3156:
 ==== Использование хешей паролей для каналов типа user ==== ==== Использование хешей паролей для каналов типа user ====
  
-[[http://​www.voip-info.org/​wiki/​view/​Asterisk+sip+md5secret]]+  * [[http://​www.voip-info.org/​wiki/​view/​Asterisk+sip+md5secret]] 
 +  * [[http://​asterisk-support.ru/​forum/​topics/​3032/​|SIP авторизация и MD5]]
  
 <​code>​ <​code>​
Line 3125: Line 3170:
 [402] [402]
 ;​secret=tpassword402 ;​secret=tpassword402
-md5secret=29c91aa064cf462f5146b7ee81e7ba49+md5secret=a77b8ed36b4be2c14c2d7e4dfad34b46
 ... ...
 </​code>​ </​code>​
сервис_asterisk.txt · Last modified: 2024/05/28 09:01 by val