Menu

Expand
Calificar esta página:

Recibir y responder mensajes SMS y MMS en el ESP8266 con C++ y ngrok

Hoy utilizaremos los SMS programables de Twilio para responder a mensajes entrantes directamente desde una aplicación móvil de C++ que se ejecuta en un ESP8266. Cuando se envía un SMS o MMS a tu número de Twilio, utilizaremos ngrok para dirigir una conexión segura desde Twilio a una ruta en tu ESP8266. Luego, aplicaremos lógica a la solicitud de Twilio, posiblemente con la intermitencia de ciertos LED, y enviaremos una respuesta con TwiML, el Markup Language de Twilio.

¿Parece difícil? Para nada, ni siquiera un poco. Te enviaremos tus webhooks en un instante.

Twilio puede enviar una solicitud HTTP a tu aplicación web cuando se produzcan determinados eventos, como un mensaje de texto entrante a uno de tus números de teléfono de Twilio. Estas solicitudes se denominan webhooks o devoluciones de llamada de estado. Para obtener más información, consulta nuestra guía de Introducción a los webhooks de Twilio. Encuentra otras páginas sobre webhooks, como una guía de seguridad y preguntas frecuentes en la sección Webhooks de los documentos.

Incoming SMS Diagram

¿Qué es un webhook?

Los webhooks son devoluciones de llamadas HTTP definidas por el usuario. Por lo general, son activados por algún evento, como recibir un mensaje SMS o una llamada telefónica entrante. Cuando se produce ese evento, Twilio realiza una solicitud HTTP (en general una POST o GET) a la URL configurada para el webhook.

Para gestionar un webhook, solo necesitas crear una pequeña aplicación web que pueda aceptar las solicitudes HTTP. Casi todos los lenguajes de programación en el lado del servidor ofrecen un marco para que lo hagas. Algunos ejemplos de lenguajes son ASP.NET MVC para C#, Servlets y Spark para Java, Express para Node.js, Django y Flask para Python, y Rails y Sinatra para Ruby. PHP tiene su propio marco integrado de app web, aunque marcos como Laravel, Symfony y Yii también son populares.

Sea cual sea el marco y lenguaje que elijas, los webhooks funcionan de igual manera para cada aplicación móvil de Twilio. Realizarán una solicitud HTTP a un URI que proporciones a Twilio. Tu aplicación móvil realiza la lógica que consideres necesaria, ya sea leer o escribir desde una base de datos, integrar otra API o realizar algún proceso de computación, y luego responde a Twilio con una respuesta TwiML con las instrucciones que deseas que Twilio lleve a cabo.

¿Qué es TwiML?

TwiML es Twilio Markup Language, que se podría decir que es un documento XML con etiquetas especiales definidas por Twilio para ayudarte a crear tus aplicaciones móviles de SMS y voz. TwiML es más fácil de mostrar que explicar. A continuación, se muestran algunos TwiML que podrías utilizar para responder una llamada telefónica entrante:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say>Thanks for calling!</Say>
</Response>

Aquí se muestran algunos TwiML que podrías utilizar para responder un mensaje SMS entrante:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>We got your message, thank you!</Message>
</Response>

Cada documento de TwiML tendrá un elemento raíz <Response> y ese elemento puede contener uno o más verbos. Los verbos son acciones que te gustaría que Twilio realice, como <Say> (Decir) un saludo a la persona que llama, o enviar un <Message> (Mensaje) SMS en respuesta a un mensaje entrante. Para obtener una referencia completa sobre todo lo que puedes hacer con TwiML, consulta nuestra Referencia de la API de TwiML.

Requisitos previos para recibir y responder mensajes SMS en el ESP8266

Hay una serie de requisitos previos que deberás tener en cuenta para seguir esta guía de forma correcta. En el corazón (o tal vez el cerebro) está el ESP8266 Espressif, que puede encontrarse en módulos de tan solo 2 USD. Al ser compatible con TLS 1.2, es una de las partes más económicas que pueden utilizar las API de Twilio de forma segura.

Cómo mínimo para integrar las webhooks de Twilio, necesitarás un ESP8266, un método para programarlo y una manera de dirigirlo de forma segura al ESP. Para seguir este artículo en particular, además necesitarás asegurarte de que puedas programar tu ESP8266 desde el IDE de Arduino.

Selección de la placa ESP8266

Si aún no has seleccionado una placa de desarrollo, te sugerimos que compruebes la lista de placas probadas en el repositorio Github de Arduino en ESP8266. No cubre todas las variantes de ESP8266 o todos los circuitos impresos (PCB), pero escoger una variante que se haya probado es la forma más rápida de comenzar. Las variantes de ESP-8266 12-E como esta funcionan bien.

Cuando creé esto por primera vez, utilice una Sparkfun Thing y la Basic FTDI breakout de Sparkfun para la programación. La Thing sobrecarga el PIN DTR y no funciona cuando se programa y se conecta al monitor serial. En la mayoría de las placas, no es necesario tocar los #define en el código.

Pero si lo haces: puedes activar o desactivar el software serial al cambiar #define USE_SOFTWARE_SERIAL en Twilio_ESP8266_Example.ino.

