В качестве памятки опишу способ доработки функции второй линии (Call Waiting) в FreePBX 14.
По-умолчанию механизм работы второй линии не предполагает никаких уведомлений звонящему в случае если вызываемый абонент уже с кем то разговаривает, а просто воспроизводятся стандартные гудки дозвона. Это создает впечатление у звонящего что вызываемый абонент не хочет брать трубку..
Было бы куда информотивнее проигрывать звонящему информационное сообщение, о том что абонент разговаривает, оставайтесь на линии или перезвоните позднее..
Как оказалось в FreePBX есть определенная обработка (macro-dialout-one-predial-hook) описанная в (/etc/asterisk/extensions.conf) и которая срабатывает до момента непосредственного звонка абоненту. В этой обработке можно проверить статус выдываемого абонента и в случае если статус линии занят, то проигрывать звонящему сообщение и продолжить вызов.
В файл конфигурации (/etc/asterisk/extensions_custom.conf) в секцию [from-internal-custom] добавляем:
[from-internal-custom] ;----- Playback Wait for answer in INUSE line ----- [macro-dialout-one-predial-hook] exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})}) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/wait_for_answer)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))
Принцип работы простой, при вызове получается статус линии и в случае если она занята, то вызывающему абоненту сперва будет проиграно заданное сообщение а после продолжится вызов абонента с мелодией ожидания вместо гудков.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА
Заметил что данная фишка не работает если на номере активна Follow Me. Методом тыка определил что если выставить стратегию ringallv2, то все успешно начинает работать.
Доброго времени!
Что то ни как не пойму, что не так делаю…
В extensions_custom.conf вписываю строки
[from-internal-custom]
include => macro-dialout-one-predial-hook
[macro-dialout-one-predial-hook]
exten => s,1,Noop(HINT STATUS — ${EXTENSION_STATE(${DEXTEN})})
exten => s,n,ExecIf($[«${EXTENSION_STATE(${DEXTEN})}» = «INUSE»]?Playback(/var/lib/asterisk/sounds/ru/wait_for_answer))
exten => s,n,ExecIf($[«${EXTENSION_STATE(${DEXTEN})}» = «INUSE»]?Set(D_OPTIONS=Ttm))
Но не работает. Follow Me на номере отключен. В консоле тишина. Если INUSE, интереса ради, меняю на UNKNOWN, то звуковое сообщение включается, но звонок не идет, т.е. трубка лежит, звонок не доходит
В консоле появляется
46337 [2021-06-21 16:08:16] VERBOSE[3138][C-0000089c] pbx.c: Executing [s@macro-dialout-one-predial-hook:1] NoOp(«SIP/************», «HINT STATUS — UNKNOWN») in new stack
Вот это работает с SIP и PJSIP
[from-internal-custom]
include => macro-dialout-one-predial-hook
[macro-dialout-one-predial-hook]
exten => s,1,Set(numberLT=$[${LEN(${DEXTEN})}+4])
exten => s,n,Set(numberLS=${LEN(${DSTRING})})
exten => s,n,ExecIf([${numberLS} > ${numberLT}]?Set(fooor=${DSTRING:0:$[${numberLT}+2]}):Set(fooor=${DSTRING}))
exten => s,n,Set(foost=${DEVICE_STATE(${fooor}})
exten => s,n,Noop(HINT ${fooor} — ${foost})
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Set(D_OPTIONS=Tt))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Set(D_OPTIONS=Tt))
Доброго времени суток. По итогу у вас получилось решить эту проблему?
Написал такую байду.
Работает на CHANSIP и PJSIP без заморочек
[from-internal-custom]
include => macro-dialout-one-predial-hook
[macro-dialout-one-predial-hook]
exten => s,1,Set(numberLT=$[${LEN(${DEXTEN})}+4])
exten => s,n,Set(numberLS=${LEN(${DSTRING})})
exten => s,n,ExecIf([${numberLS} > ${numberLT}]?Set(fooor=${DSTRING:0:$[${numberLT}+2]}):Set(fooor=${DSTRING}))
exten => s,n,Set(foost=${DEVICE_STATE(${fooor}})
exten => s,n,Noop(HINT ${fooor} — ${foost})
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Set(D_OPTIONS=Tt))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Set(D_OPTIONS=Tt))
LOG:
NoOp(«SIP/203-00000c41», «HINT SIP/247 — NOT_INUSE») in new stack
NoOp(«SIP/702-00000c43», «HINT SIP/801 — NOT_INUSE») in new stack
NoOp(«SIP/247-00000c3f», «HINT SIP/203 — INUSE») in new stack
NoOp(«SIP/801-00000c45», «HINT SIP/702 — NOT_INUSE») in new stack