Показаны сообщения с ярлыком Asterisk. Показать все сообщения
Показаны сообщения с ярлыком Asterisk. Показать все сообщения

четверг, 8 января 2015 г.

Уведомление занятости абонента при включенном Call Waiting в Asterisk.

     Наверное многие знают о существовании опции Call Waiting в Asterisk.  Функция конечно хорошая, но не без недостатка. Если абонент, кому звонят, понимает, что на второй линии другой абонент, на которого он в случае чего может переключиться, то звонящий же не узнает, разговаривает сейчас  абонент на другом конце или просто не отвечает на звонок. И, казалось бы, хорошая опция  этим недостатком может убить  все плюсы. По крайней мере в нашем офисе сотрудники часто были недовольны друг другом, думая что  на их звонки не отвечают.

     В конце концов  мне это надоело и решил искать решение. Нашел его достаточно быстро. Оказалось что я не один, кому не очень понравилась работа это функции. Решение нашел тут.

     Если  коротко, то в extensions_custom.conf надо добавить
  [from-internal-custom]  
 include => macro-dialout-one-predial-hook  
 [macro-dialout-one-predial-hook]   
  exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})   
  exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(abonent_zanyat))   
  exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))   
  exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Playback(abonent_zanyat))   
  exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))   
где abonent_zanyat название проигрываемого файла. Кстати саму начитку заказывать  у сторонних фирм не хотелось (уж больно много просят за пару слов), так что на помощь пришли онлайн синтезаторы речи. В частности этот. Текст был следующий: "В настоящий момент абонент разговаривает. Вы можете дождаться ответа или перезвонить позже." Сохранить файл можно с помощью инструментов разработки  браузера. При выборе голоса Milena получилось очень даже натурально. Был даже удивлен что не сразу и заметно, что это речь синтезатора (особенно если это услышать в трубке телефона).

     В итоге теперь если мы звоним абоненту, который уже разговаривает, то услышим нашу запись, после чего  звонок попадет на удержание. Дальше уже либо дожидаемся ответа, либо кладем трубку.

     Сотрудники теперь довольны =)

UPD. Если у вас версия freepbx не самая свежая (например freepbx 2.11) то в файле ..admin/modules/core/functions.inc.php находим строку
 $ext->add($mcontext,$exten,'godial', new ext_dial('${DSTRING}', '${ARG1},${D_OPTIONS}'));  
и меняем на
 $ext->add($mcontext,$exten,'godial', new ext_execif('$["${QAGENT}"=""]', 'Macro', 'CHECK_DEVICE_STATE,')); 
 $ext->add($mcontext,$exten,'', new ext_dial('${DSTRING}', '${ARG1},${D_OPTIONS}'));  

В extensions_custom.conf в свою очередь контекс именуем не macro-dialout-one-predial-hook, а macro-CHECK_DEVICE_STATE