Öğretici: Cihaz Sağlama Hizmeti (DPS) ile özel ayırma ilkeleri kullanma

Özel ayırma ilkeleri, cihazların IoT hub'larınıza nasıl atandığı üzerinde daha fazla denetim sağlar. Özel ayırma ilkeleriyle, Azure IoT Hub Cihaz Sağlama Hizmeti (DPS) tarafından sağlanan ilkeler senaryonuzun gereksinimlerini karşılamadığında kendi ayırma ilkelerinizi tanımlayabilirsiniz. Özel ayırma ilkesi, Azure İşlevleri barındırılan bir web kancasında uygulanır ve bir veya daha fazla bireysel kayıt ve/veya kayıt grubunda yapılandırılır. Bir cihaz yapılandırılmış bir kayıt girdisi kullanarak DPS'ye kaydolduğunda DPS, cihazın hangi IoT hub'ına kaydedilmesi gerektiğini ve isteğe bağlı olarak ilk durumunu öğrenmek için web kancasını çağırır. Daha fazla bilgi edinmek için bkz . Özel ayırma ilkelerini anlama.

Bu öğreticide, C# dilinde yazılmış bir Azure İşlevi kullanılarak özel ayırma ilkesi gösterilmektedir. Cihazlar, Contoso Toasters Bölümünü ve Contoso Isı Pompaları Bölümünü temsil eden iki IoT hub'ına atanır. Sağlama isteğinde bulunan cihazların sağlama için kabul edilmesi gereken aşağıdaki soneklerden birine sahip bir kayıt kimliği olmalıdır:

  • Contoso Toasters Bölümü için -contoso-tstrsd-007
  • Contoso Isı Pompaları Bölümü için -contoso-hpsd-088

Cihazlar, Azure IoT C SDK'sında bulunan bir sağlama örneği kullanılarak simülasyona alınır.

Bu öğreticide aşağıdakileri yapacaksınız:

  • Bir DPS örneği oluşturmak ve iki Contoso bölme IoT hub'ı (Contoso Toasters Division ve Contoso Heat Pumps Division) oluşturup buna bağlamak için Azure CLI'yi kullanın.
  • Özel ayırma ilkesini uygulayan bir Azure İşlevi oluşturun.
  • Yeni bir kayıt grubu oluşturma, özel ayırma ilkesi için Azure İşlevi'ni kullanır.
  • İki sanal cihaz için cihaz simetrik anahtarları oluşturun.
  • Azure IoT C SDK'sı için geliştirme ortamını ayarlayın.
  • Cihazların simülasyonunu yapın ve özel ayırma ilkesindeki örnek koda göre sağlandığını doğrulayın.

Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.

Önkoşullar

Aşağıdaki önkoşullar bir Windows geliştirme ortamı içindir. Linux veya macOS için SDK belgelerindeki Geliştirme ortamınızı hazırlama bölümündeki uygun bölüme bakın.

Sağlama hizmetini ve iki IoT hub'ını oluşturma

Bu bölümde Azure Cloud Shell'i kullanarak bir sağlama hizmeti ve Contoso Toasters Bölümünü ve Contoso Heat Pumps bölümünü temsil eden iki IoT hub'ı oluşturacaksınız.

  1. İlk olarak, bu öğreticideki komutları basitleştirmek için çalışma alanınızda ortam değişkenlerini ayarlayın.

    DPS ve IoT Hub adları genel olarak benzersiz olmalıdır. Yer tutucuyu SUFFIX kendi değerinizle değiştirin.

    Ayrıca, bu öğreticinin ilerleyen bölümlerinde oluşturduğunuz Azure İşlevi kodu, adlarında veya -heatpumps- adlarında bulunan -toasters- IoT hub'larını arar. Önerilen değerleri değiştirirseniz, gerekli alt dizeleri içeren adları kullandığınızdan emin olun.

    #!/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"
    

    İpucu

    Bu öğreticide kullanılan komutlar varsayılan olarak Batı ABD konumunda kaynaklar oluşturur. Kaynaklarınızı, Cihaz Sağlama Hizmeti'ni destekleyen size en yakın bölgede oluşturmanızı öneririz. Azure Durumu sayfasına gidip "Cihaz Sağlama Hizmeti" araması yaparak kullanılabilir konumların listesini görüntüleyebilirsiniz. Komutlarda konumlar tek sözcük veya çok sözcüklü biçimde belirtilebilir; örneğin: westus, Batı ABD, BATI ABD vb. Değer büyük/küçük harfe duyarlı değildir.

  2. Azure kaynak grubu oluşturmak için az group create komutunu kullanın. Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği bir mantıksal kapsayıcıdır.

    Aşağıdaki örnek bir kaynak grubu oluşturur. Bu öğreticide oluşturulan tüm kaynaklar için tek bir grup kullanmanızı öneririz. Bu yaklaşım, işiniz bittikten sonra temizlemeyi kolaylaştırır.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Cihaz Sağlama Hizmeti'nin (DPS) bir örneğini oluşturmak için az iot dps create komutunu kullanın. Sağlama hizmeti contoso-us-resource-group'a eklenir.

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

    Bu komutun tamamlanması birkaç dakika sürebilir.

  4. Contoso Toasters Division IoT hub'ını oluşturmak için az iot hub create komutunu kullanın. IoT hub'ı contoso-us-resource-group'a eklenir.

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

    Bu komutun tamamlanması birkaç dakika sürebilir.

  5. Contoso Heat Pumps Division IoT hub'ını oluşturmak için az iot hub create komutunu kullanın. Bu IoT hub'ı contoso-us-resource-group'a da eklenir.

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

    Bu komutun tamamlanması birkaç dakika sürebilir.

  6. Oluşturduğunuz hub'ların bağlantı dizesi almak için aşağıdaki iki komutu çalıştırın.

    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. Hub'ları DPS kaynağına bağlamak için aşağıdaki komutları çalıştırın. Yer tutucuları önceki adımdaki hub bağlantı dizesi ile değiştirin.

    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>
    

Özel ayırma işlevini oluşturma

Bu bölümde, özel ayırma ilkenizi uygulayan bir Azure işlevi oluşturacaksınız. Bu işlev, kayıt kimliğinin -contoso-tstrsd-007 veya -contoso-hpsd-088 dizesini içerip içermediğine bağlı olarak bir cihazın hangi bölüme kayıtlı IoT hub'ına kaydedileceğine karar verir. Ayrıca cihazın tost makinesi mi yoksa ısı pompası mı olduğuna bağlı olarak cihaz ikizinin ilk durumunu ayarlar.

  1. Azure Portal’ında oturum açın.

  2. Arama kutusunda İşlev Uygulaması'nı arayın ve seçin.

  3. İşlev Uygulaması Oluştur veya Oluştur'u seçin.

  4. İşlev Uygulaması oluşturma sayfasındaki Temel bilgiler sekmesinin altında, yeni işlev uygulamanız için aşağıdaki ayarları girin ve Gözden geçir ve oluştur'u seçin:

    Parametre Value
    Abonelik Bu öğretici için kaynakları oluşturduğunuz aboneliğin seçili olduğundan emin olun.
    Kaynak Grubu Önceki bölümde oluşturduğunuz kaynak grubunu seçin. Önceki bölümde sağlanan varsayılan değer contoso-us-resource-group şeklindedir.
    İşlev Uygulamasının adı İşlev uygulamanız için bir ad belirtin.
    Kod veya kapsayıcı görüntüsü dağıtmak istiyor musunuz? Kod
    Çalışma Zamanı Yığını .NET
    Sürüm herhangi bir işlem içi model sürümünü seçin.
    Bölge Size yakın bir bölge seçin.

    Not

    Application Insights varsayılan olarak etkindir. Bu öğretici için Application Insights gerekli değildir, ancak özel ayırmayla ilgili karşılaştığınız sorunları anlamanıza ve araştırmanıza yardımcı olabilir. İsterseniz, İzleme sekmesini ve ardından Application Insights'ı Etkinleştir için Hayır'ı seçerek Application Insights'ı devre dışı bırakabilirsiniz.

    Azure portalında İşlev Uygulaması Oluştur formunu gösteren ekran görüntüsü.

  5. gözden geçir ve oluştur sekmesinde Oluştur'u seçerek işlev uygulamasını oluşturun.

  6. Dağıtım birkaç dakika sürebilir. Tamamlandığında Kaynağa git'i seçin.

  7. İşlev uygulamasına Genel Bakış sayfasının sol bölmesinde İşlev oluştur'u seçin.

    Azure portalında işlev oluşturma seçeneğini belirlemeyi gösteren ekran görüntüsü.

  8. İşlev oluştur sayfasında HTTP Tetikleyicisi şablonunu ve ardından İleri'yi seçin.

  9. Şablon ayrıntıları sekmesinde Yetkilendirme düzeyi olarak Anonim'i ve ardından Oluştur'u seçin.

    Yetkilendirme düzeyini anonim olarak ayarlamayı gösteren ekran görüntüsü.

    İpucu

    Yetkilendirme düzeyini İşlev olarak tutarsanız DPS kayıtlarınızı işlev API anahtarıyla yapılandırmanız gerekir. Daha fazla bilgi için bkz. HTTP tetikleyicisini Azure İşlevleri.

  10. HttpTrigger1 işlevi açıldığında, sol bölmede Kod + Test'i seçin. Bu, işlevin kodunu düzenlemenize olanak tanır. Run.csx kod dosyası düzenleme için açılmalıdır.

  11. Gerekli NuGet paketlerine başvurun. İlk cihaz ikizini oluşturmak için özel ayırma işlevi, barındırma ortamına yüklenmesi gereken iki NuGet paketinde tanımlanan sınıfları kullanır. Azure İşlevleri ile NuGet paketlerine function.proj dosyası kullanılarak başvurulur. Bu adımda, gerekli derlemeler için bir function.proj dosyasını kaydedip karşıya yüklersiniz. Daha fazla bilgi için bkz. Azure İşlevleri ile NuGet paketlerini kullanma.

    1. Aşağıdaki satırları sık kullandığınız düzenleyiciye kopyalayın ve dosyayı bilgisayarınızda function.proj olarak kaydedin.

      <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. function.proj dosyanızı karşıya yüklemek için kod düzenleyicisinin üzerinde bulunan Karşıya Yükle düğmesini seçin. Karşıya yükledikten sonra, içeriği doğrulamak için açılan kutuyu kullanarak kod düzenleyicisinde dosyayı seçin.

    3. Kod düzenleyicisinde function.proj dosyasını seçin ve içeriğini doğrulayın. function.proj dosyası boşsa yukarıdaki satırları dosyaya kopyalayın ve kaydedin. (Bazen karşıya yükleme, içeriği karşıya yüklemeden dosyayı oluşturur.)

  12. Kod düzenleyicisinde HttpTrigger1 için run.csx dosyasının seçildiğinden emin olun. HttpTrigger1 işlevinin kodunu aşağıdaki kodla değiştirin ve Kaydet'i seçin:

    #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;}
    }
    

Kaydı oluşturma

Bu bölümde, özel ayırma ilkesini kullanan yeni bir kayıt grubu oluşturacaksınız. Kolaylık olması için bu öğreticide kayıt ile simetrik anahtar kanıtlaması kullanılır. Daha güvenli bir çözüm için, güven zinciriyle X.509 sertifika kanıtlamasını kullanmayı göz önünde bulundurun.

  1. Azure portalında oturum açın ve Cihaz Sağlama Hizmeti örneğine gidin.

  2. Gezinti menüsünün Ayarlar bölümünden Kayıtları yönet'i seçin.

  3. Kayıt grubu ekle'yi seçin.

  4. Kayıt grubu ekle sayfasının Kayıt + sağlama sekmesinde, kayıt grubu ayrıntılarını yapılandırmak için aşağıdaki bilgileri sağlayın:

    Alan Açıklama
    Tasdik Kanıtlama mekanizması olarak Simetrik anahtar'ı seçin.
    Simetrik anahtar ayarları Simetrik anahtarları otomatik olarak oluştur kutusunu işaretleyin.
    Grup adı Grup adı olarak contoso-custom-allocated-devices girin.
    Sağlama durumu Bu kaydı etkinleştir kutusunu işaretleyin.
  5. İleri: IoT hub'ları'ı seçin.

  6. Kayıt grubu ekle sayfasının IoT hub'ları sekmesinde, kayıt grubunun cihazları hangi IoT hub'larına sağlayabileceğini belirlemek için aşağıdaki bilgileri sağlayın:

    Alan Açıklama
    Hedef IoT hub'ları Bağlı IoT hub'larınızdan birini veya daha fazlasını seçin veya bir IoT hub'ına yeni bir bağlantı ekleyin.
    Ayırma ilkesi Özel (Azure İşlevi'ni kullan) öğesini seçin. Azure işlevini seçin'i seçin, ardından istemleri izleyerek bu öğretici için oluşturduğunuz işlevi seçin.
  7. Gözden geçir ve oluştur’u seçin.

  8. Gözden Geçir + oluştur sekmesinde tüm değerlerinizi doğrulayın ve Oluştur'u seçin.

Kaydı kaydettikten sonra yeniden açın ve Birincil anahtarı not edin. Anahtarların oluşturulması için önce kaydı kaydetmeniz gerekir. Bu anahtar, sonraki bölümde simülasyon cihazları için benzersiz cihaz anahtarları oluşturmak için kullanılır.

Benzersiz cihaz anahtarlarını türet

Cihazlar kayıt grubunun birincil simetrik anahtarını doğrudan kullanmaz. Bunun yerine, her cihaz için bir cihaz anahtarı türetmek için birincil anahtarı kullanırsınız. Bu bölümde iki benzersiz cihaz anahtarı oluşturacaksınız. Sanal bir tost makinesi cihazı için bir anahtar kullanılır. Diğer anahtar bir simülasyon ısı pompası cihazı için kullanılır.

Cihaz anahtarını türetmek için, daha önce not aldığınız birincil anahtar kayıt grubunu kullanarak her cihaz için cihaz kayıt kimliğinin HMAC-SHA256 değerini hesaplar ve sonucu Temel 64 biçimine dönüştürürsiniz. Kayıt gruplarıyla türetilmiş cihaz anahtarları oluşturma hakkında daha fazla bilgi için Simetrik anahtar kanıtlamanın grup kayıtları bölümüne bakın.

Bu öğreticideki örnek için aşağıdaki iki cihaz kayıt kimliğini kullanın ve her iki cihaz için bir cihaz anahtarı hesap edin. Her iki kayıt kimlikleri de özel ayırma ilkesi için örnek kodla çalışmak için geçerli bir son eke sahiptir:

  • breakroom499-contoso-tstrsd-007
  • mainbuilding167-contoso-hpsd-088

Azure CLI için IoT uzantısı, türetilmiş cihaz anahtarları oluşturmak için iot dps kayıt grubu compute-device-key komutunu sağlar. Bu komut, PowerShell veya Bash kabuğundan Windows tabanlı veya Linux sistemlerinde kullanılabilir.

bağımsız değişkeninin --key değerini kayıt grubunuzdaki Birincil Anahtar ile değiştirin.

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

Not

Komutun simetrik anahtarı iot dps enrollment-group compute-device-key yerine kayıt grubu kimliğini de sağlayabilirsiniz. Örneğin:

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

Simülasyon cihazları, simetrik anahtar kanıtlaması gerçekleştirmek için türetilmiş cihaz anahtarlarını her kayıt kimliğiyle birlikte kullanır.

Azure IoT C SDK'sı için geliştirme ortamını hazırlama

Bu bölümde, Azure IoT C SDK'sını derlemek için kullanılan geliştirme ortamını hazırlamış olacaksınız. SDK, simülasyon cihazının örnek kodunu içerir. Simülasyon cihazı, cihazın önyükleme dizisi sırasında sağlamayı dener.

Bu bölüm, Windows tabanlı bir iş istasyonuna yöneliktir. Linux örneği için Bkz. Öğretici: Coğrafi gecikme süresi için sağlama bölümünde VM'lerin kurulumu.

  1. CMake derleme sistemini indirin.

    Yüklemeyi başlatmadan CMake önce makinenizde Visual Studio önkoşullarının (Visual Studio ve 'C++ile masaüstü geliştirme' iş yükü) yüklü olması önemlidir. Önkoşullar sağlandıktan ve indirme doğrulandıktan sonra, CMake derleme sistemini yükleyin.

  2. SDK'nın en son sürümünün etiket adını bulun.

  3. Komut istemini veya Git Bash kabuğunu açın. C GitHub deposu için Azure IoT Cihaz SDK'sının en son sürümünü kopyalamak için aşağıdaki komutları çalıştırın. Parametrenin değeri -b olarak önceki adımda bulduğunuz etiketi kullanın, örneğin: 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
    

    Bu işlemin tamamlanması için birkaç dakika beklemeniz gerekebilir.

  4. Git deposunun kök dizininde bir cmake alt dizini oluşturun ve o klasöre gidin. Dizininden azure-iot-sdk-c aşağıdaki komutları çalıştırın:

    mkdir cmake
    cd cmake
    
  5. SDK’nın geliştirme istemci platformunuza ve özgü bir sürümünü oluşturmak için aşağıdaki komutu çalıştırın. cmake dizininde simülasyon cihazı için bir Visual Studio çözümü de oluşturulur.

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

    cmake C++ derleyicinizi bulamazsa komutunu çalıştırırken derleme hataları görebilirsiniz. Böyle bir durumda Visual Studio komut isteminde komutunu çalıştırmayı deneyin.

    Derleme başarılı olduktan sonra, son birkaç çıkış satırı aşağıdaki çıkışa benzer şekilde görünür:

    $ 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
    

Cihazların benzetimini yapmak

Bu bölümde, daha önce ayarladığınız Azure IoT C SDK'sında bulunan prov_dev_client_sample adlı bir sağlama örneğini güncelleştirin.

Bu örnek kod, sağlama isteğini Cihaz Sağlama Hizmeti örneğine gönderen bir cihaz önyükleme sırasının simülasyonunu oluşturur. Önyükleme sırası, özel ayırma ilkesi kullanılarak tost makinesi cihazının tanınmasına ve IoT hub'ına atanmalarına neden olur.

  1. Azure portalında, Cihaz Sağlama Hizmetiniz için Genel Bakış sekmesini seçin ve Kimlik Kapsamı değerini not edin.

    Portal dikey penceresinden Cihaz Sağlama Hizmeti uç noktası bilgilerini ayıklama

  2. Visual Studio'da, daha önce CMake çalıştırılarak oluşturulan azure_iot_sdks.sln çözüm dosyasını açın. Çözüm dosyası şu konumda olmalıdır: azure-iot-sdk-c\cmake\azure_iot_sdks.sln.

  3. Visual Studio'nun Çözüm Gezgini penceresinde Provision_Samples klasörüne gidin. prov_dev_client_sample adlı örnek projeyi genişletin. Kaynak Dosyalar'ı genişletin ve prov_dev_client_sample.c dosyasını açın.

  4. id_scope sabitini bulun ve değeri daha önce kopyalamış olduğunuz Kimlik Kapsamı değerinizle değiştirin.

    static const char* id_scope = "0ne00002193";
    
  5. Aynı dosyada main() işlevinin tanımını bulun. hsm_type değişkeninin aşağıda gösterildiği gibi SECURE_DEVICE_TYPE_SYMMETRIC_KEY değerine ayarlandığından emin olun:

    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. işlevinde main() çağrısı bulun Prov_Device_Register_Device(). Bu çağrıdan hemen önce, sağlama sırasında özel bir JSON yükü geçirmek için kullanılan Prov_Device_Set_Provisioning_Payload() aşağıdaki kod satırlarını ekleyin. Bu, özel ayırma işlevlerinize daha fazla bilgi sağlamak için kullanılabilir. Bu, kayıt kimliğini incelemek yerine cihaz türünü geçirmek için de kullanılabilir. DPS ile özel veri yüklerini gönderme ve alma hakkında daha fazla bilgi için bkz . Cihazlar ve DPS arasında yükleri aktarma.

    // 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. prov_dev_client_sample projesine sağ tıklayın ve Başlangıç Projesi Olarak Ayarla'yı seçin.

Contoso tost makinesi cihazının benzetimini yapın

  1. Tost makinesi cihazının benzetimini yapmak için prov_dev_client_sample.c'de açıklama satırı yapılan çağrıyı prov_dev_set_symmetric_key_info() bulun.

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

    İşlev çağrısını açıklamayı kaldırın ve yer tutucu değerlerini (açılı ayraçlar dahil) daha önce oluşturduğunuz tost makinesi kayıt kimliği ve türetilmiş cihaz anahtarıyla değiştirin. Aşağıda gösterilen JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= anahtar değeri yalnızca örnek olarak verilmiştir.

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

    Dosyayı kaydedin.

  2. Çözümü çalıştırmak için Visual Studio menüsünde Hata Ayıkla>Hata ayıklama olmadan başlat'ı seçin. Projeyi yeniden derleme isteminde Evet'i seçerek çalıştırmadan önce projeyi yeniden oluşturun.

    Aşağıdaki çıkış, sanal tost makinesi cihazının başarıyla önyüklenmesi ve özel ayırma ilkesi tarafından tost makineleri IoT hub'ına atanacak sağlama hizmeti örneğine bağlanma örneğidir:

    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:
    

    Aşağıdaki çıkış, tost makinesi cihazı için çalışan özel ayırma işlevi kodundan alınan günlük çıktısı örneğidir. Bir tost makinesi cihazı için hub'ın başarıyla seçildiğine dikkat edin. Ayrıca koda payload eklediğiniz özel JSON içeriğini içeren özelliğine de dikkat edin. Bu, kodunuzun içinde deviceRuntimeContextkullanması için kullanılabilir.

    Bu günlük kaydı, portaldaki işlev kodunun altındaki Günlükler'e tıklayarak kullanılabilir:

    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)
    

Contoso ısı pompası cihazının simülasyonunu yapın

  1. Isı pompası cihazının simülasyonunu yapmak için prov_dev_client_sample.c'deki çağrıyı prov_dev_set_symmetric_key_info() daha önce oluşturduğunuz ısı pompası kayıt kimliği ve türetilmiş cihaz anahtarıyla yeniden güncelleştirin. Aşağıda gösterilen 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= anahtar değeri de yalnızca örnek olarak verilmiştir.

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

    Dosyayı kaydedin.

  2. Çözümü çalıştırmak için Visual Studio menüsünde Hata Ayıkla>Hata ayıklama olmadan başlat'ı seçin. Projeyi yeniden derleme isteminde, çalıştırmadan önce projeyi yeniden derlemek için Evet'i seçin.

    Aşağıdaki çıkış, özel ayırma ilkesi tarafından Contoso ısı pompaları IoT hub'ına atanacak sağlama hizmeti örneğinin başarıyla önyüklenmesi ve bağlanması simülasyon ısı pompası cihazının bir örneğidir:

    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:
    

Özel ayırma ilkeleriyle ilgili sorunları giderme

Aşağıdaki tabloda beklenen senaryolar ve alabileceğiniz sonuç hata kodları gösterilmektedir. Azure İşlevleri özel ayırma ilkesi hatalarını gidermeye yardımcı olması için bu tabloyu kullanın.

Senaryo Sağlama Hizmeti'nden kayıt sonucu SDK Sonuçları Sağlama
Web kancası, 'iotHubHostName' geçerli bir IoT hub ana bilgisayar adına ayarlanmış 200 Tamam döndürür Sonuç durumu: Atanan SDK, hub bilgileriyle birlikte PROV_DEVICE_RESULT_OK döndürür
Web kancası yanıtta 'iotHubHostName' ile 200 Tamam döndürür, ancak boş bir dize veya null olarak ayarlanır Sonuç durumu: Başarısız

Hata kodu: CustomAllocationIotHubNotSpecified (400208)
SDK PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED döndürür
Web kancası 401 Yetkisiz değerini döndürür Sonuç durumu: Başarısız

Hata kodu: CustomAllocationUnauthorizedAccess (400209)
SDK, PROV_DEVICE_RESULT_UNAUTHORIZED döndürür
Cihazı devre dışı bırakmak için bir Bireysel Kayıt oluşturuldu Sonuç durumu: Devre dışı SDK, PROV_DEVICE_RESULT_DISABLED döndürür
Web kancası hata kodu >= 429 döndürür DPS'nin düzenlemesi birkaç kez yeniden denenecek. Yeniden deneme ilkesi şu anda:

  - Yeniden deneme sayısı: 10
  - başlangıç aralığı: 1 sn
  - Artış: 9 sn
SDK hatayı yoksayar ve belirtilen zamanda başka bir get durum iletisi gönderir
Web kancası başka bir durum kodu döndürür Sonuç durumu: Başarısız

Hata kodu: CustomAllocationFailed (400207)
SDK, PROV_DEVICE_RESULT_DEV_AUTH_ERROR döndürür

Kaynakları temizleme

Bu öğreticide oluşturulan kaynaklarla çalışmaya devam etmek istiyorsanız, bunları bırakabilirsiniz. Kaynakları kullanmaya devam etmek istemiyorsanız gereksiz ücretlerden kaçınmak için aşağıdaki adımları kullanarak bu öğreticide oluşturulan tüm kaynakları silin.

Buradaki adımlarda, contoso-us-resource-group adlı aynı kaynak grubunda açıklandığı gibi bu öğreticideki tüm kaynakları oluşturduğunuz varsayılır.

Önemli

Silinen kaynak grupları geri alınamaz. Kaynak grubu ve içindeki tüm kaynaklar kalıcı olarak silinir. Yanlış kaynak grubunu veya kaynakları yanlışlıkla silmediğinizden emin olun. IoT Hub'ı tutmak istediğiniz kaynakların bulunduğu mevcut bir kaynak grubunda oluşturduysanız kaynak grubunu silmek yerine IoT Hub kaynağını silin.

Kaynak grubunu ada göre silmek için:

  1. Azure portalında oturum açın ve Kaynak grupları’nı seçin.

  2. Ada göre filtrele... metin kutusuna, kaynaklarınızı içeren contoso-us-resource-group kaynak grubunun adını yazın.

  3. Sonuç listesinde kaynak grubunuzun sağında ... ve ardından Kaynak grubunu sil'i seçin.

  4. Kaynak grubunun silinmesini onaylamanız istenir. Onaylamak için kaynak grubunuzun adını yeniden yazın ve sil'i seçin. Birkaç dakika sonra kaynak grubu ve içerdiği kaynakların tümü silinir.

Sonraki adımlar

Özel ayırma ilkeleri hakkında daha fazla bilgi edinmek için bkz.