Jak używać kluczy symetrycznych za pośrednictwem protokołu HTTPS bez zestawu SDK

W tym artykule z instrukcjami aprowizujesz urządzenie przy użyciu kluczy symetrycznych za pośrednictwem protokołu HTTPS bez korzystania z zestawu SDK urządzenia usługi Azure IoT DPS. Większość języków udostępnia biblioteki do wysyłania żądań HTTP, ale zamiast skupiać się na określonym języku, w tym artykule użyjesz narzędzia wiersza polecenia cURL do wysyłania i odbierania za pośrednictwem protokołu HTTPS.

Możesz wykonać kroki opisane w tym artykule na maszynie z systemem Linux lub Windows. Jeśli korzystasz z systemu Windows Subsystem dla systemu Linux (WSL) lub z systemu Linux, możesz wprowadzać wszystkie polecenia w swoim lokalnym systemie w wierszu poleceń Bash. Jeśli korzystasz z systemu Windows, wprowadź wszystkie polecenia na swoim lokalnym systemie w wierszu polecenia GitBash.

Istnieją różne ścieżki przez ten artykuł w zależności od rodzaju wpisu rekrutacyjnego, którego chcesz użyć. Po zainstalowaniu wymagań wstępnych przed kontynuowaniem zapoznaj się z omówieniem.

Wymagania wstępne

  • Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

  • Wykonaj kroki opisane w temacie Konfigurowanie usługi IoT Hub Device Provisioning Przy użyciu witryny Azure Portal.

  • Upewnij się, że na maszynie jest zainstalowany język Python w wersji 3.7 lub nowszej. Możesz sprawdzić swoją wersję języka Python, uruchamiając polecenie python --version.

  • Jeśli korzystasz z systemu Windows, zainstaluj najnowszą wersję narzędzia Git. Upewnij się, że usługa Git jest dodawana do zmiennych środowiskowych dostępnych w oknie polecenia. Zobacz Narzędzia klienta Git Software Freedom Conservancy dla najnowszej wersji narzędzi do zainstalowania, które obejmują Git Bash, aplikację wiersza polecenia, której można użyć do interakcji z lokalnym repozytorium Git. W systemie Windows wszystkie polecenia wprowadza się w wierszu poleceń GitBash.

  • Azure CLI. Dostępne są dwie opcje uruchamiania poleceń interfejsu wiersza polecenia platformy Azure w tym artykule:

    • Użyj usługi Azure Cloud Shell — interaktywnej powłoki, która uruchamia polecenia CLI w przeglądarce. Ta opcja jest zalecana, ponieważ nie trzeba instalować żadnych elementów. Jeśli używasz usługi Cloud Shell po raz pierwszy, zaloguj się do witryny Azure Portal. Wykonaj kroki opisane w przewodniku Szybki start Cloud Shell, aby uruchomić Cloud Shell i wybrać środowisko Bash.
    • Opcjonalnie uruchom interfejs wiersza polecenia platformy Azure na komputerze lokalnym. Jeśli interfejs wiersza polecenia platformy Azure jest już zainstalowany, uruchom polecenie az upgrade , aby uaktualnić interfejs wiersza polecenia i rozszerzenia do bieżącej wersji. Aby zainstalować interfejs wiersza polecenia platformy Azure, zobacz Jak zainstalować interfejs wiersza polecenia platformy Azure.
  • Jeśli używasz systemu Linux lub środowiska WSL, otwórz konsolę Bash, aby uruchomić polecenia lokalnie. Jeśli korzystasz ze środowiska systemu Windows, otwórz okno terminala Git Bash.

Omówienie

W tym artykule można użyć albo indywidualnej rejestracji, albo grupy rejestracji do aprowizacji za pośrednictwem usługi DPS.

Po utworzeniu wpisu indywidualnej rejestracji lub grupy rejestracji przejdź do tworzenia tokenu SAS i rejestrowania urządzenia w usłudze DPS.

Używanie rejestracji indywidualnej

Jeśli chcesz utworzyć nową rejestrację indywidualną do użycia w tym artykule, możesz użyć polecenia az iot dps enrollment create , aby utworzyć rejestrację indywidualną na potrzeby zaświadczania klucza symetrycznego.

