Ситуация: Asterisk + GSM шлюз. С сотовых телефонов часто перезванивают на не отвеченные вызовы, набирают номер шлюза и по умолчанию попадают на секретаря. Как настроить систему , что бы входящий звонок клиента шел на тот внутренний номер, с которого последний раз звонили клиенту?
тогда примерно так
;исходящий контекст
[outbound-routes]
;запоминаем на какой номер кто звонил
exten => _XXXXXXXX.,1,Set(DB(lastcalls/trunk1/${EXTEN})=${CDR(src)})
;звоним в транк
exten => _XXXXXXXX.,n,Dial(SIP/trunk1/${EXTEN})
;входящий контекст, номер trunk1 это hotline|did со шлюза или от прова
[inbound]
;проверяем, есть ли номер в списке для этого транка
exten => trunk1,1,GotoIf($[foo${DB(lastcalls/trunk1/${CDR(src)})} = foo]?inbound:toext)
;если что-то имеется, то соединяем (переходим в контекст с локальными абонентами)
exten => trunk1,n(toext),GoTo(ext-local,${DB(lastcalls/trunk1/${CDR(src)})},1)
;если не имеется то как обычно, например в ИВР
exten => trunk1,n(inbound),GoTo(IVR,s,1)
Чтобы не забивать astdb можно ночью по расписанию делать так:
asterisk -rx "database del lastcalls"
ответил 2011-02-02 23:40:27 +0400
Этот пост - вики. Любой с кармой >300 может улучшить его.
Все гораздо проще, если записывается CDR. Данный контекст залазит в CDR и ищет, кто последний звонил этому абоненту (привел 2 примера, при всех вызовах, и при неотвеченных), и перезванивает ему. Если этот абонент занят, либо не отвечает, то звонок идет дальше по контексту [from-trunk]
[from-trunk-gsmin]
exten => _X.,1,Set(CHANNEL(language)=ru)
exten => _X.,n,Set(CALLID=${CALLERID(num):-7})
exten => _X.,n,MYSQL(Connect connidcdr localhost root pass asteriskcdrdb utf8)
; Для всех вызовов
exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' ORDER BY calldate DESC)
; Для неотвеченных вызовов
; exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND disposition LIKE 'NO ANSWER' ORDER BY calldate DESC)
exten => _X.,n,MYSQL(Fetch fetchid ${resultidcdr} calldate clid src dst)
exten => _X.,n,set(number=${src})
exten => _X.,n,NoOp(кто звонил --> ${clid} кому звонил --> ${dst})
exten => _X.,n,GOTOIF($["${dst}" = ""]?nodst:dst)
exten => _X.,n(dst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,dial(SIP/${number},20,tT)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?nodst)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?nodst)
exten => _X.,n,GotoIf($["${DIALSTATUS}" = "FAILED"]?nodst)
exten => _X.,n(nodst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,goto(from-trunk,${DID},1)
exten => h,1,handup()
очень просто: нужно запоминать в astdb предыдущего вызывавшего и при входящем направлять на него
я бы сделал так(с минимальным вмешательством в работу freepbx) 1) написал бы макро, которое записывает дест в базу
[macro-recordout] exten => _X.,1,Set(chan=${CUT(DSTCHANNEL,-,1)}); берем имя канала exten => _X.,n,Set(DB(lastout/${chan})=${CALLERID(num)}); запсиываем в базу по каанлу кто звонил.
2) добавляем в ключи dial в general секции freepbx m(recordout) проверяем. если все верно, у нас по любому звонку ложит кто последний звонил. правда рабоатет только если овтетили.
3) ставим входящий контекст както так
[in-from-gsm] exten => _X.,1,Set(chan=${CUT(CHANNEL,-,1)}); берем имя канала входа exten => _X.,2,Goto(from-internal,${DB(lastout/${chan})},1); zvonim tomu kot zvonil.
недостаток- не будет записывать неудачные(без ответа) звонки. ну без изменения исходящей цепочки не получиться их записывать.
Задан: 2011-02-02 22:05:00 +0400
Просмотрен: 2,220 раз
Обновлен: May 12 '16
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.