Tutorial: Menggunakan kebijakan alokasi kustom dengan Device Provisioning Service (DPS)

Kebijakan alokasi kustom memberi Anda kontrol lebih atas bagaimana perangkat ditetapkan ke hub IoT Anda. Dengan kebijakan alokasi kustom, Anda dapat menentukan kebijakan alokasi Anda sendiri saat kebijakan yang disediakan oleh Azure IoT Hub Device Provisioning Service (DPS) tidak memenuhi persyaratan skenario Anda. Kebijakan alokasi kustom diterapkan dalam webhook yang dihosting di Azure Functions dan dikonfigurasi pada satu atau beberapa pendaftaran individu dan/atau grup pendaftaran. Ketika perangkat mendaftar dengan DPS menggunakan entri pendaftaran yang dikonfigurasi, DPS memanggil webhook untuk mengetahui hub IoT mana yang harus didaftarkan perangkat dan, secara opsional, status awalnya. Untuk mempelajari selengkapnya, lihat Memahami kebijakan alokasi kustom.

Tutorial ini menunjukkan kebijakan alokasi kustom menggunakan Fungsi Azure yang ditulis dalam C#. Perangkat ditetapkan ke salah satu dari dua hub IoT yang mewakili Divisi Contoso Toasters dan Divisi Pompa Panas Contoso. Perangkat yang meminta provisi harus memiliki ID pendaftaran dengan salah satu akhiran berikut agar dapat diterima untuk provisi:

  • -contoso-tstrsd-007 untuk Divisi Contoso Toasters
  • -contoso-hpsd-088 untuk Divisi Pompa Panas Contoso

Perangkat disimulasikan menggunakan sampel provisi yang disertakan dalam Azure IoT C SDK.

Dalam tutorial ini, Anda akan melakukan hal berikut:

  • Gunakan Azure CLI untuk membuat instans DPS dan untuk membuat dan menautkan dua hub IoT divisi Contoso (Contoso Toasters Division dan Contoso Heat Pumps Division) ke dalamnya.
  • Buat Azure Function yang menerapkan kebijakan alokasi kustom.
  • Membuat grup pendaftaran baru menggunakan Azure Function untuk kebijakan alokasi kustom.
  • Buat kunci konten perangkat untuk dua perangkat yang disimulasikan.
  • Siapkan lingkungan pengembangan untuk Azure IoT C SDK.
  • Simulasikan perangkat dan verifikasi bahwa perangkat disediakan sesuai dengan kode contoh dalam kebijakan alokasi kustom.

Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.

Prasyarat

Prasyarat berikut adalah untuk lingkungan pengembangan Windows. Untuk Linux atau macOS, lihat bagian yang sesuai di Menyiapkan lingkungan pengembangan dalam dokumentasi SDK.

Membuat layanan provisi dan dua hub IoT

Di bagian ini, Anda menggunakan Azure Cloud Shell untuk membuat layanan provisi dan dua hub IoT yang mewakili Contoso Toasters Division dan Contoso Heat Pumps Division.

  1. Pertama, atur variabel lingkungan di ruang kerja Anda untuk menyederhanakan perintah dalam tutorial ini.

    Nama DPS dan IoT Hub harus unik secara global. SUFFIX Ganti tempat penampung dengan nilai Anda sendiri.

    Selain itu, kode Azure Function yang Anda buat nanti dalam tutorial ini mencari hub IoT yang memiliki -toasters- atau -heatpumps- atas namanya. Jika Anda mengubah nilai yang disarankan, pastikan untuk menggunakan nama yang berisi substring yang diperlukan.

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

    Tip

    Perintah yang digunakan dalam tutorial ini membuat sumber daya di lokasi US Barat secara default. Kami menyarankan Anda membuat sumber daya di wilayah terdekat Anda yang mendukung Device Provisioning Service. Anda dapat melihat daftar lokasi yang tersedia dengan masuk ke halaman Status Azure dan mencari "Device Provisioning Service". Dalam perintah, lokasi dapat ditentukan baik dalam format satu kata atau multi-kata; misal: westus, US Barat, US BARAT, dll. Nilainya tidak peka huruf besar/kecil.

  2. Gunakan perintah az group create untuk membuat grup sumber daya Azure. Grup sumber daya Azure adalah kontainer logis tempat sumber daya Azure disebarkan dan dikelola.

    Contoh berikut membuat grup sumber daya. Kami menyarankan agar Anda menggunakan satu grup untuk semua sumber daya yang dibuat dalam tutorial ini. Pendekatan ini akan membuat pembersihan lebih mudah setelah Anda selesai.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Gunakan perintah az iot dps create untuk membuat instans Device Provisioning Service (DPS). Layanan provisi ditambahkan ke contoso-us-resource-group.

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

    Perintah ini mungkin perlu waktu beberapa menit untuk diselesaikan.

  4. Gunakan perintah az iot hub create untuk membuat hub IoT Contoso Toasters Division. Hub IoT ditambahkan ke contoso-us-resource-group.

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

    Perintah ini mungkin perlu waktu beberapa menit untuk diselesaikan.

  5. Gunakan perintah az iot hub create untuk membuat hub IoT Contoso Heat Pumps Division. Hub IoT ini juga ditambahkan ke contoso-us-resource-group.

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

    Perintah ini mungkin perlu waktu beberapa menit untuk diselesaikan.

  6. Jalankan dua perintah berikut untuk mendapatkan string koneksi untuk hub yang Anda buat.

    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. Jalankan perintah berikut untuk menautkan hub ke sumber daya DPS. Ganti tempat penampung dengan string koneksi hub dari langkah sebelumnya.

    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>
    

Membuat fungsi alokasi kustom

Di bagian ini, Anda akan membuat fungsi Azure yang menerapkan kebijakan alokasi kustom Anda. Fungsi ini memutuskan hub IoT divisi mana yang harus didaftarkan perangkat berdasarkan apakah ID pendaftarannya berisi string -contoso-tstrsd-007 atau -contoso-hpsd-088. Fungsi ini juga menetapkan status awal perangkat kembar berdasarkan apakah perangkat tersebut pemanggang roti atau pompa kalor.

  1. Masuk ke portal Azure.

  2. Dalam kotak pencarian, cari dan pilih Aplikasi Fungsi.

  3. Pilih Buat atau Buat Aplikasi Fungsi.

  4. Pada halaman buat Aplikasi Fungsi, di bawah tab Dasar, masukkan pengaturan berikut untuk aplikasi fungsi baru Anda dan pilih Tinjau + buat:

    Parameter Nilai
    Langganan Pastikan langganan tempat Anda membuat sumber daya untuk tutorial ini dipilih.
    Grup Sumber Daya Pilih grup sumber daya yang telah Anda buat di bagian sebelumnya. Default yang disediakan di bagian sebelumnya adalah contoso-us-resource-group.
    Nama Aplikasi Fungsi Berikan nama untuk aplikasi fungsi Anda.
    Apakah Anda ingin menyebarkan kode atau gambar kontainer? Kode
    Tumpukan Runtime .NET
    Versi Pilih versi model dalam proses apa pun.
    Wilayah Pilih wilayah yang dekat dengan Anda.

    Catatan

    Secara default, Application Insights diaktifkan. Application Insights tidak diperlukan untuk tutorial ini, tetapi mungkin membantu Anda memahami dan menyelidiki masalah apa pun yang Anda temui dengan alokasi kustom. Jika mau, Anda dapat menonaktifkan Application Insights dengan memilih tab Pemantauan lalu memilih Tidak untuk Aktifkan Application Insights.

    Cuplikan layar yang memperlihatkan formulir Buat Aplikasi Fungsi di portal Azure.

  5. Pada tab Tinjau + buat , pilih Buat untuk membuat aplikasi fungsi.

  6. Penyebaran mungkin memakan waktu beberapa menit. Setelah selesai, pilih Buka sumber daya.

  7. Di panel kiri halaman Gambaran Umum aplikasi fungsi, pilih Buat fungsi.

    Cuplikan layar yang memperlihatkan memilih opsi untuk membuat fungsi di portal Azure.

  8. Pada halaman Buat fungsi , pilih templat Pemicu HTTP lalu pilih Berikutnya.

  9. Pada tab Detail templat, pilih Anonim sebagai tingkat Otorisasi lalu pilih Buat.

    Cuplikan layar yang memperlihatkan pengaturan tingkat otorisasi sebagai anonim.

    Tip

    Jika Anda mempertahankan tingkat otorisasi sebagai Fungsi, maka Anda harus mengonfigurasi pendaftaran DPS dengan kunci API fungsi. Untuk informasi selengkapnya, lihat Pemicu HTTP Azure Functions.

  10. Saat fungsi HttpTrigger1 terbuka, pilih Kode + Uji di panel kiri. Ini memungkinkan Anda mengedit kode untuk fungsi tersebut. File kode run.csx harus dibuka untuk diedit.

  11. Referensi diperlukan paket NuGet. Untuk membuat kembaran perangkat awal, fungsi alokasi kustom menggunakan kelas yang ditentukan dalam dua paket NuGet yang harus dimuat ke lingkungan hosting. Dengan Azure Functions, paket NuGet direferensikan menggunakan file function.proj. Pada langkah ini, Anda menyimpan dan mengunggah file function.proj untuk rakitan yang diperlukan. Untuk informasi lebih lanjut, lihat Menggunakan paket NuGet dengan Azure Functions.

    1. Salin baris berikut ke editor favorit Anda dan simpan file di komputer Anda sebagai function.proj.

      <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. Pilih tombol Unggah yang terletak di atas editor kode untuk mengunggah file function.proj Anda. Setelah mengunggah, pilih file di editor kode menggunakan kotak drop-down untuk memverifikasi konten.

    3. Pilih file function.proj di editor kode dan verifikasi kontennya. Jika file function.proj kosong, salin baris di atas ke dalam file dan simpan. (Terkadang unggahan membuat file tanpa mengunggah konten.)

  12. Pastikan run.csx untuk HttpTrigger1 dipilih di editor kode. Ganti kode untuk fungsi HttpTrigger1 dengan kode berikut dan pilih Simpan:

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

Membuat pendaftaran

Di bagian ini, Anda membuat grup pendaftaran baru yang menggunakan kebijakan alokasi kustom. Untuk kesederhanaan, tutorial ini menggunakan pengesahan kunci konten dengan pendaftaran. Untuk solusi yang lebih aman, sebaiknya gunakan pengesahan sertifikat digital X.509 dengan rantai kepercayaan.

  1. Masuk ke portal Microsoft Azure dan navigasikan ke instans Device Provisioning Service.

  2. Pilih Kelola pendaftaran dari bagian Pengaturan menu navigasi.

  3. Pilih Tambahkan grup pendaftaran.

  4. Pada tab Pendaftaran + provisi halaman Tambahkan grup pendaftaran, berikan informasi berikut untuk mengonfigurasi detail grup pendaftaran:

    Bidang Deskripsi
    Pengesahan Pilih Kunci konten sebagai mekanisme Pengesahan.
    Pengaturan kunci konten Centang kotak Buat kunci konten secara otomatis .
    Nama grup Masukkan contoso-custom-allocated-devices sebagai nama grup.
    Status provisi Centang kotak Aktifkan pendaftaran ini.
  5. Pilih Berikutnya: Hub IoT.

  6. Pada tab hub IoT di halaman Tambahkan grup pendaftaran, berikan informasi berikut untuk menentukan hub IoT mana yang dapat disediakan oleh grup pendaftaran untuk:

    Bidang Deskripsi
    Hub IoT target Pilih satu atau beberapa hub IoT tertaut Anda, atau tambahkan tautan baru ke hub IoT.
    Kebijakan alokasi Pilih Kustom (gunakan Azure Function). Pilih Pilih fungsi Azure, lalu ikuti perintah untuk memilih fungsi yang Anda buat untuk tutorial ini.
  7. Pilih Tinjau + buat.

  8. Pada tab Tinjau + buat , verifikasi semua nilai Anda lalu pilih Buat.

Setelah menyimpan pendaftaran, buka kembali dan catat kunci Primer. Anda harus menyimpan pendaftaran terlebih dahulu agar kunci dapat dihasilkan. Kunci ini digunakan untuk menghasilkan kunci perangkat unik untuk perangkat simulasi di bagian berikutnya.

Membuat turunan kunci perangkat unik

Perangkat tidak menggunakan kunci konten utama grup pendaftaran secara langsung. Sebagai gantinya, Anda menggunakan kunci primer untuk mendapatkan kunci perangkat untuk setiap perangkat. Di bagian ini, Anda membuat dua kunci perangkat unik. Satu kunci digunakan untuk perangkat pemangsa roti yang disimulasikan. Kunci lainnya digunakan untuk perangkat pompa panas yang disimulasikan.

Untuk mendapatkan kunci perangkat, Anda menggunakan Kunci Primer grup pendaftaran yang Anda catat sebelumnya untuk menghitung HMAC-SHA256 DARI ID pendaftaran perangkat untuk setiap perangkat dan mengonversi hasilnya menjadi format Base 64. Untuk informasi lebih lanjut terkait cara membuat kunci perangkat turunan dengan grup pendaftaran, lihat bagian pendaftaran grup dari Pengesahan kunci simetris.

Untuk contoh dalam tutorial ini, gunakan dua ID pendaftaran perangkat berikut dan komputasi kunci perangkat untuk kedua perangkat. Kedua ID pendaftaran memiliki akhiran yang valid untuk bekerja dengan kode contoh untuk kebijakan alokasi kustom:

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

Ekstensi IoT untuk Azure CLI menyediakan iot dps enrollment-group compute-device-keyperintah untuk menghasilkan kunci perangkat turunan. Perintah ini dapat digunakan pada sistem Berbasis Windows atau Linux dari PowerShell atau shell Bash.

Ganti nilai argumen --key dengan Kunci Primer dari grup pendaftaran Anda.

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

Catatan

Anda juga dapat memberikan ID grup pendaftaran daripada kunci konten ke iot dps enrollment-group compute-device-key perintah . Contohnya:

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

Perangkat yang disimulasikan menggunakan kunci perangkat turunan dengan setiap ID pendaftaran untuk melakukan pengesahan kunci konten.

Menyiapkan lingkungan pengembangan Azure IoT C SDK

Di bagian ini, Anda akan menyiapkan lingkungan pengembangan yang digunakan untuk membuat Azure IoT C SDK. SDK menyertakan kode sampel untuk perangkat yang disimulasikan. Perangkat simulasi ini akan mencoba provisi selama proses pengurutan boot perangkat.

Bagian ini berorientasi pada stasiun kerja berbasis Windows. Untuk contoh Linux, lihat penyusunan VM dalam Tutorial: Provisikan untuk latensi geografis.

  1. Unduh sistem build CMake.

    Penting bahwa prasyarat Visual Studio (Visual Studio dan beban kerja 'Pengembangan desktop dengan C++') diinstal pada komputer Anda, sebelum memulai CMake penginstalan. Setelah prasyarat tersedia, dan unduhan diverifikasi, pasang sistem build CMake.

  2. Temukan nama tag untuk rilis terbaru SDK.

  3. Buka perintah atau shell Git Bash. Jalankan perintah berikut untuk mengkloning rilis terbaru Azure IoT Device SDK untuk repositori C GitHub. Gunakan tag yang Anda temukan di langkah sebelumnya sebagai nilai untuk -b parameter, misalnya: 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
    

    Penyelesaian operasi ini membutuhkan waktu beberapa menit.

  4. Buat subdirektori cmake di direktori akar dari repositori git dan buka folder tersebut. Jalankan perintah berikut dari direktori azure-iot-sdk-c:

    mkdir cmake
    cd cmake
    
  5. Jalankan perintah berikut, yang mem-build versi SDK khusus untuk platform klien pengembangan Anda. Solusi Visual Studio untuk perangkat yang disimulasikan akan dibuat di direktori cmake.

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

    Jika cmake tidak menemukan pengkompilasi C++, Anda mungkin melihat kesalahan build saat menjalankan perintah. Jika hal ini terjadi, coba jalankan perintah ini di perintah Visual Studio.

    Setelah build berhasil, beberapa garis output terakhir akan terlihat mirip dengan output berikut:

    $ 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
    

Menyimulasikan perangkat

Di bagian ini, Anda memperbarui sampel provisi bernama prov_dev_client_sample yang terletak di Azure IoT C SDK yang Anda siapkan sebelumnya.

Contoh kode ini mensimulasikan urutan boot perangkat yang mengirimkan permintaan provisi ke instans IoT Hub Device Provisioning Service Anda. Urutan boot menyebabkan perangkat pemanggang toaster dikenali dan ditetapkan ke hub IoT menggunakan kebijakan alokasi kustom.

  1. Di portal Microsoft Azure, pilih tab Gambaran Umum untuk Device Provisioning Service Anda dan catat nilai ID Scope.

    Mengekstrak informasi titik akhir Device Provisioning Service dari blade portal

  2. Di Visual Studio, buka file solusi azure_iot_sdks.sln yang dihasilkan dengan menjalankan CMake sebelumnya. File solusi harus berada di lokasi berikut: azure-iot-sdk-c\cmake\azure_iot_sdks.sln.

  3. Di jendela Penjelajah Solusi Visual Studio, navigasikan ke folder Provision_Samples. Perluas proyek sampel bernama prov_dev_client_sample. Perluas File Sumber, dan buka prov_dev_client_sample.c.

  4. Cari konstanta id_scope, dan ganti nilainya dengan nilai Cakupan ID yang telah Anda salin sebelumnya.

    static const char* id_scope = "0ne00002193";
    
  5. Temukan definisi untuk fungsi main() dalam file yang sama. Pastikan variabel hsm_type diatur ke SECURE_DEVICE_TYPE_SYMMETRIC_KEY seperti yang ditunjukkan di bawah ini.

    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. Dalam main() fungsi, temukan panggilan ke Prov_Device_Register_Device() . Tepat sebelum panggilan itu, tambahkan baris kode berikut yang menggunakan Prov_Device_Set_Provisioning_Payload() untuk meneruskan payload JSON kustom selama provisi. Baris kode tersebut dapat digunakan untuk memberikan informasi lebih lanjut ke fungsi alokasi kustom Anda. Juga dapat digunakan untuk meneruskan jenis perangkat, daripada memeriksa ID pendaftaran. Untuk informasi lengkap cara mengirim dan menerima payload data kustom dengan DPS, lihat Cara mentransfer payload antara perangkat dan DPS.

    // 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. Klik kanan proyek prov_dev_client_sample dan pilih Atur sebagai Proyek Startup.

Menyimulasikan perangkat pemanggang roti Contoso

  1. Untuk mensimulasikan perangkat pemanggih, temukan panggilan ke prov_dev_set_symmetric_key_info() di prov_dev_client_sample.c yang dikomentari.

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

    Batalkan pemberian komentar pada panggilan fungsi dan ganti nilai tempat penampung (seperti kurung sudut) dengan ID pendaftaran pemanggang roti dan kunci perangkat turunan yang Anda hasilkan sebelumnya. Nilai kunci JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= yang ditunjukkan di bawah ini hanya disediakan sebagai contoh.

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

    Simpan file.

  2. Pada menu Visual Studio, pilih Debug>Mulai tanpa penelusuran kesalahan untuk menjalankan solusinya. Di perintah untuk membuat kembali proyek, pilih Ya, untuk membangun kembali proyeknya sebelum dijalankan.

    Contoh output perangkat berikut menunjukkan bahwa perangkat pemanggang roti yang disimulasikan berhasil mem-boot dan menghubungkan ke instans layanan provisi yang akan ditetapkan ke hub IoT pemanggang roti melalui kebijakan alokasi kustom:

    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:
    

    Output berikut adalah contoh output pengelogan dari kode fungsi alokasi kustom yang berjalan untuk perangkat pemanggang roti. Perhatikan hub untuk perangkat pemanggang roti telah berhasil dipilih. Perhatikan payload juga properti yang berisi konten JSON kustom yang Anda tambahkan ke kode. Anggota tersebut tersedia untuk digunakan kode Anda dalam deviceRuntimeContext .

    Pembuatan log ini tersedia dengan mengklik Log di bawah kode fungsi di portal:

    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)
    

Menyimulasikan perangkat pompa panas Contoso

  1. Untuk mensimulasikan perangkat pompa panas, perbarui panggilan ke prov_dev_set_symmetric_key_info() di prov_dev_client_sample.c lagi dengan ID pendaftaran pompa panas dan kunci perangkat turunan yang Anda buat sebelumnya. Nilai kunci 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= yang ditunjukkan di bawah ini hanya disediakan sebagai contoh.

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

    Simpan file.

  2. Pada menu Visual Studio, pilih Debug>Mulai tanpa penelusuran kesalahan untuk menjalankan solusinya. Saat diminta untuk membangun kembali proyek, pilih Ya untuk membangun kembali proyek sebelum dijalankan.

    Contoh output perangkat berikut menunjukkan bahwa perangkat pompa kalor yang disimulasikan berhasil mem-boot dan menghubungkan ke instans layanan provisi yang akan ditetapkan ke hub IoT pompa kalor melalui kebijakan alokasi kustom:

    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:
    

Memecahkan masalah kebijakan alokasi kustom

Tabel berikut menunjukkan skenario yang diharapkan dan kode galat hasil yang mungkin Anda terima. Gunakan tabel ini untuk membantu memecahkan masalah kegagalan kebijakan alokasi kustom dengan Azure Functions Anda.

Skenario Hasil pendaftaran dari Layanan Provisi Memprovisikan Hasil SDK
Webhook menampilkan 200 OK dengan 'iotHubHostName' diatur ke nama host hub IoT yang valid Status hasil: Ditetapkan SDK menampilkan PROV_DEVICE_RESULT_OK bersama dengan informasi hub
Webhook menampilkan 200 OK dengan 'iotHubHostName' hadir dalam respons, tetapi diatur ke string kosong atau null Status hasil: Gagal

Kode galat: CustomAllocationIotHubNotSpecified (400208)
SDK menampilkan PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED
Webhook menampilkan 401 Tidak Sah Status hasil: Gagal

kode galat: CustomAllocationUnauthorizedAccess (400209)
SDK menampilkan PROV_DEVICE_RESULT_UNAUTHORIZED
Pendaftaran Individu dibuat untuk menonaktifkan perangkat Status hasil: Dinonaktifkan SDK menampilkan PROV_DEVICE_RESULT_DISABLED
Webhook mengembalikan kode >kesalahan = 429 Orkestrasi DPS akan mencoba kembali beberapa kali. Kebijakan percobaan kembali saat ini:

  - Jumlah percobaan kembali: 10
  - Interval awal: 1 d
  - Kenaikan: 9 d
SDK akan mengabaikan kesalahan dan mengirimkan pesan status get lain dalam waktu yang ditentukan
Webhook menampilkan kode status lainnya Status hasil: Gagal

Kode galat: CustomAllocationFailed (400207)
SDK menampilkan PROV_DEVICE_RESULT_DEV_AUTH_ERROR

Membersihkan sumber daya

Jika Anda berencana untuk terus bekerja dengan sumber daya yang dibuat dalam tutorial ini, Anda dapat meninggalkannya. Jika Anda tidak berencana untuk terus menggunakan sumber daya, gunakan langkah-langkah berikut untuk menghapus semua sumber daya yang dibuat dalam tutorial ini untuk menghindari biaya yang tidak perlu.

Langkah-langkah di sini mengasumsikan Anda membuat semua sumber daya dalam tutorial ini seperti yang diinstruksikan dalam grup sumber daya yang sama bernama contoso-us-resource-group.

Penting

Penghapusan grup sumber daya tidak bisa dipulihkan. Grup sumber daya dan semua sumber daya yang tercakup di dalamnya akan dihapus secara permanen. Pastikan Anda tidak menghapus grup atau sumber daya yang salah secara tidak sengaja. Jika Anda membuat IoT Hub di dalam grup sumber daya yang ada dan berisi sumber daya yang ingin Anda simpan, hanya hapus sumber daya Hub IoT itu sendiri dan tidak perlu menghapus grup sumber daya.

Untuk menghapus grup sumber daya menurut nama:

  1. Masuk ke portal Microsoft Azure, lalu pilih Grup sumber daya.

  2. Dalam kotak teks Filter menurut nama..., ketik nama grup sumber daya yang berisi sumber daya Anda, contoso-us-resource-group.

  3. Di sebelah kanan grup sumber daya Anda dalam daftar hasil, pilih ... lalu Hapus grup sumber daya.

  4. Anda akan diminta untuk mengonfirmasi penghapusan grup sumber daya. Ketik nama grup sumber daya Anda lagi untuk mengonfirmasi, lalu pilih Hapus. Setelah beberapa saat, grup sumber daya dan semua sumber daya di dalamnya akan dihapus.

Langkah berikutnya

Untuk mempelajari selengkapnya tentang kebijakan alokasi kustom, lihat