Изменение dialplan для работы с Manager API (MAPI) в Asterisk

Изменение dialplan для работы с Manager API (MAPI) в Asterisk
Задать вопрос
Наши специалисты ответят на любой интересующий вопрос по услуге

Интерфейс управления сервером Asterisk (далее Manager API) позволяет клиентским программам соединяться с серверным приложением Asterisk, отправлять ему команды и/или считывать события, происходящие в АТС, используя TCP/IP протокол. 

Для коммуникации между АТС Asterisk и подсоединенным Manager API клиентом используется простой текстовый построчный протоков вида: "параметр: значение". Окончание строки определяется последовательностью CRLF. 

Для удобной работы Manager API в Астериск необходимо изменить диалплан (extensions.conf). Вот пример организации: 

OriginateAction o = new OriginateAction();
o.Channel = "Local/agent_logoff@manager_tools";
o.Timeout = timeout;
o.Variable = "AGENT_NUMBER=" + localAgent;
o.Application = "noop";
ManagerResponse r = manager.SendAction(o, timeout);
and add to extensions.conf next context (this example for AGent Login/Logoff/Pause/Unpause). All other function can be added in this context. Only one remark - at the end of context you must use Answer() not a Hangup()

[manager_tools]
;
; Agent login
;       $AGENT_NUMBER   agent number
;       $AGENT_EXTEN    extension number
;
exten => agent_login, 1, Set(UserEventType=Agent)
exten => agent_login, n, Set(Result=Error)
exten => agent_login, n, Set(CURRENT_AGENT=${DB(AGENT/Exten/${AGENT_EXTEN})})                   ; Current agent on extension
exten => agent_login, n, GotoIf($["${CURRENT_AGENT}" = ""]?ext_free)                            ; extension free
exten => agent_login, n, GotoIf($["${CURRENT_AGENT}" = "${AGENT_NUMBER}"]?already_login) 
exten => agent_login, n, Noop(${DB_DELETE(AGENT/Exten/${AGENT_EXTEN})})
exten => agent_login, n, Noop(${DB_DELETE(AGENT/${CURRENT_AGENT}/onExten)})
exten => agent_login, n, UserEvent(Agent|Agent: ${CURRENT_AGENT}|Status: Logoff|Port: ${AGENT_EXTEN}|Channel: ${LDP${AGENT_EXTEN}})
exten => agent_login, n, Gosub(queues-manip-custom,O${CURRENT_AGENT},1)
exten => agent_login, n(ext_free), Set(CURRENT_EXTEN=${DB(AGENT/${AGENT_NUMBER}/onExten)})      ; Current extension for agent
exten => agent_login, n, GotoIf($["${CURRENT_EXTEN}" = ""]?agent_free)                          ; agent free
exten => agent_login, n, GotoIf($["${CURRENT_EXTEN}" = "${AGENT_EXTEN}"]?already_login)
exten => agent_login, n, Noop(${DB_DELETE(AGENT/Exten/${CURRENT_EXTEN})})
exten => agent_login, n, Noop(${DB_DELETE(AGENT/${AGENT_NUMBER}/onExten)})
exten => agent_login, n, UserEvent(Agent|Agent: ${AGENT_NUMBER}|Status: Logoff|Port: ${CURRENT_EXTEN}|Channel: ${LDP${CURRENT_EXTEN}})
exten => agent_login, n, Gosub(queues-manip-custom,O${AGENT_NUMBER},1)
exten => agent_login, n(agent_free), NoOp(Agent login)
exten => agent_login, n, Set(DB(AGENT/Exten/${AGENT_EXTEN})=${AGENT_NUMBER})
exten => agent_login, n, Set(DB(AGENT/${AGENT_NUMBER}/onExten)=${AGENT_EXTEN})
exten => agent_login, n, Set(UNIQCLID=${AGENT_EXTEN})
exten => agent_login, n, Gosub(queues-manip-custom,I${AGENT_NUMBER},1)
exten => agent_login, n(already_login), Set(Result=Login)
exten => agent_login, n, Answer()
;
; Agent logoff
;       $AGENT_NUMBER
;
exten => agent_logoff, 1, Set(UserEventType=Agent)
exten => agent_logoff, n, Set(Result=Error)
exten => agent_logoff, n, Set(AGENT_EXTEN=${DB(AGENT/${AGENT_NUMBER}/onExten)})
exten => agent_logoff, n, GotoIf($["${AGENT_EXTEN}" = ""]?already_logoff)
exten => agent_logoff, n, Gosub(queues-manip-custom,O${AGENT_NUMBER},1)
exten => agent_logoff, n, Noop(${DB_DELETE(AGENT/Exten/${AGENT_EXTEN})})
exten => agent_logoff, n, Noop(${DB_DELETE(AGENT/${AGENT_NUMBER}/onExten)})
exten => agent_logoff, n(already_logoff), Set(Result=Logoff)
exten => agent_logoff, n, Answer()
;
; Agent pause
;
exten => agent_pause, 1, Set(UserEventType=Agent)
exten => agent_pause, n, Set(Result=Error)
exten => agent_pause, n, Set(AGENT_EXTEN=${DB(AGENT/${AGENT_NUMBER}/onExten)})
exten => agent_pause, n, GotoIf($["${AGENT_EXTEN}" = ""]?ext_free)
exten => agent_pause, n, PauseQueueMember(|${LDP${AGENT_EXTEN}});
exten => agent_pause, n, Set(Result=Pause)
exten => agent_pause, n(ext_free), Answer()
;
; Agent unpause
;
exten => agent_unpause, 1, Set(UserEventType=Agent)
exten => agent_unpause, n, Set(Result=Error)
exten => agent_unpause, n, Set(AGENT_EXTEN=${DB(AGENT/${AGENT_NUMBER}/onExten)})
exten => agent_unpause, n, GotoIf($["${AGENT_EXTEN}" = ""]?ext_free)
exten => agent_unpause, n, UnpauseQueueMember(|${LDP${AGENT_EXTEN}});
exten => agent_unpause, n, Set(Result=Unpause)
exten => agent_unpause, n(ext_free), Answer()
;
; User event to all above
;
exten => h, 1, GotoIf($["${UserEventType}" = "Agent"]?agent)
exten => h, n, Goto(unknown)
exten => h, n(agent), UserEvent(Agent|Agent: ${AGENT_NUMBER}|Status: ${Result}|Port: ${AGENT_EXTEN}|Channel: ${LDP${AGENT_EXTEN}})
exten => h, n(unknown), NoOp(${UserEventType})

