X
BLOG

El valor de la simulación para IoT: piratear Alexa con virtualización de servicios

El valor de la simulación para IoT: piratear Alexa con virtualización de servicios Tiempo de leer: 9 minutos

Si eres como yo, estás constantemente imaginando las posibilidades futuristas de los ecosistemas de IoT plenamente desarrollados. En el contexto de la casa, imagino mi automóvil, GPS y Nest trabajando juntos para anticipar mi llegada y hacer los ajustes adecuados al control del clima. O refrigeradores, Cuidadores de huevos, y Amazon Fresh hablando sin esfuerzo entre ellos para pedir huevos antes de que yo sepa que los necesitaré… Qué futuro.

En otras ocasiones, estoy convencido de que IoT traerá un futuro distópico (como se describe con detalles aleccionadores por Con conexión de cable).

Afortunadamente, estamos a algunos caminos de ese nivel de interconexión. El desarrollo de IoT está relativamente en pañales y existen algunos desafíos clave que los desarrolladores de IoT deben superar.

Parece haber consenso en que la complejidad ambiental es un desafío importante, y ese es un desafío difícil de superar porque la complejidad es una especie de punto en el mundo de IoT: como desarrollador de un dispositivo de IoT, puedo integrarme con muchas API de terceros posteriores. , mientras que otros desarrolladores pueden consumir mis API expuestas.

Antes de las crecientes demandas de IoT, podríamos haber probado nuestro dispositivo dentro de un ecosistema de API y dispositivos mediante la creación de laboratorios de prueba físicos. Ahora, esa es una propuesta obsoleta y costosa, y un desarrollador a menudo no puede controlar los datos que provienen de API o dispositivos de terceros (esto es fundamental para las pruebas de casos extremos).

Por eso, la virtualización de servicios es una parte fundamental de la solución. Podemos simular API descendentes y controlar los datos que consume nuestro dispositivo para validar situaciones inusuales durante las pruebas de integración.

El ejemplo de hoy

En esta publicación, usaré Amazon Echo para demostrar estas capacidades, ya que puede ser un eje central del ecosistema de IoT para el hogar (tal vez incluso tenga uno disponible como yo).

Comenzaré por mostrarle los pasos para implementar su propia habilidad de Alexa con AWS Lambda. Esta llamada le permitirá preguntarle a Alexa las condiciones climáticas para un código postal.

Luego, implementaremos los servicios virtuales de Parasoft en Azure para simular las respuestas de la API Weather para las pruebas de casos extremos. (Por ejemplo, ¿qué dirá Alexa cuando haya una tormenta eléctrica o cuando haga 101 F afuera?)

Requisitos previos que debe seguir usted mismo:

¿Cómo funcionará esto?

En la Parte 1, configuraremos nuestra función Alexa Skill y Lambda.

 

  1. El usuario le dirá algo a Alexa (la entrada del usuario se llama "Enunciado").
  2. Nuestra habilidad de Alexa asignará este "Enunciado" a un "Intención"
  3. Nuestra Alexa Skill enviará una solicitud JSON a nuestra función en AWS Lambda. Lambda es un poderoso servicio de Amazon que le permite cargar algún código y ejecutarlo en la nube bajo demanda; solo se le cobra por el tiempo en que se está ejecutando. En este ejemplo, la función Lambda decidirá qué hacer con nuestra solicitud de intención y tendrá la lógica para crear un mensaje de respuesta para el usuario en nombre de Alexa.
  4. Para crear la respuesta, nuestra función Lambda debe invocar la API meteorológica abierta para obtener la información meteorológica actual.

En la parte 2, implementaremos un servidor virtual de Parasoft en Azure. Luego colocaremos un proxy de Parasoft entre nuestra función Lambda y la API de OpenWeatherMap. Este proxy nos permitirá controlar las solicitudes meteorológicas de AWS Lambda, que fluyen a la API de OpenWeatherMap real o una representación virtual con respuestas predefinidas.

