/ #linux 

IP-телефонія на базі Asterisk. Частина 6.3: Додаткові функції Asterisk. Музика на утриманні (music on hold).

Цикл статей по розгортанню IP-телефонії на базі Asterisk. Фактично це моя проектна робота на отримання відповідного сертифікату одного з навчальних центрів. Робота була захищена, сертифікат отриманий, все написане тестувалось і є повтінстю робочою реалізацією. Інформація в статті і версії програмного забезбечення актуальні на 2017 рік.

6. Додаткові функції Asterisk.

6.2 Музика на утриманні (music on hold).

Конфігурація музики на утриманні виконується в файлі /etc/asterisk/musiconhold.conf.

[default] 
mode=files 
directory=/var/lib/asterisk/moh

[mymoh]
mode=files
directory=/var/lib/asterisk/moh/mymohdir

Після цього reload конфігурації Asterisk і перевіряємо, що новий клас створено:

asterisk-centos*CLI> moh show classes
Class: default
	Mode: files
	Directory: moh
Class: mymoh
	Mode: files
	Directory: /var/lib/asterisk/moh/mymohdir

Для того щоб програвалася музика, поки абонент не візьме слухавку, потрібно використовувати опцію m Dial() із зазначенням класу.

Для додаткової індикації дзвінків на міжнародну лінію змінимо музику на утриманні на свій клас:

;вихідні дзвінки на всі зовнішні лінії, включаючи міжнародний зв'язок
[call-out-world]
exten => _XXXXXXXXXXXX,1,Set(RECORDING=1)
exten => _XXXXXXXXXXXX,n,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _XXXXXXXXXXXX,n,Set(CHANNEL(musicclass)=mymoh)
exten => _XXXXXXXXXXXX,n,Dial(SIP/${EXTEN}@zadarma,20,m)
exten => _XXXXXXXXXXXX,n,Hangup()

Перевірка:

asterisk-centos*CLI> 
  == Using SIP RTP CoS mark 5
    -- Executing [YYYYYY@buyings:1] Set("SIP/301-0000000d", "RECORDING=1") in new stack
    -- Executing [YYYYYY@buyings:2] Macro("SIP/301-0000000d", "recording,301,YYYYYY") in new stack
    -- Executing [s@macro-recording:1] GotoIf("SIP/301-0000000d", "1?yes:no") in new stack
    -- Goto (macro-recording,s,2)
    -- Executing [s@macro-recording:2] Set("SIP/301-0000000d", "fname=2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY") in new stack
    -- Executing [s@macro-recording:3] Set("SIP/301-0000000d", "fname=2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY") in new stack
    -- Executing [s@macro-recording:4] Set("SIP/301-0000000d", "DIR_RECORDS=/var/spool/asterisk/monitor/") in new stack
    -- Executing [s@macro-recording:5] NoOp("SIP/301-0000000d", "Dir  - 2017/2017-05/2017-05-08") in new stack
    -- Executing [s@macro-recording:6] Set("SIP/301-0000000d", "monopt=nice -n 19 /usr/local/bin/lame -b 32  --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav"  "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.mp3"") in new stack
    -- Executing [s@macro-recording:7] Set("SIP/301-0000000d", "CDR(filename)=2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.mp3") in new stack
    -- Executing [s@macro-recording:8] Set("SIP/301-0000000d", "CDR(realdst)=") in new stack
[2017-05-08 19:56:55] WARNING[4884]: func_cdr.c:383 cdr_write_callback: CDR requires a value (CDR(variable)=value)
    -- Executing [s@macro-recording:9] MixMonitor("SIP/301-0000000d", "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav,b,nice -n 19 /usr/local/bin/lame -b 32  --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav"  "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.mp3"") in new stack
    -- Executing [s@macro-recording:10] Verbose("SIP/301-0000000d", "Exit record") in new stack
Exit record
    -- Executing [YYYYYY@buyings:3] Set("SIP/301-0000000d", "CHANNEL(musicclass)=mymoh") in new stack
    -- Executing [YYYYYY@buyings:4] Dial("SIP/301-0000000d", "SIP/YYYYYY@zadarma,20,m") in new stack
  == Begin MixMonitor Recording SIP/301-0000000d
  == Using SIP RTP CoS mark 5
    -- Called SIP/YYYYYY@zadarma
    -- Started music on hold, class 'mymoh', on channel 'SIP/301-0000000d'
[2017-05-08 19:56:55] WARNING[5054][C-00000007]: translate.c:407 framein: no samples for ulawtolin
       > 0xb680a4a0 -- Probation passed - setting RTP source address to 192.168.1.100:7078
    -- SIP/zadarma-0000000e is making progress passing it to SIP/301-0000000d
    -- SIP/zadarma-0000000e is ringing
    -- Got SIP response 486 "Busy here" back from 185.45.152.161:5060
    -- SIP/zadarma-0000000e is busy
  == Everyone is busy/congested at this time (1:1/0/0)
    -- Stopped music on hold on SIP/301-0000000d
    -- Executing [YYYYYY@buyings:5] Hangup("SIP/301-0000000d", "") in new stack
  == Spawn extension (buyings, YYYYYY, 5) exited non-zero on 'SIP/301-0000000d'
  == MixMonitor close filestream (mixed)
  == Executing [nice -n 19 /usr/local/bin/lame -b 32  --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav"  "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08/1494262615.20-2017-05-08-19_56-301-YYYYYY.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-08

В наступній статті налаштуємо перехоплення дзвінків в Asterisk.

Посилання

Author

Олександр Бобилєв

Залишаю собі право використовувати ненормативну (але інформативну) лексику там, де звичайні слова втрачають сенс і не відображають всієї палітри почуттів, від споглядання навколишньої дійсності.