IDE de Arduino

El núcleo de ESP8266 para Arduino proporciona de forma conveniente la cadena de herramientas Xtensa gcc, las bibliotecas muy útiles de Arduino y una forma fácil de comenzar a programar el ESP8266.

Aunque está fuera del alcance de la guía, haznos saber cualquier caso exitoso que presentes al recibir y responder mensajes SMS y MMS en el ESP8266 con otras cadenas de herramientas. ¡Nos encantaría conocer tu metodología!

Generación de TwiML de forma manual en el ESP8266

En nuestras bibliotecas auxiliares de Twilio, hemos incluido el código para ayudar a formular TwiML de forma correcta. Desafortunadamente, con una parte que admite un máximo de 16 megabytes de memoria con una RAM que se mide en kilobytes, debemos generar nuestro propio TwiML desde cero.

Sin embargo, no debes preocuparte, ya que el Markup Language de Twilio es muy sencillo y potente.

Para esta aplicación móvil de ejemplo, una ruta responderá a los SMS y MMS entrantes con un mensaje genérico predefinido. En otra, demostramos una autenticación muy sencilla (poco segura) frente a un número maestro, lo que permite que ese número encienda y apague el LED integrado en muchas placas de desarrollo ESP8266.

En este código:

  1. Recibimos un mensaje de texto entrante y preparamos de inmediato una respuesta que comienza con <?xml version=\"1.0\" encoding=\"UTF-8\"?>.
  2. Luego decidimos si un mensaje es de un número “autorizado”, que definimos como coincidente con nuestra variable master_number.
  3. Si estamos autorizados y recibimos un cuerpo que solo contiene “0” o “1”, apagamos o encendemos el LED integrado y utilizamos las etiquetas <Response> y <Message>. (Ten en cuenta que algunas placas cuentan con un LED a nivel bajo y tienen una lógica invertida, ¡te dejamos que cambies los mensajes!).

Un SMS entrante autorizado con “?” como el cuerpo responderá con instrucciones y el estado actual del LED, nuevamente en las etiquetas <Response> y <Message>. Las solicitudes no autorizadas con cualquiera de estos tres comandos recibirán una advertencia.

Finalmente, respondemos con application/xml como el tipo MIME y un código de estado de 200.

