487 просмотров
от (1.5 тыс. баллов) в категории Тонкая настройка

Здравствуйте, есть dialplan:

1, Answer()
n, Dial(SIP/111,3600,m()g)
# отправка почты
n, GotoIf($[ ${DIALSTATUS} != "ANSWER" ]?send:end)
n(send), AGI(DIALPLAN-APP-907D695D51AF9CBAB936A4EE7F1792AC.php)
n(end), Hangup()

dialplan отправляет сообщение на email если абонент 111 не ответил на звонок, или сбросил звонок, но если вызывающий не дождался ответа и положил трубку - сообщение не отправляется, dialplan вообще дальше не выполняется. Подскажите как отправить сообщение в таком случае?

1 Ответ

от (122 тыс. баллов)
выбран от
 
Лучший ответ

Можно попробовать использовать обработчик завершения вызова. 

Пример можно посмотреть в dialplan MIKOPBX. Вот пример:

    same => n,Set(CHANNEL(hangup_handler_wipe)=hangup_handler,s,1) 
   same => n,return 

[hangup_handler]
exten => s,1,NoOp(--- hangup - ${CHANNEL} ---)
   same => n,return

от (1.5 тыс. баллов)
Спасибо, помогло
от (1.4 тыс. баллов)
коллеги, а подскажите как решили этот вопрос?
от (1.5 тыс. баллов)

В файл extensions.conf добавляем в конец (вызов приложения на php для отправки почты)

; Отправка email
[hangup_handler_mail]
exten => s,1,NoOp(*** hangup_mail - ${CHANNEL} - ${DIALSTATUS} - ${MEMBERINTERFACE} ***)
   same => n,ExecIf($["${DIALSTATUS}" != "ANSWER" & "${MEMBERINTERFACE}" = ""]?AGI(DIALPLAN-APP-C07F68042D533D13CED4E52910CA61E4.php))

В приложении диалплана добавляем код

; Отправка почты при сбросе звонка клиентом
n, Set(CHANNEL(hangup_handler_wipe)=hangup_handler_mail,s,1)

В конце дилплана отключаем обработчик (если клиенту ответили)

; Отключаем отправку при сбросе звонка
n, Set(CHANNEL(hangup_handler_wipe)=hangup_handler,s,1)
от (1.4 тыс. баллов)

В приложении диалплана добавляем код

Не совсем понимаю как отредактировать extensions.conf чтобы описанный план подхватился. Приложение пытаюсь вызвать из диалплана IVR.

вот что прописал в extensions.conf

[hangup_handler_telegram]
exten => s,1,NoOp(--- hangup - ${CHANNEL} ---)
    ;same => n,Gosub(hangup_chan,${EXTEN},1)
    same => h,1,ExecIf($["${DIALSTATUS}" = "NOANSWER"] | $["${DIALSTATUS}" = "BUSY"])?AGI(DIALPLAN-APP-79CAC1F28069C0F890BDABD88F308333.php, ${CALLERID(num)}, ${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S)})
    same => n(end), Hangup()
    same => n,return
    
[ivr-2200]
exten => s,1,ExecIf($["${CHANNEL(channeltype)}" == "Local"]?Gosub(set_orign_chan,s,1))
    same => n,Set(APPEXTEN=2200)
    same => n,Gosub(dial_app,${EXTEN},1)
    same => n,Answer()
    same => n,Set(try_count=0); №6
    same => n,Set(try_count=$[${try_count} + 1])
    same => n,GotoIf($[${try_count} > 1]?internal,800,1)
    same => n,Set(TIMEOUT(digit)=2)
    same => n,Background(/storage/usbdisk1/mikopbx/media/custom/ServicehalloKarinafon)
    same => n,WaitExten(1)
    same => n, Set(CHANNEL(hangup_handler_wipe)=hangup_handler_telegram,s,1)
exten => 0,1,Goto(internal,800,1)
exten => i,1,Goto(s,6)
exten => t,1,Goto(s,6)
exten => _XXXX,1,ExecIf($["${DIALPLAN_EXISTS(internal,${EXTEN},1)}" == "0"]?Goto(i,1))
    same => n,ExecIf($["${PJSIP_ENDPOINT(${EXTEN},auth)}x" == "x"]?Goto(i,1))
    same => n,Goto(internal,${EXTEN},1)   

 

от (1.5 тыс. баллов)

1. В файл extensions.conf добавляется handler для вызова приложения php, в вашем случае это hangup_handler_telegram (командой "добавить в конец фала" раздела "кастомизация системных файлов")