Następujące polecenie tworzy wpis rejestracji z domyślnymi zasadami alokacji dla wystąpienia usługi DPS i umożliwia usłudze DPS przypisanie kluczy podstawowych i pomocniczych dla urządzenia:

az iot dps enrollment create -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id} --attestation-type symmetrickey
  • Zastąp nazwę swojej grupy zasobów i instancji usługi DPS.

  • Identyfikator zapisu to identyfikator rejestracji dla twojego urządzenia. Identyfikator rejestracji jest ciągiem bez uwzględniania wielkości liter (do 128 znaków) znaków alfanumerycznych plus znaków specjalnych: '-', '.', '_', ':'. Ostatni znak musi być alfanumeryczny lub kreskowy ('-'). Upewnij się, że identyfikator rejestracji używany w poleceniu jest zgodny z tym formatem.

Przypisane klucze symetryczne są zwracane we właściwości zaświadczania w odpowiedzi:


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

  ...

}

Zanotuj klucz podstawowy i identyfikator rejestracji dla swojego indywidualnego wpisu rejestracji; użyjesz ich później w tym artykule.

Jeśli chcesz użyć istniejącej indywidualnej rejestracji dla tego artykułu, możesz uzyskać klucz podstawowy za pomocą polecenia az iot dps enrollment show:

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

Korzystanie z grupy rejestracji

Jeśli chcesz utworzyć nową grupę rejestracji do użycia w tym artykule, możesz użyć polecenia az iot dps enrollment-group create , aby utworzyć grupę rejestracji na potrzeby zaświadczania klucza symetrycznego.

Następujące polecenie tworzy wpis grupy rejestracji z domyślnymi zasadami alokacji dla wystąpienia usługi DPS i umożliwia usłudze DPS przypisanie kluczy podstawowych i pomocniczych dla grupy rejestracji:

az iot dps enrollment-group create -g {resource_group_name} --dps-name {dps_name} --enrollment-id {enrollment_id}
  • Zastąp nazwę swojej grupy zasobów i instancji usługi DPS.

  • Identyfikator rejestracji jest ciągiem bez uwzględniania wielkości liter (do 128 znaków) znaków alfanumerycznych oraz znakami specjalnymi: '-', , '.''_', ':'. Ostatni znak musi być alfanumeryczny lub kreskowy ('-'). Może to być dowolna nazwa, której chcesz użyć dla grupy rejestracji.

Przypisane klucze symetryczne są zwracane we właściwości zaświadczania w odpowiedzi:


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

  ...

}

Zanotuj klucz podstawowy.

Jeśli chcesz użyć istniejącej rejestracji indywidualnej w tym artykule, możesz uzyskać klucz podstawowy za pomocą polecenia az iot dps enrollment-group show :

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

Uzyskiwanie klucza urządzenia

W przypadku korzystania z poświadczania klucza symetrycznego z rejestracjami grupowymi nie należy używać kluczy grupy rejestracji bezpośrednio. Zamiast tego należy utworzyć unikatowy klucz dla każdego urządzenia z klucza grupy rejestracji. Aby uzyskać więcej informacji, zobacz Rejestrowanie grup przy użyciu kluczy symetrycznych.

W tej sekcji wygenerujesz klucz urządzenia z klucza podstawowego grupy rejestracji w celu obliczenia HMAC-SHA256 unikatowego identyfikatora rejestracji urządzenia. Wynik jest następnie konwertowany na format Base64.

  1. Wygeneruj unikatowy klucz przy użyciu polecenia openssl. Użyj następującego skryptu powłoki Bash. Zastąp {primary-key} kluczem podstawowym grupy rejestracyjnej, który skopiowałeś wcześniej, i zastąp {contoso-simdevice} identyfikatorem rejestracyjnym, którego chcesz użyć dla tego urządzenia. Identyfikator rejestracji jest ciągiem bez uwzględniania wielkości liter (do 128 znaków) znaków alfanumerycznych plus znaków specjalnych: '-', '.', '_', ':'. Ostatni znak musi być alfanumeryczny lub kreskowy ('-').

    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. Skrypt generuje dane wyjściowe podobne do następującego klucza:

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    

