Wprowadzenie do tożsamości modułu IoT Hub i bliźniaczej reprezentacji modułu (Node.js)

Tożsamości modułów i bliźniacze reprezentacje modułów są podobne do tożsamości urządzenia i bliźniaczej reprezentacji urządzenia usługi Azure IoT Hub, ale zapewniają większy stopień szczegółowości. Podczas gdy Azure IoT Hub tożsamości urządzenia i bliźniaczej reprezentacji urządzenia umożliwiają aplikacji zaplecza skonfigurowanie urządzenia i zapewnienie widoczności warunków urządzenia, tożsamość modułu i bliźniacze reprezentacja modułu zapewniają te możliwości dla poszczególnych składników urządzenia. Na urządzeniach z obsługą wielu składników, takich jak urządzenia z systemem operacyjnym lub urządzeniami układowymi, umożliwia odizolowaną konfigurację i warunki dla każdego składnika.

Uwaga

Funkcje opisane w tym artykule są dostępne tylko w warstwie Standardowa IoT Hub. Aby uzyskać więcej informacji na temat warstw podstawowych i standardowych/bezpłatnych IoT Hub, zobacz Wybieranie odpowiedniej warstwy IoT Hub dla rozwiązania.

Na końcu tego artykułu masz dwie aplikacje Node.js:

  • CreateIdentities: tworzy tożsamość urządzenia, tożsamość modułu i skojarzone klucze zabezpieczeń w celu połączenia klientów urządzenia i modułu.

  • UpdateModuleTwinReportedProperties: wysyła zaktualizowaną reprezentację modułu, zgłaszane właściwości do IoT Hub.

Uwaga

Aby uzyskać więcej informacji na temat narzędzi zestawu SDK dostępnych do kompilowania aplikacji zarówno urządzeń, jak i zaplecza, zobacz Zestawy SDK usługi Azure IoT.

Wymagania wstępne

Uwierzytelnianie modułu

Do uwierzytelniania tożsamości modułów można użyć kluczy symetrycznych lub certyfikatów X.509. W przypadku uwierzytelniania certyfikatu X.509 certyfikat modułu musi mieć jego nazwę pospolitą (CN) sformatowaną na przykład CN=<deviceid>/<moduleid>. Na przykład:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

Pobieranie parametrów połączenia centrum IoT Hub

W tym artykule utworzysz usługę zaplecza, która dodaje urządzenie w rejestrze tożsamości, a następnie dodaje moduł do tego urządzenia. Usługa wymaga uprawnień do zapisu rejestru . Domyślnie każde centrum IoT jest tworzone z zasadami dostępu współdzielonego o nazwie registryReadWrite , która przyznaje to uprawnienie.

Aby uzyskać parametry połączenia IoT Hub dla zasad registryReadWrite, wykonaj następujące kroki:

  1. W Azure Portal wybierz pozycję Grupy zasobów. Wybierz grupę zasobów, w której znajduje się centrum, a następnie wybierz centrum z listy zasobów.

  2. W okienku po lewej stronie centrum wybierz pozycję Zasady dostępu współdzielonego.

  3. Z listy zasad wybierz zasady registryReadWrite .

  4. Skopiuj podstawowe parametry połączenia i zapisz wartość.

    Przechwytywanie ekranu pokazujące sposób pobierania parametrów połączenia

Aby uzyskać więcej informacji na temat zasad i uprawnień dostępu współdzielonego IoT Hub, zobacz Kontrola dostępu i uprawnienia.

Tworzenie tożsamości urządzenia i tożsamości modułu w IoT Hub

