Découvrez comment la solution Parasoft Continuous Quality permet de contrôler et de gérer les environnements de test pour fournir des logiciels de haute qualité en toute confiance. Inscrivez-vous pour la démo >>

BLOG

La valeur de la simulation pour l'IoT: pirater Alexa avec la virtualisation des services

La valeur de la simulation pour l'IoT: pirater Alexa avec la virtualisation des services Temps de lecture : 9 minutes

Si vous êtes comme moi, vous imaginez constamment les possibilités futuristes d'écosystèmes IoT pleinement réalisés. Dans le contexte de la maison, j'imagine que ma voiture, mon GPS et Nest travaillent ensemble pour anticiper mon arrivée et effectuer les réglages appropriés de la climatisation. Ou des réfrigérateurs, Maîtres d'oeufs, et Amazon Fresh se parlant sans effort pour commander des œufs avant même que je sache que j'en aurai besoin… Quel avenir.

D'autres fois, je suis convaincu que l'IoT apportera un avenir dystopique (comme décrit en détail par Wired).

Nous sommes, heureusement, à quelques pas de ce niveau d'interconnexion. Le développement de l'IoT en est à ses balbutiements et les développeurs IoT doivent surmonter certains défis clés.

Il semble y avoir un consensus sur le fait que la complexité environnementale est un défi majeur, et c'est un défi délicat à surmonter car la complexité est en quelque sorte le point dans le monde de l'IoT - en tant que développeur d'un appareil IoT, je peux intégrer de nombreuses API tierces en aval. , tandis que d'autres développeurs peuvent consommer mes API exposées.

Avant les demandes croissantes de l'IoT, nous aurions pu tester notre appareil au sein d'un écosystème d'API et d'appareils en créant des laboratoires de test physiques. Maintenant, c'est une proposition obsolète et coûteuse, et un développeur ne peut souvent pas contrôler les données provenant d'API ou d'appareils tiers (c'est essentiel pour les tests de cas de pointe).

C'est pourquoi la virtualisation des services est un élément essentiel de la solution. Nous pouvons simuler des API en aval et contrôler les données consommées par notre appareil, pour valider des situations inhabituelles lors des tests d'intégration.

Exemple de virtualisation de service d'aujourd'hui

Dans cet article, j'utiliserai Amazon Echo pour démontrer ces capacités, car il peut être un hub central de l'écosystème IoT pour la maison (peut-être en avez-vous même un disponible comme moi).

Je commencerai par vous expliquer les étapes à suivre pour mettre en œuvre votre propre compétence Alexa avec AWS Lambda. Cet appel vous permettra de demander à Alexa les conditions météorologiques pour un code postal.

Nous déploierons ensuite les services virtuels Parasoft dans Azure pour simuler les réponses de l'API Weather pour les tests de cas de périphérie. (Par exemple, que dira Alexa quand il y a un orage ou quand il fait 101 F dehors?)

Prérequis à suivre vous-même:

  • Une connexion Internet (enfin, évidemment)
  • Votre propre Amazon Echo ou Echo Dot améliorerait l'expérience, mais vous pouvez également utiliser un simulateur.
  • Un compte de développeur Amazon (https://developer.amazon.com/) et compte de services Web Amazon (https://aws.amazon.com/).
  • Inscrivez-vous en tant que développeur sur https://openweathermap.org/api pour recevoir une clé API pour l'API Open Weather.
  • Un compte Microsoft (https://signup.live.com) pour accéder à Microsoft Azure.
  • Une compréhension de base des API REST et JSON.

Comment cela fonctionnera-t-il?

Dans la partie 1, nous allons configurer notre compétence Alexa et notre fonction Lambda.

 

  1. L'utilisateur dira quelque chose à Alexa (l'entrée de l'utilisateur s'appelle un «énoncé»).
  2. Notre compétence Alexa mappera cette «énonciation» à une «intention»
  3. Notre compétence Alexa enverra une requête JSON à notre fonction dans AWS Lambda. Lambda est un service puissant d'Amazon qui vous permet de télécharger du code et de l'exécuter dans le cloud à la demande; vous n'êtes facturé que pour le temps pendant lequel il s'exécute. Dans cet exemple, la fonction Lambda décidera quoi faire avec notre demande d'intention et aura la logique de créer un message de réponse pour l'utilisateur au nom d'Alexa.
  4. Pour créer la réponse, notre fonction Lambda doit appeler l'API Open Weather pour obtenir les informations météorologiques actuelles.

Dans la partie 2, nous déploierons un serveur virtuel Parasoft dans Azure. Nous placerons ensuite un proxy Parasoft entre notre fonction Lambda et l'API OpenWeatherMap. Ce proxy nous permettra de contrôler les demandes météorologiques d'AWS Lambda, qui transitent vers la véritable API OpenWeatherMap ou une représentation virtuelle avec des réponses prédéfinies.

Partie 1: Configuration de notre compétence Alexa et de la fonction Lambda

  1. Tout d'abord, nous devons nous assurer que nous sommes dans la région «USA Est (Virginie du Nord)» dans notre Amazon Web Services Console (https://console.aws.amazon.com). Actuellement, c'est la seule région dans laquelle Lambda est disponible:
  2. Commençons par créer notre fonction Lambda. Connexion (https://console.aws.amazon.com/lambda/) et sélectionnez le bouton bleu «Créer une fonction Lambda»:
  3. Sous «Select blueprint», choisissez Blank Function, puis sélectionnez Alexa Skills Kit comme déclencheur de notre fonction Lambda. Si vous ne voyez pas «Alexa Skills Kit» dans la liste, vous n'êtes probablement pas dans la région «USA Est (Virginie du Nord)».


    Qu'est-ce qu'il se passe ici? Nous devons spécifier la façon dont notre fonction Lambda sera appelée et le kit de compétences Alexa permettra à Alexa de la lancer (une fois qu'elle aura reçu l'énoncé correct, que nous configurerons plus tard).
  4. Donnez à la fonction un nom comme «virtualWeather» et choisissez «Node.js 4.3» comme runtime. Pour les besoins de cet article, nous utiliserons la compétence que j'ai déjà créée ici alors allez-y et téléchargez-le maintenant. Si vous souhaitez consulter le code source sous-jacent, vous pouvez le trouver ici.
  5. Dans la liste déroulante Type d'entrée de code, choisissez «Télécharger un fichier .ZIP» et sélectionnez virtual-weather.zip que vous avez téléchargé à l'étape 4.
  6. Et ajoutez deux variables d'environnement - host et api_key:

    «Hôte» doit être égal à http://api.openweathermap.org pour l'instant. «Api_key» est la clé alphanumérique à 32 chiffres que vous recevrez d'OpenWeatherMap lorsque vous vous inscrivez en tant que développeur (voir la liste des conditions préalables ci-dessus pour savoir où faire cela).
  7. Sous «Gestionnaire de fonctions Lambda et rôle», sélectionnez «Créer un rôle personnalisé» dans la liste déroulante Rôle. Dans la nouvelle fenêtre qui apparaît, laissez tout par défaut et sélectionnez "Autoriser".
  8. De retour sur la page «Configurer la fonction», vous pouvez laisser les choix par défaut pour tout le reste et cliquer sur «Suivant». Sur la page Révision, choisissez «Créer une fonction» si tout semble bon.
  9. Une fois que vous avez créé la fonction, assurez-vous de copier l'identifiant ARN en haut à droite de la page. Nous en aurons besoin plus tard:
  10. Maintenant que notre fonction Lambda est en place, nous devons définir une compétence Alexa. Connectez-vous au portail Amazon Developer (http://developer.amazon.com) et sélectionnez l'onglet Alexa. Choisissez «Premiers pas avec Alexa Skills Kit:
  11. Cliquez sur "Ajouter une nouvelle compétence". Donnez-lui le nom et le nom d'invocation de "météo"

  12. Sous "Modèle d'interaction", publiez ce qui suit sous "Schéma d'intention":
    {"intents": [{"slots": [{"name": "Zip", "type": "AMAZON.Number"}], "intent": "GetWeatherForZipIntent"}]}
  13. Publiez ce qui suit sous Sample Utterances:GetWeatherForZipIntent quel temps fait-il pour le code postal {Zip}
    GetWeatherForZipIntent quel temps fait-il pour {Zip}
    GetWeatherForZipIntent quel temps fait-il à {Zip}Les deux dernières étapes précisent exactement comment notre utilisateur va interagir avec notre compétence. Nos exemples d'énoncés mappent l'entrée vocale de l'utilisateur aux intentions. Le type d'intention (GetWeatherForZipIntent, dans ce cas) et le code postal spécifié par l'utilisateur seront envoyés dans une requête à notre fonction Lambda.
  14. Sous Configuration, sélectionnez AWS Lambda ARN (Amazon Resource Name) et entrez votre ARN de fonction que vous avez copié précédemment:


Nous sommes prêts à le tester! Sous l'onglet Texte, saisissez un exemple d'énoncé tel que "quel temps fait-il à 91016" et cliquez sur "Demander la météo". Vous devriez voir la demande JSON envoyée à votre fonction Lambda et sa réponse:


Si votre Echo est connecté à ce compte et que vous avez activé cette compétence pour tester sur votre compte (vous pouvez le faire sur la page Test), vous pouvez également parler à Alexa pour tester cela. Dites quelque chose comme «Alexa, demande la météo, quel temps fait-il à 91016».

Et c'est tout pour la configuration d'Alexa! Ce n'était pas si mal, non?

Mais qu'en est-il du défi central de la complexité et des dépendances externes soulevé au début de cet article?

Notre fonction Lambda repose sur une API externe qui fournit des données en temps réel et du monde réel. En tant que développeur ou testeur d'un appareil IoT, comment nous assurer que nous recevons les données en aval dont nous avons besoin pour tester différentes conditions?

Par exemple, jetons un coup d'œil à une partie de notre compétence Alexa, weather.js:


Nous avons ici une logique simple qui ajoute des phrases appropriées à la météo en fonction de notre description météorologique. Par exemple, "Prenez un parapluie!" à la réponse de notre Alexa chaque fois que la pluie est mentionnée dans le champ de description de notre réponse JSON.

Alors, comment allons-nous tester cela exactement? À moins que vous n'ayez une danse de pluie fiable prête ou que vous viviez à Seattle, cela ne sera pas facile. Ajoutez l'automatisation des tests (pour laquelle nous aurions besoin de données cohérentes et répétables de l'API OpenWeather, ce qui est peu probable) dans le mélange et nous avons un problème très délicat.

La réponse simple est clairement la virtualisation des services. Cela nous permettra de simuler l'API Météo et de tester différentes circonstances. Parasoft dispose d'une plateforme de virtualisation de services gratuite (la plateforme de test continu) disponible pour un essai gratuit de 30 jours dans Azure.

Partie 2: Utilisation de la virtualisation des services pour effectuer des tests de cas de bord sur notre compétence Alexa

  1. Connectez-vous à votre Portail Azureet sélectionnez «Nouveau» pour accéder à la place de marché:

  2. Sur la place de marché, recherchez «Parasoft» et sélectionnez «Service Virtualization On-Demand». Vous pouvez sélectionner l'option «BYOL» si vous avez précédemment reçu une licence spéciale de Parasoft. Cliquez sur Créer.
  3. Fournissez un nom pour la machine virtuelle, puis entrez un nom d'utilisateur et un mot de passe. Vous pouvez choisir de créer un nouveau groupe de ressources pour la machine virtuelle ou de l'ajouter à une machine virtuelle existante. Toutes les autres options peuvent être laissées aux valeurs par défaut. Cliquez sur OK.
  4. Sélectionnez une taille de machine virtuelle (recommandée est DS2_V2 ou supérieure). Cliquez sur OK.
  5. Sous «Paramètres», vous pouvez modifier d'autres configurations si vous le souhaitez. Il est recommandé de ne pas modifier la configuration par défaut, sauf si vous avez une raison spécifique de le faire. Cliquez sur OK.
  6. Cliquez sur OK dans la vue Résumé.
  7. Cliquez sur Acheter dans la vue Acheter. Une fois votre essai gratuit terminé (les 30 premiers jours), vous serez facturé. Le processus de création de machine virtuelle prendra plusieurs minutes.
  8. Une fois que l'état de la VM est «En cours d'exécution», sélectionnez la VM et copiez son adresse IP publique.
  9. Allez sur http: // dans votre navigateur. Le menu principal de la plateforme de test continu apparaît. Une fois que le widget «Pourcentage en ligne» affiche «100%», la machine virtuelle est entièrement configurée et initialisée:
  10. En haut, cliquez sur "Ajouter un système":


  11. Sélectionnez «Importer un système à partir d'un fichier», puis accédez à AlexaWeatherSystem.zip (téléchargez-le ici). Sélectionnez «AzureVirtServer» comme serveur cible, puis cliquez sur «Importer»:Nous avons maintenant importé le système AlexaWeatherSkill, les services virtuels et les données associées.
  12. Terminons en plaçant notre point de terminaison proxy entre notre fonction Lambda et l'API OpenWeatherMap. Le proxy est déployé sur http:// :9080/proxyAllez dans votre fonction virtualWeather dans AWS Lambda (https://console.aws.amazon.com/lambda/) et remplacez la variable d'environnement que nous avons créée par le point de terminaison du proxy:
  13. Dans notre environnement (http: // / em / ui / environnements / 1), nous pouvons maintenant contrôler les données renvoyées à notre fonction Lambda pour tester différentes conditions. Cela changera le comportement de notre Alexa à la demande! Sélectionnez T-Storm dans le menu déroulant sous le composant API OpenWeatherMap et sélectionnez le bouton «Provision»:
    Le trafic est maintenant dirigé vers notre service virtuel «T-Storm» et une réponse (indiquant la pluie et les orages) est renvoyée. Dites quelque chose comme «Alexa, demandez à virtualWeather quel temps il fait à 91016» et vous entendrez en réponse «Prenez un parapluie! Orage et fortes pluies à Monrovia. »

 

Nous avons maintenant le pouvoir de contrôler la météo!

Prochaines étapes:

Alors, où aller à partir d'ici? Voici quelques prochaines étapes potentielles:

  • Si vous souhaitez modifier les réponses virtuelles existantes (ou créer les vôtres), consultez: http: // / em / virtualassets / gérer
  • Actuellement, les réponses virtuelles indiqueront la météo dans «Ville de test» et non le nom de la ville associé au code postal que vous avez spécifié. Vous pouvez potentiellement améliorer les services virtuels pour effectuer une recherche par code postal afin de fournir le nom de ville correct dans la réponse virtuelle.
  • Vous pouvez modifier mon code de fonction Lambda et le créer / le déployer sur AWS Lambda. Vous pourriez peut-être modifier la réponse Alexa pour inclure plus de données météorologiques renvoyées par l'API. Vous pouvez trouver le repo ici: https://github.com/sdebrosse/virtualize-weather
  • Une fois que vous l'avez cloné sur votre machine Linux (vous ne pourrez le construire que sur un environnement Linux), vous aurez besoin de l'AWS CLI configuré et de npm / nodejs installé. À partir du dossier du référentiel, vous pouvez exécuter «npm run deploy» pour déployer les modifications dans Lambda.

Je recommande également vivement l'article de Brian Donohue ici à propos de la création de votre première compétence Alexa. Je recommande également l'article de Ryan Ray ici. J'ai adapté le code de leurs deux didacticiels pour la fonction Lambda que nous avons utilisée dans cet article.

TL; DR?

Mon collègue Andrey a récemment configuré son Alexa en utilisant ces instructions pour un entretien technique, et a enregistré les résultats finaux. Regardez ci-dessous pour voir ce qui se passe après avoir suivi les étapes que j'ai décrites dans cet article:

Écrit par

Spencer Debrosse

Recevez les dernières nouvelles et ressources sur les tests de logiciels dans votre boîte de réception.