Zanotuj pochodny klucz urządzenia i identyfikator rejestracji użyty do jego wygenerowania, użyjesz ich w następnej sekcji.

Możesz również użyć interfejsu wiersza polecenia platformy Azure lub programu PowerShell, aby uzyskać klucz urządzenia. Aby dowiedzieć się więcej, zobacz Tworzenie klucza urządzenia.

Tworzenie tokenu SAS

W przypadku korzystania z zaświadczania klucza symetrycznego urządzenia uwierzytelniają się w usłudze DPS przy użyciu tokenu sygnatury dostępu współdzielonego (SAS). W przypadku provisioningu urządzeń za pośrednictwem rejestracji indywidualnej, token jest podpisywany przy użyciu klucza podstawowego lub pomocniczego, który jest ustawiony we wpisie rejestracji. W przypadku aprowizacji urządzenia za pośrednictwem grupy rejestracji token jest podpisywany przy użyciu klucza pochodnego urządzenia, który z kolei jest generowany przy użyciu klucza głównego lub pomocniczego ustawionego w grupie rejestracji. Token określa czas wygaśnięcia i identyfikator URI zasobu docelowego.

Do wygenerowania tokenu SAS można użyć następującego skryptu języka Python.

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))

Gdzie:

  • [resource_uri] to identyfikator URI zasobu, do którego próbujesz uzyskać dostęp za pomocą tego tokenu. W przypadku usługi DPS jest to format [dps_id_scope]/registrations/[dps_registration_id], gdzie [dps_id_scope] jest zakresem identyfikacji Twojego wystąpienia usługi DPS, a [dps_registration_id] jest identyfikatorem rejestracji używanym dla urządzenia.

    Zakres identyfikatora dla wystąpienia usługi DPS można znaleźć w okienku Przegląd w portalu Azure lub skorzystać z polecenia az iot dps show w interfejsie wiersza polecenia platformy Azure (zastępując symbole zastępcze nazwą swojej grupy zasobów i wystąpienia usługi DPS).

    az iot dps show -g {resource_group_name} --name {dps_name}
    
  • [device_key] to klucz urządzenia skojarzony z urządzeniem. Ten klucz jest określony lub wygenerowany automatycznie dla Użytkownika w ramach rejestracji indywidualnej lub klucz pochodny dla rejestracji grupy.

  • [expiry_in_seconds] to okres ważności tego tokenu sygnatury dostępu współdzielonego w sekundach.

  • [policy] to zasady, z którymi jest skojarzony klucz urządzenia. W przypadku rejestracji urządzeń w usłudze DPS zasady są zakodowane jako "rejestracja".

Przykładowy zestaw danych wejściowych dla urządzenia o nazwie my-symkey-device z okresem ważności 30 dni może wyglądać następująco.

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

Zmodyfikuj skrypt dla urządzenia i wystąpienia usługi DPS i zapisz go jako plik w języku Python; na przykład generate_token.py. Uruchom skrypt, na przykład python generate_token.py. Powinien on wygenerować token SAS podobny do następującego przykładu:

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

Skopiuj i zapisz cały wiersz rozpoczynający się od SharedAccessSignature. Ten wiersz jest tokenem SAS. Potrzebujesz ich w poniższych sekcjach.

Aby dowiedzieć się więcej na temat używania tokenów SAS z usługą DPS i ich strukturą, zobacz Kontrola dostępu do usługi Azure IoT Hub Device Provisioning Service (DPS) przy użyciu sygnatur dostępu współdzielonego i tokenów zabezpieczających.

Rejestrowanie własnego urządzenia

Aby aprowizować urządzenie za pośrednictwem usługi DPS, należy wywołać interfejs API REST Rejestruj Urządzenie.

Użyj następującego polecenia curl:

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

Gdzie:

  • -L informuje curl, aby podążał za przekierowaniami HTTP.

  • –i nakazuje curlowi uwzględnić nagłówki protokołu w output. Te nagłówki nie są ściśle niezbędne, ale mogą być przydatne.

  • -X PUT informuje curl, że to polecenie jest poleceniem HTTP PUT. Wymagane dla tego wywołania interfejsu API.

  • -H 'Content-Type: application/json' informuje usługę DPS, że publikujemy zawartość JSON i musi mieć wartość "application/json".

  • -H 'Content-Encoding: utf-8' informuje usługę DPS o kodowaniu używanym dla naszej treści komunikatu. Ustaw odpowiednią wartość dla systemu operacyjnego/klienta; jednak zazwyczaj jest to utf-8.

  • -H 'Authorization: [sas_token]' informuje usługę DPS o uwierzytelnienie przy użyciu tokenu SAS. Zastąp ciąg [sas_token] tokenem wygenerowanym w sekcji Tworzenie tokenu SAS.

  • -d '{"registrationId": "[registration_id]"}' –d, parametr to "dane" lub treść komunikatu, który publikujemy. Musi to być kod JSON w postaci "{"registrationId":"[registration_id"}". Dla curl jest to ujęte w pojedynczy cudzysłów; w przeciwnym razie należy użyć ukośnika przed podwójnymi cudzysłowami w pliku JSON.

  • Na koniec ostatnim parametrem jest adres URL do opublikowania. W przypadku "zwykłego" (tj. nie lokalnego) usługi DPS używany jest globalny punkt końcowy usługi DPS, global.azure-devices-provisioning.net: https://global.azure-devices-provisioning.net/[dps_id_scope]/registrations/[registration_id]/register?api-version=2019-03-31. Musisz zastąpić [dps_scope_id] i [registration_id] odpowiednimi wartościami.

Na przykład:

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

Pomyślne wywołanie zapewnia odpowiedź podobną do następującego przykładu:

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"}

Odpowiedź zawiera identyfikator operacji i stan. W takim przypadku stan ma wartość assigning. Rejestracja w usłudze DPS jest potencjalnie długotrwałą operacją, więc jest wykonywana asynchronicznie. Zazwyczaj sprawdzasz stan przy użyciu interfejsu REST API wyszukiwania stanu operacji, aby określić, kiedy urządzenie zostanie przypisane lub czy wystąpi awaria.

Prawidłowe wartości stanu dla usługi DPS to:

  • assigned: wartość zwracana z wywołania stanu wskazuje, do którego usługi IoT Hub przypisano urządzenie.

  • assigning: operacja jest nadal uruchomiona.

  • disabled: rekord rejestracji jest wyłączony w usłudze DPS, więc nie można przypisać urządzenia.

  • failed: zadanie nie udało się. Elementy errorCode i errorMessage są zwracane w zapisie registrationState w odpowiedzi, aby wskazać, co nie powiodło się.

  • unassigned

Aby wywołać interfejs API wyszukiwania stanu operacji, użyj następującego polecenia curl:

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

Używasz tego samego zakresu identyfikatora, identyfikatora rejestracji i tokenu SAS, tak jak w żądaniu Rejestrowanie urządzenia. Użyj identyfikatora operacji zwróconego w odpowiedzi na Zarejestruj urządzenie.

Na przykład:

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

Poniższe dane wyjściowe przedstawiają odpowiedź urządzenia, które zostało pomyślnie przypisane. Zwróć uwagę, że status właściwość to assigned i że registrationState.assignedHub właściwość jest ustawiona na centrum IoT, w którym aprowizowano urządzenie.

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="
   }
}

Wysyłanie komunikatu telemetrii

Przed wysłaniem komunikatu telemetrii należy utworzyć token SAS dla centrum IoT, do którego przypisano urządzenie. Podpisujesz ten token, używając tego samego klucza podstawowego lub pochodnego klucza urządzenia, którego użyłeś do podpisania tokenu SAS dla wystąpienia usługi DPS.

Tworzenie tokenu SAS dla centrum IoT

Aby utworzyć token SAS, możesz uruchomić ten sam kod, którego użyłeś do stworzenia tokenu dla wystąpienia DPS, z następującymi zmianami:

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

Gdzie:

  • [resource_uri] to identyfikator URI zasobu, do którego próbujesz uzyskać dostęp za pomocą tego tokenu. W przypadku urządzenia wysyłającego komunikaty do centrum IoT Hub jest to formularz [iot-hub-host-name]/devices/[device-id].

    • W przypadku [iot-hub-host-name] użyj nazwy hosta usługi IoT Hub zwróconej assignedHub we właściwości poprzedniej sekcji.

    • W przypadku [device-id] elementu użyj zwróconego identyfikatora urządzenia deviceId we właściwości w poprzedniej sekcji.

  • [device_key] to klucz urządzenia skojarzony z urządzeniem. Ten klucz jest określony lub wygenerowany automatycznie dla Użytkownika w ramach rejestracji indywidualnej lub klucz pochodny dla rejestracji grupy. (Jest to ten sam klucz, który został wcześniej użyty do utworzenia tokenu dla usługi DPS).

  • [expiry_in_seconds] to okres ważności tego tokenu SAS w sekundach.

  • policy=None Żadne zasady nie są wymagane dla urządzenia wysyłającego dane telemetryczne do centrum IoT, więc ten parametr jest ustawiony na Nonewartość .

Przykładowy zestaw danych wejściowych dla urządzenia o nazwie my-symkey-device, wysyłanego do usługi IoT Hub o nazwie MyExampleHub, z okresem ważności tokenu wynoszącym jedną godzinę może wyglądać następująco:

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

Następujące dane wyjściowe przedstawiają przykładowy token SAS dla tych danych wejściowych:

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

Aby dowiedzieć się więcej na temat tworzenia tokenów SAS dla usługi IoT Hub, w tym przykładowego kodu w innych językach programowania, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego.

Uwaga

Dla wygody możesz użyć polecenia Azure CLI az iot hub generate-sas-token aby uzyskać token SAS dla urządzenia zarejestrowanego w centrum IoT. Na przykład następujące polecenie generuje token SAS z czasem trwania jednej godziny. W przypadku elementu {iothub_name}potrzebna jest tylko pierwsza część nazwy hosta, na przykład MyExampleHub.

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

Wysyłanie danych do centrum IoT

Wywołasz interfejs API REST Send Device Event w usłudze IoT Hub, aby wysyłać dane telemetryczne do urządzenia.

Użyj następującego polecenia curl:

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

Gdzie:

  • -X POST informuje curl, że to polecenie jest poleceniem HTTP POST. Wymagane dla tego wywołania interfejsu API.

  • -H 'Content-Type: application/json' informuje usługę IoT Hub, że przesyłamy dane w formacie JSON i musi być typu 'application/json'.

  • -H 'Content-Encoding: utf-8' informuje usługę IoT Hub o kodowaniu używanym dla treści komunikatu. Ustaw odpowiednią wartość dla systemu operacyjnego/klienta; jednak zazwyczaj jest to utf-8.

  • -H 'Authorization: [sas_token]' informuje usługę IoT Hub, aby uwierzytelniała się przy użyciu tokenu SAS. Zastąp [sas_token] element tokenem wygenerowanym dla przypisanego centrum IoT.

  • -d '{"temperature": 30}' –d, parametr to "dane" lub treść komunikatu, który publikujemy. W tym artykule publikujemy pojedynczy punkt danych temperatury. Typ zawartości został określony jako application/json, więc dla tego żądania treść to JSON. Dla curl jest to ujęte w pojedynczy cudzysłów; w przeciwnym razie należy użyć ukośnika przed podwójnymi cudzysłowami w pliku JSON.

  • Ostatnim parametrem jest adres URL do opublikowania. W przypadku API do wysyłania zdarzeń urządzenia, adres URL to: https://[assigned_iot_hub_name].azure-devices.net/devices/[device_id]/messages/events?api-version=2020-03-13.

    • Zastąp [assigned_iot_hub_name] ciąg nazwą centrum IoT, do którego przypisano urządzenie.

    • Zastąp [device_id] element identyfikatorem urządzenia, który został przypisany podczas rejestrowania urządzenia. W przypadku urządzeń konfigurowanych poprzez grupy rejestracyjne identyfikator urządzenia jest identyfikatorem rejestracji. W przypadku rejestracji indywidualnych można opcjonalnie określić identyfikator urządzenia inny niż identyfikator rejestracji we wpisie rejestracji.

Na przykład w przypadku urządzenia z identyfikatorem my-symkey-device urządzenia wysyłającego punkt danych telemetrycznych do centrum IoT o nazwie MyExampleHub:

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

Udane wywołanie ma odpowiedź podobną do poniższego przykładu.

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

Następne kroki