SCROLL
Среднее время на прочтение: 1 мин.

Уведомление о занятости абонента при входящем звонке на занятую линию с включенным Call Waiting в FreePBX 14

В качестве памятки опишу способ доработки функции второй линии (Call Waiting) в FreePBX 14.

JUQwJTlGJUQwJUJFLSVEMSU4MyVEMCVCQyVEMCVCRSVEMCVCQiVEMSU4NyVEMCVCMCVEMCVCRCVEMCVCOCVEMSU4RSUyMCVEMCVCQyVEMCVCNSVEMSU4NSVEMCVCMCVEMCVCRCVEMCVCOCVEMCVCNyVEMCVCQyUyMCVEMSU4MCVEMCVCMCVEMCVCMSVEMCVCRSVEMSU4MiVEMSU4QiUyMCVEMCVCMiVEMSU4MiVEMCVCRSVEMSU4MCVEMCVCRSVEMCVCOSUyMCVEMCVCQiVEMCVCOCVEMCVCRCVEMCVCOCVEMCVCOCUyMCVEMCVCRCVEMCVCNSUyMCVEMCVCRiVEMSU4MCVEMCVCNSVEMCVCNCVEMCVCRiVEMCVCRSVEMCVCQiVEMCVCMCVEMCVCMyVEMCVCMCVEMCVCNSVEMSU4MiUyMCVEMCVCRCVEMCVCOCVEMCVCQSVEMCVCMCVEMCVCQSVEMCVCOCVEMSU4NSUyMCVEMSU4MyVEMCVCMiVEMCVCNSVEMCVCNCVEMCVCRSVEMCVCQyVEMCVCQiVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCOSUyMCVEMCVCNyVEMCVCMiVEMCVCRSVEMCVCRCVEMSU4RiVEMSU4OSVEMCVCNSVEMCVCQyVEMSU4MyUyMCVEMCVCMiUyMCVEMSU4MSVEMCVCQiVEMSU4MyVEMSU4NyVEMCVCMCVEMCVCNSUyMCVEMCVCNSVEMSU4MSVEMCVCQiVEMCVCOCUyMCVEMCVCMiVEMSU4QiVEMCVCNyVEMSU4QiVEMCVCMiVEMCVCMCVEMCVCNSVEMCVCQyVEMSU4QiVEMCVCOSUyMCVEMCVCMCVEMCVCMSVEMCVCRSVEMCVCRCVEMCVCNSVEMCVCRCVEMSU4MiUyMCVEMSU4MyVEMCVCNiVEMCVCNSUyMCVEMSU4MSUyMCVEMCVCQSVEMCVCNSVEMCVCQyUyMCVEMSU4MiVEMCVCRSUyMCVEMSU4MCVEMCVCMCVEMCVCNyVEMCVCMyVEMCVCRSVEMCVCMiVEMCVCMCVEMSU4MCVEMCVCOCVEMCVCMiVEMCVCMCVEMCVCNSVEMSU4MiUyQyUyMCVEMCVCMCUyMCVEMCVCRiVEMSU4MCVEMCVCRSVEMSU4MSVEMSU4MiVEMCVCRSUyMCVEMCVCMiVEMCVCRSVEMSU4MSVEMCVCRiVEMSU4MCVEMCVCRSVEMCVCOCVEMCVCNyVEMCVCMiVEMCVCRSVEMCVCNCVEMSU4RiVEMSU4MiVEMSU4MSVEMSU4RiUyMCVEMSU4MSVEMSU4MiVEMCVCMCVEMCVCRCVEMCVCNCVEMCVCMCVEMSU4MCVEMSU4MiVEMCVCRCVEMSU4QiVEMCVCNSUyMCVEMCVCMyVEMSU4MyVEMCVCNCVEMCVCQSVEMCVCOCUyMCVEMCVCNCVEMCVCRSVEMCVCNyVEMCVCMiVEMCVCRSVEMCVCRCVEMCVCMC4lMjAlRDAlQUQlRDElODIlRDAlQkUlMjAlRDElODElRDAlQkUlRDAlQjclRDAlQjQlRDAlQjAlRDAlQjUlRDElODIlMjAlRDAlQjIlRDAlQkYlRDAlQjUlRDElODclRDAlQjAlRDElODIlRDAlQkIlRDAlQjUlRDAlQkQlRDAlQjglRDAlQjUlMjAlRDElODMlMjAlRDAlQjclRDAlQjIlRDAlQkUlRDAlQkQlRDElOEYlRDElODklRDAlQjUlRDAlQjMlRDAlQkUlMjAlRDElODclRDElODIlRDAlQkUlMjAlRDAlQjIlRDElOEIlRDAlQjclRDElOEIlRDAlQjIlRDAlQjAlRDAlQjUlRDAlQkMlRDElOEIlRDAlQjklMjAlRDAlQjAlRDAlQjElRDAlQkUlRDAlQkQlRDAlQjUlRDAlQkQlRDElODIlMjAlRDAlQkQlRDAlQjUlMjAlRDElODUlRDAlQkUlRDElODclRDAlQjUlRDElODIlMjAlRDAlQjElRDElODAlRDAlQjAlRDElODIlRDElOEMlMjAlRDElODIlRDElODAlRDElODMlRDAlQjElRDAlQkElRDElODMuLg==

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

