Как организовать обратный звонок напрямую на внутренний номер абонента?

Добрый день, существует задача на чистом Астериске организовать обратный звонок с городского, сотового на внутренний номер абонента,
Т.е когда внутренний абонент компании, звонит на городской, мобильный (клиенту) и там не берут трубку эта запись заносится в базу данных, после этого внешний клиент( который не взял трубку) перезвонив на городской номер компании ( который у него в телефоне в пропущенных вызовах) слышит в IVR предложение по нажатию кнопки 0 вызвать сразу последнего набравшего его абонента (тем самым не загружает секретарей которые сейчас бедные ищут кто же набирал того или иного клиента ) звонившей ему компании, либо если клиент звонит в первый раз в компанию то включался стандартный IVR где предлагается просто набрать внутренний номер или дождаться ответа секретаря .. Возможно это должен делать скрипт, возможно просто запись в диал план. Хэлп???
  • Вопрос задан
  • 1061 просмотр
Пригласить эксперта
Ответы на вопрос 6
OrlovEvgenii
@OrlovEvgenii
golang developer / DevOps
Гугли в сторону AGI
AGI — это встроенный в Asterisk метод выполнения внешних скриптов (по аналогии с CGI для http серверов), который может расширить функциональность asterisk при помощи других языков программирования. Таких, как: Perl, PHP, C, Pascal, Bourne Shell.


Если коротко, отслеживаешь и пишешь в базу исходящие номера абонентов которым пытались дозвониться + внутренний номер с которого звонили. Далее когда вам абонент решит перезвонить, в диалплане строкой exten => t,n,AGI(exemple.php); будет вызван вами написанный скрипт exemple.php который в свою очередь пойдет в базу и проверит пытались ли дозвониться до этого абонента.
Ответ написан
Комментировать
@Deq56
Python dev, JS, CSS, Asterisk, Mikrotik
примерно так
Исходящая маршрутизация
context out {
_X. =>{
Dial(SIP/number@Trunk);
};
h=>{
if ("${CDR(disposition)}"="NO ANSWER") {
&resultat_sql(%${CALLERID(num)}, ${EXTEN}, 0);

};
if ("${CDR(disposition)}" = "BUSY") {
&resultat_sql(%${CALLERID(num)}, ${EXTEN}, 0);
};
};
h=>{
if ("${CDR(disposition)}"="NO ANSWER") {
&resultat_sql(${EXTEN}, status);

};
if ("${CDR(disposition)}" = "BUSY") {
&resultat_sql(${EXTEN}, status);
};
};
};

macro resultat_sql(num_out, num_to, status) {
MYSQL(Connect connid localhost user pass DB);
MYSQL(Query resultid ${connid} INSERT INTO out_call VALUE num_out=${num_out} num_to=${num_to} status=${status});
MYSQL(Clear ${resultid});
MYSQL(Disconnect ${connid});
};

Входящая маршрутизация
context in {
_X. =>{
MYSQL(Connect connid localhost user pass DB)
MYSQL(Query resultid ${connid} select num_out from out_call where num_to LIKE '%${CALLERID(num):2}%' status '0' limit 1)
MYSQL(Fetch fetchid ${resultid} NUMBER_TO_DIAL)
if (${EXIST(${NUMBER_TO_DIAL})}){
Dial(Local/${NUMBER_TO_DIAL});
}
else{
обычное прохождение звонка
};
};
h =>{
MYSQL(Connect connid localhost user pass DB);
MYSQL(Query resultid ${connid} UPDATE out_call SET status='1' where num_to like '%${CALLERID(num):2}%' );
MYSQL(Clear ${resultid});
MYSQL(Disconnect ${connid});
};
};
Ответ написан
Комментировать
EnterSandman
@EnterSandman
Эникей
Это может сделать и скрипт, это может и сделать макрос в диалплане...
Соответственно я бы обратился к фрилансерам (обращайтесь, помогу =))
вам нужно обработать исходящий звонок и при статусах busy/noanswer/cancel делал бы запись в бд
соответственно при входящих звонках делать сопоставление звонящего CID из базы и выполнять нужные действия
Ответ написан
Комментировать
@Daios Автор вопроса
А можно пример аналогичного скрипта в студию для осмысления и разбора? Да Asterisk чистый! на Ubunte не Elastiх..итд
Ответ написан
Комментировать
@zeronice
VoIP, .NET, интернет
Достаточно использовать встроенную BD астериска.
Используйте DIALSTATUS при исходящем звонке и при получении BUSY заносите в базу номер абонента из ${EXTEN} и CALLERID звонящего сотрудника

ну а в обработке входящих воплняеет макрос по наличию в БД абонента. в макросе реализуете то самое IVR и удаление записи из базы
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Сделать несложно, есть только пара маленьких нюансов.
Если звонить на сотовый телефон через аналоговую городскую линию и у абонента включена музыка вместо гудков, то сбивается анализ состояния звонка (callprogress в dahdi), соответственно Asterisk считает, что ему уже ответили, хотя абонент трубку и не поднял. Соответственно, в таком случае проще заносить в базу все звонки и предлагать абоненту переключиться на последнего, с кем он говорил.
Если звонить на короткий номер сотового телефона, то в обратном звонке будет полный сотовый номер. Надо либо делать таблицу соответствий, либо решать на организационном уровне.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы