Oktatóanyag: Egyéni foglalási szabályzatok használata a Device Provisioning Service (DPS) szolgáltatással

Az egyéni foglalási szabályzatokkal jobban szabályozhatja, hogy az eszközök hogyan legyenek hozzárendelve az IoT Hubokhoz. Egyéni foglalási szabályzatokkal saját foglalási szabályzatokat határozhat meg, ha az Azure IoT Hub Device Provisioning Service (DPS) által biztosított szabályzatok nem felelnek meg a forgatókönyv követelményeinek. Az egyéni foglalási szabályzatokat az Azure Functionsben üzemeltetett webhookban implementáljuk, és egy vagy több egyéni regisztrációra és/vagy regisztrációs csoportra konfiguráljuk. Amikor egy eszköz egy konfigurált regisztrációs bejegyzéssel regisztrál a DPS-ben, a DPS meghívja a webhookot, hogy megtudja, melyik IoT Hubra kell regisztrálni az eszközt, és szükség esetén a kezdeti állapotára. További információ: Az egyéni foglalási szabályzatok ismertetése.

Ez az oktatóanyag egy egyéni foglalási szabályzatot mutat be egy C# nyelven írt Azure-függvény használatával. Az eszközök két IoT Hub egyikéhez vannak rendelve, amelyek a Contoso Toasters divíziót és a Contoso hőszivattyús részleget képviselik. A kiépítést kérő eszközöknek olyan regisztrációs azonosítóval kell rendelkezniük, amely a következő utótagok egyikével rendelkezik a kiépítéshez:

  • -contoso-tstrsd-007 a Contoso Kenyérpirítók Divízióhoz
  • -contoso-hpsd-088 for the Contoso Heat Pumps Division

Az eszközök az Azure IoT C SDK-ban található kiépítési mintával szimulálhatók.

Ebben az oktatóanyagban a következőket fogja elvégezni:

  • Az Azure CLI használatával hozzon létre egy DPS-példányt, és hozzon létre és csatoljon hozzá két Contoso divízió IoT-központot (Contoso Toasters Division és Contoso Heat Pumps Division).
  • Hozzon létre egy Azure-függvényt, amely implementálja az egyéni foglalási szabályzatot.
  • Hozzon létre egy új regisztrációs csoportot, amely az Azure-függvényt használja az egyéni foglalási szabályzathoz.
  • Eszköz szimmetrikus kulcsainak létrehozása két szimulált eszközhöz.
  • Az Azure IoT C SDK fejlesztési környezetének beállítása.
  • Szimulálja az eszközöket, és ellenőrizze, hogy ki vannak-e építve az egyéni foglalási szabályzat példakódjának megfelelően.

Ha nem rendelkezik Azure-előfizetéssel, első lépésként hozzon létre egy ingyenes Azure-fiókot.

Előfeltételek

Az alábbi előfeltételek a Windows fejlesztői környezethez tartoznak. Linux vagy macOS esetén lásd a fejlesztési környezet előkészítése című szakaszt az SDK dokumentációjában.

A kiépítési szolgáltatás és két IoT Hub létrehozása

Ebben a szakaszban az Azure Cloud Shell használatával hoz létre egy kiépítési szolgáltatást és két IoT Hubot, amelyek a Contoso Kenyérpirítók divíziót és a Contoso Hőszivattyúk divíziót képviselik.

  1. Először állítson be környezeti változókat a munkaterületen, hogy egyszerűsítse az oktatóanyag parancsait.

    A DPS- és IoT Hub-neveknek globálisan egyedinek kell lenniük. Cserélje le a SUFFIX helyőrzőt a saját értékére.

    Emellett az oktatóanyag későbbi részében létrehozott Azure-függvénykód olyan IoT-központokat is keres, amelyek vagy -toasters--heatpumps- a nevükben szerepelnek. Ha módosítja a javasolt értékeket, mindenképpen használjon olyan neveket, amelyek tartalmazzák a szükséges részstringeket.

    #!/bin/bash
    export RESOURCE_GROUP="contoso-us-resource-group"
    export LOCATION="westus"
    export DPS="contoso-provisioning-service-SUFFIX"
    export TOASTER_HUB="contoso-toasters-hub-SUFFIX"
    export HEATPUMP_HUB="contoso-heatpumps-hub-SUFFIX"
    
    # PowerShell
    $env:RESOURCE_GROUP = "contoso-us-resource-group"
    $env:LOCATION = "westus"
    $env:DPS = "contoso-provisioning-service-SUFFIX"
    $env:TOASTER_HUB = "contoso-toasters-hub-SUFFIX"
    $env:HEATPUMP_HUB = "contoso-heatpumps-hub-SUFFIX"
    

    Tipp.

    Az oktatóanyagban használt parancsok alapértelmezés szerint az USA nyugati régiójában hoznak létre erőforrásokat. Javasoljuk, hogy az erőforrásokat az Önhöz legközelebbi régióban hozza létre, amely támogatja a Device Provisioning Service szolgáltatást. Az elérhető helyek listájának megtekintéséhez lépjen az Azure Állapot lapjára, és keresse meg a "Device Provisioning Service" kifejezést. A parancsokban a helyek egy vagy többszavas formátumban is megadhatóak; például: westus, USA nyugati régiója, USA nyugati régiója stb. Az érték nem megkülönbözteti a kis- és nagybetűk értékét.

  2. Az az group create paranccsal hozzon létre egy Azure-erőforráscsoportot. Az Azure-erőforráscsoport olyan logikai tároló, amelybe a rendszer üzembe helyezi és kezeli az Azure-erőforrásokat.

    Az alábbi példa létrehoz egy erőforráscsoportot. Javasoljuk, hogy egyetlen csoportot használjon az oktatóanyagban létrehozott összes erőforráshoz. Ez a módszer megkönnyíti a tisztítást a befejezés után.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Az az iot dps create paranccsal hozza létre a Device Provisioning Service (DPS) egy példányát. A kiépítési szolgáltatás hozzá lesz adva a contoso-us-resource-grouphoz.

    az iot dps create --name $DPS --resource-group $RESOURCE_GROUP --location $LOCATION
    

    A parancs végrehajtása eltarthat néhány percig.

  4. Az az iot hub create parancsával hozza létre a Contoso Toasters Division IoT Hubot. Az IoT Hub hozzá lesz adva a contoso-us-resource-grouphoz.

    az iot hub create --name $TOASTER_HUB --resource-group $RESOURCE_GROUP --location $LOCATION --sku S1
    

    A parancs végrehajtása eltarthat néhány percig.

  5. Az az iot hub create parancsával hozza létre a Contoso Hőszivattyúk Divízió IoT Hubot. Ez az IoT Hub a contoso-us-resource-grouphoz is hozzáadódik.

    az iot hub create --name $HEATPUMP_HUB --resource-group $RESOURCE_GROUP --location $LOCATION --sku S1
    

    A parancs végrehajtása eltarthat néhány percig.

  6. Futtassa az alábbi két parancsot a létrehozott központok kapcsolati sztring lekéréséhez.

    az iot hub connection-string show --hub-name $TOASTER_HUB --key primary --query connectionString -o tsv
    az iot hub connection-string show --hub-name $HEATPUMP_HUB --key primary --query connectionString -o tsv
    
  7. Futtassa az alábbi parancsokat a központok DPS-erőforráshoz való csatolásához. Cserélje le a helyőrzőket az előző lépésben szereplő központi kapcsolati sztring.

    az iot dps linked-hub create --dps-name $DPS --resource-group $RESOURCE_GROUP --location $LOCATION --connection-string <toaster_hub_connection_string>
    az iot dps linked-hub create --dps-name $DPS --resource-group $RESOURCE_GROUP --location $LOCATION --connection-string <heatpump_hub_connection_string>
    

Az egyéni foglalási függvény létrehozása