JUQwJTlBJUQwJUIwJUQwJUJBJTIwJUQwJUJFJUQwJUJBJUQwJUIwJUQwJUI3JUQwJUIwJUQwJUJCJUQwJUJFJUQxJTgxJUQxJThDJTIwJUQwJUIyJTIwRnJlZVBCWCUyMCVEMCVCNSVEMSU4MSVEMSU4MiVEMSU4QyUyMCVEMCVCRSVEMCVCRiVEMSU4MCVEMCVCNSVEMCVCNCVEMCVCNSVEMCVCQiVEMCVCNSVEMCVCRCVEMCVCRCVEMCVCMCVEMSU4RiUyMCVEMCVCRSVEMCVCMSVEMSU4MCVEMCVCMCVEMCVCMSVEMCVCRSVEMSU4MiVEMCVCQSVEMCVCMCUyMG1hY3JvLWRpYWxvdXQtb25lLXByZWRpYWwtaG9vayVDMiVBMCVEMCVCRSVEMCVCRiVEMCVCOCVEMSU4MSVEMCVCMCVEMCVCRCVEMCVCRCVEMCVCMCVEMSU4RiUyMCVEMCVCMiUyMCUyRmV0YyUyRmFzdGVyaXNrJTJGZXh0ZW5zaW9ucy5jb25mJUMyJUEwJUQwJUI4JTIwJUQwJUJBJUQwJUJFJUQxJTgyJUQwJUJFJUQxJTgwJUQwJUIwJUQxJThGJTIwJUQxJTgxJUQxJTgwJUQwJUIwJUQwJUIxJUQwJUIwJUQxJTgyJUQxJThCJUQwJUIyJUQwJUIwJUQwJUI1JUQxJTgyJTIwJUQwJUI0JUQwJUJFJTIwJUQwJUJDJUQwJUJFJUQwJUJDJUQwJUI1JUQwJUJEJUQxJTgyJUQwJUIwJTIwJUQwJUJEJUQwJUI1JUQwJUJGJUQwJUJFJUQxJTgxJUQxJTgwJUQwJUI1JUQwJUI0JUQxJTgxJUQxJTgyJUQwJUIyJUQwJUI1JUQwJUJEJUQwJUJEJUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQwJUI3JUQwJUIyJUQwJUJFJUQwJUJEJUQwJUJBJUQwJUIwJTIwJUQwJUIwJUQwJUIxJUQwJUJFJUQwJUJEJUQwJUI1JUQwJUJEJUQxJTgyJUQxJTgzLiUyMCVEMCU5MiUyMCVEMSU4RCVEMSU4MiVEMCVCRSVEMCVCOSUyMCVEMCVCRSVEMCVCMSVEMSU4MCVEMCVCMCVEMCVCMSVEMCVCRSVEMSU4MiVEMCVCQSVEMCVCNSUyMCVEMCVCQyVEMCVCRSVEMCVCNiVEMCVCRCVEMCVCRSUyMCVEMCVCRiVEMSU4MCVEMCVCRSVEMCVCMiVEMCVCNSVEMSU4MCVEMCVCOCVEMSU4MiVEMSU4QyUyMCVEMSU4MSVEMSU4MiVEMCVCMCVEMSU4MiVEMSU4MyVEMSU4MSUyMCVEMCVCMiVEMSU4QiVEMCVCNCVEMCVCMCVEMCVCMiVEMCVCMCVEMCVCNSVEMCVCQyVEMCVCRSVEMCVCMyVEMCVCRSUyMCVEMCVCMCVEMCVCMSVEMCVCRSVEMCVCRCVEMCVCNSVEMCVCRCVEMSU4MiVEMCVCMCUyMCVEMCVCOCUyMCVEMCVCMiUyMCVEMSU4MSVEMCVCQiVEMSU4MyVEMSU4NyVEMCVCMCVEMCVCNSUyMCVEMCVCNSVEMSU4MSVEMCVCQiVEMCVCOCUyMCVEMSU4MSVEMSU4MiVEMCVCMCVEMSU4MiVEMSU4MyVEMSU4MSUyMCVEMCVCQiVEMCVCOCVEMCVCRCVEMCVCOCVEMCVCOCUyMCVEMCVCNyVEMCVCMCVEMCVCRCVEMSU4RiVEMSU4MiUyQyUyMCVEMSU4MiVEMCVCRSUyMCVEMCVCRiVEMSU4MCVEMCVCRSVEMCVCOCVEMCVCMyVEMSU4MCVEMSU4QiVEMCVCMiVEMCVCMCVEMSU4MiVEMSU4QyUyMCVEMCVCNyVEMCVCMiVEMCVCRSVEMCVCRCVEMSU4RiVEMSU4OSVEMCVCNSVEMCVCQyVEMSU4MyUyMCVEMSU4MSVEMCVCRSVEMCVCRSVEMCVCMSVEMSU4OSVEMCVCNSVEMCVCRCVEMCVCOCVEMCVCNSUyMCVEMCVCOCUyMCVEMCVCRiVEMSU4MCVEMCVCRSVEMCVCNCVEMCVCRSVEMCVCQiVEMCVCNiVEMCVCOCVEMSU4MiVEMSU4QyUyMCVEMCVCMiVEMSU4QiVEMCVCNyVEMCVCRSVEMCVCMi4=

