Кто звонил? Или обратный звонок с сотового на asterisk

в 11:18, , рубрики: Без рубрики

Кто звонил? Или обратный звонок с сотового на asterisk
Часто попадали в ситуацию когда на мобильном обнаруживаешь пропущенный звонок с городского и при попытке перезвонить попадаешь на голосовое меню какой-нибудь фирмы и совершенно непонятно кто тебе звонил? Я часто, а также и клиенты нашей компании каждый день сталкиваются с этим… С этим решено было что-то делать. Все последующие действия актуальны для trixbox v2.8.0.4 (с некоторыми корректировками или, возможно, даже без них можно реализовать и на других системах)

Вся информация по совершенным звонкам хранится в CDR Report и соответственно базе mysql.
Алгоритм следующий:
Берем номер входящего звонка, делаем запрос к таблице cdr и получаем внутренний extension, который совершал последний вызов на данный номер, проговариваем номер extension'a, соединяем абонентов.

Зайдя в mysql на хосте asterisk мы сразу видим базу «asteriskcdrdb» с одной единственной табличкой «cdr» в которой хранятся записи такого вида
image

Из всех столбцов нам понадобятся:

  • calldate — время звонка
  • dst — набранный номер
  • channel — внутренний номер с которого был совершен звонок

Поэкспериментировав с запросами получаем следующий:
SELECT `channel` FROM cdr WHERE `dst`='${CALLERID(number)}' ORDER BY `calldate` DESC LIMIT 1
Получаем поле channel из таблицы cdr где набранный номер совпадает с текущим callerid, сортируем по убыванию и получаем только последнюю запись, т.е. последний номер с которого был звонок.

Воспользуемся custom файлами asterisk'a. Добавляем в конец файла extensions_custom.conf следующий код. В данном примере используется extension 456.

[custom-from-mobile]
exten => 456,1,Answer()
exten => 456,n,MYSQL(Connect connid localhost root pass asteriskcdrdb)
exten => 456,n,MYSQL(Query resultid ${connid} SELECT `channel` FROM cdr WHERE `dst`='${CALLERID(number)}' ORDER BY `calldate` DESC LIMIT 1)
exten => 456,n,MYSQL(Fetch fetchid ${resultid} VAR)
exten => 456,n,MYSQL(Clear ${resultid})
exten => 456,n,MYSQL(Disconnect ${connid})
exten => 456,n,Set(CHAN=${SHELL(echo ${var} |tr -d 'n' |sed -e 's/.*/(.*)-.*/1/g')})
exten => 456,n,Set(i=0)
exten => 456,n,Set(COUNTER=${LEN(${CHAN})})
exten => 456,n,While($[${i} < ${COUNTER}])
exten => 456,n,Playback(digitsru/${CHAN:${i}:1})
exten => 456,n,Set(i=$[${i} + 1])
exten => 456,n,EndWhile()
exten => 456,n,Goto(from-internal,${CHAN},1)
  1. Отвечаем на звонок
  2. Подключаемся к БД пользователем root, паролем pass, к базе asteriskcdrdb
  3. Выполняем запрос
  4. Получаем результат пишем в var
  5. Освобождаем память от запроса
  6. Отключаемся от БД
  7. В поле channel содержится не только номер канала, ненужное убирается sed'ом (Пример: SIP/160-0000000. Регулярным выражением убираем "/" и все что до него, а также "-" и все что после него), а также лишний перевод строки tr'ом
  8. Индекс для цикла
  9. Получаем длину внутреннего номера который нужно произнести
  10. Пока индекс меньше длины номера
  11. Произносим текущую цифру номера
  12. Увеличиваем индекс на один
  13. Заканчиваем цикл
  14. Соединяем абонентов

По коду вроде все, теперь необходимо чтобы можно было использовать полноценно эту функцию в веб интерфейсе asterisk'a. Заходим в веб интерфейс trixbox.
PBX — PBX Settings — Tools — Custom Destinations и кликаем на Add Custom Destination. Заполняем два поля:
Custom Destination: custom-from-mobile,456,1 #где custom-from-mobile заголовок добавленного кода в custom_extensions.conf, 456 — номер extension'a, 1 — приоритет
Descritpion: по желанию к примеру 456.
Кто звонил? Или обратный звонок с сотового на asterisk
Не забываем нажать на Submit Changes.
Правим голосовое меню IVR и вешаем к примеру на цифру «5» пункт Custom Destinations: с только что созданным 456.
Кто звонил? Или обратный звонок с сотового на asterisk
Submit Changes. Apply Configuration Changes и Continue with reload. Дожидаемся применения изменений.

Теперь набрав номер нашей компании, у клиента есть всегда возможность нажав 5 в голосовом меню соединиться с последним позвонившим ему номером.

Автор: albertxyc

Источник

Поделиться

* - обязательные к заполнению поля