[AsteriskBrasil] Asterisk / java / DTMF

Paulo Sigrist paulo.sigrist em gmail.com
Sexta Fevereiro 19 14:45:27 BRST 2010


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
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20100219/baea533e/attachment.htm 


Mais detalhes sobre a lista de discussão AsteriskBrasil