В файл конфигурации /etc/asterisk/extensions_custom.conf в секцию [from-internal-custom] добавляем:

/etc/asterisk/extensions_custom.conf
[from-internal-custom]

JTNCLS0tLS0lMjBQbGF5YmFjayUyMFdhaXQlMjBmb3IlMjBhbnN3ZXIlMjBpbiUyMElOVVNFJTIwbGluZSUyMC0tLS0t
JTVCbWFjcm8tZGlhbG91dC1vbmUtcHJlZGlhbC1ob29rJTVE
ZXh0ZW4lMjAlM0QlM0UlMjBzJTJDMSUyQ05vb3AoREVWSUNFJTIwU1RBVEUlMjAtJTIwJTI0JTdCREVWSUNFX1NUQVRFKCUyNCU3QkRTVFJJTkclN0QpJTdEKQ==
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))
Возможные варианты состояния линии DEVICE_STATE — UNKNOWN, NOT_INUSE, INUSE, BUSY, INVALID, UNAVAILABLE, RINGING, RINGINUSE, ONHOLD (более подробно можно почитать в оф. документации)

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

JUQwJTlGJUQwJUJFLSVEMSU4MyVEMCVCQyVEMCVCRSVEMCVCQiVEMSU4NyVEMCVCMCVEMCVCRCVEMCVCOCVEMSU4RSUyMEZyZWVQQlglMjAlRDElODElRDAlQkMlRDAlQkUlRDElODIlRDElODAlRDAlQjglRDElODIlMjAlRDAlQkElRDAlQjAlRDElODIlRDAlQjAlRDAlQkIlRDAlQkUlRDAlQjMlMjAlRDElODElRDAlQkUlMjAlRDAlQjclRDAlQjIlRDElODMlRDAlQkElRDAlQjAlRDAlQkMlMjAlRDAlQkYlRDAlQkUlMjAlRDAlQkYlRDElODMlRDElODIlRDAlQjglMjAlRTIlODAlOTQlQzIlQTAlMkZ2YXIlMkZsaWIlMkZhc3RlcmlzayUyRnNvdW5kcyUyRnJ1LiUyMA==

Скачать “ЗВУК. Абонент разговаривает или временно не доступен” wait_for_answer.wav – Загружено 939 раз – 92,10 КБ  

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение

Ответ на комментарий ИгорьОтмена ответа
10 комментариев
  • Сергей а какую именно запись использовали? у меня в extensions.conf нету поля [from-internal-custom] нужно вручную добавлять?

  • Спасибо, это помогло FreePBX 15

  • Уважаемый Jakondo, не могли бы вы подсказать что нужно изменить в написанном Вами руководстве, чтобы оно работало в FreePBX 15? Буду очень признателен Вам за ответ.

    • Это ответ на комментарий Игорь

      Сложно сказать на самом деле, т.к. нет под рукой FreePBX 15 и возможности проверить.
      Нужно смотреть лог звонка, анализировать и вносить правки.

      Пришлите лог звонка, попробую посмотреть.

  • Написал такую байду.
    Работает на 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

  • Доброго времени!
    Что то ни как не пойму, что не так делаю…
    В 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))

    • Это ответ на комментарий Константин

      Доброго времени суток. По итогу у вас получилось решить эту проблему?

  • Заметил что данная фишка не работает если на номере активна Follow Me. Методом тыка определил что если выставить стратегию ringallv2, то все успешно начинает работать.