No último artigo da série "Asterisk e FreeBSD o Futuro da Telefonia IP", vamos configurar uma placa FXO (Foreign eXchange Office) e programar um contexto para auto-atendimento. Iremos também configurar algumas features de sucesso do ASTERISK como, AudioConferência e filas de CallBack.
1 - Introdução a portas FXO.
Uma porta FXO(Foreign eXchange Office) nos possibilita realmente brincarmos e nos divertimos com o ASTERISK, até um tempo atrás eu não tinha disponível um DISPOSITIVO com esta porta, apesar de já ter configurado algumas placas da Digium, me sentia frustrado de não possuir uma dessas em meu ambiente computacional. Existem algumas placas que costumamos chamar de CLONES, podemos encontrá-las a um valor acessível no mercado:
DigiNetwork X100P Nacional Digistar As placas CLONES possuem um CHIPSET compatível com as funcionalidades implementadas no MODULO ZAPTEL. Pude testar 2 placas CLONES, uma com um CHIPSET Motorola(62802-51) e outra Ambient(3200), essas placas são os famosos WinModens PCI que não servem para praticamente nenhuma aplicação funcional.
Em meu primeiro teste com a placa MOTOROLA, encontrei em seu circuito um *VARISTOR* em CURTO, quando alguem ligava via PSTN(Public Switched Telephone Network) a placa ao detectar o aumento de voltagem na linha, ARMAVA a porta antes mesmo de completar um RING no telefone, não permitindo o tratamento via ASTERISK. Removendo o *VARISTOR* da porta LINE da placa, consegui burlar o problema, mas desprotegi boa parte do circuito. A segunda placa Ambient(3200), foi uma doação de um grande amigo que participou da maioria dos testes via PSTN, ele estava prestes a jogar esta placa no LIXO, pois não encontrava utilidade para ela, além do acumulo de poeira. Quero agradecer publicamente a doação do Marcelo Piaz Vianna, que possibilitou a conclusão desta 3o parte do artigo.
Hoje possuo o seguinte ambiente de testes em minha casa:
 2 - Configurando uma porta FXO.Existe uma grande confusão quando se trata de portas e sinalizações, vou tentar da forma mais clara possível esclarecer estas dúvidas. Uma porta FXO recebe uma sinalização FXS. Uma porta FXS recebe uma sinalização FXO.Exemplo: FXS(Tomada da parede) --------[ SINALIZACAO FXS]------------> FXO(Placa PCI) FXO(Telefone ou PLACA) ------[ SINALIZACAO FXO]-----------> FXS(ATA ou PLACA PCI) Quando instalarmos o ASTERISK, automaticamente, como dependência para algumas funcionalidades como o MeetMe, o pacote ZAPTEL será instalado. # arquivo /usr/ports/net/asterisk/Makefile RUN_DEPENDS+= ${LOCALBASE}/include/zaptel.h:${PORTSDIR}/misc/zaptelPara entendermos melhor o funcionamento das ferramentas de teste do zaptel, vamos atualizar a coleção de PORTS MISC e fazer a reinstalação do pacote. Não irei entrar em detalhes de como atualizar via CVSUP ou CSUP, pois existem ótimos artigos públicados aqui no site da FUG. # Instalando o pacote ZAPTEL. nagazaki# cd /usr/ports/misc/zaptel/ nagazaki# make deinstall && make all reinstall clean # Ferramentas de testes. nagazaki# pwd /usr/ports/misc/zaptel/work/zaptel-bsd-1.0/test Existe um sub-diretório chamado test, com algumas ferramentas para testarmos o funcionamento da porta FXO, executando o make install, todas as ferramentas são instaladas no sistema. # Configurando o zaptel.conf nagazaki# vi /usr/local/etc/zaptel.conf loadzone = br defaultzone = br fxsks = 1O primeiro parametro loadzone permite especificar os tons que podem ser gerados por esta interface. Na instalação padrão encontrada nos ports, não existe um tone_zone para o Brasil, vamos adicionar essa função. nagazaki# pwd /usr/ports/misc/zaptel/work/zaptel-bsd-1.0/ztcfg nagazaki# vi zonedata.c Após o ultimo zone "China", vamos adicionar o zone para o Brasil.
{ 21, "br", "Brazil", { 1000, 4000 }, { { ZT_TONE_DIALTONE, "425" }, { ZT_TONE_BUSY, "425/250,0/250" }, { ZT_TONE_RINGTONE, "425/1000,0/4000" }, { ZT_TONE_CONGESTION, "425/250,0/250,425/750,0/250" }, { ZT_TONE_CALLWAIT, "425/50,0/1000" }, { ZT_TONE_DIALRECALL, "350+440" }, { ZT_TONE_RECORDTONE, "425/250,0/250" }, { ZT_TONE_INFO, "950/330,1400/330,1800/330" }, { ZT_TONE_STUTTER, "350+440" } }, },
# Agora vamos compilar e instalar novamente a libtonezone.a e o tonezone.h. nagazaki# pwd /usr/ports/misc/zaptel/work/zaptel-bsd-1.0/ztcfg nagazaki# make nagazaki# make install /usr/bin/install -o root -g wheel -m 755 -s ztcfg /usr/local/bin/ /usr/bin/install -o root -g wheel -m 644 libtonezone.a /usr/local/lib/ /usr/bin/install -o root -g wheel -m 644 tonezone.h /usr/local/include/ /usr/bin/install -o root -g wheel -m 644 ../zaptel/zaptel.h /usr/local/include/
Técnicamente você adicionando ou não o zone para o Brasil, os testes deste artigo devem funcionar corretamente usando o zone "us", este exemplo de zona é para conhecimento das possibilidades de alterações do código fonte do pacote. O parametro fxsks sinaliza a porta como FXS Kewlstart, para receber e efetuar ligações via PSTN.
# Vamos agora startar os modulos zaptel. nagazaki# /usr/local/etc/rc.d/zaptel.sh.sample start
# Veremos a seguinte saida no syslog. # Note o registro da ZONA que adicionamos no zonedata.c Echo Canceller: MARK3 ZapTel device: vendor=e159 device=1 subvendor=8086 wcfxo0: <Generic Clone> port 0x9000-0x90ff mem 0xd4000000-0xd4000fff irq 19 at device 11.0 on pci0 ZapTel Attach for wcfxo0: deviceID : 0xe159 wcfxo0: [FAST] wcfxo: DAA mode is 'FCC' Found a Wildcard FXO: Generic Clone ZapTel device loaded. Registered tone zone 21 (Brazil) # Testando o canal FXO
nagazaki# ztcfg -vv 3 - Configurando o arquivo zapata.conf. Por padrão o arquivo zapata.conf vem com diversas configurações, iremos em um primeiro momento limpar este arquivo. nagazaki# cat /dev/null > /usr/local/etc/asterisk/zapata.conf O Arquivo zapata.conf tem por finalidade controlar todas as portas reconhecidas pelos módulos zaptel, abordaremos aqui os parâmetros principais para a conclusão dos nossos testes, não siga apenas este artigo como referência, pois o ZAPATA é muito poderoso e possui muitos recursos aqui não mostrados. # Configurando o zapata.conf. nagazaki# vi /usr/local/etc/asterisk/zapata.conf [channels] busydetect=4 busycount=7 immediate=yes context=receive signalling=fxs_ks callerid=asreceived echocancel=yes channel => 1 Estamos aqui criando a entrada para os canais zaptel, logo abaixo podemos ver algumas descrições desta configuração. Busydetect = Especificamos quantos tons de ocupados antes de enviarmos um sinal de Hangup(). Busycount = Especificamos a intensidade do sinal de ocupado, na maioria dos países é 500msec Ligado e 500msec Desligado. Callerid = Especificamos o número que será enviado quando efetivarmos uma ligação via PSTN, essa configuração vai depender muito de sua OPERADORA DE TELEFONIA e os serviços contratados. Signalling = O Tipo de sinalização que nossa porta irá receber. Context = Contexto que nossa porta tera no arquivo extensions.conf. Channel = Especificamos qual o canal a ser usado na PLACA. 4 - Configurando o contexto para o auto-atendimento para o canal zaptel. Em meu ambiente de testes, quando alguem faz uma chamada via PSTN para a central Asterisk, redireciono a ligação para um telefone SIP e caso ninguém atenda, redireciono novamente para uma URA( Unidade de resposta audivel). # Configurando extensions.conf nagazaki# vi /usr/local/etc/asterisk/extensions.conf [receive] exten => s,1,Answer() exten => s,2,Dial(SIP/araujo,10) exten => s,3,Goto(ura_home,s,1)
Note que o contexto criado é o mesmo especificado no arquivo zapata.conf. Em um primeiro momento o asterisk captura a chamada com o Answer() e joga para o client SIP araujo durante 10 segundos. Caso o cliente SIP não atenda neste período a chamada é redirecionada para o contexto ura_home em sua primeira extensão. # Criando o contexto ura_home. [ura_home] exten => s,1,Background(menu) exten => 1,1,Playback(michele) exten => 1,2,Voicemail(michele@casa) exten => 2,1,Playback(araujo) exten => 2,2,Voicemail(araujo@casa) exten => 3,1,Playback(chico) exten => 3,2,Voicemail(chico@casa) exten => 4,1,VoicemailMain(9010@araujo)
Neste contexto, gravei algumas opções para o originador da chamada, indicando para qual pessoa ele poderá deixar o seu recado. Para verificar os recados, criei a opção *4* que me direciona para a parte administrativa das contas de VoiceMail.
5 - Criando filas de atendimento DAC(Distribution Automatic Carrier).
A plataforma IP já é reconhecida como sinônimo de mobilidade, redução de custos e aumento de produtividade pelos contact centers. Segundo um levantamento feito pela Frost & Sullivan, o mercado latino-americano fechou o ano de 2005 com 8,9 mil PAs IP(Postos de atendimento), 50% deste montante esta no Brasil, 20% no Cone Sul e 15% no México, o restante esta dividido entre outras regiões, como Andina e Caribe. Como é esperado para a maior adoção da telefonia IP, os preços dos ramais IP'S já está próximo dos ramais digitais, visto que a mobilidade e facilidade de implantação desta tecnologia fomenta todo o mercado de fabricantes de telefones e equipamentos de telecomunicações. As vantagens de se ter um Contact Center falando IP, é a mobilidade para a troca de postos de atendimento, ao qual irei me referir pela sigla PA. Esta troca constante de ambiente ou até mesmo de localidade, permite o crescimento de PA's sem ter que ampliar a estrutura física em um mesmo prédio, ou até mesmo criar fragmentações do Contact Center em diversos países e regiões.
Alguns conceitos usados para a programação de Contact Centers. Agentes: - Podem ser fixos ou móveis Filas: - Formada por um conjunto de agentes e possuem listas de espera e prioridade para atendimento. Vamos configurar para este exemplo, 2 agentes como "call back", 1 fila com esses dois agentes e usar "Round-Robin" para a escolha dos agentes para atenderem as chamadas. As filas podem ser configuradas no modelo FIFO(Primeiro que entra é o primeiro que sai) ou com o modelo que não será abordado neste artigo, QUEUE_PRIO, prioridade de enfileiramento.
# Configurando a fila queues.conf # Existem diversas configurações padrões no arquivo queues.conf, iremos apenas adicionar uma fila como exemplo no final deste arquivo. nagazaki# pwd /usr/local/etc/asterisk nagazaki# vi queues.conf
[atendimento] wrapuptime=0 timeout=15 strategy=roundrobin retry=5 music=default monitor-join=yes monitor-format=gsm member=agent/9010 member=agent/9030 maxlen=0 leavewehenempty=no joinempty=yes announce-holdtime=yes announce-frequency=30
Existem algumas estratégias para montarmos uma fila de atendimento, no setting "strategy" podemos modificar isso.
ringall = Todos os ramais da fila tocam ao mesmo tempo. roundrobin = Distribui igualmente as chamadas para todos os ramais. leastrecent = Distribuir para a interface que menos recebeu chamadas. fewestcalls = Toca aquela com menos chamadas completadas. random = Toca um ramal aleatoriamente. rrmemory = Roundrobin com memória, lembra onde deixou a última chamada.
# Configurando os Agentes em agents.conf # No final do arquivo dentro do contexto "agents", iremos adicionar nossos ramais.
agent => 9030,12345,Marcelo Araujo agent => 9010,12345,Operator Bastard From Hell
# Configurar o AgentCallback no extensions.conf
exten => 5000,1,Wait(1) exten => 5000,2,AgentCallbackLogin(|${CALLERIDNUM}) exten => 08000,1,Queue(atendimento|tThH|||100)
Para entendermos o processo deste modelo de configuração para o DAC, iremos verificar os passos tomados por um atendente de Contact Center em seu dia de trabalho. O Atendente chega a seu PA e disca para o número "5000", o AgentLogin pede por uma extensão válida e logo após a senha desta extensão, finalizando pede a localização desta extensão.
Exemplo: Disque 5000. Digite 9030#. Digite 12345#. Digite 9010#.
Neste exemplo, entramos com nosso login "RAMAL" e redirecionamos nossas ligaçõse para o ramal "9010". Logo quando alguem cair na Fila de atendimento e nosso ramal for contactado, automaticamente será redirecionado para o ramal "9010". Podemos usar a CLI(Command Line Interface) para verificarmos quais agentes estão configurados e logados na fila atendimento.
*CLI> show queue atendimento atendimento has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:0, SL:0.0% within 0s Members: agent/9030 (Unavailable) has taken no calls yet agent/9010 (Unavailable) has taken no calls yet No Callers
Nenhum atendente logado, podemos notar que a estratégia tomada nesta configuração foi "ringall".
*CLI> show queue atendimento atendimento has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0, A:0, SL:0.0% within 0s Members: agent/9030 (Not in use) has taken no calls yet agent/9010 (Unavailable) has taken no calls yet No Callers
Um atendente logado como agente "9030" e nenhuma ligação atendida na fila. *CLI> show agents 9030 (Marcelo Araujo) not logged in (musiconhold is 'default') 9010 (Operator Bastard from hell) available at '9010' (musiconhold is 'default') 2 agents configured [1 online , 1 offline] Podemos verificar para onde determinado AGENTE redirecionou suas chamadas. *CLI> show queue atendimento atendimento has 0 calls (max unlimited) in 'roundrobin' strategy (0s holdtime), W:0, C:3, A:0, SL:0.0% within 0s Members: agent/9020 (Not in use) has taken 2 calls (last was 5 secs ago) agent/9010 (Not in use) has taken 1 calls (last was 20 secs ago) No Callers Agora podemos notar que os dois agentes estão logados, o primeiro agente "9020" recebeu 2 ligações, como estamos usando a estratégia "Round-robin" o próximo atendente a receber a ligação será o "9010". 6 - Configurando um sitema de AudioConferência.
É possível criar salas de "audioconferência", com este elemento podemos agendar reuniões em determinado canal e solicitar que cada integrante que digite uma senha única para participar. Existem alguns casos de sucesso como o da GM Motors, que após a implementação de um IPBX, teve um aumento significativo no uso de AudioConferência em seu ambiente de trabalho. Para utilizarmos o recurso de MeetMe é necessário carregar o modulo ztdummy, pois a aplicação usa os recursos de CLOCK deste driver. O arquivo meetme.conf é responsável pelas configurações dos canais e suas respectivas senhas.
# Configurando o arquivo meetme.conf
No contexto "rooms" vamos adicionar o canal e o PIN(Private Identification Number) para acesso ao recurso.
conf => reuniao,12345,1122
reuniao = Nome do canal de AudioConferência. 12345 = Senha para ingressar no contexto. 1122 = Senha administrativa.
# No arquivo extensions.conf vamos criar uma extensão para a AudioConferência exten => 0011,1,Wait(1) exten => 011,2,MeetMe(reuniao|Mpv) exten => 011,3,Hangup()
Ao ingressar na AudioConferência será solicitado o PIN NUMBER. O primeiro ramal a entrar no contexto da AudioConferência receberá uma música de espera até que outro ramal entre no mesmo contexto, após outro ramal logar-se na AudioConferência será emitido um BEEP e liberado o canal para a reunião.
Para verificar quem esta conectado no contexto "reuniao". *CLI> meetme list reuniao
Outros comandos. *CLI> help meetme
7 - Conclusão.  Espero ter contribuído um pouco para o avanço da telefonia IP e o uso do ASTERISK no sistema FreeBSD. Quero apenas salientar que a escolha pelo sistema FreeBSD não foi por acaso, usei outros sistemas livres durante vários anos e por uma série de testes e experiências pude constatar que os mesmos estão longe de acompanhar a evolução do FreeBSD. Sobre o autor desta série de artigos:Marcelo Araujo é membro do BSDCertification atuando no time Translators Brazilian Portuguese, mantém os ports ASK e MAILREP , usa FreeBSD para resolver problemas desde a versão 3.2. - Marcelo Araujo araujo AT fug DOT com DOT br
|