[AsteriskBrasil] Asterisk / java / DTMF
Luis Reis
luis.reis em singularideas.com.br
Sexta Fevereiro 19 17:13:12 BRST 2010
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
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20100219/dda7548b/attachment-0001.htm
Mais detalhes sobre a lista de discussão AsteriskBrasil