Loading Code Sample...
        
        
        Generación manual de TwiML en el ESP8266

        Sending and Receiving Messages on the ESP8266

        Generación manual de TwiML en el ESP8266

        Configuración de una ruta en el ESP8266

        En realidad, configurar una ruta en el servidor web de ESP8266 es muy sencillo con la biblioteca ESP8266WebServer. Como mínimo, necesitarás crear instancias de un objeto ESP8266WebServer, configurar una ruta única y una función para gestionar solicitudes, y comenzar a escuchar a servidor. Twilio espera recibir TwiML como respuesta, por lo que una vez que la ruta funcione correctamente, te recomendamos devolver TwiML para indicar a Twilio cómo responder un mensaje entrante.

        En nuestro código, esta línea:

        twilio_server.on("/message", handle_message);

        establece una ruta en /message y handle_message es un puntero a una función nula (nuestra implementación está en el repositorio de Github). Cuando se realiza una solicitud a /message, se llama a esa función y el ESP8266 pasa a través de la lógica previamente descrita a fin de escoger una respuesta (y posiblemente hacer que el LED parpadee).

        En este ejemplo de código se destaca toda la información para realizar este trabajo.

        Loading Code Sample...
              
              
              Crear una instancia de ESP8266WebServer en el puerto 8000, configurar una ruta con una función de devolución de llamada, iniciar el servidor de ESP8266 y gestionar las conexiones entrantes.

              Configuración de una ruta en el ESP8266 para un webhook de Twilio

              Crear una instancia de ESP8266WebServer en el puerto 8000, configurar una ruta con una función de devolución de llamada, iniciar el servidor de ESP8266 y gestionar las conexiones entrantes.

              Configuración de la URL del webhook

              Si todo funcionó bien, ahora tienes un servidor web que se ejecuta en el ESP8266 en una red amigable. Si has llegado hasta acá, el resto del trabajo de la configuración se llevará a cabo fuera del ESP8266.

              Sin embargo, en primer lugar debes encontrar el servidor web. Utiliza el medio más fácil para encontrar la dirección IP del ESP8266 en tu red local. Si estás conectado a la serie en la placa, esto puede ser tan fácil como buscar la dirección IP asignada en un mensaje similar a esta ejecución exitosa:

              .....
              Conectado a Wi‐Fi, dirección IP:
              192.168.1.155
              Conectando al host api.twilio.com
              Las huellas del certificado coinciden.

              Aunque es casi seguro que tu ESP8266 no se encontrará en 192.168.1.155, cuando encuentres la IP puedes probarlo al visitarlo (en un navegador):

              <YOUR ESP8266'S IP ADDRESS>:8000/message

              y comprobar que obtienes una respuesta xml.

              Si funciona, estás listo para compartirlo con el mundo y dejar que Twilio sepa dónde encontrar tu ESP. Pero primero, necesitamos encontrar una manera de exponerlo.

              Uso de ngrok para exponer el ESP8266

              Una manera simple de probar nuestro nuevo servidor de ESP8266 es con ngrok. Este hace que sea muy fácil canalizar solicitudes seguras a tu red local, lo que garantiza que el cifrado no se rompa hasta dentro de su (esperemos) red interna más controlable.

              En una máquina que puede ver el ESP8266 y cuenta con ngrok instalado, simplemente ejecuta el siguiente comando en el terminal que escojas (al reemplazar 192.168.1.155 con la dirección IP de tu ESP8266):

              ngrok http 192.168.1.155:8000

              ... y eso es realmente todo lo que necesitas. Deberías ver que ngrok toma el control de tu terminal con un gran resumen:

              Using ngrok to Route Requests to an Espressif ESP8266

              Configuración de un webhook de mensajería con Twilio

              Ahora que nuestro ESP8266 está expuesto al mundo con ngrok, solo queda un paso más antes de que podamos enviar mensajes de texto a nuestra pieza de silicona de 2 USD para divertirnos y obtener ganancias.

              Ingresa a la consola de Twilio y dirígete hasta un número (preferiblemente, el número que se estableció en la variable from_number) que te gustaría vincular a tu placa.

              Desplázate hacia abajo y verás una sección para configurar las URL de los webhooks para la mensajería. Simplemente, pega la URL de ngrok segura seguida de /message y estarás listo:

              Configure Messaging Webhook

              Después de eso, estarás trabajando con Twilio. Intenta enviar mensajes con “0”, “1”, “?” y cualquier otra cosa que desees desde el master_number y otros números y observa el resultado que obtienes. ¡Eso es todo lo que se necesita para conectar tu dispositivo ESP8266 con Twilio!

              Respaldar la URL del webhook

              Observarás que hay un campo opcional “Primary Handler Fails” (Fallos del administrador principal). En tu aplicación móvil final, es probable que desees agregar un punto final secundario para que Twilio se vuelva a conectar si el ESP8266 no se logra alcanzar, de modo que puedas gestionar la lógica cuando vuelva a estar online.

              Simplemente agrega una URL a ese campo y Twilio se conmutará de forma automática si se produce un código de error o si el webhook primario no responde dentro de 15 segundos. Consulta nuestra Guía de disponibilidad y fiabilidad para obtener más información sobre la URL de respaldo.

              Proteger los webhooks

              Twilio es compatible con la autenticación HTTP básica y codificada. La autenticación te permite proteger tus URL de TwiML en tu servidor web con contraseña para que solo tú y Twilio puedan acceder a ellos.

              Obtén más información sobre la autenticación HTTP aquí.

              Responder con contenido multimedia (mensaje MMS)

              Enviar un MMS es tan sencillo como agregar una etiqueta nueva a TwiML con una etiqueta <Media>. Puedes incluir hasta 10 etiquetas multimedia individuales en una respuesta.

              Aunque esto se encuentra fuera del tema de este artículo, significa que podrías enviar imágenes alojadas (o generadas de forma dinámica) en el ESP8266 en respuesta a mensajes entrantes. Genial, ¿no?

              Mejorar mensajes con complementos

              ¿Necesitas más información sobre el número de teléfono que envió el mensaje? ¿Necesitas analizar el mensaje en sí en busca de opiniones u otros datos? Los complementos se encuentran disponibles en el Mercado de complementos a fin de realizar estas tareas y mucho más.

              Para obtener más información sobre cómo habilitar Complementos para los mensajes SMS entrantes, consulta nuestro Inicio rápido de complementos.

              ¿Quién necesita más de 64 kB de RAM, por no hablar de 640 kB?

              Entre este artículo y nuestro artículo sobre cómo enviar mensajes SMS y MMS desde un ESP8266, hemos cubierto cómo gestionar mensajes entrantes y salientes con el ESP8266 Espressif y la API de Twilio. Ahora puedes implementar tus apps web en entornos en los que los servidores no podían trabajar anteriormente.

              El siguiente paso depende de ti. Utiliza Twilio y tu imaginación para configurar una app de seguridad, automatización del hogar o monitoreo remoto. ¡Nos encantaría conocer lo que creas! Comunícate con nosotros en Twitter y envíanos un enlace de tu próximo gran proyecto.

              Paul Kamp Kevin Segovia Daniel Erazo
              Calificar esta página:

              ¿Necesitas ayuda?

              Todos la necesitamos a veces; la programación es difícil. Obtén ayuda ahora de nuestro equipo de soporte, o recurre a la sabiduría de la multitud visitando Stack Overflow Collective de Twilio o navegando por la etiqueta de Twilio en Stack Overflow.

              Loading Code Sample...
                    
                    
                    

                    Gracias por tus comentarios.

                    Selecciona los motivos de tus comentarios. La información adicional que nos brindas nos ayuda a mejorar nuestra documentación:

                    Enviando tus comentarios…
                    🎉 Gracias por tus comentarios.
                    Se produjo un error. Inténtalo de nuevo.

                    Gracias por tus comentarios.

                    thanks-feedback-gif