Parte 1: Configuración de nuestra función Alexa Skill y Lambda

  1. Primero, debemos asegurarnos de que estamos en la región "EE. UU. Este (Norte de Virginia)" en nuestra Consola de servicios web de Amazon (https://console.aws.amazon.com). Actualmente, esta es la única región en la que Lambda está disponible:
  2. Comencemos por crear nuestra función Lambda. Acceso (https://console.aws.amazon.com/lambda/) y seleccione el botón azul "Crear una función Lambda":
  3. En "Seleccionar plano", elija Función en blanco y luego seleccione el kit de habilidades de Alexa como disparador de nuestra función Lambda. Si no ve el "Kit de habilidades de Alexa" en la lista, probablemente no se encuentre en la región "EE.UU. Este (Norte de Virginia)".


    ¿Que esta pasando aqui? Debemos especificar la forma en que se invocará nuestra función Lambda y el kit de habilidades de Alexa permitirá que Alexa lo inicie (una vez que reciba la pronunciación correcta, que configuraremos más adelante).
  4. Asigne a la función un nombre como "virtualWeather" y elija "Node.js 4.3" como tiempo de ejecución. Para los propósitos de este artículo, usaremos la habilidad que ya construí. aquí así que adelante, descárgalo ahora. Si desea ver el código fuente subyacente, puede encontrarlo. aquí.
  5. En el menú desplegable Tipo de entrada de código, elija "Cargar un archivo .ZIP" y seleccione virtual-weather.zip que descargó en el paso 4.
  6. Y agregue dos variables de entorno: host y api_key:

    "Host" debe ser igual a http://api.openweathermap.org por ahora. “Api_key” es la clave alfanumérica de 32 dígitos que recibirá de OpenWeatherMap cuando se registre como desarrollador (consulte la lista de requisitos previos anterior para saber dónde hacerlo).
  7. En "Rol y controlador de funciones Lambda", seleccione "Crear un rol personalizado" en el menú desplegable Rol. En la nueva ventana que aparece, deje todo por defecto y seleccione "Permitir".
  8. De vuelta en la página "Configurar función", puede dejar las opciones predeterminadas para todo lo demás y hacer clic en "Siguiente". En la página Revisar, elija "Crear función" si todo se ve bien.
  9. Una vez que haya creado la función, asegúrese de copiar el ID de ARN en la parte superior derecha de la página. Lo necesitaremos más tarde:
  10. Ahora que nuestra función Lambda está en su lugar, tenemos que definir una habilidad de Alexa. Inicie sesión en el portal de desarrolladores de Amazon (http://developer.amazon.com) y seleccione la pestaña Alexa. Elija "Comenzar con el kit de habilidades de Alexa:
  11. Haga clic en "Agregar una nueva habilidad". Dale el nombre y el nombre de invocación de "clima"

  12. En "Modelo de interacción", publique lo siguiente en "Esquema de intención":
    {"intents": [{"slots": [{"name": "Zip", "type": "AMAZON.Number"}], "intent": "GetWeatherForZipIntent"}]}
  13. Publique lo siguiente en Expresiones de muestra:

    GetWeatherForZipIntent cuál es el clima para el código postal {Zip}
    GetWeatherForZipIntent cuál es el tiempo para {Zip}
    GetWeatherForZipIntent qué tiempo hace en {Zip}

    Los dos últimos pasos especifican exactamente cómo nuestro usuario interactuará con nuestra habilidad. Nuestras expresiones de muestra asignan la entrada vocal del usuario a Intents. El tipo de Intent (GetWeatherForZipIntent, en este caso) y el código postal especificado por el usuario se enviarán en una solicitud a nuestra función Lambda.

  14. En Configuración, seleccione AWS Lambda ARN (Nombre de recurso de Amazon) e ingrese el ARN de su función que copió anteriormente:


¡Estamos listos para probarlo! En la pestaña Texto, ingrese un enunciado de muestra como "¿Cuál es el clima en 91016?" Y haga clic en "Preguntar clima". Debería ver la solicitud JSON enviada a su función Lambda y su respuesta:


Si su Echo está conectado a esta cuenta y ha habilitado esta habilidad para probarla en su cuenta (puede hacer esto en la página de Prueba), puede hablar con Alexa para probar esto también. Di algo como "Alexa, pregunta el tiempo, qué tiempo hace en 91016".

¡Y eso es todo para la configuración de Alexa! Eso no estuvo tan mal, ¿verdad?

Pero, ¿qué pasa con el desafío central de la complejidad y las dependencias externas que se planteó al comienzo de este artículo?

Nuestra función Lambda se basa en una API externa que proporciona datos del mundo real en tiempo real. Como desarrollador o probador de un dispositivo de IoT, ¿cómo nos aseguramos de recibir los datos posteriores que necesitamos para probar diferentes condiciones?

Por ejemplo, echemos un vistazo a parte de nuestra habilidad de Alexa, weather.js:


Tenemos una lógica simple aquí que agrega frases apropiadas para el clima basadas en nuestra descripción del clima. Por ejemplo, "¡Coge un paraguas!" a la respuesta de nuestra Alexa cada vez que se menciona la lluvia en el campo de descripción de nuestra respuesta JSON.

Entonces, ¿exactamente cómo vamos a probar esto? A menos que tenga listo un baile de lluvia confiable o viva en Seattle, esto no será fácil. Agregue la automatización de pruebas (para lo cual necesitaríamos datos consistentes y repetibles de la API de OpenWeather, lo cual es poco probable) a la mezcla y tenemos un problema muy complicado.

La respuesta fácil, claramente, es la virtualización de servicios. Esto nos permitirá simular la API Weather y probar diferentes circunstancias. Parasoft tiene una plataforma de virtualización de servicios gratuita (la plataforma de prueba continua) disponible para una prueba gratuita de 30 días en Azure.

Parte 2: Uso de la virtualización de servicios para realizar pruebas de casos perimetrales en nuestra habilidad de Alexa

  1. Inicia sesión en tu Portal Azurey seleccione "Nuevo" para acceder al Marketplace:

  2. En Marketplace, busque "Parasoft" y seleccione "Service Virtualization On-Demand". Puede seleccionar la opción "BYOL" si anteriormente recibió una licencia especial de Parasoft. Haga clic en Crear.
  3. Proporcione un nombre para la máquina virtual y luego ingrese un nombre de usuario y una contraseña. Puede optar por crear un nuevo grupo de recursos para la VM o agregarlo a una VM existente. Todas las demás opciones se pueden dejar en los valores predeterminados. Haga clic en Aceptar.
  4. Seleccione un tamaño de máquina virtual (se recomienda DS2_V2 o mejor). Haga clic en Aceptar.
  5. En "Configuración", puede cambiar otras configuraciones si lo desea. Se recomienda que no cambie la configuración predeterminada a menos que tenga una razón específica para hacerlo. Haga clic en Aceptar.
  6. Haga clic en Aceptar en la vista Resumen.
  7. Haga clic en Comprar en la vista Comprar. Una vez que se complete la prueba gratuita (los primeros 30 días), se le cobrará. El proceso de creación de la máquina virtual tardará varios minutos en completarse.
  8. Una vez que el estado de la VM sea "En ejecución", seleccione la VM y copie su Dirección IP pública.
  9. Vaya a http: // en su navegador. Aparecerá el menú principal de Continuous Testing Platform. Una vez que el widget "Porcentaje en línea" muestra "100%", la máquina virtual está completamente configurada e inicializada:
  10. Cerca de la parte superior, haga clic en "Agregar sistema":


  11. Seleccione "Importar un sistema desde un archivo", luego busque AlexaWeatherSystem.zip (descárguelo aquí). Seleccione "AzureVirtServer" como el servidor de destino, luego haga clic en "Importar":Ahora hemos importado el sistema AlexaWeatherSkill, los servicios virtuales y los datos asociados.
  12. Terminemos colocando nuestro punto final de proxy entre nuestra función Lambda y la API de OpenWeatherMap. El proxy se implementa en http: // : 9080 / proxy

    Vaya a su función virtualWeather en AWS Lambda (https://console.aws.amazon.com/lambda/) y cambiamos la Variable de entorno que creamos al punto final del proxy:

  13. En nuestro entorno (http: // / em / ui / environment / 1), ahora podemos controlar los datos que se devuelven a nuestra función Lambda para probar diferentes condiciones. ¡Esto cambiará el comportamiento de nuestra Alexa bajo demanda! Seleccione T-Storm en el menú desplegable debajo del componente API de OpenWeatherMap y seleccione el botón "Provisión":
    El tráfico ahora se dirige a nuestro servicio virtual "T-Storm" y se está devolviendo una respuesta (que indica lluvia y tormentas eléctricas). Di algo como “Alexa, pregunta a virtualWeather qué tiempo hace en 91016” y escucharás como respuesta “¡Toma un paraguas! Tormenta y lluvia intensa en Monrovia ".

 

¡Ahora tenemos el poder de controlar el clima!

Pasos siguientes:

Entonces, ¿a dónde ir desde aquí? A continuación, se muestran algunos posibles pasos siguientes:

  • Si tiene curiosidad por modificar las respuestas virtuales existentes (o crear las suyas propias), consulte: http: // / em / virtualassets / manage
  • Actualmente, las respuestas virtuales informarán el clima en la "Ciudad de prueba" y no el nombre de la ciudad asociada con el código postal que especificó. Potencialmente, podría mejorar los servicios virtuales para realizar una búsqueda por código postal para proporcionar el nombre correcto de la ciudad en la respuesta virtual.
  • Puede modificar el código de mi función Lambda y compilarlo / implementarlo en AWS Lambda. Quizás podría modificar la respuesta de Alexa para incluir más datos meteorológicos devueltos por la API. Puede encontrar el repositorio aquí: https://github.com/sdebrosse/virtualize-weather
  • Una vez que lo haya clonado en su máquina Linux (solo podrá compilarlo en un entorno Linux), necesitará AWS CLI configurado y npm / nodejs instalado. Desde la carpeta del repositorio, puede ejecutar "npm run deploy" para implementar cambios en Lambda.

También recomiendo encarecidamente el artículo de Brian Donohue aquí sobre cómo crear tu primera habilidad de Alexa. También recomiendo el artículo de Ryan Ray aquí. He adaptado el código de sus dos tutoriales para la función Lambda que usamos en este artículo.

TL; DR?

Mi colega Andrey configuró recientemente su Alexa usando estas instrucciones para una charla técnica y registró los resultados finales. Mire a continuación para ver qué sucede después de seguir los pasos que he establecido en esta publicación:

Escrito por

Spencer Debrosse

Reciba las últimas noticias y recursos sobre pruebas de software en su bandeja de entrada.

Prueba Parasoft