https://d226lax1qjow5r.cloudfront.net/blog/blogposts/handle-keypad-input-dtmf-with-java-dr/Handle-Keypad-Input-With-Java.png

Manejar la entrada de teclado (DTMF) con Java

Publicado el May 3, 2021

Tiempo de lectura: 10 minutos

Introducción

En un tutorial anterior, le mostramos cómo crear una aplicación que puede Recibir una llamada telefónica con Java. En este tutorial, crearás una aplicación que puede recibir una llamada telefónica y responder a la entrada del usuario utilizando la Voice API de Vonage.

Requisitos previos

Para realizar este tutorial, necesitarás una Account de Vonage. Regístrate ahora si aún no tienes una Account.

Utilizará Gradle para gestionar tus dependencias y ejecutar tu aplicación. Adicionalmente, necesitarás asegurarte de que tienes una copia del JDK instalada. Yo usaré JDK 8 en este tutorial.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Manejar las entradas del usuario con Java

Este tutorial le guiará a través de los siguientes pasos:

  1. Uso de Gradle para configurar un nuevo proyecto Java.

  2. Uso de la plataforma Spark para controlar la llamada.

  3. Comprar un número y configurar tu cuenta de Vonage para usar ese número con tu aplicación.

Uso de Gradle para crear un nuevo proyecto Java

Utilizará Gradle para gestionar tus dependencias y crear y ejecutar tu aplicación Java. Desde la línea de comandos, crea un nuevo proyecto Java con los siguientes comandos:

mkdir handle-user-input cd handle-user-input gradle init --type java-application

El comando gradle init --type java-application creará todas las carpetas que necesites, así como una clase de ejemplo en la que escribirás tu código.

Uso del marco Spark para controlar la llamada

Utilizará el módulo Spark para interceptar la llamada HTTP que Vonage utiliza cuando tu número recibe una llamada, y para la solicitud que Vonage envía cuando se recibe la entrada.

Añadir las dependencias

Añada lo siguiente a su bloque dependencies en el archivo build.gradle archivo:

compile 'com.sparkjava:spark-core:2.7.2'
compile 'com.nexmo:client:4.0.1'

El bloque dependencies debe tener este aspecto:

dependencies {
    // This dependency is found on compile classpath of this component and consumers.
    compile 'com.google.guava:guava:23.0'
    compile 'com.sparkjava:spark-core:2.7.2'
    compile 'com.nexmo:client:4.0.1'

    // Use JUnit test framework
    testCompile 'junit:junit:4.12'
}

Configurar la ruta de respuesta

Gradle creará la clase App clase en la carpeta src/main/java carpeta. Dentro de esta clase hay un getGreeting y un método main método. No necesitarás el método getGreeting así que siéntete libre de eliminarlo.

Sustituya el contenido del método main resolviendo cualquier importación, por

/*
* Route to answer incoming calls.
*/
Route answerRoute = (req, res) -> {
    TalkAction intro = new TalkAction
            .Builder("Hello. Please press any key to continue.")
            .build();

    InputAction input = new InputAction.Builder()
            .eventUrl(String.format("%s://%s/webhooks/dtmf", req.scheme(), req.host()))
            .maxDigits(1)
            .build();


    res.type("application/json");

    return new Ncco(intro, input).toJson();
};

/*
* Route to print out call event info.
*/
Route eventRoute = (req, res) -> {
    System.out.println(req.body());
    return "";
};

Spark.port(3000);
Spark.get("/webhooks/answer", answerRoute);
Spark.post("/webhooks/events", eventRoute);

Este código creará una ruta en http://localhost:3000/webhooks/answer que responderá con lo siguiente Objeto de Control de Llamada Nexmo (NCCO):

[
  {
    "text": "Hello please press any key to continue.",
    "action": "talk"
  },
  {
    "maxDigits": 1,
    "action": "input",
    "eventUrl": [
      "http://localhost:3000/webhooks/dtmf"
    ]
  }
]

La acción de hablar le indicará a Vonage que diga la text propiedad a la persona que llama. La acción de entrada le indicará a Vonage que capture un solo dígito que ingrese la persona que llama y que envíe una solicitud POST a eventUrl con esta información.

También se creará una ruta en http://localhost:3000/webhooks/events que Vonage utilizará para comunicar los cambios de estado de las llamadas.

Configurar la ruta DTMF

Cuando la persona que llama presiona un dígito en su dispositivo, se crea una señal de multifrecuencia de doble tono (DTMF). Vonage utiliza esta señal DTMF para determinar qué conjunto de teclas se presionaron. Una vez que esto sucede, Vonage envía una solicitud POST a la carpeta eventUrl definido en el archivo InputNcco.

