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

Добрый день, существует задача на чистом Астериске организовать обратный звонок с городского, сотового на внутренний номер абонента,
Т.е когда внутренний абонент компании, звонит на городской, мобильный (клиенту) и там не берут трубку эта запись заносится в базу данных, после этого внешний клиент( который не взял трубку) перезвонив на городской номер компании ( который у него в телефоне в пропущенных вызовах) слышит в IVR предложение по нажатию кнопки 0 вызвать сразу последнего набравшего его абонента (тем самым не загружает секретарей которые сейчас бедные ищут кто же набирал того или иного клиента ) звонившей ему компании, либо если клиент звонит в первый раз в компанию то включался стандартный IVR где предлагается просто набрать внутренний номер или дождаться ответа секретаря .. Возможно это должен делать скрипт, возможно просто запись в диал план. Хэлп???
  • Вопрос задан
  • 1056 просмотров
Пригласить эксперта
Ответы на вопрос 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 считает, что ему уже ответили, хотя абонент трубку и не поднял. Соответственно, в таком случае проще заносить в базу все звонки и предлагать абоненту переключиться на последнего, с кем он говорил.
Если звонить на короткий номер сотового телефона, то в обратном звонке будет полный сотовый номер. Надо либо делать таблицу соответствий, либо решать на организационном уровне.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы