Der von Watson IoT Platform bereitgestellte Data Store Connector (DSC) ist insofern hervorragend, als er automatisch Informationen von IoT-Geräten in einer externen Datenbank sammeln kann.
Es kann einfach mithilfe des Application SDK und des von IBM bereitgestellten Beispielcodes eingestellt werden. Es besteht jedoch das Gefühl, dass im praktischen Betrieb ein wenig Informationen fehlen, sodass ich die Ergebnisse meiner eigenen Forschung zusammenfassen werde.
Python 3.7 wiotp-sdk 0.11.0 (kann mit pip3 installiert werden)
Dieses Mal wird Cloudant als Verbindungsziel von DSC verwendet, und es wird davon ausgegangen, dass die folgenden Arbeiten abgeschlossen wurden. --Erstellen Sie ein IBM Cloud-Konto
Es gibt viele detaillierte Schriften zur Arbeitsweise, daher werde ich sie hier weglassen. Es gibt viele in Qiita, also lasst uns suchen.
Generieren Sie als Nächstes einen Authentifizierungsschlüssel und ein Token für die Watson IoT Platform. Dies wird zur Authentifizierung verwendet, wenn der auszuführende Code wiotp-sdk verwendet, um die von Watson IoT Platform bereitgestellte API aufzurufen.
Weitere Informationen finden Sie weiter unten. https://developer.ibm.com/jp/tutorials/iot-generate-apikey-apitoken/
Insbesondere werden Token nur angezeigt, wenn sie generiert werden. Notieren Sie sich daher die auf dem Bildschirm gedruckte Zeichenfolge.
Führen Sie die folgenden Schritte aus, um Ihren Benutzernamen und Ihr Kennwort in Ihren Cloudant-Dienstanmeldeinformationen zu überprüfen. https://cloud.ibm.com/docs/Cloudant?topic=Cloudant-creating-an-ibm-cloudant-instance-on-ibm-cloud&locale=ja#locating-your-service-credentials
Hinweis) Es scheint, dass es heutzutage zwei Arten von Cloudant-Authentifizierungsmethoden bietet, aber der in diesem Artikel behandelte Code muss ausgewählt werden, wenn beim Bereitstellen (Erstellen) des Dienstes "Legacy-Anmeldeinformationen und IAM verwenden" ausgewählt ist. Die Ausführung funktioniert nicht.
Der hier bestätigte Benutzername und das Kennwort werden über die Dienstbindung des Anwendungs-SDK an die Watson IoT-Plattform übergeben und zur Authentifizierung verwendet, wenn die Watson IoT-Plattform Daten in Cloudant schreibt.
Der folgende Link enthält Beispielcode zum Einrichten eines DSC für die Verbindung mit Cloudant.
https://www.ibm.com/support/knowledgecenter/SSQP8H/iot/platform/reference/dsc/cloudant.html
Schreiben Sie den Benutzernamen und das Passwort in serviceBinding auf die in 2.3 bestätigten und führen Sie sie aus.
# export WIOTP_AUTH_KEY='kkkkkkkkkkk'
# export WIOTP_AUTH_TOKEN='tttttttttttttttt'
# python sample.py
Im obigen Ausführungsbeispiel wird der Beispielcode (sample.py) unter Verwendung des in 2.2 generierten Authentifizierungsschlüssels und Tokens ausgeführt. Setzen Sie den Authentifizierungsschlüssel und das Token auf WIOTP_AUTH_KEY bzw. WIOTP_AUTH_TOKEN, bevor Sie den Beispielcode ausführen.
Durch Ausführen des Beispielcodes wie in 2.4 werden alle an Watson IoT Platform gemeldeten Ereignisse in der Datenbank in Cloudant gespeichert.
Wenn Sie den Inhalt des Beispielcodes hier etwas genauer lesen,
Sie können sehen, dass einige DSCs die erforderlichen Objekte aus nichts anderem erstellen.
Es wird Sie vom Zustand zu dem Punkt bringen, an dem es vorerst funktioniert, aber es scheint, dass Sie eine Prozedur benötigen, um die aktuelle Konfiguration zu überprüfen oder zu ändern, um sie unter der Voraussetzung des tatsächlichen Betriebs zu beherrschen.
Im Folgenden werde ich einige Schritte ausprobieren, die das Minimum zu sein scheinen, um DSC vorerst zu beherrschen.
Für den Betrieb ist es wichtig, die aktuellen Einstellungen zu verstehen. Ich habe ein Programm geschrieben, um eine Liste von Service-Bindungen und DSCs anzuzeigen.
ApplicationClient.ServiceBindings, ApplicationClient.dsc usw. werden vom Iterator wiederholt, aber seien Sie vorsichtig, da sich die Benutzerfreundlichkeit von der normalen Liste unterscheidet. Wenn ich beispielsweise versuche zu überprüfen, wie viele mit len () gespeichert sind, wird 0 zurückgegeben.
ls_dsc.py
import wiotp.sdk.application
options = wiotp.sdk.application.parseEnvVars()
appClient = wiotp.sdk.application.ApplicationClient(options)
print("Service Bindings")
for s in appClient.serviceBindings:
print("ID: " + s.id)
print("")
print("DSC")
for c in appClient.dsc:
print("ID: " + c.id)
print("serviceId: " + c.serviceId)
for d in c.destinations:
print("Destination.name: " + d.name)
for r in c.rules:
print("Rules.id: " + r.id)
print("Rules.name: " + r.name)
print("Rules.destinatioName: " + r.destinationName)
print("Rules.typeId: " + r.typeId)
print("Rules.eventId: " + r.eventId)
Nachfolgend sind die Ergebnisse des Laufens in meiner Umgebung aufgeführt.
# export WIOTP_AUTH_KEY='kkkkkkkkkkkkkkkkkkk'
# export WIOTP_AUTH_TOKEN='tttttttttttttttttt'
# python ls_dsc.py
Service Bindings
ID: d2b141eb-2390-4fa0-b253-24b14c465298
ID: 5aa553e6-692c-45fd-ba2c-a717a635d5bb
ID: 85cb36b6-eda7-48b0-bc5a-6eb2c2f03619
ID: ae5a431d-98f6-4c9b-9ffc-a3ba9206770e
ID: 4f905b29-70ce-4f01-a2c6-9feb1c2d3e4a
ID: 137becb6-502a-4919-83da-079a434a7175
DSC
ID: 5db2d160f7e0960025221b51
serviceId: 4f905b29-70ce-4f01-a2c6-9feb1c2d3e4a
Destination.name: events
ID: 5db2d1b8f7e0960025221b52
serviceId: 137becb6-502a-4919-83da-079a434a7175
Destination.name: events
Rules.id: 5db2d1bbf7e0960025221b53
Rules.name: allevents
Rules.destinatioName: events
Rules.typeId: *
Rules.eventId: *
Ich habe den Beispielcode 2.4 so geändert, dass nur Ereignisbenachrichtigungen an Cloudant gesendet werden. Aufgrund von Versuchen und Irrtümern in der Mitte bleiben jedoch unnötige Service-Bindung und DSC übrig.
Es gibt zwei DSCs, aber die zuerst aufgeführte (ID = 5db2d160f7e0960025221b51) scheint leere Regeln zu haben und funktioniert nicht. Es bleibt unvollständig, da der Beispielcode vor der Erstellung der Regel abnormal beendet wurde. Die andere (ID = 5db2d1b8f7e0960025221b52) hat sowohl das Ziel als auch die Regeln bereits erstellt und funktioniert.
Es wurden sechs Dienstbindungen erstellt, aber die gültige DSC verwendet die von dsc.serviceId (ID = 137becb6-502a-4919-83da-079a434a7175) angegebene und die verbleibenden fünf Ist noch unnötig.
Wenn Sie diese ls_dsc.py verwenden, können Sie den Einstellungsstatus von DSC erfassen. Derzeit werden nur die minimalen Eigenschaften angezeigt, aber ich denke, dass es besser ist, die anzuzeigenden Eigenschaften nach Bedarf hinzuzufügen.
Jetzt, da es angezeigt werden kann, werden unnötige Objekte gelöscht.
Ich habe nach einer Möglichkeit gesucht, unerwünschte Objekte mithilfe des Python SDK zu entfernen, konnte jedoch keine finden. Wenn Sie es mit der REST-API löschen, ist es in Ordnung, daher lösche ich es direkt mit curl.
Es scheint, dass die vom DSC verwendete Dienstbindung nicht gelöscht werden kann. Löschen Sie daher zuerst den unnötigen DSC und dann die unnötige Dienstbindung.
Weitere Informationen zur REST-API finden Sie unter den folgenden Links. https://docs.internetofthings.ibmcloud.com/apis/swagger/v0002/historian-connector.html#/Services
Der für die Authentifizierung verwendete Benutzername / das Kennwort gibt den in 2.2 erstellten Authentifizierungsschlüssel und das Token an. Ersetzen Sie oooooo in der von der REST-API angegebenen URL durch die Organisations-ID der Watson IoT Platform.
# curl -X DELETE --user 'kkkkkkkkkkkkkkkkkkk:tttttttttttttttttt' https://oooooo.internetofthings.ibmcloud.com/api/v0002/historianconnectors/5db2d160f7e0960025221b51
# curl -X DELETE --user 'kkkkkkkkkkkkkkkkkkk:tttttttttttttttttt' https://oooooo.internetofthings.ibmcloud.com/api/v0002/s2s/services/5aa553e6-692c-45fd-ba2c-a717a635d5bb
# curl -X DELETE --user 'kkkkkkkkkkkkkkkkkkk:tttttttttttttttttt' https://oooooo.internetofthings.ibmcloud.com/api/v0002/s2s/services/d2b141eb-2390-4fa0-b253-24b14c4652
# curl -X DELETE --user 'kkkkkkkkkkkkkkkkkkk:tttttttttttttttttt' https://oooooo.internetofthings.ibmcloud.com/api/v0002/s2s/services/85cb36b6-eda7-48b0-bc5a-6eb2c2f03619
# curl -X DELETE --user 'kkkkkkkkkkkkkkkkkkk:tttttttttttttttttt' https://oooooo.internetofthings.ibmcloud.com/api/v0002/s2s/services/ae5a431d-98f6-4c9b-9ffc-a3ba9206770e
# curl -X DELETE --user 'kkkkkkkkkkkkkkkkkkk:tttttttttttttttttt' https://oooooo.internetofthings.ibmcloud.com/api/v0002/s2s/services/4f905b29-70ce-4f01-a2c6-9feb1c2d3e4a
# export WIOTP_AUTH_KEY='kkkkkkkkkkkkkkkkkkk'
# export WIOTP_AUTH_TOKEN='tttttttttttttttttt'
# python ls_dsc.py
Service Bindings
ID: 137becb6-502a-4919-83da-079a434a7175
DSC
ID: 5db2d1b8f7e0960025221b52
serviceId: 137becb6-502a-4919-83da-079a434a7175
Destination.name: events
Rules.id: 5db2d1bbf7e0960025221b53
Rules.name: allevents
Rules.destinatioName: events
Rules.typeId: *
Rules.eventId: *
Nach dem Löschen habe ich ls_dsc.py erneut ausgeführt, um das Ergebnis zu überprüfen. Unnötige Dienstbindung und DSC wurden gelöscht und es wird aktualisiert.
Nachdem wir nun wissen, dass Service Binding und DSC gelöscht werden können, können verschiedene Einstellungen durch "Löschen" und "Neu erstellen" geändert werden. Ich konnte die für die Installation und Einstellung von DSC erforderlichen Mindestfunktionen bestätigen, aber es scheint schwierig zu sein, jedes Mal "zu löschen" und "neu zu erstellen". Daher werde ich auch prüfen, wie die Konfiguration aktualisiert wird.
Es scheint, dass Sie häufig die Konfiguration des DSC ändern möchten, sobald diese aufgrund von Versuch und Irrtum in der Anfangsphase der Implementierung oder aufgrund von Spezifikationsänderungen generiert wurde. Es scheint, dass verschiedene Eigenschaften, die beim Generieren der in DSC enthaltenen Dienstbindung, DSC, Ziele und Regeln angegeben werden, mithilfe der update () -Methode geändert werden können.
Zu diesem Zeitpunkt wurde kein Dokument mit Spezifikationen gefunden. Ich habe gerade den Quellcode gelesen und herausgefunden. Der Code zum Ändern der Regel wird unten als Beispiel gezeigt. Beachten Sie jedoch, dass er aufgrund zukünftiger Änderungen im Python SDK möglicherweise nicht funktioniert.
update_rule.py
import wiotp.sdk.application
options = wiotp.sdk.application.parseEnvVars()
appClient = wiotp.sdk.application.ApplicationClient(options)
# Get connector instance with its ID (=5db2d1b8f7e0960025221b52) as a key
c = appClient.dsc['5db2d1b8f7e0960025221b52']
# Update rule (ID=5db2d1bbf7e0960025221b53)
s = {
'deviceType' : '*',
'eventId' : 'bar'
}
c.rules.update(ruleId='5db2d1bbf7e0960025221b53', ruleType='event', name="allevents", destinationName="events", description="A sample rule", enabled=True, selector=s)
Im obigen Beispiel wird nur eventId von '*' in 'bar' geändert.
Geben Sie für appClient.dsc die DSC-ID (in diesem Beispiel 5db2d1b8f7e0960025221b52) als Schlüssel an, um die der ID entsprechende DSC-Instanz abzurufen. Sie können die Regel aktualisieren, indem Sie update () für die Regeln für diese Instanz aufrufen. Geben Sie im ersten Argument dieser update () -Methode die ID der Regel an, die Sie aktualisieren möchten, und legen Sie die Eigenschaften der Regel fest, die Sie im Rest aktualisieren möchten. Es scheint, dass die Eigenschaft, die nicht aktualisiert wird, auch durch Festlegen des aktuellen Werts aufgerufen wird. Es ist ein wenig schwierig, das Selektorargument anzugeben, aber wenn ich den Quellcode und die vom Python SDK aufgerufenen REST-API-Spezifikationen lese, scheint es so eingestellt zu sein.
Unten sind die Ausführungsergebnisse.
# export WIOTP_AUTH_KEY='kkkkkkkkkkkkkkkkkkk'
# export WIOTP_AUTH_TOKEN='tttttttttttttttttt'
# python ls_dsc.py
Service Bindings
ID: 137becb6-502a-4919-83da-079a434a7175
DSC
ID: 5db2d1b8f7e0960025221b52 <- !!!DSC ID
serviceId: 137becb6-502a-4919-83da-079a434a7175
Destination.name: events
Rules.id: 5db2d1bbf7e0960025221b53 <- !!!Regel-ID
Rules.name: allevents
Rules.destinatioName: events
Rules.typeId: *
Rules.eventId: * <- !!!Vorher ändern
# python update_rule.py <- !!!Veränderung
# python ls_dsc.py
Service Bindings
ID: 137becb6-502a-4919-83da-079a434a7175
DSC
ID: 5db2d1b8f7e0960025221b52
serviceId: 137becb6-502a-4919-83da-079a434a7175
Destination.name: events
Rules.id: 5db2d1bbf7e0960025221b53
Rules.name: allevents
Rules.destinatioName: events
Rules.typeId: *
Rules.eventId: bar <- !!!Nach der veränderung
Ich habe vorgestellt, wie DSC-Einstellungen mit dem Python SDK überprüft / gelöscht / geändert werden.
Auch hier gibt es einige Methoden, die IBM nicht explizit empfohlen hat, und die Verwendung des in diesem Artikel dargestellten Codes erfolgt auf eigenes Risiko. Beachten Sie auch, dass zukünftige Änderungen an der Python SDK-Implementierung dazu führen können, dass diese Codes nicht mehr funktionieren.
Am sichersten ist es, es mithilfe der REST-API zu implementieren. Die Verwendung des Python SDK ist jedoch einfacher und einfacher zu codieren. Ich hoffe, dass sich das Python SDK in Zukunft zu einer benutzerfreundlicheren Form entwickeln wird.
Der folgende Qiita-Artikel kann hilfreich sein, um mithilfe der REST-API Einstellungen vorzunehmen. Wenn Sie also interessiert sind, lesen Sie bitte den Artikel. https://qiita.com/Motonaga/items/6304f5f66f63cb566943