W tej sekcji utworzysz aplikację Node.js, która tworzy tożsamość urządzenia i tożsamość modułu w rejestrze tożsamości w centrum IoT. Urządzenie lub moduł nie może nawiązać połączenia z centrum IoT, chyba że ma wpis w rejestrze tożsamości. Aby uzyskać więcej informacji, zobacz Omówienie rejestru tożsamości w centrum IoT. Uruchomienie tej aplikacji konsolowej powoduje wygenerowanie unikatowego identyfikatora i klucza zarówno dla urządzenia, jak i modułu. Identyfikator i klucz są uwzględniane wielkości liter. Urządzenie i moduł korzystają z tych wartości w celu identyfikowania się podczas wysyłania komunikatów urządzenie-chmura do usługi IoT Hub.

  1. Utwórz katalog do przechowywania kodu.

  2. Wewnątrz tego katalogu najpierw uruchom polecenie npm init -y , aby utworzyć pusty plik package.json z wartościami domyślnymi. Jest to plik projektu dla kodu.

  3. Uruchom polecenie npm install -S azure-iothub@modules-preview , aby zainstalować zestaw SDK usługi w podkatalogu node_modules .

    Uwaga

    Nazwa podkatalogu node_modules używa modułu word, aby oznaczać "bibliotekę węzłów". Termin ten nie ma nic wspólnego z modułami IoT Hub.

  4. Utwórz następujący plik .js w katalogu. Nazwij go add.js. Skopiuj i wklej parametry połączenia centrum i nazwę centrum.

    var Registry = require('azure-iothub').Registry;
    var uuid = require('uuid');
    // Copy/paste your connection string and hub name here
    var serviceConnectionString = '<hub connection string from portal>';
    var hubName = '<hub name>.azure-devices.net';
    // Create an instance of the IoTHub registry
    var registry = Registry.fromConnectionString(serviceConnectionString);
    // Insert your device ID and moduleId here.
    var deviceId = 'myFirstDevice';
    var moduleId = 'myFirstModule';
    // Create your device as a SAS authentication device
    var primaryKey = new Buffer(uuid.v4()).toString('base64');
    var secondaryKey = new Buffer(uuid.v4()).toString('base64');
    var deviceDescription = {
      deviceId: deviceId,
      status: 'enabled',
      authentication: {
        type: 'sas',
        symmetricKey: {
          primaryKey: primaryKey,
          secondaryKey: secondaryKey
        }
      }
    };
    
    // First, create a device identity
    registry.create(deviceDescription, function(err) {
      if (err) {
        console.log('Error creating device identity: ' + err);
        process.exit(1);
      }
      console.log('device connection string = "HostName=' + hubName + ';DeviceId=' + deviceId + ';SharedAccessKey=' + primaryKey + '"');
    
      // Then add a module to that device
      registry.addModule({ deviceId: deviceId, moduleId: moduleId }, function(err) {
        if (err) {
          console.log('Error creating module identity: ' + err);
          process.exit(1);
        }
    
        // Finally, retrieve the module details from the hub so we can construct the connection string
        registry.getModule(deviceId, moduleId, function(err, foundModule) {
          if (err) {
            console.log('Error getting module back from hub: ' + err);
            process.exit(1);
          }
          console.log('module connection string = "HostName=' + hubName + ';DeviceId=' + foundModule.deviceId + ';ModuleId='+foundModule.moduleId+';SharedAccessKey=' + foundModule.authentication.symmetricKey.primaryKey + '"');
          process.exit(0);
        });
      });
    });
    
    

Ta aplikacja tworzy tożsamość urządzenia o identyfikatorze myFirstDevice i tożsamości modułu o identyfikatorze myFirstModule w obszarze urządzenia myFirstDevice. (Jeśli ten identyfikator modułu już istnieje w rejestrze tożsamości, kod po prostu pobiera informacje o istniejącym module). Następnie aplikacja wyświetla klucz podstawowy dla tej tożsamości. Tego klucza używa się w symulowanej aplikacji modułu, aby nawiązać połączenie z centrum IoT.

Uruchom to polecenie przy użyciu add.js węzła. Zapewni to parametry połączenia dla tożsamości urządzenia i inną dla tożsamości modułu.

Uwaga

