[PYTHON] Senden und Empfangen von Daten mit MQTT über die Watson IoT Platform

Einführung

Die Watson IoT-Plattform (Internet of Things Platform, im Folgenden WIOTP) ist eine Plattform für IoT, die auf der IBM Cloud basiert. Es bietet verschiedene Funktionen wie das Sammeln, Sammeln und Visualisieren von Daten, die von Geräten wie Sensoren stammen. Das offizielle SDK zum Verbinden von Geräten und Anwendungen wird bereitgestellt, und Daten können über MQTT gesendet und empfangen werden. In diesem Artikel wird erklärt, wie das geht.

Watson IoT Platform-Konzept

Zunächst werde ich das Konzept der von WIOTP behandelten "Dinge" erläutern. WIOTP definiert die folgenden drei Arten von "Dingen", die verbunden werden sollen, und die Funktionen und Verbindungsmethoden, die implementiert werden können, unterscheiden sich jeweils.

--Anwendung --Gerät --Tor

Anwendung

Die Anwendung kann die meisten Funktionen der drei Dinge verwenden, das vom Gerät gesendete Ereignis empfangen und für den Dienst verwenden oder das Ereignis als Gerät selbst senden. Um es als Anwendung zu implementieren, muss im Voraus ein API-Schlüssel in der WIOTP-Konsole ausgegeben werden. Durch die Authentifizierung mit dem API-Schlüssel beim Herstellen einer Verbindung zu WIOTP kann die verbundene Anwendung von WIOTP identifiziert werden. Darüber hinaus definiert WIOTP den erwarteten Anwendungstyp, und Sie können die Funktionen einschränken, die verwendet werden können, indem Sie den Anwendungstyp für jeden API-Schlüssel auswählen.

Sie können die folgenden Funktionen in Ihrer Anwendung verwenden:

Gerät

Die Aufgabe des Geräts besteht darin, die vom Sensor usw. erhaltenen Umgebungsinformationen an WIOTP zu senden. Um es als Gerät zu implementieren, müssen Sie den Gerätetyp und die Geräte-ID in der WIOTP-Konsole im Voraus festlegen und die Geräte-ID so festlegen, dass sie für jedes Gerät eindeutig ist. Mit WIOTP können Sie anhand der Geräte-ID identifizieren, welches Gerät die Verbindungsanforderung oder Datenübertragung durchgeführt hat.

Die folgenden Funktionen sind auf Ihrem Gerät verfügbar:

Tor

Wenn mehrere Geräte desselben Typs und derselben Rolle vorhanden sind, besteht die Rolle des Gateways darin, Daten zwischen ihnen und WIOTP weiterzuleiten. Auf diese Weise kann WIOTP die von mehreren Geräten gesendeten Daten so behandeln, als ob sie von einem Gerät (Gateway) gesendet wurden, was die Verarbeitung der Daten erleichtert. Wie bei Geräten muss das Gateway den Gerätetyp und die Geräte-ID im Voraus auf der WIOTP-Konsole festlegen. Es wird als eines der Geräte in WIOTP behandelt.

Die folgenden Funktionen stehen auf dem Gateway zur Verfügung:

Beispiel erstellen

Wir werden das offizielle SDK tatsächlich verwenden, um eine Beispiel-App zu erstellen, die regelmäßig Ereignisse an WIOTP sendet und empfängt. Dieses Mal erstellen wir den Absender als Gerät und den Empfänger als Anwendung.

Annahme

Vorbereitungen

Geräteeinstellungen in WIOTP

Registrieren Sie das Gerät, das zur Implementierung des Geräts erforderlich ist.

--Öffnen Sie eine Instanz der Watson IoT Platform und öffnen Sie "Geräte" aus dem Menü auf der linken Seite des Bildschirms. ――Die Seite mit der Aufschrift "Nach Gerät suchen" wird angezeigt. Klicken Sie oben rechts auf die Schaltfläche "Gerät hinzufügen". image.png

--Stellen Sie einen beliebigen Wert für "Gerätetyp" und "Geräte-ID" ein und klicken Sie auf die Schaltfläche "Weiter". image.png

Ausgabe des API-Schlüssels in WIOTP

Geben Sie den API-Schlüssel aus, der zum Implementieren der Anwendung erforderlich ist. Weitere Informationen finden Sie unter "1. Ausgabe von API-Schlüsseln" im folgenden Artikel. https://qiita.com/Motonaga/items/6304f5f66f63cb566943

Absenderimplementierung

Implementieren Sie das sendende Gerät.

publish.py


import wiotp.sdk.application
import time
import json

##Betten Sie verschiedene Parameter für "Gerät", die in WIOTP festgelegt wurden, in Konfigurationsinformationen (Optionen) im JSON-Format ein.
org_id = "xxxx" #WIOTP-Organisations-ID
device_id = "sample_id" #"Geräte-ID" im Voraus eingestellt
device_type = "sample_type" #"Gerätetyp" im Voraus eingestellt
token = "sample-token" #"Authentifizierungstoken" im Voraus festgelegt
event_id = "sample" #Die Kennung des zu sendenden Ereignisses. Es kann ein beliebiger Wert eingestellt werden. Stellen Sie den gleichen Wert wie auf der Empfangsseite ein

