Часто попадали в ситуацию когда на мобильном обнаруживаешь пропущенный звонок с городского и при попытке перезвонить попадаешь на голосовое меню какой-нибудь фирмы и совершенно непонятно кто тебе звонил? Я часто, а также и клиенты нашей компании каждый день сталкиваются с этим… С этим решено было что-то делать. Все последующие действия актуальны для trixbox v2.8.0.4 (с некоторыми корректировками или, возможно, даже без них можно реализовать и на других системах)
Вся информация по совершенным звонкам хранится в CDR Report и соответственно базе mysql.
Алгоритм следующий:
Берем номер входящего звонка, делаем запрос к таблице cdr и получаем внутренний extension, который совершал последний вызов на данный номер, проговариваем номер extension'a, соединяем абонентов.
Зайдя в mysql на хосте asterisk мы сразу видим базу «asteriskcdrdb» с одной единственной табличкой «cdr» в которой хранятся записи такого вида
Из всех столбцов нам понадобятся:
- 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)
- Отвечаем на звонок
- Подключаемся к БД пользователем root, паролем pass, к базе asteriskcdrdb
- Выполняем запрос
- Получаем результат пишем в var
- Освобождаем память от запроса
- Отключаемся от БД
- В поле channel содержится не только номер канала, ненужное убирается sed'ом (Пример: SIP/160-0000000. Регулярным выражением убираем "/" и все что до него, а также "-" и все что после него), а также лишний перевод строки tr'ом
- Индекс для цикла
- Получаем длину внутреннего номера который нужно произнести
- Пока индекс меньше длины номера
- Произносим текущую цифру номера
- Увеличиваем индекс на один
- Заканчиваем цикл
- Соединяем абонентов
По коду вроде все, теперь необходимо чтобы можно было использовать полноценно эту функцию в веб интерфейсе 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.
Не забываем нажать на Submit Changes.
Правим голосовое меню IVR и вешаем к примеру на цифру «5» пункт Custom Destinations: с только что созданным 456.
Submit Changes. Apply Configuration Changes и Continue with reload. Дожидаемся применения изменений.
Теперь набрав номер нашей компании, у клиента есть всегда возможность нажав 5 в голосовом меню соединиться с последним позвонившим ему номером.
Автор: albertxyc