Samouczek: aprowizuj opóźnienie geograficzne

W tym samouczku pokazano, jak bezpiecznie aprowizować wiele symulowanych urządzeń kluczy symetrycznych do grupy usługi IoT Hubs przy użyciu zasad alokacji. usługa IoT Hub Device Provisioning Service (DPS) obsługuje różne scenariusze alokacji za pomocą wbudowanych zasad alokacji i obsługi niestandardowych zasad alokacji.

Aprowizowanie na potrzeby opóźnienia geolokalizacji/geograficznego jest typowym scenariuszem alokacji. W miarę przemieszczania się urządzenia między lokalizacjami opóźnienie sieci jest poprawiane dzięki aprowizacji urządzenia w centrum IoT, które znajduje się najbliżej każdej lokalizacji. W tym scenariuszu dla rejestracji jest wybierana grupa centrów IoT, które obejmują wiele regionów. Dla tych rejestracji wybrano wbudowane zasady alokacji najmniejszego opóźnienia . Te zasady powodują, że usługa Device Provisioning Service ocenia opóźnienie urządzenia i określa zamknięcie centrum IoT hub poza grupą centrów IoT.

W tym samouczku użyto przykładu symulowanego urządzenia z zestawu SDK języka C usługi Azure IoT , aby zademonstrować sposób aprowizowania urządzeń w różnych regionach. W tym samouczku wykonasz następujące kroki:

  • Używanie interfejsu wiersza polecenia platformy Azure do tworzenia dwóch regionalnych centrów IoT (Zachodnie stany USA 2 i Wschodnie stany USA)
  • Tworzenie rejestracji, która aprowizuje urządzenia na podstawie geolokalizacji (najmniejsze opóźnienie)
  • Użyj interfejsu wiersza polecenia platformy Azure, aby utworzyć dwie regionalne maszyny wirtualne z systemem Linux do działania jako urządzenia w tych samych regionach (Zachodnie stany USA 2 i Wschodnie stany USA)
  • Konfigurowanie środowiska deweloperskiego dla zestawu SDK języka C usługi Azure IoT na obu maszynach wirtualnych z systemem Linux
  • Zasymuluj urządzenia i sprawdź, czy są one aprowidowane w centrum IoT w najbliższym regionie.

Ważne

Niektóre regiony mogą, od czasu do czasu, wymuszać ograniczenia tworzenia Virtual Machines. W momencie pisania tego przewodnika regiony westus2 i eastus zezwoliły na tworzenie maszyn wirtualnych. Jeśli nie możesz utworzyć w jednym z tych regionów, możesz wypróbować inny region. Aby dowiedzieć się więcej na temat wybierania regionów geograficznych platformy Azure podczas tworzenia maszyn wirtualnych, zobacz Regiony maszyn wirtualnych na platformie Azure

Wymagania wstępne

Tworzenie dwóch regionalnych centrów IoT

W tej sekcji utworzysz grupę zasobów platformy Azure i dwie nowe regionalne zasoby centrum IoT. Jedno centrum IoT będzie znajdować się w regionie Zachodnie stany USA 2 , a drugie — w regionie Wschodnie stany USA .

Ważne

Zaleca się użycie tej samej grupy zasobów dla wszystkich zasobów utworzonych w tym samouczku. Ułatwi to czyszczenie po zakończeniu pracy.

  1. W usłudze Azure Cloud Shell utwórz grupę zasobów za pomocą następującego polecenia az group create:

    az group create --name contoso-us-resource-group --location eastus
    
  2. Utwórz centrum IoT Hub w lokalizacji eastus i dodaj je do utworzonej grupy zasobów za pomocą następującego polecenia az iot hub create (zastąp {unique-hub-name} własną unikatową nazwą):

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
    

    Wykonanie tego polecenia może potrwać kilka minut.

  3. Teraz utwórz centrum IoT w lokalizacji westus2 i dodaj je do utworzonej grupy zasobów za pomocą następującego polecenia az iot hub create (zastąp {unique-hub-name} własną unikatową nazwą):

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
    

    Wykonanie tego polecenia może potrwać kilka minut.

Tworzenie rejestracji na potrzeby opóźnienia geograficznego

W tej sekcji utworzysz nową grupę rejestracji dla urządzeń.

Dla uproszczenia w tym samouczku jest używane zaświadczenie klucza symetrycznego z rejestracją. Aby uzyskać bezpieczniejsze rozwiązanie, rozważ użycie zaświadczania certyfikatów X.509 z łańcuchem zaufania.

  1. Zaloguj się do Azure Portal i przejdź do wystąpienia usługi Device Provisioning Service.

  2. Wybierz pozycję Zarządzaj rejestracjami w sekcji Ustawienia w menu nawigacji.

  3. Wybierz pozycję Dodaj grupę rejestracji.

  4. Na karcie Rejestracja i aprowizacja na stronie Dodawanie grupy rejestracji podaj następujące informacje, aby skonfigurować szczegóły grupy rejestracji:

    Pole Opis
    Zaświadczanie Wybierz pozycję Klucz symetryczny jako mechanizm zaświadczania.
    Ustawienia klucza symetrycznego Zaznacz pole Automatycznie Generuj klucze symetryczne .
    Nazwa grupy Nazwij grupę contoso-us-devices lub podaj własną nazwę grupy. Nazwa grupy 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 kreska ('-').
  5. Wybierz pozycję Dalej: centra IoT.

  6. Wykonaj następujące kroki, aby dodać dwa centra IoT do grupy rejestracji:

    1. Na karcie Centra IoT na stronie Dodawanie grupy rejestracji wybierz pozycję Dodaj link do centrum IoT Hub w sekcji Docelowe centra IoT .

    2. Na stronie Dodawanie linku do centrum IoT hub wybierz centrum IoT utworzone w regionie eastus i przypisz do niego dostęp iothubowner .

    3. Wybierz pozycję Zapisz.

    4. Ponownie wybierz pozycję Dodaj link do centrum IoT Hub i wykonaj te same kroki, aby dodać centrum IoT utworzone w regionie westus2 .

    5. W menu rozwijanym Docelowe centra IoT wybierz oba centra IoT.

  7. W obszarze Zasady alokacji wybierz pozycję Najmniejsze opóźnienie.

  8. Wybierz pozycję Przejrzyj i utwórz.

  9. Na karcie Przeglądanie + tworzenie sprawdź wszystkie wartości, a następnie wybierz pozycję Utwórz.

  10. Po utworzeniu grupy rejestracji wybierz jej nazwę contoso-us-devices z listy grup rejestracji.

  11. Skopiuj klucz podstawowy. Ten klucz będzie później używany do generowania unikatowych kluczy urządzenia dla obu symulowanych urządzeń.

Tworzenie regionalnych maszyn wirtualnych z systemem Linux

W tej sekcji utworzysz dwie regionalne maszyny wirtualne z systemem Linux, jedną w regionie Zachodnie stany USA 2 i jedną w regionie Wschodnie stany USA 2. Te maszyny wirtualne uruchamiają przykład symulacji urządzeń z każdego regionu, aby zademonstrować aprowizowanie urządzeń dla urządzeń z obu regionów.

Aby ułatwić czyszczenie, dodaj te maszyny wirtualne do tej samej grupy zasobów, która zawiera utworzone centra IoT, contoso-us-resource-group.

  1. W usłudze Azure Cloud Shell uruchom następujące polecenie, aby utworzyć maszynę wirtualną w regionie Wschodnie stany USA po wprowadzeniu następujących zmian parametrów w poleceniu:

    --name: wprowadź unikatową nazwę maszyny wirtualnej urządzenia regionalnego Wschodnie stany USA .

    --admin-username: użyj własnej nazwy użytkownika administratora.

    --admin-password: użyj własnego hasła administratora.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceEast \
    --location eastus \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Wykonanie tego polecenia potrwa kilka minut.

  2. Po zakończeniu polecenia skopiuj wartość publicIpAddress dla maszyny wirtualnej regionu Wschodnie stany USA.

  3. W usłudze Azure Cloud Shell uruchom polecenie , aby utworzyć maszynę wirtualną w regionie Zachodnie stany USA 2 po wprowadzeniu następujących zmian parametrów w poleceniu:

    --name: wprowadź unikatową nazwę maszyny wirtualnej urządzenia regionalnego w regionie Zachodnie stany USA 2 .

    --admin-username: użyj własnej nazwy użytkownika administratora.

    --admin-password: użyj własnego hasła administratora.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceWest2 \
    --location westus2 \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Wykonanie tego polecenia potrwa kilka minut.

  4. Po zakończeniu wykonywania polecenia skopiuj wartość publicIpAddress dla maszyny wirtualnej regionu Zachodnie stany USA 2.

  5. Otwórz dwie powłoki wiersza polecenia.

  6. Nawiąż połączenie z jedną z regionalnych maszyn wirtualnych w każdej powłoce przy użyciu protokołu SSH.

    Przekaż nazwę użytkownika administratora i publiczny adres IP skopiowany jako parametry do protokołu SSH. Po wyświetleniu monitu wprowadź hasło administratora.

    ssh contosoadmin@1.2.3.4
    
    contosoadmin@ContosoSimDeviceEast:~$
    
    ssh contosoadmin@5.6.7.8
    
    contosoadmin@ContosoSimDeviceWest:~$
    

Przygotowywanie środowiska deweloperskiego zestawu SDK języka C usługi Azure IoT

W tej sekcji sklonujesz zestaw SDK języka C usługi Azure IoT na każdej maszynie wirtualnej. Zestaw SDK zawiera przykład, który symuluje aprowizację urządzenia z każdego regionu.

Dla każdej maszyny wirtualnej:

  1. Zainstaluj narzędzia CMake, g++, gcc i Git przy użyciu następujących poleceń:

    sudo apt-get update
    sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
    
  2. Znajdź i skopiuj nazwę tagu dla najnowszej wersji zestawu SDK.

  3. Sklonuj zestaw SDK urządzenia usługi Azure IoT dla języka C na obu maszynach wirtualnych. Użyj tagu znalezionego w poprzednim kroku jako wartości parametru -b , na przykład: lts_01_2023.

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    Należy się spodziewać, że ukończenie operacji potrwa kilka minut.

  4. Utwórz nowy folder cmake wewnątrz repozytorium i przejdź do tego folderu.

    mkdir ~/azure-iot-sdk-c/cmake
    cd ~/azure-iot-sdk-c/cmake
    
  5. Uruchom następujące polecenie, które kompiluje wersję zestawu SDK specyficzną dla platformy klienta dewelopera:

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    
  6. Gdy kompilacja zakończy się powodzeniem, kilka ostatnich wierszy danych wyjściowych będzie wyglądać podobnie do następujących danych wyjściowych:

    -- IoT Client SDK Version = 1.7.0
    -- Provisioning SDK Version = 1.7.0
    -- Looking for include file stdint.h
    -- Looking for include file stdint.h - found
    -- Looking for include file stdbool.h
    -- Looking for include file stdbool.h - found
    -- target architecture: x86_64
    -- Performing Test CXX_FLAG_CXX11
    -- Performing Test CXX_FLAG_CXX11 - Success
    -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so
    -- target architecture: x86_64
    -- iothub architecture: x86_64
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/contosoadmin/azure-iot-sdk-c/azure-iot-sdk-c
    

Uzyskiwanie unikatowych kluczy urządzeń

W przypadku korzystania z zaświadczania klucza symetrycznego z rejestracjami grup nie należy używać kluczy grupy rejestracji bezpośrednio. Zamiast tego uzyskujesz unikatowy klucz z klucza grupy rejestracji dla każdego urządzenia.

W tej części samouczka wygenerujesz klucz urządzenia z klucza głównego grupy w celu obliczenia HMAC-SHA256 unikatowego identyfikatora rejestracji urządzenia. Wynik zostanie następnie przekonwertowany na format Base64.

Ważne

Nie dołączaj klucza głównego grupy do kodu urządzenia.

W przypadku urządzeń eastus i westus2:

  1. Wygeneruj unikatowy klucz przy użyciu polecenia openssl. Użyjesz następującego skryptu powłoki powłoki Bash (zastąp element {primary-key} kluczem podstawowym skopiowanego wcześniej klucza grupy rejestracji i zastąpisz {contoso-simdevice}go własnym unikatowym identyfikatorem rejestracji dla każdego urządzenia. 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 ('-').

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

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    
  3. Teraz każde urządzenie ma własny klucz urządzenia pochodnego i unikatowy identyfikator rejestracji w celu przeprowadzenia zaświadczania klucza symetrycznego z grupą rejestracji podczas procesu aprowizacji.

Symulowanie urządzeń z każdego regionu

W tej sekcji zaktualizujesz przykład aprowizacji w zestawie SDK języka C usługi Azure IoT dla obu regionalnych maszyn wirtualnych.

Przykładowy kod symuluje sekwencję rozruchu urządzenia, która wysyła żądanie aprowizacji do wystąpienia usługi Device Provisioning Service. Sekwencja rozruchowa powoduje rozpoznawanie i przypisywanie urządzenia do centrum IoT, które jest najbliższe na podstawie opóźnienia.

  1. W Azure Portal wybierz kartę Przegląd usługi Device Provisioning Service i zanotuj wartość Zakres identyfikatora.

    Wyodrębnij informacje o punkcie końcowym usługi Device Provisioning z bloku portalu.

  2. W obu maszynach wirtualnych otwórz plik ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c , aby go edytować.

    vi ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c
    
  3. Na obu maszynach wirtualnych znajdź stałą id_scope i zastąp wartość wartością Zakres identyfikatora skopiowaną wcześniej.

    static const char* id_scope = "0ne00002193";
    
  4. Na obu maszynach wirtualnych znajdź definicję main() funkcji w tym samym pliku. Upewnij się, że zmienna hsm_type jest ustawiona na SECURE_DEVICE_TYPE_SYMMETRIC_KEY tak, jak pokazano poniżej, aby dopasować metodę zaświadczania grupy rejestracji.

    Zapisz zmiany w plikach na obu maszynach wirtualnych.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  5. Na obu maszynach wirtualnych znajdź wywołanie metody prov_dev_set_symmetric_key_info() w pliku prov_dev_client_sample.c , które zostało skomentowane.

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    Usuń komentarz z wywołań funkcji i zastąp wartości symbolu zastępczego (w tym nawiasy kątowe) unikatowymi identyfikatorami rejestracji i pochodnymi kluczami urządzeń dla każdego urządzenia uzyskanego w poprzedniej sekcji. Klucze pokazane poniżej to przykłady. Użyj wygenerowanych wcześniej kluczy.

    Wschodnie stany USA:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
    

    Zachodnie stany USA:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
    
  6. Na obu maszynach wirtualnych zapisz plik.

  7. Na obu maszynach wirtualnych przejdź do przykładowego folderu pokazanego poniżej i skompiluj przykład.

    cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/
    cmake --build . --target prov_dev_client_sample --config Debug
    
  8. Po pomyślnym zakończeniu kompilacji uruchom prov_dev_client_sample.exe na obu maszynach wirtualnych, aby symulować urządzenie z każdego regionu. Zwróć uwagę, że każde urządzenie jest przydzielane do centrum IoT znajdującego się najbliżej regionu symulowanego urządzenia.

    Uruchom symulację:

    ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
    

    Przykładowe dane wyjściowe z maszyny wirtualnej Wschodnie stany USA:

    contosoadmin@ContosoSimDeviceEast:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-east-hub.azure-devices.net, deviceId: contoso-simdevice-east
    Press enter key to exit:
    
    

    Przykładowe dane wyjściowe z maszyny wirtualnej Zachodnie stany USA:

    contosoadmin@ContosoSimDeviceWest:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-west-hub.azure-devices.net, deviceId: contoso-simdevice-west
    Press enter key to exit:
    

Czyszczenie zasobów

Jeśli planujesz kontynuować pracę z zasobami utworzonymi w tym samouczku, możesz je pozostawić. W przeciwnym razie wykonaj następujące kroki, aby usunąć wszystkie zasoby utworzone przez ten samouczek, aby uniknąć niepotrzebnych opłat.

W poniższych krokach założono, że wszystkie zasoby utworzone w tym samouczku zostały utworzone zgodnie z instrukcjami w tej samej grupie zasobów o nazwie contoso-us-resource-group.

Ważne

Usunięcie grupy zasobów jest nieodwracalne. Grupa zasobów oraz wszystkie zawarte w niej zasoby zostaną trwale usunięte. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub niewłaściwej grupy zasobów. Jeśli usługa IoT Hub została utworzona wewnątrz istniejącej grupy zasobów zawierającej zasoby, które chcesz zachować, zamiast usuwać całą grupę zasobów, usuń tylko zasób usługi IoT Hub.

Aby usunąć grupę zasobów według nazwy:

  1. Zaloguj się w witrynie Azure Portal.

  2. Wybierz pozycję Grupy zasobów.

  3. W polu tekstowym Filtruj według nazwy ... wpisz nazwę grupy zasobów zawierającej zasoby contoso-us-resource-group.

  4. Z prawej strony grupy zasobów na liście wyników kliknij pozycję ..., a następnie kliknij pozycję Usuń grupę zasobów.

  5. Zostanie wyświetlony monit o potwierdzenie usunięcia grupy zasobów. Wpisz ponownie nazwę grupy zasobów, aby potwierdzić, a następnie wybierz pozycję Usuń. Po krótkim czasie grupa zasobów i wszystkie zawarte w niej zasoby zostaną usunięte.

Następne kroki

Aby dowiedzieć się więcej na temat niestandardowych zasad alokacji, zobacz