Rejestr tożsamości usługi IoT Hub przechowuje tożsamości urządzenia i modułu tylko po to, aby umożliwić bezpieczny dostęp do centrum IoT. W rejestrze tożsamości są przechowywane identyfikatory urządzeń i klucze służące jako poświadczenia zabezpieczeń. W rejestrze tożsamości są także przechowywane flagi włączenia/wyłączenia dla każdego urządzenia, za pomocą których można wyłączyć dostęp do danego urządzenia. Jeśli aplikacja wymaga przechowywania innych metadanych dla określonego urządzenia, powinna korzystać z magazynu określonego dla aplikacji. Nie istnieje flaga włączenia/wyłączenia tożsamości modułów. Aby uzyskać więcej informacji, zobacz Omówienie rejestru tożsamości w IoT Hub w przewodniku dewelopera IoT Hub.

Aktualizowanie bliźniaczej reprezentacji modułu przy użyciu zestawu SDK urządzenia Node.js

W tej sekcji utworzysz aplikację Node.js na urządzeniu symulowanym, który aktualizuje zgłaszane właściwości bliźniaczej reprezentacji modułu.

  1. Pobierz parametry połączenia modułu. Zaloguj się w witrynie Azure Portal. Przejdź do IoT Hub i wybierz pozycję Urządzenia IoT. Znajdź plik myFirstDevice, otwórz go i zobaczysz, że moduł myFirstModule został pomyślnie utworzony. Skopiuj parametry połączenia modułu. Będą potrzebne w następnym kroku.

    Szczegóły modułu w witrynie Azure Portal

  2. Podobnie jak w poprzedniej sekcji, utwórz katalog dla kodu urządzenia i użyj narzędzia NPM, aby zainicjować go i zainstalować zestaw SDK urządzenia (npm install -S azure-iot-device-amqp@modules-preview).

    Uwaga

    Polecenie npm install może działać wolno. Bądź cierpliwy; ściąga wiele kodu z repozytorium pakietów.

    Uwaga

    Jeśli zobaczysz błąd informujący o błędzie npm ERR! błąd rejestru podczas analizowania kodu json. Jest to bezpieczne do zignorowania. Jeśli zobaczysz błąd informujący o błędzie npm ERR! błąd rejestru podczas analizowania kodu json. Jest to bezpieczne do zignorowania.

  3. Utwórz plik o nazwie twin.js. Skopiuj i wklej ciąg tożsamości modułu.

    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-amqp').Amqp;
    // Copy/paste your module connection string here.
    var connectionString = '<insert module connection string here>';
    // Create a client using the Amqp protocol.
    var client = Client.fromConnectionString(connectionString, Protocol);
    client.on('error', function (err) {
      console.error(err.message);
    });
    // connect to the hub
    client.open(function(err) {
      if (err) {
        console.error('error connecting to hub: ' + err);
        process.exit(1);
      }
      console.log('client opened');
    // Create device Twin
      client.getTwin(function(err, twin) {
        if (err) {
          console.error('error getting twin: ' + err);
          process.exit(1);
        }
        // Output the current properties
        console.log('twin contents:');
        console.log(twin.properties);
        // Add a handler for desired property changes
        twin.on('properties.desired', function(delta) {
            console.log('new desired properties received:');
            console.log(JSON.stringify(delta));
        });
        // create a patch to send to the hub
        var patch = {
          updateTime: new Date().toString(),
          firmwareVersion:'1.2.1',
          weather:{
            temperature: 72,
            humidity: 17
          }
        };
        // send the patch
        twin.properties.reported.update(patch, function(err) {
          if (err) throw err;
          console.log('twin state reported');
        });
      });
    });
    
  4. Teraz uruchom polecenie przy użyciu węzła polecenia twin.js.

    F:\temp\module_twin>node twin.js
    

    Następnie zobaczysz:

    client opened
    twin contents:
    { reported: { update: [Function: update], '$version': 1 },
      desired: { '$version': 1 } }
    new desired properties received:
    {"$version":1}
    twin state reported
    

Następne kroki

Aby kontynuować wprowadzenie do usługi IoT Hub i zapoznać się z innymi scenariuszami IoT, zobacz: