Share via


Verwenden symmetrischer Schlüssel über HTTPS ohne SDK

In diesem Anleitungsartikel wird ein Gerät unter Verwendung von symmetrischen Schlüsseln über HTTPS ohne Verwendung eines Azure IoT DPS-Geräte-SDK bereitgestellt. Die meisten Sprachen bieten Bibliotheken zum Senden von HTTP-Anforderungen. In diesem Artikel wird allerdings das Befehlszeilentool cURL zum Senden und Empfangen über HTTPS verwendet, anstatt sich auf eine bestimmte Sprache zu konzentrieren.

Die Schritte in diesem Artikel können sowohl auf einem Linux-Computer als auch auf einem Windows-Computer ausgeführt werden. Bei Verwendung des Windows-Subsystems für Linux (WSL) oder auf einem Linux-Computer können Sie alle Befehle auf Ihrem lokalen System in eine Bash-Eingabeaufforderung eingeben. Geben Sie unter Windows alle Befehle auf Ihrem lokalen System in eine GitBash-Eingabeaufforderung ein.

In diesem Artikel gibt es verschiedene Pfade, abhängig von der Art des verwendeten Registrierungseintrags. Sehen Sie nach der Installation der erforderlichen Komponenten unbedingt zunächst die Übersicht an.

Voraussetzungen

  • Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

  • Führen Sie die Schritte im Artikel Einrichten des IoT Hub Device Provisioning Service im Azure-Portal aus.

  • Stellen Sie sicher, dass auf Ihrem Computer mindestens Python 3.7 installiert ist. Durch Ausführen von python --version können Sie überprüfen, welche Python-Version verwendet wird.

  • Installieren Sie unter Windows die neueste Version von Git. Stellen Sie sicher, dass Git den Umgebungsvariablen hinzugefügt wurde, auf die das Befehlsfenster Zugriff hat. Unter den Git-Clienttools von Software Freedom Conservancy finden Sie die neueste Version der zu installierenden git-Tools. Hierzu zählt auch die Befehlszeilen-App Git Bash, über die Sie mit Ihrem lokalen Git-Repository interagieren können. Unter Windows werden alle Befehle auf Ihrem lokalen System in eine GitBash-Eingabeaufforderung eingegeben.

  • Azure-Befehlszeilenschnittstelle. In diesem Artikel gibt es zwei Möglichkeiten zum Ausführen von Azure CLI-Befehlen:

    • Verwenden Sie Azure Cloud Shell. Dabei handelt es sich um eine interaktive Shell, mit der CLI-Befehle im Browser ausgeführt werden. Diese Option wird empfohlen, da Sie nichts installieren müssen. Wenn Sie Cloud Shell zum ersten Mal verwenden, melden Sie sich beim Azure-Portal an. Führen Sie in der Cloud Shell-Schnellstartanleitung die Schritte zum Starten von Cloud Shell und Auswählen der Bash-Umgebung aus.
    • Führen Sie optional die Azure CLI auf dem lokalen Computer aus. Wenn die Azure CLI bereits installiert ist, führen Sie az upgrade aus, um die CLI und die Erweiterungen auf die aktuelle Version zu aktualisieren. Informationen zur Installation der Azure CLI finden Sie unter Installieren der Azure CLI.
  • Öffnen Sie bei Verwendung einer Linux- oder WSL-Umgebung eine Bash-Eingabeaufforderung, um Befehle lokal auszuführen. In einer Windows-Umgebung können Sie eine GitBash-Eingabeaufforderung öffnen.

Übersicht

In diesem Artikel können Sie entweder eine individuelle Registrierung oder eine Registrierungsgruppe für die Bereitstellung über DPS verwenden.

Nachdem Sie den Eintrag für die individuelle Registrierung oder für die Registrierungsgruppe erstellt haben, können Sie ein SAS-Token erstellen und Ihr Gerät bei DPS registrieren.

Verwenden einer individuellen Registrierung

Wenn Sie für diesen Artikel eine neue individuelle Registrierung erstellen möchten, können Sie den Befehl az iot dps enrollment create verwenden, um eine individuelle Registrierung für den Nachweis des symmetrischen Schlüssels zu erstellen.

Der folgende Befehl erstellt einen Registrierungseintrag mit der Standardzuweisungsrichtlinie für Ihre DPS-Instanz und ermöglicht es DPS, den Primärschlüssel und den Sekundärschlüssel für Ihr Gerät zuzuweisen:

az iot dps enrollment create -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --attestation-type symmetrickey
  • Ersetzen Sie den Namen Ihrer Ressourcengruppe und Ihrer DPS-Instanz.

  • Die Registrierungs-ID ist die Registrierungs-ID für Ihr Gerät. Bei der Registrierungs-ID handelt es sich um eine Zeichenfolge (bis zu 128 Zeichen lang) alphanumerischer Zeichen ohne Beachtung der Groß-/Kleinschreibung plus diese Sonderzeichen: '-', '.', '_', ':'. Das letzte Zeichen muss alphanumerisch oder ein Bindestrich ('-') sein. Achten Sie darauf, dass die im Befehl verwendete Registrierungs-ID diesem Format entspricht.

Die zugewiesenen symmetrischen Schlüssel werden in der Antwort in der Nachweiseigenschaft (attestation) zurückgegeben:


{
  "allocationPolicy": null,
  "attestation": {
    "symmetricKey": {
      "primaryKey": "G3vn0IZH9oK3d4wsxFpWBtd2KUrtjI+39dZVRf26To8w9OX0LaFV9yZ93ELXY7voqHEUsNhnb9bt717UP87KxA==",
      "secondaryKey": "4lNxgD3lUAOEOied5/xOocyiUSCAgS+4b9OvXLDi8ug46/CJzIn/3rN6Ys6gW8SMDDxMQDaMRnIoSd1HJ5qn/g=="
    },
    "tpm": null,
    "type": "symmetricKey",
    "x509": null
  },

  ...

}

Notieren Sie sich den Primärschlüssel und die Registrierungs-ID (Registrierungs-ID) für Ihren individuellen Registrierungseintrag. Sie verwenden sie weiter unten in diesem Artikel.

Wenn Sie für diesen Artikel eine bereits vorhandene individuelle Registrierung verwenden möchten, können Sie den Primärschlüssel mit dem Befehl az iot dps enrollment show abrufen:

az iot dps enrollment show -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --show-keys true

Verwenden einer Registrierungsgruppe

Wenn Sie für diesen Artikel eine neue Registrierungsgruppe erstellen möchten, können Sie den Befehl az iot dps enrollment-group create verwenden, um eine Registrierungsgruppe für den Nachweis des symmetrischen Schlüssels zu erstellen.

Der folgende Befehl erstellt einen Registrierungsgruppeneintrag mit der Standardzuweisungsrichtlinie für Ihre DPS-Instanz und ermöglicht es DPS, den Primärschlüssel und den Sekundärschlüssel für die Registrierungsgruppe zuzuweisen:

az iot dps enrollment-group create -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id}
  • Ersetzen Sie den Namen Ihrer Ressourcengruppe und Ihrer DPS-Instanz.

  • Die Registrierungs-ID ist eine von der Groß- und Kleinschreibung unabhängige, bis zu 128-stellige Zeichenfolge, die alphanumerische Zeichen und folgende Sonderzeichen enthalten kann: '-', '.', '_', ':'. Das letzte Zeichen muss alphanumerisch oder ein Bindestrich ('-') sein. Dabei kann es sich um einen beliebigen Namen handeln, den Sie für die Registrierungsgruppe verwenden möchten.

Die zugewiesenen symmetrischen Schlüssel werden in der Antwort in der Nachweiseigenschaft (attestation) zurückgegeben:


{
  "allocationPolicy": null,
  "attestation": {
    "symmetricKey": {
      "primaryKey": "G3vn0IZH9oK3d4wsxFpWBtd2KUrtjI+39dZVRf26To8w9OX0LaFV9yZ93ELXY7voqHEUsNhnb9bt717UP87KxA==",
      "secondaryKey": "4lNxgD3lUAOEOied5/xOocyiUSCAgS+4b9OvXLDi8ug46/CJzIn/3rN6Ys6gW8SMDDxMQDaMRnIoSd1HJ5qn/g=="
    },
    "tpm": null,
    "type": "symmetricKey",
    "x509": null
  },

  ...

}

Notieren Sie sich den Primärschlüssel.

Wenn Sie für diesen Artikel eine bereits vorhandene individuelle Registrierung verwenden möchten, können Sie den Primärschlüssel mit dem Befehl az iot dps enrollment-group show abrufen:

az iot dps enrollment-group show -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --show-keys true

Ableiten eines Geräteschlüssels

Bei Verwendung des Nachweises des symmetrischen Schlüssels mit Gruppenregistrierungen verwenden Sie die Registrierungsgruppenschlüssel nicht direkt. Stattdessen leiten Sie für jedes Gerät einen eindeutigen Schlüssel vom Registrierungsgruppenschlüssel ab. Weitere Informationen finden Sie unter Gruppenregistrierungen mit symmetrischen Schlüsseln.

In diesem Abschnitt generieren Sie einen Geräteschlüssel auf der Grundlage des Primärschlüssels der Registrierungsgruppe, um einen HMAC vom Typ „SHA256“ der eindeutigen Registrierungs-ID für das Gerät zu berechnen. Das Ergebnis wird dann in das Base64-Format konvertiert.

  1. Erzeugen Sie Ihren eindeutigen Schlüssel mit openssl. Verwenden Sie dazu das folgende Bash-Shellskript. Ersetzen Sie {primary-key} durch den Primärschlüssel der Registrierungsgruppe, den Sie zuvor kopiert haben, und ersetzen Sie {contoso-simdevice} durch die Registrierungs-ID, die Sie für das Gerät verwenden möchten. Bei der Registrierungs-ID handelt es sich um eine Zeichenfolge (bis zu 128 Zeichen lang) alphanumerischer Zeichen ohne Beachtung der Groß-/Kleinschreibung plus diese Sonderzeichen: '-', '.', '_', ':'. Das letzte Zeichen muss alphanumerisch oder ein Bindestrich ('-') sein.

    KEY={primary-key}
    REG_ID={contoso-simdevice}
    
    keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
    echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
    
  2. Das Skript gibt in etwa den folgenden Schlüssel aus:

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    

Notieren Sie sich den abgeleiteten Geräteschlüssel sowie die Registrierungs-ID, die Sie zum Generieren verwendet haben, und verwenden Sie sie im nächsten Abschnitt.

Sie können auch die Azure CLI oder PowerShell verwenden, um einen Geräteschlüssel abzuleiten. Weitere Informationen finden Sie unter Ableiten eines Geräteschlüssels.

Erstellen eines SAS-Token

Bei Verwendung des Nachweises des symmetrischen Schlüssels authentifizieren sich Geräte mithilfe eines SAS-Tokens (Shared Access Signature) bei DPS. Bei der Gerätebereitstellung über eine einzelne Registrierung wird das Token mit dem im Registrierungseintrag festgelegten Primär- oder Sekundärschlüssel signiert. Bei einer Gerätebereitstellung über eine Registrierungsgruppe wird das Token mit einem abgeleiteten Geräteschlüssel signiert, der wiederum auf der Grundlage des im Registrierungsgruppeneintrag festgelegten Primär- oder Sekundärschlüssels generiert wurde. Das Token gibt eine Ablaufzeit und einen Zielressourcen-URI an.

Zum Generieren eines SAS-Tokens kann das folgende Python-Skript verwendet werden:

from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC

def generate_sas_token(uri, key, policy_name, expiry=3600):
     ttl = time() + expiry
     sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
     print(sign_key)
     signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest())

     rawtoken = {
         'sr' :  uri,
         'sig': signature,
         'se' : str(int(ttl))
     }

     if policy_name is not None:
         rawtoken['skn'] = policy_name

     return 'SharedAccessSignature ' + urlencode(rawtoken)

uri = '[resource_uri]'
key = '[device_key]'
expiry = [expiry_in_seconds]
policy= '[policy]'

print(generate_sas_token(uri, key, policy, expiry))

Hierbei gilt:

  • [resource_uri] ist der URI der Ressource, auf die Sie mit diesem Token zugreifen möchten. Für DPS hat er das Format [dps_id_scope]/registrations/[dps_registration_id]. Dabei ist [dps_id_scope] der ID-Bereich Ihrer DPS-Instanz und [dps_registration_id] die Registrierungs-ID, die Sie für Ihr Gerät verwendet haben.

    Den ID-Bereich für Ihre DPS-Instanz können Sie im Azure-Portal im Bereich Übersicht Ihrer Instanz ermitteln. Alternativ können Sie den Azure CLI-Befehl az iot dps show verwenden. Ersetzen Sie dabei die Platzhalter durch den Namen Ihrer Ressourcengruppe und Ihrer DPS-Instanz:

    az iot dps show -g {resource_group_name} --name {dps_name}
    
  • [device_key] ist der Geräteschlüssel, der Ihrem Gerät zugeordnet ist. Dieser Schlüssel ist entweder der angegebene oder automatisch für Sie generierte Schlüssel (individuelle Registrierung) oder ein abgeleiteter Schlüssel (Gruppenregistrierung).

  • [expiry_in_seconds] ist die Gültigkeitsdauer dieses SAS-Tokens in Sekunden.

  • [policy] ist die Richtlinie, der der Geräteschlüssel zugeordnet ist. Für die DPS-Geräteregistrierung ist die Richtlinie auf „registration“ hartcodiert.

Eingaben für ein Gerät namens my-symkey-device mit einer Gültigkeitsdauer von 30 Tagen können beispielsweise wie folgt aussehen:

uri = '0ne00111111/registrations/my-symkey-device'
key = '18RQk/hOPJR9EbsJlk2j8WA6vWaj/yi+oaYg7zmxfQNdOyMSu+SJ8O7TSlZhDJCYmn4rzEiVKIzNiVAWjLxrGA=='
expiry = 2592000
policy='registration'

Ändern Sie das Skript für Ihr Gerät und Ihre DPS-Instanz, und speichern Sie es als Python-Datei (Beispiel: generate_token.py). Führen Sie das Skript aus (Beispiel: python generate_token.py). Daraufhin sollte ein SAS-Token wie das folgende ausgegeben werden:

0ne00111111%2Fregistrations%2Fmy-symkey-device
1663952627
SharedAccessSignature sr=0ne00111111%2Fregistrations%2Fmy-symkey-device&sig=eNwg52xQdFTNf7bgPAlAJBCIcONivq%2Fck1lf3wtxI4A%3D&se=1663952627&skn=registration

Kopieren und speichern Sie die gesamte Zeile, die mit SharedAccessSignature beginnt. Diese Zeile ist das SAS-Token. Es wird in den folgenden Schritten benötigt.

Weitere Informationen zur Verwendung von SAS-Token mit DPS sowie zu deren Struktur finden Sie unter Steuern des Zugriffs auf DPS mit SAS.

Registrieren Ihres Geräts

Rufen Sie die REST-API für die Geräteregistrierung auf, um Ihr Gerät über DPS bereitzustellen.

Verwenden Sie den folgenden cURL-Befehl:

curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [sas_token]' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/register?api-version=2019-03-31

Hierbei gilt:

  • -L weist cURL an, HTTP-Umleitungen zu folgen.

  • –i weist cURL an, Protokollheader in die Ausgabe einzuschließen. Diese Header sind nicht zwingend erforderlich, können aber hilfreich sein.

  • -X PUT teilt cURL mit, dass es sich um einen HTTP PUT-Befehl handelt. Erforderlich für diesen API-Aufruf.

  • -H 'Content-Type: application/json' teilt DPS mit, dass JSON-Inhalte veröffentlicht werden, und muss „application/json“ sein.

  • -H 'Content-Encoding: utf-8' teilt DPS die für den Nachrichtentext verwendete Codierung mit. Verwenden Sie den entsprechenden Code für Ihr Betriebssystem bzw. Ihren Client. Das ist üblicherweise utf-8.

  • -H 'Authorization: [sas_token]' weist DPS an, sich mit Ihrem SAS-Token zu authentifizieren. Ersetzen Sie „[sas_token]“ durch das Token, das Sie unter Erstellen eines SAS-Token generiert haben.

  • -d '{"registrationId": "[registration_id]"}': Bei dem Parameter –d handelt es sich um die Daten oder um den Text der veröffentlichten Nachricht. Hierbei muss es sich um JSON-Code im folgenden Format handeln: '{"registrationId":"[registration_id"}'. Beachten Sie, dass der Code für cURL in einfache Anführungszeichen eingeschlossen wird. Andernfalls müssen die doppelten Anführungszeichen im JSON-Code mit Escapezeichen versehen werden.

  • Der letzte Parameter ist die URL für die Veröffentlichung. Bei einer regulären (nicht lokalen) DPS-Instanz wird der globale DPS-Endpunkt global.azure-devices-provisioning.net verwendet: https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/register?api-version=2019-03-31. Beachten Sie, dass [dps_scope_id] und [registration_id] durch die entsprechenden Werte ersetzt werden müssen.

Zum Beispiel:

curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: SharedAccessSignature sr=0ne00111111%2Fregistrations%2Fmy-symkey-device&sig=eNwg52xQdFTNf7bgPAlAJBCIcONivq%2Fck1lf3wtxI4A%3D&se=1663952627&skn=registration' -d '{"registrationId": "my-symkey-device"}' https://global.azure-devices-provisioning.net/0ne00111111/registrations/my-symkey-device/register?api-version=2021-06-01

Bei einem erfolgreichen Anruf wird eine Antwort wie die folgende angezeigt:

HTTP/1.1 202 Accepted
Date: Wed, 31 Aug 2022 22:02:49 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Location: https://global.azure-devices-provisioning.net/0ne00111111/registrations/my-symkey-device/register
Retry-After: 3
x-ms-request-id: a021814f-0cf6-4ce9-a1e9-ead7eb5118d9
Strict-Transport-Security: max-age=31536000; includeSubDomains

{"operationId":"5.316aac5bdc130deb.b1e02da8-c3a0-4ff2-a121-7ea7a6b7f550","status":"assigning"}

Die Antwort enthält eine Vorgangs-ID und einen Status. In diesem Fall lautet der Status assigning. Die DPS-Registrierung ist unter Umständen ein zeitintensiver Vorgang und wird daher asynchron ausgeführt. In der Regel wird der Status mithilfe der REST-API zum Ermitteln des Vorgangsstatus abgefragt, um zu bestimmen, wann Ihr Gerät zugewiesen wurde oder ob ein Fehler aufgetreten ist.

Gültige Statuswerte für DPS sind:

  • assigned: Der Rückgabewert aus dem Statusaufruf gibt an, welchem IoT-Hub das Gerät zugewiesen wurde.

  • assigning: Der Vorgang wird noch ausgeführt.

  • disabled: Der Registrierungsdatensatz ist in DPS deaktiviert. Das Gerät kann somit nicht zugewiesen werden.

  • failed: Die Zuweisung war nicht erfolgreich. In der Antwort werden in einem Datensatz vom Typ registrationState ein Fehlercode (errorCode) und eine Fehlermeldung (errorMessage) zurückgegeben, die Aufschluss über den Fehler geben.

  • unassigned

Verwenden Sie den folgenden cURL-Befehl, um die API zum Ermitteln des Vorgangsstatus aufzurufen:

curl -L -i -X GET -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [sas_token]' https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/operations/[operation_id]?api-version=2019-03-31

Sie verwenden den gleichen ID-Bereich, die gleiche Registrierungs-ID und das gleiche SAS-Token wie bei der Anforderung Gerät registrieren. Verwenden Sie die Vorgangs-ID, die in der Antwort von Gerät registrieren zurückgegeben wurde.

Zum Beispiel:

curl -L -i -X GET -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: SharedAccessSignature sr=0ne00111111%2Fregistrations%2Fmy-symkey-device&sig=eNwg52xQdFTNf7bgPAlAJBCIcONivq%2Fck1lf3wtxI4A%3D&se=1663952627&skn=registration' https://global.azure-devices-provisioning.net/0ne00111111/registrations/my-symkey-device/operations/5.316aac5bdc130deb.f4f1828c-4dab-4ca9-98b2-dfc63b5835d6?api-version=2021-06-01

Die folgende Ausgabe zeigt die Antwort für ein erfolgreich zugewiesenes Gerät. Beachten Sie, dass die Eigenschaft status den Wert assigned hat und dass die Eigenschaft registrationState.assignedHub auf den IoT-Hub festgelegt ist, für den das Gerät bereitgestellt wurde.

HTTP/1.1 200 OK
Date: Wed, 31 Aug 2022 22:05:23 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
x-ms-request-id: ffb98d42-023e-4e75-afb0-1807ff091cbb
Strict-Transport-Security: max-age=31536000; includeSubDomains

{
   "operationId":"5.316aac5bdc130deb.b1e02da8-c3a0-4ff2-a121-7ea7a6b7f550",
   "status":"assigned",
   "registrationState":{
      "registrationId":"my-symkey-device",
      "createdDateTimeUtc":"2022-08-31T22:02:50.5163352Z",
      "assignedHub":"MyExampleHub.azure-devices.net",
      "deviceId":"my-symkey-device",
      "status":"assigned",
      "substatus":"initialAssignment",
      "lastUpdatedDateTimeUtc":"2022-08-31T22:02:50.7370676Z",
      "etag":"IjY5MDAzNTUyLTAwMDAtMDMwMC0wMDAwLTYzMGZkYThhMDAwMCI="
   }
}

Senden einer Telemetrienachricht

Bevor Sie eine Telemetrienachricht senden können, müssen Sie ein SAS-Token für den IoT-Hub erstellen, dem das Gerät zugewiesen wurde. Sie signieren dieses Token mit dem gleichen Primärschlüssel oder abgeleiteten Geräteschlüssel, den Sie zum Signieren des SAS-Tokens für Ihre DPS-Instanz verwendet haben.

Erstellen eines SAS-Tokens für Ihren IoT-Hub

Um das SAS-Token zu erstellen, können Sie den gleichen Code ausführen, den Sie auch zum Erstellen des Tokens für Ihre DPS-Instanz ausgeführt haben – allerdings mit folgenden Änderungen:

uri = '[resource_uri]'
key = '[device_key]'
expiry = [expiry_in_seconds]
policy= None

Hierbei gilt:

  • [resource_uri] ist der URI der Ressource, auf die Sie mit diesem Token zugreifen möchten. Bei einem Gerät, das Nachrichten an einen IoT-Hub sendet, hat er das Format [iot-hub-host-name]/devices/[device-id].

    • Verwenden Sie für [iot-hub-host-name] den Hostnamen des IoT-Hubs, der im vorherigen Abschnitt in der Eigenschaft assignedHub zurückgegeben wurde.

    • Verwenden Sie für [device-id] die Geräte-ID, die im vorherigen Abschnitt in der Eigenschaft deviceId zurückgegeben wurde.

  • [device_key] ist der Geräteschlüssel, der Ihrem Gerät zugeordnet ist. Dieser Schlüssel ist entweder der angegebene oder automatisch für Sie generierte Schlüssel (individuelle Registrierung) oder ein abgeleiteter Schlüssel (Gruppenregistrierung). (Das ist der gleiche Schlüssel, den Sie zuvor beim Erstellen eines Tokens für DPS verwendet haben.)

  • [expiry_in_seconds] ist die Gültigkeitsdauer dieses SAS-Tokens in Sekunden.

  • policy=None: Für ein Gerät, das Telemetriedaten an einen IoT-Hub sendet, ist keine Richtlinie erforderlich, daher ist dieser Parameter auf None festgelegt.

Eingaben für ein Gerät namens my-symkey-device, das Daten an eine IoT-Hub-Instanz namens MyExampleHub sendet und über eine Tokengültigkeitsdauer von einer Stunde verfügt, können beispielsweise wie folgt aussehen:

uri = 'MyExampleHub.azure-devices.net/devices/my-symkey-device'
key = '18RQk/hOPJR9EbsJlk2j8WA6vWaj/yi+oaYg7zmxfQNdOyMSu+SJ8O7TSlZhDJCYmn4rzEiVKIzNiVAWjLxrGA=='
expiry = 3600
policy= None

Die folgende Ausgabe zeigt ein SAS-Beispieltoken für diese Eingaben:

SharedAccessSignature sr=MyExampleHub.azure-devices.net%2Fdevices%2Fmy-symkey-device&sig=f%2BwW8XOKeJOtiPc9Iwjc4OpExvPM7NlhM9qxN2a1aAM%3D&se=1663119026

Weitere Informationen zum Erstellen von SAS-Token für IoT Hub (einschließlich Beispielcode in anderen Programmiersprachen) finden Sie unter Steuern des Zugriffs auf IoT Hub mithilfe von Shared Access Signatures.

Hinweis

Der Einfachheit halber können Sie den Azure CLI-Befehl az iot hub generate-sas-token verwenden, um ein SAS-Token für ein Gerät abzurufen, das bei einem IoT-Hub registriert ist. Mit dem folgenden Befehl wird beispielsweise ein SAS-Token mit einer Gültigkeitsdauer von einer Stunde generiert. Für {iothub_name} benötigen Sie nur den ersten Teil des Hostnamens (beispielsweise MyExampleHub).

az iot hub generate-sas-token -d {device_id} -n {iothub_name}

Senden von Daten an Ihren IoT-Hub

Rufen Sie die REST-API zum Senden von Geräteereignissen von IoT Hub auf, um Telemetriedaten an das Gerät zu senden.

Verwenden Sie den folgenden cURL-Befehl:

curl -L -i -X POST -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: [sas_token]' -d '{"temperature": 30}' https://[assigned_iot_hub_name].azure-devices.net/devices/[device_id]/messages/events?api-version=2020-03-13

Hierbei gilt:

  • -X POST teilt cURL mit, dass es sich um einen HTTP POST-Befehl handelt. Erforderlich für diesen API-Aufruf.

  • -H 'Content-Type: application/json' teilt IoT Hub mit, dass JSON-Inhalte veröffentlicht werden, und muss „application/json“ sein.

  • -H 'Content-Encoding: utf-8' teilt IoT Hub die für den Nachrichtentext verwendete Codierung mit. Verwenden Sie den entsprechenden Code für Ihr Betriebssystem bzw. Ihren Client. Das ist üblicherweise utf-8.

  • -H 'Authorization: [sas_token]' weist IoT Hub an, sich mit Ihrem SAS-Token zu authentifizieren. Ersetzen Sie [sas_token] durch das Token, das Sie für den zugewiesenen IoT-Hub generiert haben.

  • -d '{"temperature": 30}': Bei dem Parameter –d handelt es sich um die Daten oder um den Text der veröffentlichten Nachricht. Für diesen Artikel wird ein einzelner Temperaturdatenpunkt veröffentlicht. Der Inhaltstyp wurde als „application/json“ angegeben. Der Text für diese Anforderung ist also JSON-Code. Beachten Sie, dass der Code für cURL in einfache Anführungszeichen eingeschlossen wird. Andernfalls müssen die doppelten Anführungszeichen im JSON-Code mit Escapezeichen versehen werden.

  • Der letzte Parameter ist die URL für die Veröffentlichung. Für die API zum Senden von Geräteereignissen lautet die URL https://[assigned_iot_hub_name].azure-devices.net/devices/[device_id]/messages/events?api-version=2020-03-13.

    • Ersetzen Sie [assigned_iot_hub_name] durch den Namen des IoT-Hubs, dem Ihr Gerät zugewiesen wurde.

    • Ersetzen Sie [device_id] durch die Geräte-ID, die bei der Registrierung Ihres Geräts zugewiesen wurde. Bei Geräten mit Bereitstellung über Registrierungsgruppen ist die Geräte-ID die Registrierungs-ID. Bei individuellen Registrierungen können Sie optional eine Geräte-ID angeben, die sich von der Registrierungs-ID im Registrierungseintrag unterscheidet.

Hier sehen Sie ein Beispiel für ein Gerät mit der Geräte-ID my-symkey-device, das einen Telemetriedatenpunkt an einen IoT-Hub namens MyExampleHub sendet:

curl -L -i -X POST -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -H 'Authorization: SharedAccessSignature sr=MyExampleHub.azure-devices.net%2Fdevices%2Fmy-symkey-device&sig=f%2BwW8XOKeJOtiPc9Iwjc4OpExvPM7NlhM9qxN2a1aAM%3D&se=1663119026' -d '{"temperature": 30}' https://MyExampleHub.azure-devices.net/devices/my-symkey-device/messages/events?api-version=2020-03-13

Bei einem erfolgreichen Anruf wird eine Antwort wie die folgende angezeigt:

HTTP/1.1 204 No Content
Content-Length: 0
Vary: Origin
Server: Microsoft-HTTPAPI/2.0
x-ms-request-id: 9e278582-3561-417b-b807-76426195920f
Date: Wed, 14 Sep 2022 00:32:53 GMT

Nächste Schritte