options = {
  "identity": {
    "orgId": org_id,
    "typeId": device_type,
    "deviceId": device_id
  },
  "auth": {
    "token": token
  }
}

#Stellen Sie mit dem SDK eine Verbindung zu WIOTP als "Gerät" her
client = wiotp.sdk.device.DeviceClient(options,  logHandlers=None)
client.connect()

#Alle 2 Sekunden{count}Wird erhöht und an WIOTP gesendet
myData = {'message': 'foo', 'count': 0}
while True:
  print("data published: ", json.dumps(myData))
  client.publishEvent(event_id, "json", myData)
  myData['count'] += 1
  time.sleep(2)

Implementierung des Empfängers

Implementieren Sie die empfangende Anwendung.

subscribe.py


import wiotp.sdk.application
import json
import time

app_id = "sample_app" #Anwendungskennung. Stellen Sie einen beliebigen Wert ein
app_auth_key = "xxxx" #API-Schlüssel der von WIOTP ausgegebenen Anwendung
app_auth_token = "xxxx" #Von WIOTP ausgestelltes Anwendungsauthentifizierungstoken

#Betten Sie verschiedene Parameter für "Anwendung", die in WIOTP festgelegt wurden, in Konfigurationsinformationen (Optionen) im JSON-Format ein.
options = {
  "identity": {
    "appId": app_id
  },
  "auth": {
    "key": app_auth_key,
    "token": app_auth_token
  }
}

#Stellen Sie mit dem SDK eine Verbindung zu WIOTP als "Anwendung" her
client = wiotp.sdk.application.ApplicationClient(options, logHandlers=None)
client.connect()

#Stellen Sie die Rückruffunktion ein, wenn ein Ereignis empfangen wird. Hier werden die empfangenen Ereignisinformationen in die Standardausgabe geschrieben.
def event_callback(event):
  #Der Hauptteil der empfangenen Daten ist ein Ereignis.Kann mit Daten erhalten werden
  print("{} event '{}' received from device [{}]: {}".format(event.format, event.eventId, event.device, json.dumps(event.data)))
client.deviceEventCallback = event_callback

#Stellen Sie die Parameter des zu abonnierenden Geräts ein (dieselben wie der Absender) und starten Sie Abonnieren
device_id = "sample_id" #"Geräte-ID" im Voraus eingestellt
device_type = "sample_type" #"Gerätetyp" im Voraus eingestellt
event_id = "sample" #Die Kennung des zu empfangenden Ereignisses. Es kann ein beliebiger Wert eingestellt werden. Machen Sie den gleichen Wert wie der Absender

client.subscribeToDeviceEvents(typeId=device_type, deviceId=device_id, eventId=event_id)

#Führen Sie eine Schleife aus, um die App am Laufen zu halten
while True: 
  time.sleep(3)

Ausführungsergebnis

Wenn Sie sowohl den Sender als auch den Empfänger ausführen, erhalten Sie die folgenden Ergebnisse und können bestätigen, dass die Daten wie erwartet über MQTT gesendet und empfangen werden können.

WIOTP-Gerätekonsole (zeigt den Inhalt der gesendeten Ereignisse an)

image.png

Empfangskonsole

$ python subscribe.py 
2019-12-23 15:41:58,308   wiotp.sdk.application.client.ApplicationClient  INFO    Connected successfully: a:a54k3u:sample_app
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 0}
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 1}
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 2}
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 3}
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 4}
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 5}
json event 'sample' received from device [sample_type:sample_id]: {"message": "foo", "count": 6}

Zusammenfassung

In diesem Artikel habe ich das Konzept der "Dinge" erklärt, die eine Verbindung zur Watson IoT Platform herstellen, und erklärt, wie eine Verbindung mit dem offiziellen SDK hergestellt wird. In Bezug auf die Verbindungsmethode habe ich den Absender als Gerät und den Empfänger als Anwendung erstellt, aber wenn ich ihn im eigentlichen Bereich verwende, denke ich, dass es viele Implementierungen geben wird, bei denen mehrere Geräte vom Gateway weitergeleitet werden.

Referenzmaterial

Recommended Posts

Senden und Empfangen von Daten mit MQTT über die Watson IoT Platform
Senden und Empfangen von Binärdaten über serielle Kommunikation mit Python3 (auf Mac)
Senden und Empfangen von Bilddaten als JSON in Python über das Netzwerk
Starten Sie die Kommunikation mit UDP und senden und empfangen Sie mit TCP
Senden und empfangen Sie Google Mail über die Google Mail-API mit Python
Senden und Empfangen von Kolbenbildern
Lassen Sie uns den Watson IoT Platform Data Store Connector etwas mehr verwenden
[aws] Senden und Empfangen von SQL-Nachrichten
Senden Sie E-Mails über Google Mail mit Python 3.4.3.
Greifen Sie mit Python auf die Web-API zu, um IoT-Daten zu registrieren / zu erfassen (dweet.io, Requests, HTTPie).
Datenpipeline-Aufbau mit Python und Luigi
POST verschieden mit Python und empfange mit Flask
Senden Sie Daten mit Vue.js an die DRF-API
Senden Sie Dateien über Step Server mit scp