Python-Mock, um AWS IoT Device Shadow auszuprobieren

Einführung

Ich denke, einer der Gründe für die Verwendung von AWS IoT ist, dass Sie Thing / Device by Thing Shadow steuern können. Auf der anderen Seite denken viele Leute, obwohl ich die Gliederung verstanden habe, dass es nicht möglich ist, die Operation zu überprüfen, weil es keine "Sache" gibt. Sie können dies unter Linux mithilfe des Geräte-SDK überprüfen. Lassen Sie uns hier den Betrieb von Thing Shadow mit EC2 als virtuellem Gerät überprüfen.

[Zusatz] Ich wurde nach der Bedeutung von Shadow gefragt, daher füge ich ein wenig hinzu. Wenn Sie ein Gerät wie dieses Beispiel verwalten, ist es nicht schwierig, es manuell zu organisieren. Im Fall von IoT ist es jedoch erforderlich, eine große Anzahl von Sensoren und Gateways zu verwalten. Auch ist es nicht immer nah. Ich denke, der Wert von Shadow ist, dass Sie die Einstellungen vieler / entfernter Geräte über die Cloud verwalten / ändern können.

Vorbereitung

AWS IoT

Dinge erschaffen

Wählen Sie die Registrierung und wählen Sie die Dinge aus. Wenn der Bereich "Dinge" angezeigt wird, klicken Sie oben auf dem Bildschirm auf "Erstellen". スクリーンショット 2017-02-07 23.08.11.png

Um eine Sache zu erstellen, legen Sie einen beliebigen Namen fest und drücken Sie auf Erstellen. Hier ist der Name _ ** Schattentest ** _.

Wählen Sie nach dem Erstellen von Thing auf dem Bildschirm Zertifikat aus. Klicken Sie auf dem angezeigten Bildschirm auf Zertifikat erstellen. スクリーンショット 2017-02-07 23.11.03.png

Bitte laden Sie die drei erstellten Zertifikate herunter. (cert.pem / public.key / private.key) Drücken Sie außerdem ** Aktiv **, das am unteren Bildschirmrand angezeigt wird, um das Zertifikat zu aktivieren.

Endpunkt bestätigen

Drücken Sie in der AWS IoT-Konsole unten links auf dem Bildschirm auf Einstellungen, überprüfen Sie den Endpunkt auf dem angezeigten Bildschirm, kopieren Sie ihn in Text usw. Für jede Region gibt es einen Endpunkt. {random}.iot.{region}.amazon.com Es wird in Form von angezeigt.

EC2

Starten Sie EC2

Booten Sie Amazon Linux mit EC2. t2.micro ist genug. Wenn Sie nicht wissen, wie Sie EC2 starten sollen, lesen Sie bitte hier. Standardmäßig ist auch die Festplattengröße ausreichend. Vergessen Sie nicht, Global IP für die Anmeldung bei SSH einzurichten.

Installieren Sie das IoT Device SDK auf EC2

Da Mock mit Python SDK erstellt wird, installieren Sie Python SDK. Geben Sie den folgenden Befehl über die EC2-Konsole aus

pip install AWSIoTPythonSDK

Installation des Dummy-Programms (Mock)

Wie benötigt

Platz In diesem Beitrag gehe ich davon aus, dass Sie unter / tmp arbeiten werden.

mkdir /tmp/dummy-shadow
cd /tmp/dummy-shadow
mkdir certs
cd certs

Zertifikateinstellungen

Holen Sie sich rootCA (unter Zertifikaten platziert) Erhalten von VeriSign hier

curl https://www.symantec.com/content/en/us/enterprise/veisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -o /tmp/root.pem

Platzieren Sie außerdem das zuvor in AWS IoT erstellte private / cert-Zertifikat in diesem Zertifikatsverzeichnis. Sie können auch mit scp / vi kopieren und einfügen. Der Dateiname lautet cert => cert.pem private => private.pem Bitte. Versuchen Sie, das folgende Ergebnis zu erhalten.

ls -1 /tmp/certs
cert.pem
private.pem
root.pem

Installation von Dummy (Mock)

Platzieren Sie die folgenden Dateien in / tmp / dummy-shadow. Bitte stellen Sie YOUR_AWSIOT_DOMAIN entsprechend Ihrer Umgebung ein. Informationen zur Domänenüberprüfung finden Sie unter AWS IoT Console-Einstellungen => Benutzerdefinierter Endpunkt.

setup.json


{
   "AWSIoT": {
        "ENDPOINT":"YOUR_AWSIOT_DOMAIN",
        "CERT_PATH":"./certs/",
        "KEYS":["cert.pem", "public.pem", "root.pem"]
   },
   "DEVICE":{
        "NAME":"shadow-test",
   }
}

Unten ist das Dummy-Programm

dummy-shadow.py


import os
import sys
import json
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient


CONFIG_FILE = './setup.json'

#Feste Definition des Status beim Start der Anwendung(Variablen, die mit dem Schatten synchronisiert werden)
SIGNAL    = "green"
WAIT_TIME = 10

#Da Schatten aus der Rückruffunktion gelesen wird, wird er als global definiert.
shadow         = None
shadow_hundler = None

##########################################################
# setup.Lesen Sie die Einstellungen von json
##########################################################
def readConfig():
    print 'start readConfig func'

    try:
        # read config file
        f = open(CONFIG_FILE, "r")
        jsonData = json.load(f)
        f.close()

        list = {}
        list["ENDPOINT"]    = jsonData["AWSIoT"]["ENDPOINT"]
        list["CERT_PATH"]   = jsonData["AWSIoT"]["CERT_PATH"]
        list["DEVICE_NAME"] = jsonData["DEVICE"]["NAME"]
        
        return list

    except Exception as e:
        print 'Config load error'
        print e.message
        sys.exit()

##########################################################
#Ausgabe des Shadow Update-Befehls
##########################################################
def updateThing(report):
    try: 
        report_json = '{"state":{"reported":'+ report + '}}'
        print "send currnet status to cloud-shadow"
        print report_json
        shadow_hundler.shadowUpdate(report_json, None, 5)
        
        return
    
    except Exception as e:
        print e.message
        sys.exit()
        
##########################################################
#Wird als Rückruftyp von shadowRegisterDeltaCallback aufgerufen
#
##########################################################
def getDelta(payload, responseStatus, token):
    try:
        print '======get Delta======'
        dict_delta = json.loads(payload)
        print dict_delta
        state = dict_delta["state"]
        
        if state.has_key("wait_time"):
            delta = int(state["wait_time"])
            global WAIT_TIME
            WAIT_TIME = delta
            print "wait time change :%s" % WAIT_TIME
        if state.has_key('signal'):
            global SIGNAL
            SIGNAL = state['signal']
            print "SIGNAL change :%s" % SIGNAL

        report = json.dumps(dict_delta["state"])
        updateThing(report)
        
        return

    except Exception as e:
        print "Error on Delta function"
        print e.message
        raise

################################################
#Prozedurale Funktion der Schattenverbindung
################################################
def initShadow(Config):
    ##--need device cert / private / rootCA--
    # rootCA: get from symantec
    ROOT_KEY    = Config['CERT_PATH'] + 'root.pem'
    CERT_KEY    = Config['CERT_PATH'] + 'cert.pem'
    PRIVATE_KEY = Config['CERT_PATH'] + 'private.pem'
    
    try:
        # init shadow connect procedure
        global shadow
        shadow = AWSIoTMQTTShadowClient(Config["DEVICE_NAME"])
        shadow.configureEndpoint(Config["ENDPOINT"], 8883)    # Setting URL-ENDPOINT & Port
        shadow.configureCredentials(ROOT_KEY, PRIVATE_KEY, CERT_KEY ) # Cert file setting
        shadow.configureConnectDisconnectTimeout(10)# CONNACK wait time (sec)
        shadow.configureMQTTOperationTimeout(5)     # QoS1 publish (sec)
        print 'start connct shadow'
        shadow.connect()
        print 'shadow connect'
        
        return
    
    except Exception as e:
        print 'Error on Init Shadow'
        raise
        
####
if __name__ == '__main__':
    Config = readConfig()
    
    try:
        initShadow(Config)
        print 'satrt subscribe shadow'
        shadow_hundler = shadow.createShadowHandlerWithName(Config['DEVICE_NAME'], True)
        shadow_hundler.shadowRegisterDeltaCallback(getDelta)
        default_state = '{"wait_time":' + str(WAIT_TIME) + ', "signal":"green"}'
        updateThing(default_state)

        while True:
            time.sleep(WAIT_TIME)
            print 'Currnet WAIT_TIME=%s' % str(WAIT_TIME)
            pass

    except KeyboardInterrupt:
         print 'Keyboard Interrupt'
         sys.exit()

    except Exception as e:
        print e.message
        sys.exit()

Ausführungsmethode

python PROGRAM.py &

Beginnt im Hintergrund mit.

shadow update