2. В вашем приложении диалплана назначаете этот handler при досрочном завершении вызова с помощью команды Set(CHANNEL(hangup_handler_wipe)=hangup_handler_telegram,s,1)

от (1.4 тыс. баллов)
спасибо, но еще один вопрос, если можно, а то мозг сломал.

входящий звонок сейчас идет таким образом

приложение диалплана с определением времени (условно график), при условии совпадения под график отправляется на определенное ивр меню, далее звонок уходит на очередь, ну и затем на ответственного специалиста.

Задача сделать уведомление в случае если звонок сорвался на этапе ивр.
от (1.4 тыс. баллов)

вроде бы придумал как сделать, но уведомление не приходит

 == Setting global variable 'SIPDOMAIN' to '10.10.0.11'
    -- Executing [2200116@all_peers:1] ExecIf("PJSIP/1303-00001a31", "0?Hangup()") in new stack
    -- Executing [2200116@all_peers:2] Set("PJSIP/1303-00001a31", "cleanNumber=2200116") in new stack
    -- Executing [2200116@all_peers:3] ExecIf("PJSIP/1303-00001a31", "0?Goto(all_peers,2200116,4)") in new stack
    -- Executing [2200116@all_peers:4] Set("PJSIP/1303-00001a31", "__FROM_CHAN=PJSIP/1303-00001a31") in new stack
    -- Executing [2200116@all_peers:5] ExecIf("PJSIP/1303-00001a31", "1?Set(__OLD_LINKEDID=mikopbx-1619762259.15692)") in new stack
    -- Executing [2200116@all_peers:6] ExecIf("PJSIP/1303-00001a31", "1?Gosub(set_from_peer,s,1)") in new stack
    -- Executing [s@set_from_peer:1] NoOp("PJSIP/1303-00001a31", "__FROM_PEER set to 1303")
    -- Executing [s@set_from_peer:1] return("PJSIP/1303-00001a31", "")
    -- Executing [2200116@all_peers:7] ExecIf("PJSIP/1303-00001a31", "0?Gosub(set_orign_chan,s,1)") in new stack
    -- Executing [2200116@all_peers:8] ExecIf("PJSIP/1303-00001a31", "0?Set(CALLERID(num)=1303)") in new stack
    -- Executing [2200116@all_peers:9] ExecIf("PJSIP/1303-00001a31", "0?Set(CALLERID(name)=1303)") in new stack
    -- Executing [2200116@all_peers:10] ExecIf("PJSIP/1303-00001a31", "0?Set(__FROM_PEER=1303)") in new stack
    -- Executing [2200116@all_peers:11] Set("PJSIP/1303-00001a31", "CHANNEL(hangup_handler_wipe)=hangup_handler,s,1") in new stack
    -- Executing [2200116@all_peers:12] Gosub("PJSIP/1303-00001a31", "dial,2200116,1") in new stack
    -- Executing [2200116@dial:1] UserEvent("PJSIP/1303-00001a31", "CdrConnector,AgiData:eyJJU19PUkdOVCI6ZmFsc2UsIlVOSVFVRUlEIjoibWlrb3BieC0xNjE5NzYyMjU5LjE1NjkyX21GeGVrMSIsImFjdGlvbiI6ImRpYWwiLCJhZ2lfY2hhbm5lbCI6IlBKU0lQLzEzMDMtMDAwMDFhMzEiLCJkaWQiOiIiLCJkc3RfbnVtIjoiMjIwMDExNiIsImZyb21fYWNjb3VudCI6IjEzMDMiLCJsaW5rZWRpZCI6Im1pa29wYngtMTYxOTc2MjI1OS4xNTY5MiIsInNyY19jYWxsX2lkIjoiMF8zNTc2NDE2OTE3QDEwLjEwLjAuMTAxIiwic3JjX2NoYW4iOiJQSlNJUC8xMzAzLTAwMDAxYTMxIiwic3JjX251bSI6IjEzMDMiLCJzdGFydCI6IjIwMjEtMDQtMzAgMDg6NTc6MzkuODU3IiwidHJhbnNmZXIiOiIwIiwidmVyYm9zZV9jYWxsX2lkIjoiW0MtMDAwMDEyNDldIn0=")
    -- Executing [2200116@dial:1] return("PJSIP/1303-00001a31", "")
    -- Executing [2200116@all_peers:13] GosubIf("PJSIP/1303-00001a31", "0?all_peers-custom,2200116,1") in new stack
    -- Executing [2200116@all_peers:14] Goto("PJSIP/1303-00001a31", "peer_1303,2200116,1") in new stack
    -- Goto (peer_1303,2200116,1)
    -- Executing [2200116@peer_1303:1] NoOp("PJSIP/1303-00001a31", "Start outgoing calling...") in new stack
    -- Executing [2200116@peer_1303:2] Ringing("PJSIP/1303-00001a31", "") in new stack
    -- Executing [2200116@peer_1303:3] GosubIf("PJSIP/1303-00001a31", "0?peer_1303-custom,2200116,1") in new stack
    -- Executing [2200116@peer_1303:4] Set("PJSIP/1303-00001a31", "CHANNEL(hangup_handler_wipe)=hangup_handler_telegram,s,1") in new stack
    -- Executing [2200116@peer_1303:5] BackGround("PJSIP/1303-00001a31", "/storage/usbdisk1/mikopbx/media/custom/ServicehalloKarinafon") in new stack
       > 0x2b2e20085c60 -- Strict RTP learning after remote address set to: 10.10.0.101:12674
       > 0x2b2e20085c60 -- Strict RTP switching to RTP target address 10.10.0.101:12674 as source
    -- <PJSIP/1303-00001a31> Playing '/storage/usbdisk1/mikopbx/media/custom/ServicehalloKarinafon.slin' (language 'ru-ru')
  == Spawn extension (peer_1303, 2200116, 5) exited non-zero on 'PJSIP/1303-00001a31'
    -- Executing [h@peer_1303:1] ExecIf("PJSIP/1303-00001a31", "0?Gosub(dial_hangup,h,1)") in new stack
    -- PJSIP/1303-00001a31 Internal Gosub(hangup_handler_telegram,s,1) start
    -- Executing [s@hangup_handler_telegram:1] NoOp("PJSIP/1303-00001a31", "--- hangup - PJSIP/1303-00001a31 ---") in new stack
    -- Executing [s@hangup_handler_telegram:2] AGI("PJSIP/1303-00001a31", "DIALPLAN-APP-13202105B9F5EBB3A1CD41B5113E8329.php)") in new stack
 

 

