[AsteriskBrasil] Asterisk / java / DTMF

Paulo Sigrist paulo.sigrist em gmail.com
Segunda Março 1 16:28:01 BRT 2010


Olá pessoal,

somente concluindo o assunto. Segui o conselho do Luis e utilizei a API do
AGI da asterisk-java para fazer a integração com a minha aplicação.

Durante a semana, houve uma mudança nos requisitos e a aplicação não
precisará ligar para o usuário (isso até decidirem que vai precisar
novamente hehe).

Obrigado pela ajuda Luis

2010/2/22 Paulo Sigrist <paulo.sigrist em gmail.com>

> Luis,
>
> eu nunca trabalhei com o AGI, só havia utilizado a API do manager para
> conectar o Java com o Asterisk.
>
> Entendi mais ou menos o que voce explicou. Vou estudar como funciona o AGI
> e fazer uns testes aqui. Assim que conseguir um progresso, informo aqui na
> lista.
>
> Obrigado pela ajuda
>
> []´s
>
> Sigrist
>
> 2010/2/19 Luis Reis <luis.reis em singularideas.com.br>
>
>> Jovem
>>
>> já sofri muito com isso e a melhor solução é você fazer um AGI que faça um
>> dial utilizando a opção *G(context^exten^pri), *Isso permite que a
>> chamada, assim que completada, seja transferida para um
>> contexto-extensão-prioridade que tenha a sua URA. Se quiser fazer o dial no
>> Java no agi seria assim
>>
>> public class HelloAgiScript extends BaseAgiScript {
>>     public void service(AgiRequest request, AgiChannel channel) throws
>> AgiException {
>>         exec("dial", "SIP/gateway/03432320000,30,tTG(ura^n^1)");
>>     }
>> }
>>
>> Neste contexto da URA, tu podes chamar outro AGI que faz o tratamento dos
>> DTMF normalmente.
>>
>> Se for via Manager, tu tens que codificar um OriginateAction e enviar para
>> o Manager através da ManagerAPI e neste caso, a extenção que liga deve
>> conter o AGI que vai tratar os seus DTMFs.
>> .
>>
>> me fala se vc entendeu ou não...
>> Em 19 de fevereiro de 2010 14:45, Paulo Sigrist <paulo.sigrist em gmail.com>escreveu:
>>
>> Luis,
>>>
>>> seguem os arquivos:
>>>
>>> (Lembrando que esses códigos se referem a um teste....)
>>>
>>> = extensions.conf
>>> =============================================================
>>> [globals]
>>>
>>> [general]
>>> autofallthrough=yes
>>>
>>> [macro-local-calls]
>>> exten => s,1,Dial(${ARG1})
>>> exten => s,n,Hangup()
>>>
>>> [main-dialplan]
>>> include => dtmf-test
>>> include => local-numbers
>>> include => default-route
>>>
>>> ;Hangup extension
>>> exten => h,1,NoOp(Hangup extension)
>>>
>>> [local-numbers]
>>> ;
>>> ; caracter _ significa que estamos falando de um pattern
>>> ; X = 0-9
>>> ; Z = 1-9
>>> ; N = 2-9
>>> ; [5-7] = 5,6,7 (range)
>>> ; . = um ou mais caracteres
>>> ; ! um ou mais cracteres
>>> ; variavel ${EXTEN} contem numero efetivamente discado
>>> ; ${EXTEN:1} - tira primeiro digito do numero discado
>>> ; ${EXTEN:1:3} - especifica range 1 a 3
>>> ; ${EXTEN:-4:4} - comeca quatro digitos do final
>>> exten => _3755XXXX,1,Macro(local-calls,SIP/+5519${EXTEN:-8})
>>> exten => _+19X.3755XXXX,1,Macro(local-calls,SIP/+5519${EXTEN:-8})
>>>
>>>
>>> [default-route]
>>>
>>> [dtmf-test]
>>> exten => 456,1,Answer()
>>> exten => 456,n,Background(hello-world)
>>> exten => 456,n,WaitExten(100)
>>> exten => 1,1,Playback(digits/1)
>>> exten => 1,n,Goto(ported-numbers,456,1)
>>>
>>>
>>> = sip.conf =============================================================
>>> [general]
>>> bindport => 5060
>>> canreinvite = no
>>> dtmfmode=info
>>> disallow=all
>>> allow=ulaw
>>>
>>> [phone-template](!); The exclamation point in parenthesis makes a
>>> template.
>>> type = friend
>>> context = main-dialplan
>>> host = dynamic
>>> srvlookup = yes
>>>
>>> [carrier1.com]
>>> type = friend
>>> ;user=phone
>>> host = carrier1.com
>>> insecure = very
>>> context = incoming-ims-calls
>>> canreinvite = no
>>> srvlookup = yes
>>> disallow = all
>>> allow = ulaw
>>> allow = alaw
>>> ;usereqphone=yes
>>>
>>> [+551937550000]
>>> type = friend
>>> context = main-dialplan
>>> host = dynamic
>>> srvlookup = yes
>>>
>>> [+551937558888]
>>> type = friend
>>> context = main-dialplan
>>> host = dynamic
>>> srvlookup = yes
>>>
>>>
>>> = HelloEvents.java
>>> =============================================================
>>> package br.org.teste.asterisk.dtmf;
>>>
>>> import java.io.IOException;
>>>
>>> import org.asteriskjava.manager.AuthenticationFailedException;
>>> import org.asteriskjava.manager.ManagerConnection;
>>> import org.asteriskjava.manager.ManagerConnectionFactory;
>>> import org.asteriskjava.manager.ManagerEventListener;
>>> import org.asteriskjava.manager.TimeoutException;
>>> import org.asteriskjava.manager.action.OriginateAction;
>>> import org.asteriskjava.manager.event.DtmfEvent;
>>> import org.asteriskjava.manager.event.ManagerEvent;
>>> import org.asteriskjava.manager.response.ManagerResponse;
>>>
>>> public class HelloEvents implements ManagerEventListener
>>> {
>>>     private ManagerConnection managerConnection;
>>>
>>>     public HelloEvents() throws IOException
>>>     {
>>>         ManagerConnectionFactory factory = new ManagerConnectionFactory(
>>>                 "127.0.0.1", "manager", "pa55w0rd");
>>>
>>>         this.managerConnection = factory.createManagerConnection();
>>>     }
>>>
>>>     public void run() throws IOException, AuthenticationFailedException,
>>>             TimeoutException, InterruptedException
>>>     {
>>>         // register for events
>>>         managerConnection.addEventListener(this);
>>>
>>>         // connect to Asterisk and log in
>>>         managerConnection.login();
>>>
>>>         // request channel state
>>>         {
>>>             OriginateAction originateAction;
>>>             ManagerResponse originateResponse;
>>>
>>>             originateAction = new OriginateAction();
>>>             originateAction.setChannel("SIP/+551937550000");
>>>             originateAction.setContext("default");
>>>             originateAction.setExten("37558888");
>>>             originateAction.setPriority(new Integer(1));
>>>
>>>             originateAction.setTimeout(new Integer(30000));
>>>
>>>             // send the originate action and wait for a maximum of 30
>>> seconds for Asterisk
>>>             // to send a reply
>>>             originateResponse =
>>> managerConnection.sendAction(originateAction, 30000);
>>>
>>>             // print out whether the originate succeeded or not
>>>             System.out.println(originateResponse.getResponse());
>>>
>>>         }
>>>
>>>         // Fica travado recebendo os eventos (parar o teste pelo STOP da
>>> IDE)
>>>         while (true) {
>>>             if (false) break;
>>>         }
>>>
>>>         // and finally log off and disconnect
>>>         managerConnection.logoff();
>>>     }
>>>
>>>     public void onManagerEvent(ManagerEvent event)
>>>     {
>>>         if (event instanceof DtmfEvent) {
>>>             DtmfEvent dtmf = (DtmfEvent) event;
>>>
>>>             System.out.println("Digit  : " +dtmf.getDigit());
>>>             System.out.println("Source : " + dtmf.getSource());
>>>             System.out.println("Channel: " +dtmf.getChannel());
>>>
>>>             System.out.println(dtmf);
>>>         }
>>>
>>>     }
>>>
>>>     public static void main(String[] args) throws Exception
>>>     {
>>>         HelloEvents helloEvents;
>>>
>>>         helloEvents = new HelloEvents();
>>>         helloEvents.run();
>>>     }
>>> }
>>>
>>>
>>> =============================================================================
>>>
>>> O que acontece é o seguinte. Quando pego um SIP Client e ligo para 456,
>>> recebo a mensagem "Hello World" e caso aperte algum número, o mesmo é
>>> repetido e logo após o "Hello World" é executado novamente. Se ao mesmo
>>> tempo, roda a minha aplicação Java, recebo o evento DtmfEvent e consigo
>>> realizar uma ação com as informações.
>>>
>>> O segundo teste, é fazer com que o Java ligue, o que eu consigo através
>>> do OriginateAction, mas o que eu não consigo é receber os eventos DTMF no
>>> Asterisk, que por sua vez, não repassa ao Java.
>>>
>>> Obrigado
>>> Paulo Sigrist
>>>
>>> 2010/2/19 Luis Reis <luis.reis em singularideas.com.br>
>>>
>>>  Jovem
>>>>
>>>> Tu tens que fazer a aplicação em AGI Síncrono e não orientada à eventos.
>>>>
>>>> Manda o fonte aí para eu te ajudar.
>>>>
>>>> Em 19 de fevereiro de 2010 11:50, Paulo Sigrist <
>>>> paulo.sigrist em gmail.com> escreveu:
>>>>
>>>>>  Olá pessoal,
>>>>>
>>>>> estou desenvolvendo uma aplicação que envolve o reconhecimento de DTMF
>>>>> em java. Um primeiro teste, eu ligo para uma ramal 456, o asterisk atende a
>>>>> chamada, e a partir desse momento, qualquer tecla que eu pressione no meu
>>>>> aparelho, é enviado um sinal DTMF e o asterisk gera um evento, que eu
>>>>> capturo no Java, através da API asterisk-java.
>>>>>
>>>>> Até ai tudo tranquilo, funcionando muito bem.
>>>>>
>>>>> O problema, é que a lógica da minha aplicação é a seguinte:
>>>>>
>>>>> 1 - Aplicação liga para uma extensão
>>>>> 2 - Aplicação apresenta o menu para o usuário
>>>>> 3 - Usuário seleciona a opção do menu
>>>>> 4 - Aplicação executa a ação correspondente a seleção do usuário.
>>>>>
>>>>> os passos 1 e 2, eu consigo através da api asterisk-java. O que não
>>>>> estou conseguindo é fazer o asterisk reconhecer que o usuário apertou uma
>>>>> tecla no aparelho e gerar o evento DTMF para que o meu código em Java
>>>>> reconheça e possa executar a ação.
>>>>>
>>>>> Minha dúvida é:
>>>>>
>>>>> É possível reconhecer o DTMF do usuário que recebe a ligação?
>>>>>
>>>>> Obrigado
>>>>> Paulo Sigrist
>>>>>
>>>>> _______________________________________________
>>>>> KHOMP: qualidade em placas de E1, GSM, FXS e FXO para Asterisk.
>>>>> - Hardware com alta disponibilidade de recursos e qualidade KHOMP
>>>>> - Suporte técnico local qualificado e gratuito
>>>>> Conheça a linha completa de produtos KHOMP em www.khomp.com.br
>>>>> _______________________________________________
>>>>> Lista de discussões AsteriskBrasil.org
>>>>> AsteriskBrasil em listas.asteriskbrasil.org
>>>>> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Luis Machado Reis
>>>> Analista de Sistemas
>>>> www.singularideas.com.br
>>>>
>>>> _______________________________________________
>>>> KHOMP: qualidade em placas de E1, GSM, FXS e FXO para Asterisk.
>>>> - Hardware com alta disponibilidade de recursos e qualidade KHOMP
>>>> - Suporte técnico local qualificado e gratuito
>>>> Conheça a linha completa de produtos KHOMP em www.khomp.com.br
>>>> _______________________________________________
>>>> Lista de discussões AsteriskBrasil.org
>>>> AsteriskBrasil em listas.asteriskbrasil.org
>>>> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>>>
>>>
>>>
>>> _______________________________________________
>>> KHOMP: qualidade em placas de E1, GSM, FXS e FXO para Asterisk.
>>> - Hardware com alta disponibilidade de recursos e qualidade KHOMP
>>> - Suporte técnico local qualificado e gratuito
>>> Conheça a linha completa de produtos KHOMP em www.khomp.com.br
>>> _______________________________________________
>>> Lista de discussões AsteriskBrasil.org
>>> AsteriskBrasil em listas.asteriskbrasil.org
>>> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>>
>>
>>
>>
>> --
>> Luis Machado Reis
>> Analista de Sistemas
>> www.singularideas.com.br
>>
>> _______________________________________________
>> KHOMP: qualidade em placas de E1, GSM, FXS e FXO para Asterisk.
>> - Hardware com alta disponibilidade de recursos e qualidade KHOMP
>> - Suporte técnico local qualificado e gratuito
>> Conheça a linha completa de produtos KHOMP em www.khomp.com.br
>> _______________________________________________
>> Lista de discussões AsteriskBrasil.org
>> AsteriskBrasil em listas.asteriskbrasil.org
>> http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>>
>
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20100301/5a7c2d8e/attachment-0001.htm 


Mais detalhes sobre a lista de discussão AsteriskBrasil