[AsteriskBrasil] AMI - Queue Status

Ribeiro asterisk em aquidolado.com.br
Quarta Junho 6 00:21:46 BRT 2012


Pessoal

 

Acabei a primeira parte de minha integração Asterisk/Aplicação.

Perguntei a um tempo atrás o caminho e já cheguei no primeiro hotel.. J

Mas vamos lá... Documentação extremamente superficial.

Funcionando está, mas não consegui ainda entender algumas informações que eu
estou recebendo.

Aconselho aos que usam fila, pois tem alguns dados bem interessantes, mesmo
que não façam uso de AMI ou sejam desenvolvedores.

 

Estou utilizando AJAM (AMI Web).

 

Solicitação de status da fila:

 

<response type='object' id='unknown'><generic response='Success'
message='Queue status will follow' /></response>

Beleza! Sucesso na carga. Recebi 3 eventos diferentes: QueueParams (Dados da
fila), QueueMember (Membros da fila) e QueueEntry (Ligações na fila e ainda
não atendidas).

 

<generic event='QueueParams' queue='50' max='0' strategy='ringall' calls='1'
holdtime='11' talktime='122' completed='23' abandoned='6' servicelevel='60'
servicelevelperf='95.7' weight='0' />

Estes são os dados da fila:

Queue=’50’ – Numero da fila – O número que disco para entrar na fila

Max=’0’ – Quantidade máxima de pessoas que podem ficar na fila – Está
ilimitada.

Strategy=’ringall’ – Estratégia... Sem problema... Bem documentado isso.

Calls=’1’ – Ligações na fila e ainda não atendidas. Me parece perfeito.
Testado e não encontrei problemas.

HoldTime=’11’ – Aqui começa meu problema... Pelo que entendi são 11 segundos
“em média” que uma pessoa espera. Fiz o diversos testes com diversos tempos
altos e o valor não altera. Esta média é de quantas ligações? Todas as
feitas até hoje? Não é, pois o valor já mudou sem muita lógica... Me
iluminem aqui...

TalkTime=’122’ – Este é irmão do HoldTime pelo que eu entendi. É a média não
explicada do tempo de ligação, ou seja, 00:02:02 de média do telefone
falando. Também preciso de ajuda.

Completed=’23’ – Outro... Este não tem nada a ver com os dois de cima. É a
quantidade de ligações que foram atendidas. Mas quando que iniciou? Alguém
para me ajudar aqui?

Abandoned=’6’ – Abandonadas pelo cliente antes de serem atendidas. Tem tudo
a ver com o completed. Mas a mesma pergunta. Abandonadas na última hora? No
último dia? Ajuda aqui também.

ServiceLevel=’60’ – Haaaa.... Este é o cara? Não. Eu achava que era ele, mas
não é. No Elastix está escrito assim: “Used for service level statistics
(calls answered within service level time frame)”. Como está 60 segundos,
não vou nem tentar explicar os números de cima. Pensando e pesquisando, acho
que entendi.

ServiceLevelPerf=’95.7’ – Este número e o nome das tags me levaram a
entender uma coisa legal... Este não é o TMA e sim o percentual de ligações
atendidas em 60 segundos. É isso mesmo?

Weight=’0’ – Pelo que entendi é o peso desta fila em relação a outros
“canais”, ou seja, quanto maior o número, sua prioridade será maior para
atendimento. Alguém poderia me explicar o que seria este “canal”? Não
entendo como duas filas se cruzariam.

 

<response type='object' id='unknown'><generic event='QueueMember' queue='50'
name='Fixo' location='Local/10 em from-queue/n' membership='dynamic'
penalty='0' callstaken='11' lastcall='1338677447' status='2' paused='0'
/></response>

Estes são os dados dos membros da fila:

Queue=’50’ – Mesmo do de cima. Usado para vincular um ao outro.

Name=’Fixo’ – Nome do ramal (Extensão) informado na criação do mesmo.

Location=’Local/10 em from-queue/n’ – Nome interno do ramal. Coisa do Arterisk.
Usei ele depois para duas coisas, sendo uma na gambiarra e outra correta.
Digo mais abaixo e se alguém quiser explicar melhor, seja com link,
agradeço.

Membership=’dynamic’ – Se o ramal é estático ou dinâmico. Um dinâmico entra
na fila com ‘<Numero da fila>*’, que neste caso seria ‘50*’ e sai com
‘50**’. Pelo que eu entendi um estático faz parte da fila e pronto e um
dinâmico pode entrar e sair. Porém a mensagem diz que meu ramal estático
saiu da fila com ‘50**’ e na verdade não saiu. Uso Elastix e entendo que é
falta de carinho com o código de quem o fez.

Penalty=’0’ – O nome é estranho, mas eu entendi que quanto maior, menor a
prioridade de tocar. Por exemplo um estagiário. Se tem alguém com Penalty
menor, a ligação é enviada para ele antes. Só quando não tem ninguém menor
disponível é que o estagiário atende. Entendo que dependa da estratégia, mas
não sei qual. Seria bom saber.

CallsTaken=’11’ – Ligações atendidas por este membro. Entendo que ele
atendeu 11 ligações. Porém a soma dos membros não é igual ao completed da
parte de cima. Muito estranho isso... Alguém poderia me explicar?