[queues-manip-custom]
exten => _[IO]XX., 1, Noop(${EXTEN})
exten => _[IO]XX., n, Set(AGENT_NUMBER=${EXTEN:1})
exten => _[IO]XX., n, Set(AGENT_EXTEN=${DB(AGENT/${AGENT_NUMBER}/onExten)})
exten => _[IO]XX., n, Set(agentvar=${AGENT${AGENT_NUMBER}})
exten => _[IO]XX., n, ExecIf($["${EXTEN:0:1}" = "I"]|Set|DB(AGENT/${AGENT_NUMBER}/Queues)=${AGENT${AGENT_NUMBER}})
exten => _[IO]XX., n, GotoIf($["${EXTEN:0:1}" = "I"]?continue)
exten => _[IO]XX., n, ExecIf($["${EXTEN:0:1}" = "O"]|Set|agentvar=${DB_DELETE(AGENT/${AGENT_NUMBER}/Queues)})
exten => _[IO]XX., n(continue), Set(i=0)
exten => _[IO]XX., n(repeat), Set(i=$[${i}+1])
exten => _[IO]XX., n, Set(q=${CUT(agentvar,:,${i})})
exten => _[IO]XX., n, GotoIf($[${LEN(${q})} = 0]?endrepeat);
exten => _[IO]XX., n, Noop(${q})
exten => _[IO]XX., n, Set(queuename=${CUT(q,-,1)})
exten => _[IO]XX., n, Set(penalty=${CUT(q,-,2)})
exten => _[IO]XX., n, GotoIf($[${LEN(${penalty})} > 0]?$[${PRIORITY}+2])
exten => _[IO]XX., n, Set(penalty=0)
exten => _[IO]XX., n, ExecIf($["${EXTEN:0:1}" = "I"]|AddQueueMember|${queuename}|${LDP${AGENT_EXTEN}}|${penalty}||Agent/${AGENT_NUMBER})
exten => _[IO]XX., n, ExecIf($["${EXTEN:0:1}" = "O"]|RemoveQueueMember|${queuename}|${LDP${AGENT_EXTEN}})
exten => _[IO]XX., n, Goto(repeat)
exten => _[IO]XX., n(endrepeat), Noop(End of cycle)
exten => _[IO]XX., n, ExecIf($["${EXTEN:0:1}" = "I"]|System|echo "${EPOCH}|${UNIQUEID}|NONE|Agent/${AGENT_NUMBER}|AGENTCALLBACKLOGIN|${AGENT_EXTEN}" >> /var/log/asterisk/queue_log)
exten => _[IO]XX., n, ExecIf($["${EXTEN:0:1}" = "O"]|System|echo "${EPOCH}|${UNIQUEID}|NONE|Agent/${AGENT_NUMBER}|AGENTCALLBACKLOGOFF|${AGENT_EXTEN}" >> /var/log/asterisk/queue_log)
exten => _[IO]XX., n, Return

На этом все. Спасибо за внимание!

Если статья оказалась полезной - поделись ссылкой с друзьями - кнопки ниже!

Цель нашей компании - предоставление высококачественных ИТ-услуг предприятиям малого и среднего бизнеса.