He aquí un ejemplo de solicitud POST que contiene un cuerpo JSON:

{
    "dtmf": "5",
    "timed_out": false,
    "uuid": "some-uuid",
    "conversation_uuid": "some-conversation",
    "timestamp": "2018-08-14T19:59:02.528Z"
}

Para leer esta información en Java, necesitará una clase que mapee las propiedades JSON a propiedades Java. La Nexmo Java Client Library contiene la InputEvent para realizar este mapeo.

En el main de la clase App añada la siguiente ruta debajo de eventRoute:

/*
* Route which returns NCCO saying which DTMF code was received.
*/
Route inputRoute = (req, res) -> {
    InputEvent event = InputEvent.fromJson(req.body());

    TalkAction response = new TalkAction
            .Builder(String.format("You pressed %s, Goodbye.", event.getDtmf()))
            .build();

    res.type("application/json");

    return new Ncco(response).toJson();
};

A continuación, registre la ruta añadiendo lo siguiente al final del método main método:

Spark.post("/webhooks/dtmf", inputRoute);

Esta ruta responderá con lo siguiente OCN:

[
  {
    "text": "You pressed 6, Goodbye.",
    "action": "talk"
  }
]

donde 6 es la propiedad dtmf propiedad del json enviado a /webhooks/dtmf.

Comprar un Numbers

Necesitarás un número de Vonage para recibir llamadas telefónicas. Si no tienes un número, puedes usar la CLI de Vonage para encontrar y luego comprar uno. Primero elige un número disponible para comprar:

vonage numbers:search US

Y luego compre uno de los Numbers disponibles:

vonage numbers:buy US

Tome nota del número que se le asigna en el momento de la compra. Necesitará este número para vincular su solicitud y para las pruebas.

Cómo exponer su aplicación

Para enviar una solicitud HTTP a tu aplicación, Vonage necesita conocer la URL en la que se ejecuta tu aplicación.

En lugar de configurar su red local o alojar su aplicación en un servicio externo, puede utilizar ngrok para exponer tu aplicación a Internet de forma segura.

Descargar ngrok y ejecute el siguiente comando:

ngrok http 3000

Tome nota de la dirección de reenvío, ya que la necesitará cuando configure su Account. En la siguiente imagen, la dirección de reenvío es http://99cad2de.ngrok.io.

Screenshot of ngrok running in terminal with forwarding address http://99cad2de.ngrok.ioscreenshot of ngrok

Configura tu cuenta de Vonage

Si no tienes una aplicación, puedes utilizar la CLI de Vonage para crear una usando tu ngrok dirección de reenvío:

vonage apps:create "Receive Call Demo" http://your-ngrok-forwarding-address/webhooks/answer http://your-ngrok-forwarding-address/webhooks/events --keyfile private.key

Tras ejecutar este comando, se le mostrará un identificador de aplicación. Por ejemplo: notreal-1111-2222-3333-appid. Necesitará este identificador de aplicación para vincular su número de teléfono a la aplicación.

Puedes utilizar la CLI de Vonage para vincular tu número de teléfono y aplicación:

vonage apps:link your-application-id --number=your-vonage-phone-number

Este comando le indica a Vonage que cree una nueva aplicación en tu Account. La aplicación enviará una solicitud a la primera URL cuando reciba una llamada telefónica. La aplicación enviará solicitudes a la segunda URL cuando cambie el estado de la llamada.

Pruebe su aplicación

Inicie su aplicación con el comando gradle run dentro de su directorio handle-user-input directorio.

Haz una llamada a tu número de Vonage y prueba tu aplicación. Escucharás el mensaje "Hola, presiona cualquier tecla para continuar", presiona un dígito en el teclado de tu teléfono y escucharás el mensaje "Presionaste 6, adiós", donde 6 es el número que presionaste.

Conclusión

En unas pocas líneas de código has creado una aplicación que puede recibir una llamada telefónica, capturar la entrada del usuario y responder con esa entrada. Experimenta con otras formas de utilizar la entrada del usuario para controlar la llamada.

Consulte nuestra documentación en Desarrollador Nexmo donde podrá obtener más información sobre flujo de llamadas o Objetos de control de llamadas Nexmo. Vea nuestros Ejemplos de inicio rápido de Nexmo para Java para ejemplos de código completos sobre este tutorial y mucho más.

Compartir:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Steve CrowAntiguos alumnos de Vonage

Steve se autoproclama matemático y rey de la sátira. También le gustan los galgos, los rompecabezas enrevesados y los juegos de mesa europeos. Cuando no está hablando de matemáticas con gente que no es matemática o de Java con gente que no es de Java, se le puede encontrar tomando café y hackeando código.