LastCall=’1338677447’ – No primeiro momento me pareceu ser o número do
telefone de quem fez a última ligação, mas não é. Me parece ser o
“UniqueID”, sem o “.” e os 3 números no final. Não me pareceu útil mesmo e
não tenho certeza se é isso mesmo. Alguém me confirma?

Status=’2’ – Diz se o ramal está ocupado, tocando, em uso, etc. Peguei a
tabela completa no código fonte do Asterisk. Sem problemas.

Paused=’0’ – Se o ramal está em pausa. Em pausa, ele não faz parte da fila.
Seria igual a um membro dinâmico pressionar ‘50**’ e sair, mas neste caso
ele permanece na fila e você consegue visualizar.

 

<response type='object' id='unknown'><generic event='QueueEntry' queue='50'
position='1' channel='SIP/10-000000a6' uniqueid='1338791132.268'
calleridnum='10' calleridname='Pedido:Fixo' connectedlinenum='unknown'
connectedlinename='unknown' wait='10' /></response>

Estes estão na fila ainda sem atendimento:

Queue=’50’ – Mesma coisa. Eles estão na fila ‘50’ neste caso. O mesmo dos de
cima.

Position=’1’ – Posição na fila. Perfeito e entendido. Este é o próximo a ser
atendido. Atendido este, o ‘2’ vira ‘1’ e os demais descem.

Channel=’SIP/10-000000a6’ – O canal que a ligação está passando para chegar
a fila. Coisas de Asterisk. Entendo que seja este canal que está relacionado
ao Weight.

UniqueID='1338791132.268' – Identificação única deste canal. Eu conseguiria
achar esta ligação entre outras por este número. É isso mesmo?

CallerIDNum=’10’ – Este é o cara que eu procurava... O número de telefone do
ligador.

CallerIDName=’Fixo’ – Este é o nome do ligador. Nos EUA e outros países, a
operadora envia o numero do telefone e o nome da pessoa. Aqui no Brasil, o
sistema inovador e proprietário envia somente o número do telefone. De
qualquer forma, tem como colocar um nome aqui por AGI ou outras formas até
mais fáceis. No Elastix (FreePBX) chama-se “CallerID Lookup Sources”.

ConnectedLineNum=’unknown’ – Ramal de quem atendeu.

ConnectedLineName=’unknown’ – Nome do ramal de quem atendeu. O mesmo que o
Name do members acima.

Wait=’10’ – Tempo de espera na fila: 10 segundos.

 

Isso foi o que eu descobri e não descobri. Ajuda outros o que eu descobri e
me ajudem a entender o que eu não entendi. Detalhado, vou editar e colocar
no Wiki, mas preciso da ajuda de vocês.

 

Problemas: Não estou usando evento. Os eventos são disparados quando alguma
coisa acontece e se nada acontecer, não recebo nada. Isso eu entendi.

Mas não estou usando por uns motivos técnicos. Meu servidor com a aplicação
está “nas nuvens” e na DMZ. Meu servidor Asterisk está protegido com um
Firewall e não é acessível da “rua”. Desta forma, estou com um serviço
interno rodando, pegando os dados do Arterisk e replicando para o outro
servidor “nas nuvens” por um protocolo proprietário e mesmo invadido, não
ajuda muito a ninguém. Não se tem controle de nada.

E este mesmo programa já é usado para trafegar dados e se fosse usar
eventos, teria que duplicar o canal de comunicação ou fazer uma coisa bem
mais complexa. Segui sem o evento.

Vou explicar o que eu já tenho: Pausar e Despausar membros. Funciona
perfeitamente. Tenho todos os dados nesta resposta. Preciso do Location
citado aqui, que lá chama-se Interface (Isso é horrível, pois o cada hora o
nome muda), o Queue e se é para Pausar ou Despausar. Perfeito!

 

Mas como nem tudo na vida são flores... Eu preciso do CallerID de quem liga
DEPOIS que o membro da fila atendeu. Isso não rola. A informação fica por 1
segundo e depois some... É preenchido o ConnectedLineNum e o
ConnectedLineName, se mantém por 1 segundo e depois some e eu preciso disso.
O que eu fiz?

Recupei pelo Status, que retona todas as ligações em andamento. Mas não tem
como vincular uma coisa na outra, ou seja, o ramal do membro com a ligação.
Eu teria que carregar outros dados, como os ramais para poder vincular e não
estava a fim. Não sei onde. Seria procurar uma agulha em um palheiro. Então
fiz o seguinte:

 

·         Retirei o “/n” do final do Location e armazenei em uma variável.

·         Comparei se o começo do Channel do Status é igual a variável que
eu criei.

 

Isso me retorna duas linhas. Aparentemente uma do telefone do ligador para a
fila e outro da fila para o ramal. Pelo menos foi o que me pareceu.

 

·         Então eu fico com a linha que tem ‘ChannelState=6’ e
‘Extension=s’. Não sei o que estes dois significam, mas funcionou.

 

Se alguém tiver uma forma melhor de fazer isso ou mais correta, me informe.
Seria de boa ajuda.

Conto com a ajuda de todos.

 

Um abraço

Ribeiro

-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20120606/66f30597/attachment-0001.htm 


Mais detalhes sobre a lista de discussão AsteriskBrasil