Führen Sie eine Schattenaktualisierung auf der Konsole oder der CLI durch. Wählen Sie Widerstand => Sache => [Sache Name] => Schatten.

Fügen Sie einen gewünschten Abschnitt wie unten gezeigt hinzu und registrieren Sie sich mit wait_time: 30, Signal: "grün". Dann, als Delta, wait_time: 30, das heißt, nur der Unterschied wird als Delta gemeldet.

スクリーンショット 2017-02-19 22.20.44.png

Wenn Sie sich die Konsole auf der Programmseite ansehen, sollten Sie das Delta und die Sohle sehen. Wie Sie dem Code entnehmen können, habe ich die Variable wait_time geändert und [state] zurückgesendet. Da der Zustand, der als Ergebnis Konsistenz sein sollte, im Zustand Delta geschrieben wird, ist es nicht erforderlich, JSON einzeln zu erstellen, indem dies nur gemeldet wird, wenn __korrekter Zustandsübergang __ durchgeführt wird. Wie oben erwähnt, beachten Sie bitte, dass wenn Sie in einem Zustand melden, in dem der Zustand nicht korrekt geändert werden kann, er falsch ausgerichtet ist.

Wenn dieser Bericht gesendet wird, sollte das Delta weg sein und gewünscht / gemeldet sollte den gleichen Wert haben.

Grobe Reihenfolge

Die grobe Reihenfolge ist unten gezeigt.

スクリーンショット 2017-02-19 22.38.16.png

Als Programmstatus beim Programmstart fest codiert SIGNAL = "green" WAIT_TIME = 10 Wird benachrichtigt. Wenn der Schattenzustand mehrmals geändert wird, werden die obigen Anfangsparameter sofort nach dem Start des Programms benachrichtigt, und Delta wird sofort empfangen.

Haftungsausschluss

Dieser Beitrag ist eine individuelle Meinung und bezieht sich nicht auf das Unternehmen oder die Organisation, zu der er gehört. Darüber hinaus übernehmen wir keine Garantie für den Betrieb des veröffentlichten Beispielprogramms. Verwenden Sie es daher nur als Referenz.

Recommended Posts

Python-Mock, um AWS IoT Device Shadow auszuprobieren
Versuchen Sie, Python selbst zu verstehen
Skript zum einfachen Erstellen einer Clientgeräteumgebung für AWS IoT (Python v2-Version)
Führen Sie das AWS IoT Device SDK für Python auf Raspberry Pi aus
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Versuchen Sie, Facebook mit Python zu betreiben
Versuchen Sie, Trace in Python zu berechnen
Versuchen Sie, die cloudmonkey-CLI in python3 -1 zu konvertieren
[AWS SAM] Einführung in die Python-Version
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Versuchen Sie, sich mit Python bei qiita anzumelden
Versuchen Sie Python
Ich möchte mit aws mit Python spielen
Versuchen Sie, Excel mit Python (Xlwings) zu betreiben.
Python Amateur versucht die Liste zusammenzufassen ①
AWS IoT Device Alive Monitoring
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Erste Schritte zum Testen von Google CloudVision in Python
Versuchen Sie, Oni Mai Tsuji Miserable mit Python zu implementieren
Versuchen Sie, Metriken über Python DogStatsD an datadog zu senden
Berechnen wir das statistische Problem mit Python
3,14 π Tag, versuchen Sie also, in Python auszugeben
Versuchen Sie automatisch, Enum in Python 3.6 automatisch zu bewerten
[Version 2020] So installieren Sie Python3 auf EC2 von AWS
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
So legen Sie Attribute mit Mock of Python fest
Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[AWS / Lambda] Laden einer externen Python-Bibliothek
Erste Schritte mit AWS IoT in Python
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Versuchen Sie, Fische mit Python + OpenCV2.4 (unvollendet) zu erkennen.
Auf Python 2.7.9 aktualisiert
Python> try: / außer:
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
"Backport" zu Python 2
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Python-Anfänger versucht, dem Administrator von Django eine grundlegende Authentifizierung hinzuzufügen
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
Flottenbereitstellung mit AWS IoT SDK für Python v2
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Setzen Sie die Schlüsselwortargumente des Konstruktors auf die Scheinattribute in Python
termux × AWS Senden Sie mit IoT Standortinformationen für Smartphones an AWS
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte Lambda mit Python auf Mac AWS!
Versuchen Sie, hochfrequente Wörter mit NLTK (Python) zu extrahieren.
Raspberry Pi + Python + IoT-Gerät, Umgebungskonstruktionsverfahren zum Starten der Bildverarbeitung und des maschinellen Lernens