от (1.5 тыс. баллов)
Судя по логу ваше php приложение запускается, проверьте php код и настройку почты
от (1.4 тыс. баллов)
почту тут проверять не зачем, т.к. она не используется, а вот код php уже несколько раз перепроверил, гляну конечно еще, спасибо
от (122 тыс. баллов)

PHP-AGI скрипт запускается, но по приложенному логу не видно кода возврата, должен вернуть 0 при успехе, если в ходе выполнения скрипта были ошибки, то вернет другой код. 

Для отладки AGI в консоли CLI asterisk можно дополнительно ввести команду agi set debug on

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

собственно смотрю в сторону стандартных уведомлений на email, не могу в контексте найти как оно работает и можно ли модифицировать на работу с телегой.
На этом сайте можно бесплатно задать вопрос разработчикам MikoPBX и другим членам сообщества. Время ответа не регламентированно, но мы стараемся несколько раз в день заглядывать сюда. Для срочного решения проблем обращайтесь на платную линию поддержки

Популярные теги

askozia входящие-вызовы настройка исходящие маршрутизация провайдер запись-разговоров входящие ivr исходящие-звонки обновление ошибка очередь провайдеры битрикс24 очередь-вызовов переадресация запись установка маршрут история-звонков mikopbx транк панель-телефонии-1с перевод-вызова перевод askozia7 askozia6 битрикс callerid интеграция голосовая-почта логи перехват-вызова ростелеком нерабочее-время факс модуль nat docker запись-разговора веб-интерфейс bitrix24 goip настройка-провайдер история диалплан почта журнал-звонков релиз gsm вызовы звонок внешние-номера web-интерфейс zabbix маршруты cdr sip панель pjsip переадресация-мобильный voicemail ascozia телефонная-книга аон мобильный звонков лицензирование вызовов редактор номер asterisk лицензия ami регистрация оповещения провайдеров время голосовая fax trunk разговоров группы-пользователей #mikopbx пропущенные-звонки донабор beeline monitoring тишина smtp cisco мобильные мультифон мегафон шлюз не-работает электронная-почта не-слышно-звук

2.8 тыс. вопросов

2.4 тыс. ответов

6.7 тыс. комментариев

465 тыс. пользователей

...