Ebben a szakaszban létrehoz egy Azure-függvényt, amely implementálja az egyéni foglalási szabályzatot. Ez a függvény dönti el, hogy az eszköz melyik osztási IoT Hubra legyen regisztrálva annak alapján, hogy a regisztrációs azonosítója tartalmazza-e a -contoso-tstrsd-007 vagy a -contoso-hpsd-088 sztringet. Az ikereszköz kezdeti állapotát is beállítja attól függően, hogy az eszköz kenyérpirító vagy hőszivattyú.

  1. Jelentkezzen be az Azure Portalra.

  2. A keresőmezőben keresse meg és válassza a Függvényalkalmazás lehetőséget.

  3. Válassza a Függvényalkalmazás létrehozása vagy létrehozása lehetőséget.

  4. A Függvényalkalmazás létrehozása lap Alapszintű beállítások lapján adja meg az új függvényalkalmazás alábbi beállításait, és válassza a Véleményezés + létrehozás lehetőséget:

    Paraméter Érték
    Előfizetés Győződjön meg arról, hogy az oktatóanyag erőforrásait létrehozó előfizetés ki van választva.
    Erőforráscsoport Válassza ki az előző szakaszban létrehozott erőforráscsoportot. Az előző szakaszban megadott alapértelmezett érték a contoso-us-resource-group.
    Függvényalkalmazás neve Adjon nevet a függvényalkalmazásnak.
    Kódot vagy tárolórendszerképet szeretne üzembe helyezni? Kód
    Futtatókörnyezeti verem .NET
    Verzió Válasszon ki egy folyamaton belüli modellverziót .
    Régió Válasszon ki egy Önhöz közeli régiót.

    Feljegyzés

    Alapértelmezés szerint az alkalmazás Elemzések engedélyezve van. Az oktatóanyaghoz nem szükséges alkalmazás Elemzések, de segíthet megérteni és kivizsgálni az egyéni foglalással kapcsolatos problémákat. Ha szeretné, letilthatja az alkalmazás Elemzések a Figyelés fülre kattintva, majd a Nem gombra kattintva engedélyezheti az alkalmazás Elemzések.

    Képernyőkép a Függvényalkalmazás létrehozása űrlapról az Azure Portalon.

  5. A Véleményezés + létrehozás lapon válassza a Létrehozás lehetőséget a függvényalkalmazás létrehozásához.

  6. Az üzembe helyezés több percet is igénybe vehet. Ha befejeződött, válassza az Ugrás az erőforrásra lehetőséget.

  7. A függvényalkalmazás Áttekintés lapjának bal oldali ablaktábláján válassza a Függvény létrehozása lehetőséget.

    Képernyőkép az Azure Portalon a függvény létrehozásának lehetőségének kiválasztásáról.

  8. A Függvény létrehozása lapon válassza a HTTP-eseményindító sablont, majd kattintson a Tovább gombra.

  9. A Sablon részletei lapon válassza a Névtelen lehetőséget engedélyezési szintként, majd válassza a Létrehozás lehetőséget.

    Az engedélyezési szint névtelenként való beállítását bemutató képernyőkép.

    Tipp.

    Ha az engedélyezési szintet függvényként tartja, akkor a DPS-regisztrációkat a függvény API-kulcsával kell konfigurálnia. További információ: Azure Functions HTTP-eseményindító.

  10. Amikor megnyílik a HttpTrigger1 függvény, válassza a Kód + Teszt lehetőséget a bal oldali panelen. Ez lehetővé teszi a függvény kódjának szerkesztését. A run.csx kódfájlt meg kell nyitni szerkesztésre.

  11. Referencia szükséges NuGet-csomagokra. A kezdeti ikereszköz létrehozásához az egyéni foglalási függvény két NuGet-csomagban definiált osztályokat használ, amelyeket be kell tölteni az üzemeltetési környezetbe. Az Azure Functionsben a NuGet-csomagokra egy function.proj fájl hivatkozik. Ebben a lépésben egy function.proj fájlt menthet és tölthet fel a szükséges szerelvényekhez. További információ: NuGet-csomagok használata az Azure Functions használatával.

    1. Másolja a következő sorokat a kedvenc szerkesztőbe, és mentse a fájlt a számítógépre function.proj fájlként.

      <Project Sdk="Microsoft.NET.Sdk">  
          <PropertyGroup>  
              <TargetFramework>netstandard2.0</TargetFramework>  
          </PropertyGroup>  
          <ItemGroup>  
              <PackageReference Include="Microsoft.Azure.Devices.Provisioning.Service" Version="1.18.1" />
              <PackageReference Include="Microsoft.Azure.Devices.Shared" Version="1.30.1" />
          </ItemGroup>  
      </Project>
      
    2. A függvény.proj fájl feltöltéséhez kattintson a kódszerkesztő fölött található Feltöltés gombra. A feltöltés után válassza ki a fájlt a kódszerkesztőben a legördülő listával a tartalom ellenőrzéséhez.

    3. Válassza ki a function.proj fájlt a kódszerkesztőben, és ellenőrizze annak tartalmát. Ha a function.proj fájl üres, másolja a fenti sorokat a fájlba, és mentse. (Néha a feltöltés a tartalom feltöltése nélkül hozza létre a fájlt.)

  12. Győződjön meg arról, hogy a HttpTrigger1 run.csx fájlja ki van jelölve a kódszerkesztőben. Cserélje le a HttpTrigger1 függvény kódját a következő kódra, és válassza a Mentés lehetőséget:

    #r "Newtonsoft.Json"
    
    using System.Net;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Newtonsoft.Json;
    
    using Microsoft.Azure.Devices.Shared;               // For TwinCollection
    using Microsoft.Azure.Devices.Provisioning.Service; // For TwinState
    
    public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        // Get request body
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
    
        log.LogInformation("Request.Body:...");
        log.LogInformation(requestBody);
    
        // Get registration ID of the device
        string regId = data?.deviceRuntimeContext?.registrationId;
    
        string message = "Uncaught error";
        bool fail = false;
        ResponseObj obj = new ResponseObj();
    
        if (regId == null)
        {
            message = "Registration ID not provided for the device.";
            log.LogInformation("Registration ID : NULL");
            fail = true;
        }
        else
        {
            string[] hubs = data?.linkedHubs?.ToObject<string[]>();
    
            // Must have hubs selected on the enrollment
            if (hubs == null)
            {
                message = "No hub group defined for the enrollment.";
                log.LogInformation("linkedHubs : NULL");
                fail = true;
            }
            else
            {
                // This is a Contoso Toaster Model 007
                if (regId.Contains("-contoso-tstrsd-007"))
                {
                    //Find the "-toasters-" IoT hub configured on the enrollment
                    foreach(string hubString in hubs)
                    {
                        if (hubString.Contains("-toasters-"))
                            obj.iotHubHostName = hubString;
                    }
    
                    if (obj.iotHubHostName == null)
                    {
                        message = "No toasters hub found for the enrollment.";
                        log.LogInformation(message);
                        fail = true;
                    }
                    else
                    {
                        // Specify the initial tags for the device.
                        TwinCollection tags = new TwinCollection();
                        tags["deviceType"] = "toaster";
    
                        // Specify the initial desired properties for the device.
                        TwinCollection properties = new TwinCollection();
                        properties["state"] = "ready";
                        properties["darknessSetting"] = "medium";
    
                        // Add the initial twin state to the response.
                        TwinState twinState = new TwinState(tags, properties);
                        obj.initialTwin = twinState;
                    }
                }
                // This is a Contoso Heat pump Model 008
                else if (regId.Contains("-contoso-hpsd-088"))
                {
                    //Find the "-heatpumps-" IoT hub configured on the enrollment
                    foreach(string hubString in hubs)
                    {
                        if (hubString.Contains("-heatpumps-"))
                            obj.iotHubHostName = hubString;
                    }
    
                    if (obj.iotHubHostName == null)
                    {
                        message = "No heat pumps hub found for the enrollment.";
                        log.LogInformation(message);
                        fail = true;
                    }
                    else
                    {
                        // Specify the initial tags for the device.
                        TwinCollection tags = new TwinCollection();
                        tags["deviceType"] = "heatpump";
    
                        // Specify the initial desired properties for the device.
                        TwinCollection properties = new TwinCollection();
                        properties["state"] = "on";
                        properties["temperatureSetting"] = "65";
    
                        // Add the initial twin state to the response.
                        TwinState twinState = new TwinState(tags, properties);
                        obj.initialTwin = twinState;
                    }
                }
                // Unrecognized device.
                else
                {
                    fail = true;
                    message = "Unrecognized device registration.";
                    log.LogInformation("Unknown device registration");
                }
            }
        }
    
        log.LogInformation("\nResponse");
        log.LogInformation((obj.iotHubHostName != null) ? JsonConvert.SerializeObject(obj) : message);
    
        return (fail)
            ? new BadRequestObjectResult(message) 
            : (ActionResult)new OkObjectResult(obj);
    }
    
    public class ResponseObj
    {
        public string iotHubHostName {get; set;}
        public TwinState initialTwin {get; set;}
    }
    

A regisztráció létrehozása

Ebben a szakaszban egy új regisztrációs csoportot hoz létre, amely az egyéni foglalási szabályzatot használja. Az egyszerűség kedvéért ez az oktatóanyag szimmetrikus kulcsigazolást használ a regisztrációval. A biztonságosabb megoldás érdekében fontolja meg az X.509-tanúsítványigazolás használatát egy bizalmi lánccal.

  1. Jelentkezzen be az Azure Portalra , és keresse meg a Device Provisioning Service-példányt.

  2. A navigációs menü Gépház szakaszában válassza a Regisztrációkkezelése lehetőséget.

  3. Válassza a Regisztrációs csoport hozzáadása lehetőséget.

  4. A Regisztrációs csoport hozzáadása lap Regisztráció + kiépítés lapján adja meg a következő információkat a regisztrációs csoport adatainak konfigurálásához:

    Mező Leírás
    Igazolás Válassza ki a szimmetrikus kulcsot az igazolási mechanizmusként.
    Szimmetrikus kulcsbeállítások Jelölje be a Szimmetrikus kulcsok automatikus létrehozása jelölőnégyzetet.
    Csoport neve Csoportnévként adja meg a contoso-custom-allocated-devices nevet.
    Kiépítés állapota Jelölje be a Regisztráció engedélyezése jelölőnégyzetet.
  5. Válassza a Tovább: IoT Hubs lehetőséget.

  6. A Regisztrációs csoport hozzáadása lap IoT Hubs lapján adja meg az alábbi információkat annak megállapításához, hogy a regisztrációs csoport mely IoT Hubok számára építhet ki eszközöket:

    Mező Leírás
    Cél IoT Hubok Válasszon ki egy vagy több csatolt IoT Hubot, vagy adjon hozzá egy új hivatkozást egy IoT Hubhoz.
    Foglalási szabályzat Válassza az Egyéni (az Azure-függvény használata) lehetőséget. Válassza az Azure-függvény kiválasztása lehetőséget, majd kövesse az utasításokat az oktatóanyaghoz létrehozott függvény kiválasztásához.
  7. Válassza az Áttekintés + létrehozás lehetőséget.

  8. A Véleményezés + létrehozás lapon ellenőrizze az összes értéket, majd válassza a Létrehozás lehetőséget.

A regisztráció mentése után nyissa meg újra, és jegyezze fel az elsődleges kulcsot. A kulcsok létrehozásához először mentenie kell a regisztrációt. Ez a kulcs a szimulált eszközök egyedi eszközkulcsainak létrehozásához használható a következő szakaszban.

Egyedi eszközkulcsok levezetése

Az eszközök nem használják közvetlenül a regisztrációs csoport elsődleges szimmetrikus kulcsát. Ehelyett az elsődleges kulccsal kell levezetni az eszközkulcsot az egyes eszközökhöz. Ebben a szakaszban két egyedi eszközkulcsot hoz létre. Egy kulccsal szimulált kenyérpirító eszköz használható. A másik kulcsot egy szimulált hőszivattyús eszközhöz használják.

Az eszközkulcs származtatásához a korábban feljegyzett regisztrációs csoport elsődleges kulcsával számítja ki az eszközregisztrációs azonosító HMAC-SHA256 azonosítóját az egyes eszközökhöz, és konvertálja az eredményt Base 64 formátumba. A származtatott eszközkulcsok regisztrációs csoportokkal való létrehozásáról további információt a szimmetrikus kulcsigazolás csoportregisztráció szakaszában talál.

Az oktatóanyagban szereplő példához használja az alábbi két eszközregisztrációs azonosítót, és számítsa ki az eszközkulcsot mindkét eszközhöz. Mindkét regisztrációs azonosító érvényes utótaggal rendelkezik az egyéni foglalási szabályzat példakódjának használatához:

  • breakroom499-contoso-tstrsd-007
  • főépület167-contoso-hpsd-088

Az Azure CLI IoT-bővítménye biztosítja a iot dps enrollment-group compute-device-key származtatott eszközkulcsok létrehozásának parancsát. Ez a parancs Windows- vagy Linux-rendszereken használható PowerShell- vagy Bash-rendszerhéjból.

Cserélje le az argumentum értékét --key a regisztrációs csoport elsődleges kulcsára .

az iot dps enrollment-group compute-device-key --key <ENROLLMENT_GROUP_KEY> --registration-id breakroom499-contoso-tstrsd-007
az iot dps compute-device-key --key <ENROLLMENT_GROUP_KEY> --registration-id mainbuilding167-contoso-hpsd-088

Feljegyzés

A parancshoz a szimmetrikus kulcs helyett a regisztrációs csoport azonosítóját iot dps enrollment-group compute-device-key is megadhatja. Példa:

az iot dps enrollment-group compute-device-key -g contoso-us-resource-group --dps-name contoso-provisioning-service-1098 --enrollment-id contoso-custom-allocated-devices --registration-id breakroom499-contoso-tstrsd-007

A szimulált eszközök a származtatott eszközkulcsokat használják az egyes regisztrációs azonosítókkal a szimmetrikus kulcsigazolás végrehajtásához.

Azure IoT C SDK fejlesztői környezet előkészítése

Ebben a szakaszban előkészíti az Azure IoT C SDK létrehozásához használt fejlesztői környezetet. Az SDK tartalmazza a szimulált eszköz mintakódját. A szimulált eszköz a beléptetést az rendszerindítási során fogja megkísérelni.

Ez a szakasz egy Windows-alapú munkaállomásra irányul. Linux-példaként tekintse meg a virtuális gépek beállítását a következő oktatóanyagban : Geokésésítés.

  1. Töltse le a CMake buildrendszert.

    A telepítés megkezdése előtt fontos, hogy a Visual Studio előfeltételei (a Visual Studio és a "C++ számítási feladattal rendelkező asztali fejlesztés") telepítve legyenek a CMake számítógépen. Ha az előfeltételek telepítve vannak, és ellenőrizte a letöltött fájlt, telepítse a CMake buildelési rendszert.

  2. Keresse meg az SDK legújabb kiadásának címkéjét.

  3. Nyisson meg egy parancssort vagy a Git Bash-felületet. Futtassa az alábbi parancsokat az Azure IoT Device SDK for C GitHub-adattár legújabb kiadásának klónozásához. Használja az előző lépésben talált címkét a -b paraméter értékeként, például: 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
    

    Ez a művelet várhatóan több percig is eltarthat.

  4. Hozzon létre egy cmake alkönyvtárat a Git-adattár gyökérkönyvtárában, és lépjen erre a mappára. Futtassa a következő parancsokat a azure-iot-sdk-c könyvtárból:

    mkdir cmake
    cd cmake
    
  5. Futtassa az alábbi parancsot, amely létrehozza az SDK fejlesztői ügyfélplatformra szabott verzióját. A szimulált eszközhöz tartozó Visual Studio-megoldás a cmake könyvtárban jön létre.

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    

    Ha cmake nem találja a C++ fordítót, a parancs futtatása közben buildelési hibák jelenhetnek meg. Ha ez történik, futtassa a parancsot a Visual Studio parancssorában.

    Miután a build sikeres volt, az utolsó néhány kimeneti sor az alábbi kimenethez hasonlóan néz ki:

    $ cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    -- Building for: Visual Studio 15 2017
    -- Selecting Windows SDK version 10.0.16299.0 to target Windows 10.0.17134.
    -- The C compiler identification is MSVC 19.12.25835.0
    -- The CXX compiler identification is MSVC 19.12.25835.0
    
    ...
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: E:/IoT Testing/azure-iot-sdk-c/cmake
    

Az eszközök szimulálása

Ebben a szakaszban frissít egy prov_dev_client_sample nevű kiépítési mintát a korábban beállított Azure IoT C SDK-ban.

Ez a mintakód egy eszköz rendszerindítási sorozatát szimulálja, amely elküldi a kiépítési kérelmet a Device Provisioning Service-példánynak. A rendszerindítási sorrend miatt a kenyérpirító eszköz felismerhető és hozzárendelhető az IoT Hubhoz az egyéni foglalási szabályzat használatával.

  1. Az Azure Portalon válassza az Eszközkiépítési szolgáltatás Áttekintés lapját, és jegyezze fel az azonosító hatókörének értékét.

    Az eszközkiépítési szolgáltatás végpontadatainak kinyerése a portál paneljéről

  2. Nyissa meg a Visual Studióban a CMake korábbi futtatásával létrehozott azure_iot_sdks.sln megoldásfájlt. A megoldásfájlnak a következő helyen kell lennie: azure-iot-sdk-c\cmake\azure_iot_sdks.sln.

  3. A Visual Studio Megoldáskezelő ablakában keresse meg a Provision_Samples mappát. Bontsa ki a prov_dev_client_sample nevű mintaprojektet. Bontsa ki a Forrásfájlok elemet, és nyissa meg a prov_dev_client_sample.c fájlt.

  4. Keresse meg az id_scope állandót, és cserélje le az értékét a korábban kimásolt Azonosító hatóköre értékre.

    static const char* id_scope = "0ne00002193";
    
  5. Keresse meg a main() függvény definícióját ugyanebben a fájlban. Győződjön meg róla, hogy a hsm_type változó értéke SECURE_DEVICE_TYPE_SYMMETRIC_KEY, mint az alább is látható:

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  6. A függvényben main() keresse meg a következő hívását Prov_Device_Register_Device(): . A hívás előtt adja hozzá a következő kódsorokat, amelyek az egyéni JSON-hasznos adatok átadására szolgálnak Prov_Device_Set_Provisioning_Payload() a kiépítés során. Ezzel további információkat adhat meg az egyéni foglalási függvényekhez. Ezzel az eszköztípust is át lehet adni a regisztrációs azonosító vizsgálata helyett. Az egyéni adatok DPS-sel való küldésével és fogadásával kapcsolatos további információkért lásd : Hasznos adatok átvitele eszközök és DPS között.

    // An example custom payload
    const char* custom_json_payload = "{\"MyDeviceFirmwareVersion\":\"12.0.2.5\",\"MyDeviceProvisioningVersion\":\"1.0.0.0\"}";
    
    prov_device_result = Prov_Device_Set_Provisioning_Payload(prov_device_handle, custom_json_payload);
    if (prov_device_result != PROV_DEVICE_RESULT_OK)
    {
        (void)printf("\r\nFailure setting provisioning payload: %s\r\n", MU_ENUM_TO_STRING(PROV_DEVICE_RESULT, prov_device_result));
    }
    
  7. Kattintson a jobb gombbal a prov_dev_client_sample projektre, és válassza a Beállítás indítási projektként lehetőséget.

A Contoso kenyérpirító eszköz szimulálása

  1. A kenyérpirító eszköz szimulálásához keresse meg a prov_dev_client_sample.c fájlban található hívástprov_dev_set_symmetric_key_info(), amely megjegyzésként szerepel.

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

    Bontsa ki a függvényhívást, és cserélje le a helyőrző értékeket (beleértve a szögletes zárójeleket) a korábban létrehozott pirítósregisztrációs azonosítóra és származtatott eszközkulcsra. Az alábbi JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= kulcsérték csak példaként jelenik meg.

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("breakroom499-contoso-tstrsd-007", "JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs=");
    

    Mentse a fájlt.

  2. A Visual Studio menüjében válassza a Debug>Start without debugging (Hibakeresés > Indítás hibakeresés nélkül) lehetőséget a megoldás futtatásához. A projekt újraépítésére vonatkozó kérdésben válassza az Igen lehetőséget a projekt újraépítéséhez a futtatás előtt.

    Az alábbi kimenet egy példa arra, hogy a szimulált kenyérpirító eszköz sikeresen elindul és csatlakozik a kiépítési szolgáltatáspéldányhoz, amelyet az egyéni kiosztási szabályzat rendel a pirítók IoT Hubhoz:

    Provisioning API Version: 1.8.0
    
    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-toasters-hub-1098.azure-devices.net, deviceId: breakroom499-contoso-tstrsd-007
    
    Press enter key to exit:
    

    Az alábbi kimenet a kenyérpirító eszközhöz futó egyéni foglalási függvény kódjának kimenetét naplózhatja. Figyelje meg, hogy egy központ sikeresen ki van jelölve egy kenyérpirító eszközhöz. Figyelje meg azt a payload tulajdonságot is, amely a kódhoz hozzáadott egyéni JSON-tartalmat tartalmazza. Ez a kód deviceRuntimeContexta .

    Ez a naplózás a Naplók elemre kattintva érhető el a portál függvénykódja alatt:

    2022-08-03T20:34:41.178 [Information] Executing 'Functions.HttpTrigger1' (Reason='This function was programmatically called via the host APIs.', Id=12950752-6d75-4f41-844b-c253a6653d4f)
    2022-08-03T20:34:41.340 [Information] C# HTTP trigger function processed a request.
    2022-08-03T20:34:41.341 [Information] Request.Body:...
    2022-08-03T20:34:41.341 [Information] {"enrollmentGroup":{"enrollmentGroupId":"contoso-custom-allocated-devices","attestation":{"type":"symmetricKey"},"capabilities":{"iotEdge":false},"etag":"\"0000f176-0000-0700-0000-62eaad1e0000\"","provisioningStatus":"enabled","reprovisionPolicy":{"updateHubAssignment":true,"migrateDeviceData":true},"createdDateTimeUtc":"2022-08-03T17:15:10.8464255Z","lastUpdatedDateTimeUtc":"2022-08-03T17:15:10.8464255Z","allocationPolicy":"custom","iotHubs":["contoso-toasters-hub-1098.azure-devices.net","contoso-heatpumps-hub-1098.azure-devices.net"],"customAllocationDefinition":{"webhookUrl":"https://contoso-function-app-1098.azurewebsites.net/api/HttpTrigger1?****","apiVersion":"2021-10-01"}},"deviceRuntimeContext":{"registrationId":"breakroom499-contoso-tstrsd-007","currentIotHubHostName":"contoso-toasters-hub-1098.azure-devices.net","currentDeviceId":"breakroom499-contoso-tstrsd-007","symmetricKey":{},"payload":{"MyDeviceFirmwareVersion":"12.0.2.5","MyDeviceProvisioningVersion":"1.0.0.0"}},"linkedHubs":["contoso-toasters-hub-1098.azure-devices.net","contoso-heatpumps-hub-1098.azure-devices.net"]}
    2022-08-03T20:34:41.382 [Information] Response
    2022-08-03T20:34:41.398 [Information] {"iotHubHostName":"contoso-toasters-hub-1098.azure-devices.net","initialTwin":{"properties":{"desired":{"state":"ready","darknessSetting":"medium"}},"tags":{"deviceType":"toaster"}}}
    2022-08-03T20:34:41.399 [Information] Executed 'Functions.HttpTrigger1' (Succeeded, Id=12950752-6d75-4f41-844b-c253a6653d4f, Duration=227ms)
    

A Contoso hőszivattyú eszköz szimulálása

  1. A hőszivattyús eszköz szimulálásához frissítse újra a prov_dev_client_sample.c-be irányuló prov_dev_set_symmetric_key_info() hívást a korábban létrehozott hőszivattyú regisztrációs azonosítójával és származtatott eszközkulcsával. Az alábbi 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= kulcsérték szintén csak példaként van megadva.

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("mainbuilding167-contoso-hpsd-088", "6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg=");
    

    Mentse a fájlt.

  2. A Visual Studio menüjében válassza a Debug>Start without debugging (Hibakeresés > Indítás hibakeresés nélkül) lehetőséget a megoldás futtatásához. A projekt újraépítésére vonatkozó kérdésben válassza az Igen lehetőséget a projekt újraépítéséhez a futtatás előtt.

    Az alábbi kimenet egy példa arra, hogy a szimulált hőszivattyús eszköz sikeresen elindul és csatlakozik a Kiépítési szolgáltatáspéldányhoz, amelyet az egyéni kiosztási szabályzat rendel a Contoso hőszivattyúk IoT Hubhoz:

    Provisioning API Version: 1.8.0
    
    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-heatpumps-hub-1098.azure-devices.net, deviceId: mainbuilding167-contoso-hpsd-088
    
    Press enter key to exit:
    

Egyéni foglalási szabályzatok hibaelhárítása

Az alábbi táblázat a várt forgatókönyveket és az esetlegesen kapott eredményhibakódokat mutatja be. Ezzel a táblázattal elháríthatja az egyéni foglalási szabályzatok hibáit az Azure Functionsben.

Eset Regisztrációs eredmény a Kiépítési szolgáltatásból SDK-eredmények kiépítése
A webhook a 200 OK értéket adja vissza, és az "iotHubHostName" értéke érvényes IoT Hub-állomásnév Eredmény állapota: Hozzárendelve Az SDK PROV_DEVICE_RESULT_OK a központi adatokkal együtt adja vissza
A webhook 200 OK értéket ad vissza a válaszban található "iotHubHostName" értékkel, de üres sztringre vagy nullra van állítva Eredmény állapota: Sikertelen

Hibakód: CustomAllocationIotHubNotSpecified (400208)
Az SDK PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED ad vissza
A webhook a 401 Jogosulatlan értéket adja vissza Eredmény állapota: Sikertelen

Hibakód: CustomAllocationUnauthorizedAccess (400209)
Az SDK PROV_DEVICE_RESULT_UNAUTHORIZED ad vissza
Egyéni regisztráció lett létrehozva az eszköz letiltásához Eredmény állapota: Letiltva Az SDK PROV_DEVICE_RESULT_DISABLED ad vissza
A webhook a = 429 hibakódot >adja vissza A DPS vezénylése többször is próbálkozik. Az újrapróbálkozési szabályzat jelenleg a következő:

  - Újrapróbálkozás száma: 10
  - Kezdeti időköz: 1 s
  - Növekmény: 9 s
Az SDK figyelmen kívül hagyja a hibát, és egy másik get állapotüzenetet küld a megadott időpontban
A webhook bármilyen más állapotkódot ad vissza Eredmény állapota: Sikertelen

Hibakód: CustomAllocationFailed (400207)
Az SDK PROV_DEVICE_RESULT_DEV_AUTH_ERROR ad vissza

Az erőforrások eltávolítása

Ha folytatni szeretné az oktatóanyagban létrehozott erőforrások használatát, elhagyhatja őket. Ha nem tervezi folytatni az erőforrások használatát, az alábbi lépésekkel törölheti az oktatóanyagban létrehozott összes erőforrást a szükségtelen díjak elkerülése érdekében.

Az alábbi lépések feltételezik, hogy ebben az oktatóanyagban az összes erőforrást a contoso-us-resource-group nevű erőforráscsoportban leírtak szerint hozta létre.

Fontos

Az erőforráscsoport törlése nem vonható vissza. Az erőforráscsoport és a benne foglalt erőforrások véglegesen törlődnek. Figyeljen, nehogy véletlenül rossz erőforráscsoportot vagy erőforrásokat töröljön. Ha az IoT Hubot egy meglévő, megtartani kívánt erőforrásokat tartalmazó erőforráscsoportban hozta létre, az erőforráscsoport törlése helyett törölheti csak magát az IoT Hub-erőforrást.

Az erőforráscsoport törlése név szerint:

  1. Jelentkezzen be az Azure Portalra, és válassza az Erőforráscsoportok elemet.

  2. A Szűrés név szerint... szövegmezőbe írja be az erőforrásokat tartalmazó erőforráscsoport nevét( contoso-us-resource-group).

  3. Az eredménylistában az erőforráscsoporttól jobbra válassza a ... lehetőséget, majd az Erőforráscsoport törlése lehetőséget.

  4. A rendszer kérni fogja, hogy erősítse meg az erőforráscsoport törlését. Írja be ismét az erőforráscsoport nevét a megerősítéshez, majd válassza a Törlés lehetőséget. A rendszer néhány pillanaton belül törli az erőforráscsoportot és a benne foglalt erőforrásokat.

Következő lépések

Az egyéni foglalási szabályzatokkal kapcsolatos további információkért lásd: