Der Wert der Simulation für das Internet der Dinge: Alexa mit Service-Virtualisierung hacken
Von Spencer Debrosse
28. April 2017
9 min lesen
Wenn Sie wie ich sind, stellen Sie sich ständig die futuristischen Möglichkeiten vollständig realisierter IoT-Ökosysteme vor. Im Kontext des Hauses stelle ich mir vor, wie mein Auto, GPS und Nest zusammenarbeiten, um meine Ankunft zu antizipieren und die Klimaregelung richtig anzupassen. Oder Kühlschränke, Eierpflegerund Amazon Fresh sprechen mühelos miteinander, um Eier zu bestellen, bevor ich überhaupt weiß, dass ich sie brauche ... Was für eine Zukunft.
In anderen Fällen bin ich davon überzeugt, dass das Internet der Dinge eine dystopische Zukunft bringen wird (wie in ernüchternden Details von beschrieben Verdrahtet).
Wir sind glücklicherweise einige Wege von dieser Ebene der Verbindung entfernt. Die IoT-Entwicklung steckt noch in den Kinderschuhen und es gibt einige wichtige Herausforderungen, die IoT-Entwickler bewältigen müssen.
Es scheint Konsens darüber zu bestehen, dass die Komplexität der Umwelt eine große Herausforderung darstellt, und diese Herausforderung ist schwierig zu bewältigen, da Komplexität in der Welt des IoT eine wichtige Rolle spielt. Als Entwickler eines IoT-Geräts kann ich mich in viele nachgeschaltete APIs von Drittanbietern integrieren , während andere Entwickler möglicherweise meine exponierten APIs verwenden.
Vor den gestiegenen Anforderungen des IoT haben wir unser Gerät möglicherweise in einem Ökosystem von APIs und Geräten getestet, indem wir physische Testlabors erstellt haben. Dies ist eine veraltete und teure Angelegenheit, und ein Entwickler kann die Daten, die von APIs oder Geräten von Drittanbietern stammen, häufig nicht kontrollieren (dies ist für Edge-Case-Tests von entscheidender Bedeutung).
Aus diesem Grund ist die Servicevirtualisierung ein wichtiger Bestandteil der Lösung. Wir können nachgeschaltete APIs simulieren und die Daten steuern, die unser Gerät verbraucht, um ungewöhnliche Situationen während des Integrationstests zu validieren.
Das heutige Beispiel für Service-Virtualisierung
In diesem Beitrag werde ich das Amazon Echo verwenden, um diese Funktionen zu demonstrieren, da es ein zentraler Knotenpunkt des IoT-Ökosystems für zu Hause sein kann (vielleicht haben Sie sogar einen zur Verfügung, wie ich es tue).
Ich werde Sie zunächst durch die Schritte zur Implementierung Ihrer eigenen Alexa-Fähigkeit mit AWS Lambda führen. Mit diesem Anruf können Sie Alexa nach den Wetterbedingungen für eine Postleitzahl fragen.
Anschließend stellen wir virtuelle Parasoft-Dienste in Azure bereit, um Antworten von der Wetter-API für Edge-Case-Tests zu simulieren. (Was wird Alexa zum Beispiel sagen, wenn es ein Gewitter gibt oder wenn es draußen 101 F ist?)
Voraussetzungen, um sich selbst zu folgen:
- Eine Internetverbindung (na klar)
- Ihr eigenes Amazon Echo oder Echo Dot würde die Erfahrung verbessern, aber Sie können auch einen Simulator verwenden.
- Ein Amazon Developer-Konto (https://developer.amazon.com/) und Amazon Web Services Account (https://aws.amazon.com/).
- Melden Sie sich als Entwickler bei an https://openweathermap.org/api um einen API-Schlüssel für die Open Weather API zu erhalten.
- Ein Microsoft-Konto (https://signup.live.com), um auf Microsoft Azure zuzugreifen.
- Grundlegendes Verständnis von REST-APIs und JSON.
Wie wird das funktionieren?
In Teil 1 werden wir unsere Alexa Skill- und Lambda-Funktion einrichten.
- Der Benutzer sagt etwas zu Alexa (die Eingabe des Benutzers wird als "Äußerung" bezeichnet).
- Unsere Alexa-Fähigkeit wird diese „Äußerung“ einer „Absicht“ zuordnen.
- Unsere Alexa-Fähigkeit sendet eine JSON-Anfrage an unsere Funktion in AWS Lambda. Lambda ist ein leistungsstarker Dienst von Amazon, mit dem Sie Code hochladen und bei Bedarf in der Cloud ausführen können. Ihnen wird nur die Zeit in Rechnung gestellt, zu der es ausgeführt wird. In diesem Beispiel entscheidet die Lambda-Funktion, was mit unserer Absichtsanforderung geschehen soll, und verfügt über die Logik, im Auftrag von Alexa eine Antwortnachricht für den Benutzer zu erstellen.
- Um die Antwort zu erstellen, muss unsere Lambda-Funktion die Open-Weather-API aufrufen, um die aktuellen Wetterinformationen abzurufen.
In Teil 2 stellen wir einen virtuellen Parasoft-Server in Azure bereit. Anschließend platzieren wir einen Parasoft-Proxy zwischen unserer Lambda-Funktion und der OpenWeatherMap-API. Mit diesem Proxy können wir Wetteranforderungen von AWS Lambda steuern, die an die reale OpenWeatherMap-API oder eine virtuelle Darstellung mit vordefinierten Antworten weitergeleitet werden.
Teil 1: Einrichten unserer Alexa Skill- und Lambda-Funktion
- Zunächst müssen wir in unserer Amazon Web Services Console sicherstellen, dass wir uns in der Region „US East (N. Virginia)“ befinden (https://console.aws.amazon.com). Derzeit ist dies die einzige Region, in der Lambda verfügbar ist:
- Beginnen wir mit der Erstellung unserer Lambda-Funktion. Anmeldung (https://console.aws.amazon.com/lambda/) und wählen Sie die blaue Schaltfläche „Create a Lambda Function“: Erstellen Sie eine Lambda-Funktion:
- Wählen Sie unter „Blaupause auswählen“ die Option „Leere Funktion“ und anschließend das Alexa Skills Kit als Auslöser für unsere Lambda-Funktion. Wenn Sie "Alexa Skills Kit" nicht in der Liste sehen, befinden Sie sich wahrscheinlich nicht in der Region "US East (N. Virginia)".
Was passiert hier? Wir müssen angeben, wie unsere Lambda-Funktion aufgerufen wird, und das Alexa Skills Kit ermöglicht es Alexa, sie zu starten (sobald sie die richtige Äußerung erhalten hat, die wir später konfigurieren werden). - Geben Sie der Funktion einen Namen wie "virtualWeather" und wählen Sie "Node.js 4.3" als Laufzeit. Für die Zwecke dieses Artikels verwenden wir die Fertigkeit, die ich bereits erstellt habe hier Laden Sie es jetzt herunter. Wenn Sie sich den zugrunde liegenden Quellcode ansehen möchten, finden Sie ihn hier .
- Wählen Sie in der Dropdown-Liste Code-Eintragstyp die Option „Hochladen einer ZIP-Datei“ und wählen Sie virtual-weather.zip aus, das Sie in Schritt 4 heruntergeladen haben.
- Fügen Sie zwei Umgebungsvariablen hinzu - host und api_key:
"Host" sollte gleich sein http://api.openweathermap.org zur Zeit. "Api_key" ist der 32-stellige alphanumerische Schlüssel, den Sie von OpenWeatherMap erhalten, wenn Sie sich als Entwickler anmelden (Informationen dazu finden Sie in der Liste der Voraussetzungen oben). - Wählen Sie unter "Lambda-Funktionshandler und -Rolle" in der Dropdown-Liste "Rolle" die Option "Benutzerdefinierte Rolle erstellen" aus. Übernehmen Sie im neuen Fenster alle Standardeinstellungen und wählen Sie "Zulassen".
- Zurück auf der Seite "Funktion konfigurieren" können Sie die Standardauswahl für alles andere beibehalten und auf "Weiter" klicken. Wählen Sie auf der Überprüfungsseite "Funktion erstellen", wenn alles gut aussieht.
- Stellen Sie nach dem Erstellen der Funktion sicher, dass Sie die ARN-ID oben rechts auf der Seite kopieren. Wir werden es später brauchen:
- Nachdem unsere Lambda-Funktion eingerichtet ist, müssen wir eine Alexa-Fähigkeit definieren. Melden Sie sich beim Amazon Developer Portal an (http://developer.amazon.com) und wählen Sie die Registerkarte Alexa. Wählen Sie „Erste Schritte mit dem Alexa Skills Kit:
- Klicken Sie auf "Neue Fähigkeit hinzufügen". Geben Sie den Namen und den Aufrufnamen von "Wetter"
- Veröffentlichen Sie unter "Interaktionsmodell" Folgendes unter "Absichtsschema":
{"Absichten": [{"Slots": [{"Name": "Zip", "Typ": "AMAZON.Number"}], "Absicht": "GetWeatherForZipIntent"}]}
- Posten Sie Folgendes unter Beispieläußerungen:GetWeatherForZipIntent was ist das Wetter für Postleitzahl {Zip}
GetWeatherForZipIntent wie ist das Wetter für {Zip}
GetWeatherForZipIntent wie ist das Wetter in {Zip}Die letzten beiden Schritte geben genau an, wie unser Benutzer mit unserem Skill interagieren wird. Unsere Beispieläußerungen ordnen die Spracheingabe des Benutzers Intents zu. Der Intent-Typ (in diesem Fall GetWeatherForZipIntent) und die vom Benutzer angegebene Postleitzahl werden in einer Anfrage an unsere Lambda-Funktion gesendet. - Wählen Sie unter Konfiguration die Option AWS Lambda ARN (Amazon Resource Name) aus und geben Sie Ihre zuvor kopierte Funktions-ARN ein:
Wenn Ihr Echo mit diesem Konto verbunden ist und Sie diese Fähigkeit zum Testen in Ihrem Konto aktiviert haben (dies können Sie auf der Testseite tun), können Sie mit Alexa sprechen, um dies ebenfalls zu testen. Sagen Sie etwas wie "Alexa, fragen Sie das Wetter, wie ist das Wetter in 91016".
Und das wars für das Alexa-Setup! Das war doch nicht so schlimm, oder?
Aber was ist mit der zentralen Herausforderung der Komplexität und der externen Abhängigkeiten, die zu Beginn dieses Artikels aufgeworfen wurden?
Unsere Lambda-Funktion basiert auf einer externen API, die Echtzeitdaten liefert. Wie stellen wir als Entwickler oder Tester eines IoT-Geräts sicher, dass wir die nachgelagerten Daten erhalten, die wir zum Testen verschiedener Bedingungen benötigen?
Schauen wir uns zum Beispiel einen Teil unserer Alexa-Fähigkeit an: weather.js:
Wir haben hier eine einfache Logik, die wettergerechte Sätze basierend auf unserer Wetterbeschreibung hinzufügt. Zum Beispiel: "Schnapp dir einen Regenschirm!" auf die Antwort unserer Alexa, wenn im Beschreibungsfeld unserer JSON-Antwort Regen erwähnt wird.
Wie genau werden wir das testen? Solange Sie keinen zuverlässigen Regentanz bereithalten oder zufällig in Seattle leben, wird dies nicht einfach. Fügen Sie der Mischung Testautomatisierung hinzu (für die wir konsistente, wiederholbare Daten aus der OpenWeather-API benötigen würden, was unwahrscheinlich ist), und wir haben ein sehr kniffliges Problem.
Die einfache Antwort ist eindeutig die Service-Virtualisierung. Auf diese Weise können wir die Wetter-API simulieren und verschiedene Umstände testen. Parasoft verfügt über eine kostenlose Service-Virtualisierungsplattform (die Continuous Testing Platform), die für eine kostenlose 30-Tage-Testversion in Azure verfügbar ist.
Teil 2: Verwenden der Service-Virtualisierung zum Durchführen von Edge-Case-Tests mit unserer Alexa-Fähigkeit
- Einloggen, um Azure-Portalund wählen Sie "Neu", um auf den Marktplatz zuzugreifen:
- Suchen Sie auf dem Marktplatz nach "Parasoft" und wählen Sie "Service Virtualization On-Demand". Sie können die Option „BYOL“ auswählen, wenn Sie zuvor eine spezielle Lizenz von Parasoft erhalten haben. Klicken Sie auf Erstellen.
- Geben Sie einen Namen für die VM ein und geben Sie einen Benutzernamen und ein Kennwort ein. Sie können eine neue Ressourcengruppe für die VM erstellen oder einer vorhandenen VM hinzufügen. Alle anderen Optionen können auf den Standardeinstellungen belassen werden. OK klicken.
- Wählen Sie eine Größe der virtuellen Maschine aus (empfohlen ist DS2_V2 oder besser). OK klicken.
- Unter "Einstellungen" können Sie bei Bedarf andere Konfigurationen ändern. Es wird empfohlen, die Standardkonfiguration nur zu ändern, wenn Sie einen bestimmten Grund dafür haben. OK klicken.
- Klicken Sie in der Übersichtsansicht auf OK.
- Klicken Sie in der Ansicht Kaufen auf Kaufen. Nach Abschluss Ihrer kostenlosen Testversion (die ersten 30 Tage) werden Ihnen Gebühren berechnet. Der VM-Erstellungsprozess dauert einige Minuten.
- Sobald der Status der VM "Wird ausgeführt" lautet, wählen Sie die VM aus und kopieren Sie ihre öffentliche IP-Adresse.
- Gehen Sie zu http: // in Ihrem Browser. Das Hauptmenü der Continuous Testing Platform wird angezeigt. Sobald das Widget "Online Percentage" "100%" anzeigt, ist die virtuelle Maschine vollständig konfiguriert und initialisiert:
- Klicken Sie oben auf "System hinzufügen":
- Wählen Sie "System aus Datei importieren" und navigieren Sie zu AlexaWeatherSystem.zip (Laden Sie es herunter hier ). Wählen Sie "AzureVirtServer" als Zielserver aus und klicken Sie auf "Importieren":
Wir haben jetzt das AlexaWeatherSkill-System, virtuelle Dienste und zugehörige Daten importiert.
- Platzieren wir zum Abschluss unseren Proxy-Endpunkt zwischen unserer Lambda-Funktion und der OpenWeatherMap-API. Der Proxy wird unter http:// bereitgestellt. :9080/proxyGehen Sie in Ihre virtualWeather-Funktion in AWS Lambda (https://console.aws.amazon.com/lambda/) und ändern Sie die von uns erstellte Umgebungsvariable in den Proxy-Endpunkt:
- In unserer Umgebung (http: // / em / ui / environment / 1) können wir jetzt die Daten steuern, die an unsere Lambda-Funktion zurückgegeben werden, um verschiedene Bedingungen zu testen. Dies ändert das Verhalten unserer Alexa bei Bedarf! Wählen Sie T-Storm aus der Dropdown-Liste unter der OpenWeatherMap-API-Komponente aus und klicken Sie auf die Schaltfläche „Bereitstellung“:
Der Verkehr wird jetzt zu unserem virtuellen "T-Storm" -Dienst geleitet und eine Antwort (die auf Regen und Gewitter hinweist) wird zurückgegeben. Sagen Sie etwas wie "Alexa, fragen Sie virtualWeather, wie das Wetter in 91016 ist" und Sie hören als Antwort "Schnappen Sie sich einen Regenschirm!" Gewitter und starker Regen in Monrovia. “
Wir haben jetzt die Macht, das Wetter zu kontrollieren!
Nächste Schritte:
Also, wohin von hier aus? Hier sind einige mögliche nächste Schritte:
- Wenn Sie neugierig sind, die vorhandenen virtuellen Antworten zu ändern (oder eigene zu erstellen), schauen Sie unter: http: // / em / virtualassets / verwalten
- Derzeit wird in den virtuellen Antworten das Wetter in "Test City" und nicht der Name der Stadt angegeben, die der von Ihnen angegebenen Postleitzahl zugeordnet ist. Sie können die virtuellen Dienste möglicherweise so erweitern, dass eine Suche nach Postleitzahl durchgeführt wird, um den richtigen Städtenamen in der virtuellen Antwort anzugeben.
- Sie können meinen Lambda-Funktionscode ändern und auf AWS Lambda erstellen / bereitstellen. Möglicherweise können Sie die Alexa-Antwort so ändern, dass mehr Wetterdaten von der API zurückgegeben werden. Das Repo finden Sie hier: https://github.com/sdebrosse/virtualize-weather
- Sobald Sie es auf Ihren Linux-Computer geklont haben (Sie können es nur in einer Linux-Umgebung erstellen), müssen Sie AWS CLI konfiguriert und npm / nodejs installiert haben. Im Repo-Ordner können Sie "npm run deploy" ausführen, um Änderungen an Lambda bereitzustellen.
Ich würde auch Brian Donohues Artikel wärmstens empfehlen hier über das Erstellen Ihrer ersten Alexa-Fähigkeit. Ich empfehle auch den Artikel von Ryan Ray hier . Ich habe den Code aus beiden Tutorials für die Lambda-Funktion angepasst, die wir in diesem Artikel verwendet haben.
TL, DR?
Mein Kollege Andrey hat kürzlich seine Alexa anhand dieser Anweisungen für ein technisches Gespräch konfiguriert und die Endergebnisse aufgezeichnet. Sehen Sie unten, um zu sehen, was passiert, nachdem Sie die in diesem Beitrag beschriebenen Schritte ausgeführt haben: