كيفية استخدام نُهج التخصيص المخصصة

يمنحك نهج تخصيص مخصص مزيداً من التحكم في كيفية تعيين الأجهزة إلى مركز IoT. يتم تحقيق ذلك باستخدام تعليمات برمجية مخصصة في وظيفة Azure لتعيين الأجهزة إلى مركز إنترنت الأشياء. تستدعي خدمة توفير الجهاز تعليمة Azure Function البرمجية لتوفير جميع المعلومات ذات الصلة حول الجهاز والتسجيل. يتم تنفيذ التعليمة البرمجية للدالة الخاصة بك وإرجاع معلومات مركز IoT المستخدمة لتوفير الجهاز.

باستخدام نهج التخصيص المخصصة، يمكنك تعريف نهج التخصيص عندما لا تفي النهج التي توفرها Device Provisioning Service بمتطلبات السيناريو الخاص بك.

على سبيل المثال، ربما تريد فحص الشهادة التي يستخدمها جهاز أثناء توفير الجهاز وتعيينه إلى مركز IoT استناداً إلى خاصية شهادة. أو ربما لديك معلومات مخزنة في قاعدة بيانات للأجهزة الخاصة بك وتحتاج إلى الاستعلام عن قاعدة البيانات لتحديد محور IoT الذي يجب تعيين جهاز له.

توضح هذه المقالة نهج تخصيص مخصص باستخدام دالة Azure مكتوبة في C#. تم إنشاء مركزين جديدين لإنترنت الأشياء يمثلان قسم محمصات Contoso وقسممضخات Contoso الحرارية. يجب أن تحتوي الأجهزة التي تطلب إدارة الحسابات على معرف تسجيل مع إحدى اللواحق التالية ليتم قبولها للتوفير:

  • -contoso-tstrsd-007: قسم محمصات كونتوسو
  • -contoso-hpsd-088: قسم مضخات الحرارة Contoso

سيتم توفير الأجهزة بناء على إحدى هذه اللواحق المطلوبة في معرف التسجيل. ستتم محاكاة هذه الأجهزة باستخدام نموذج إدارة حسابات مضمن في Azure IoT C SDK.

يمكنك تنفيذ الخطوات التالية في هذه المقالة:

  • استخدم Azure CLI لإنشاء مركزين لإنترنت الأشياء لقسم Contoso (قسم محمصات Contoso وقسممضخات Contoso الحرارية)
  • إنشاء تسجيل مجموعة جديدة باستخدام Azure Function لنهج التخصيص المخصص
  • إنشاء مفاتيح الجهاز لاثنين من عمليات محاكاة الجهاز.
  • إعداد بيئة التطوير ل Azure IoT C SDK
  • محاكاة الأجهزة والتحقق من توفيرها وفقا للرمز المثال في نهج التخصيص المخصص

إذا لم يكن لديك اشتراك Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

المتطلبات الأساسية

المتطلبات الأساسية التالية هي لبيئة تطوير Windows. بالنسبة إلى Linux أو macOS، راجع القسم المناسب في إعداد بيئة التطوير في وثائق SDK.

إنشاء خدمة التوفير ومركزين لإنترنت الأشياء للأقسام

في هذا القسم، يمكنك استخدام Azure Cloud Shell لإنشاء خدمة توفير ومركزين لإنترنت الأشياء يمثلان قسم محمصات Contoso وقسممضخات Contoso الحرارية.

تلميح

الأوامر المستخدمة في هذه المقالة إنشاء خدمة توفير والموارد الأخرى في موقع غرب الولايات المتحدة. نوصي بإنشاء مواردك في المنطقة الأقرب إليك والتي تدعم خدمة إدارة حسابات الأجهزة. يمكنك عرض قائمة بالمواقع المتاحة عن طريق تشغيل الأمر az provider show --namespace Microsoft.Devices --query "resourceTypes[?resourceType=='ProvisioningServices'].locations | [0]" --out table أو بالانتقال إلى صفحة حالة Azure والبحث عن "خدمة توفير الجهاز". في الأوامر، يمكن تحديد المواقع إما بتنسيق كلمة واحدة أو تنسيق متعدد الكلمات؛ على سبيل المثال: westus، وWest US، وWEST US، وما إلى ذلك. القيمة ليست حساسة لحالة الأحرف. إذا كنت تستخدم تنسيقاً متعدد الكلمات لتحديد الموقع، فقم بإحاطة القيمة بعلامات اقتباس؛ على سبيل المثال، -- location "West US".

  1. استخدم Azure Cloud Shell لإنشاء مجموعة موارد باستخدام الأمر إنشاء مجموعة az. مجموعة موارد Azure هي حاوية منطقية يتم بها نشر موارد Azure وإدارتها.

    ينشئ المثال التالي مجموعة موارد تسمى مجموعة موارد contoso-us-resource-group في منطقة ويستوس . يوصى باستخدام هذه المجموعة لكافة الموارد التي تم إنشاؤها في هذه المقالة. سيجعل هذا النهج التنظيف أسهل بعد الانتهاء.

    az group create --name contoso-us-resource-group --location westus
    
  2. استخدم Azure Cloud Shell لإنشاء خدمة توفير جهاز (DPS) باستخدام الأمر إنشاء az iot dps . ستتم إضافة خدمة التوفير إلى مجموعة contoso-us-resource-group.

    ينشئ المثال التالي خدمة توفير تسمى contoso-provisioning-service-1098 في موقع Westus . يجب عليك استخدام اسم خدمة فريد. قم بتكوين اللاحقة الخاصة بك في اسم الخدمة بدلا من 1098.

    az iot dps create --name contoso-provisioning-service-1098 --resource-group contoso-us-resource-group --location westus
    

    ربما يستغرق هذا الأمر بضع دقائق حتى يكتمل.

  3. استخدم Azure Cloud Shell لإنشاء مركز إنترنت الأشياء لقسم تحميصات Contoso باستخدام الأمر إنشاء موزع az iot . ستتم إضافة مركز إنترنت الأشياء إلى مجموعة contoso-us-resource-group.

    ينشئ المثال التالي مركزا لإنترنت الأشياء يسمى contoso-toasters-hub-1098 في موقع Westus . يجب عليك استخدام اسم موزع فريد. قم بتكوين لاحقة خاصة بك في اسم المحور بدلا من 1098.

    تنبيه

    يتطلب مثال التعليمة البرمجية لدالة Azure لنهج التخصيص المخصص السلسلة -toasters- الفرعية في اسم الموزع. تأكد من استخدام اسم يحتوي على السلسلة الفرعية للمحامص المطلوبة.

    az iot hub create --name contoso-toasters-hub-1098 --resource-group contoso-us-resource-group --location westus --sku S1
    

    ربما يستغرق هذا الأمر بضع دقائق حتى يكتمل.

  4. استخدم Azure Cloud Shell لإنشاء مركز إنترنت الأشياء لقسم المضخات الحرارية Contoso باستخدام الأمر إنشاء موزع az iot . كما ستتم إضافة مركز إنترنت الأشياء هذا إلى مجموعة موارد contoso-us-resource-group.

    ينشئ المثال التالي مركزا لإنترنت الأشياء يسمى contoso-heatpumps-hub-1098 في موقع Westus . يجب عليك استخدام اسم موزع فريد. قم بتكوين لاحقة خاصة بك في اسم المحور بدلا من 1098.

    تنبيه

    يتطلب مثال التعليمة البرمجية لدالة Azure لنهج التخصيص المخصص السلسلة -heatpumps- الفرعية في اسم الموزع. تأكد من استخدام اسم يحتوي على السلسلة الفرعية للمضخات الحرارية المطلوبة.

    az iot hub create --name contoso-heatpumps-hub-1098 --resource-group contoso-us-resource-group --location westus --sku S1
    

    ربما يستغرق هذا الأمر بضع دقائق حتى يكتمل.

  5. يجب ربط محاور إنترنت الأشياء بمورد DPS.

    قم بتشغيل الأمرين التاليين للحصول على سلاسل الاتصال للموزعات التي أنشأتها للتو. استبدل أسماء موارد الموزع بالأسماء التي اخترتها في كل أمر:

    hubToastersConnectionString=$(az iot hub connection-string show --hub-name contoso-toasters-hub-1098 --key primary --query connectionString -o tsv)
    hubHeatpumpsConnectionString=$(az iot hub connection-string show --hub-name contoso-heatpumps-hub-1098 --key primary --query connectionString -o tsv)
    

    قم بتشغيل الأوامر التالية لربط الموزعات بمورد DPS. استبدل اسم مورد DPS بالاسم الذي اخترته في كل أمر:

    az iot dps linked-hub create --dps-name contoso-provisioning-service-1098 --resource-group contoso-us-resource-group --connection-string $hubToastersConnectionString --location westus
    az iot dps linked-hub create --dps-name contoso-provisioning-service-1098 --resource-group contoso-us-resource-group --connection-string $hubHeatpumpsConnectionString --location westus
    

إنشاء دالة التخصيص المخصصة

في هذا القسم، يمكنك إنشاء دالة Azure التي تنفذ نهج التخصيص المخصص. تحدد هذه الوظيفة محور إنترنت الأشياء التقسيمي الذي يجب تسجيل الجهاز فيه استنادا إلى ما إذا كان معرف التسجيل الخاص به يحتوي على السلسلة -contoso-tstrsd-007 أو -contoso-hpsd-088. كما أنه يحدد الحالة الأولية لتوأم الجهاز بناء على ما إذا كان الجهاز محمصة أو مضخة حرارية.

  1. تسجيل الدخول إلى ⁧⁩مدخل Azure⁧⁩. في صفحة Azure الرئيسية، حدد +Create a resource.

  2. في مربع البحث Search the Marketplace، اكتب "Function App". من القائمة المنسدلة حدد Function App، ثم حدد Create.

  3. على صفحة إنشاء Function App ضمن علامة التبويب Basics، أدخل الإعدادات التالية لتطبيق الوظائف الجديد، وحدد Review + create:

    مجموعة الموارد: حدد مجموعة الموارد contoso-us-resource-group للاحتفاظ بكافة الموارد التي تم إنشاؤها في هذه المقالة معا.

    تسمية Function App name: أدخل اسمًا فريدًا لتطبيق الوظائف. يستخدم هذا المثال contoso-function-app-1098.

    النشر: تحقق من تحديد التعليمات البرمجية.

    مكدس وقت التشغيل: حدد ‎.NET Core من القائمة المنسدلة.

    الإصدار: حدد 3.1 من القائمة المنسدلة.

    المنطقة: حدد نفس المنطقة التي حددتها مجموعة الموارد. يستخدم هذا المثال غرب الولايات المتحدة.

    ملاحظة

    بشكل افتراضي، يتم تمكين Application Insights. Application Insights غير ضروري لهذه المقالة، ولكن قد تساعدك في فهم أية مشكلات تواجهها مع التخصيص المخصص والتحقق منها. إذا كنت تفضل ذلك، يمكنك تعطيل Application Insights عن طريق تحديد علامة التبويب Monitoring ثم تحديد No للخيار Enable Application Insights.

    Create an Azure Function App to host the custom allocation function

  4. في صفحة Summary، حدد Create لإنشاء تطبيق الوظائف. وقد يستغرق التوزيع دقائق عدة. عند الانتهاء، حدد Go to resource.

  5. في الجزء الأيمن من صفحة نظرة عامة على تطبيق الوظيفة ، انقر فوق وظائف ثم + إضافة لإضافة دالة جديدة.

  6. في صفحة إضافة وظيفة ، انقر على مشغل HTTP، ثم انقر على الزر إضافة .

  7. في الصفحة التالية، انقر فوق رمز + اختبار. يتيح لك ذلك تحرير التعليمات البرمجية للوظيفة المسماة HttpTrigger1. يجب فتح ملف التعليمات البرمجية run.csx للتحرير.

  8. المرجع المطلوب حزم NuGet. لإنشاء توأم الجهاز الأولي، تستخدم وظيفة التخصيص المخصص الفئات التي تم تعريفها في حزمتي NuGet التي يجب تحميلها في بيئة الاستضافة. باستخدام وظائف Azure، تتم الإشارة إلى حزم NuGet باستخدام ملف function.proj. في هذه الخطوة، يمكنك حفظ وتحميل ملف function.proj للتجميعات المطلوبة. لمزيد من المعلومات، راجع استخدام حزم NuGet مع وظائف Azure.

    1. انسخ الأسطر التالية إلى المحرر المفضل لديك واحفظ الملف على جهاز الكمبيوتر الخاص بك ك function.proj.

      <Project Sdk="Microsoft.NET.Sdk">  
          <PropertyGroup>  
              <TargetFramework>netstandard2.0</TargetFramework>  
          </PropertyGroup>  
          <ItemGroup>  
              <PackageReference Include="Microsoft.Azure.Devices.Provisioning.Service" Version="1.16.3" />
              <PackageReference Include="Microsoft.Azure.Devices.Shared" Version="1.27.0" />
          </ItemGroup>  
      </Project>
      
    2. انقر فوق الزر Upload الموجود أعلى محرر التعليمات البرمجية لتحميل ملف function.proj. بعد التحميل، حدد الملف في محرر التعليمات البرمجية باستخدام المربع المنسدل للتحقق من المحتويات.

  9. تأكد من تحديد run.csx ل HttpTrigger1 في محرر التعليمات البرمجية. استبدل التعليمة البرمجية للدالة HttpTrigger1 بالتعليمة البرمجية التالية وحدد حفظ:

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

إنشاء التسجيل

في هذا القسم، ستقوم بإنشاء مجموعة تسجيل جديدة تستخدم نهج التخصيص المخصص. للبساطة، يستخدم هذا المقال شهادة مفتاح متماثل مع التسجيل. للحصول على حل أكثر أماناً، فكر في استخدام الشهادة X.509 مع سلسلة من الثقة.

  1. لا تزال على مدخل Microsoft Azure، افتح خدمة التوفير.

  2. حدد Manage enrollments في الجزء الأيسر، ثم حدد الزر Manage enrollments في أعلى الصفحة.

  3. في إضافة مجموعة تسجيل، أدخل المعلومات التالية، وحدد الزر حفظ .

    اسم المجموعة: أدخل contoso-custom-alتخصيص-devices.

    نوع التصديق: حدد مفتاح متماثل.

    إنشاء مفاتيح تلقائية: يجب تحديد خانة الاختيار هذه بالفعل.

    تحديد الطريقة التي تريد بها تعيين الأجهزة إلى الموزعات: حدد مخصص (استخدام وظيفة Azure).

    الاشتراك: حدد الاشتراك الذي أنشأت فيه وظيفة Azure الخاصة بك.

    تطبيق الوظيفة: حدد تطبيق الوظيفة الخاص بك بالاسم. تم استخدام contoso-function-app-1098 في هذا المثال.

    الوظيفة: حدد الدالة HttpTrigger1 .

    Add custom allocation enrollment group for symmetric key attestation

  4. بعد حفظ التسجيل، أعد فتحه ثم قم بتدوين ملاحظة Primary Key. يجب حفظ التسجيل أولاً لإنشاء المفاتيح. سيتم استخدام هذا المفتاح لإنشاء مفاتيح جهاز فريدة للأجهزة المحاكية لاحقا.

اشتقاق مفاتيح جهاز فريدة

في هذا القسم، يمكنك إنشاء مفتاحي جهاز فريدين. سيتم استخدام مفتاح واحد لجهاز محمصة محاكاة. سيتم استخدام المفتاح الآخر لجهاز مضخة حرارية محاكاة.

لإنشاء مفتاح الجهاز، يمكنك استخدام المفتاح الأساسي الذي قمت بتدوينه سابقا لحساب HMAC-SHA256 من معرف تسجيل الجهاز لكل جهاز وتحويل النتيجة إلى تنسيق Base64. لمزيد من المعلومات حول إنشاء مفاتيح الأجهزة المشتقة مع مجموعات التسجيل، راجع قسم التسجيلات الجماعية في Symmetric key attestation.

على سبيل المثال الوارد في هذه المقالة، استخدم معرفي تسجيل الجهازين التاليين وقم بحساب مفتاح جهاز لكلا الجهازين. يحتوي كل من معرفي التسجيل على لاحقة صالحة للعمل مع التعليمات البرمجية النموذجية لنهج التخصيص المخصص:

  • بريكروم 499-contoso-tstrsd-007
  • البناء الرئيسي167-contoso-hpsd-088

إذا كنت تستخدم محطة عمل تستند إلى Windows، يمكنك استخدام PowerShell لإنشاء مفتاح الجهاز المشتق كما هو موضح في المثال التالي.

استبدل قيمة المفتاح بالمفتاحالأساسي الذي أشرت إليه سابقا.

$KEY='oiK77Oy7rBw8YB6IS6ukRChAw+Yq6GC61RMrPLSTiOOtdI+XDu0LmLuNm11p+qv2I+adqGUdZHm46zXAQdZoOA=='

$REG_ID1='breakroom499-contoso-tstrsd-007'
$REG_ID2='mainbuilding167-contoso-hpsd-088'

$hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha256.key = [Convert]::FromBase64String($KEY)
$sig1 = $hmacsha256.ComputeHash([Text.Encoding]::ASCII.GetBytes($REG_ID1))
$sig2 = $hmacsha256.ComputeHash([Text.Encoding]::ASCII.GetBytes($REG_ID2))
$derivedkey1 = [Convert]::ToBase64String($sig1)
$derivedkey2 = [Convert]::ToBase64String($sig2)

echo "`n`n$REG_ID1 : $derivedkey1`n$REG_ID2 : $derivedkey2`n`n"
breakroom499-contoso-tstrsd-007 : JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs=
mainbuilding167-contoso-hpsd-088 : 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg=

ستستخدم الأجهزة المحاكية مفاتيح الجهاز المشتقة مع كل معرف تسجيل لإجراء تصديق متماثل للمفتاح.

إعداد بيئة تطوير SDK IoT C من Azure

في هذا القسم، سيتم تحضير بيئة التطوير المستخدمة في إنشاء SDK IoT C Azure. يتضمن SDK نموذج التعليمات البرمجية للجهاز المحاكى. سيحاول هذا الجهاز المحاكي القيام بالتوفير أثناء تسلسل التمهيد للجهاز.

يتم توجيه هذا المقال نحو محطة عمل تستند إلى Windows. للحصول على مثال Linux، راجع إعداد VMs في كيفية توفير تأجير متعدد.

  1. قم بتنزيل نظام بنية CMake.

    من المهم أن يتم تثبيت المتطلبات الأساسية لبرنامج Visual Studio (حمل عمل Visual Studio و"تطوير سطح المكتب باستخدام C ++") على جهازك، قبل بدء تثبيت CMake. بمجرد أن يتم وضع المتطلبات الأساسية، ويتم التحقق من التنزيل، قم بتثبيت نظام بنية CMake.

  2. ابحث عن اسم العلامة لأحدث إصدار من SDK.

  3. افتح موجه الأوامر أو Git Bash shell. قم بتشغيل الأوامر التالية لاستنساخ أحدث إصدار من مستودع GitHubAzure IoT C SDK. استخدم العلامة التي وجدتها في الخطوة السابقة كقيمة -bللمعلمة:

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

    ينبغي أن تتوقع أنَّ هذه العملية سوف تستغرق عدة دقائق لإكمالها.

  4. إنشاء cmake دليل فرعي في الدليل مخزن git ثم انتقل إلى ذلك المجلد. تشغيل الأوامر التالية من الدليل azure-iot-sdk-c:

    mkdir cmake
    cd cmake
    
  5. تشغيل الأمر التالي الذي ينشئ إصدار SDK خاصة إلى النظام الأساسي لعميل التطوير الخاص بك. يتم إنشاء حل Visual Studio للجهاز المحاكى في الدليل cmake.

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

    إذا لم يعثر cmake على المحول البرمجي C++، فقد تحصل على أخطاء في البنية أثناء تشغيل الأمر. إذا حدث ذلك، فحاول تشغيل الأمر في موجه الأوامر Visual Studio.

    بمجرد نجاح البنية، ستبدو أسطر الإخراج القليلة الأخيرة مشابهة للإخراج التالي:

    $ 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
    

محاكاة الجهاز

في هذا القسم، يمكنك تحديث نموذج إدارة حسابات باسم prov_dev_client_sample الموجود في Azure IoT C SDK الذي قمت بإعداده مسبقا.

تحاكي هذه التعليمة البرمجية نموذج تسلسل تمهيد جهاز يرسل طلب التوفير إلى مثيل "Device Provisioning Service". سيؤدي تسلسل التمهيد إلى التعرف على جهاز المحمصة وتعيينها إلى مركز IoT باستخدام نهج التخصيص المخصص.

  1. في مدخل Microsoft Azure، حدد علامة التبويب Overview لخدمة إدارة الأجهزة الخاصة بك وقم بتدوين قيمة ID Scope.

    Extract Device Provisioning Service endpoint information from the portal blade

  2. في Visual Studio، افتح ملف الحل azure_iot_sdks.sln الذي تم إنشاؤه بواسطة تشغيل CMake مسبقًا. يجب أن يكون ملف الحل في الموقع التالي:

    azure-iot-sdk-c\cmake\azure_iot_sdks.sln
    
  3. في نافذة Visual Studio في مستكشف الحلول، انتقل إلى المجلد Provision_Samples. قم بتوسيع نموذج المشروع المسمى prov_dev_client_sample. قم بتوسيع المصدر من الملفات، وافتح prov_dev_client_sample.c.

  4. ابحث عن id_scope الثابت، واستبدل القيمة بقيمة نطاق معرفك التي قمت بنسخها سابقاً.

    static const char* id_scope = "0ne00002193";
    
  5. ابحث عن تعريف الدالة main() في نفس الملف. تأكد من تعيين المتغير hsm_type كما هو موضح SECURE_DEVICE_TYPE_SYMMETRIC_KEY أدناه:

    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. انقر بزر الماوس الأيمن فوق مشروع prov_dev_client_sample وحدد تعيين كبدء تشغيل Project.

محاكاة جهاز محمصة Contoso

  1. لمحاكاة جهاز المحمصة ، ابحث عن المكالمة إلى prov_dev_set_symmetric_key_info()prov_dev_client_sample.c التي تم التعليق عليها.

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

    قم بإلغاء تعليق استدعاء الوظيفة، واستبدل قيم العناصر النائبة (بما في ذلك أقواس الزاوية) بمعرف تسجيل المحمصة ومفتاح الجهاز المشتق الذي أنشأته مسبقًا. القيمة الرئيسية JC8F96eayuQwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= الموضحة أدناه مقدمة فقط كمثال.

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

    احفظ الملف.

  2. في القائمة Visual Studio، حدد Debug>Start بدون تصحيح الأخطاء لتشغيل الحل. في المطالبة بإعادة إنشاء المشروع، حدد Yes لإعادة إنشاء المشروع قبل تشغيله.

    الإخراج التالي هو مثال على جهاز محمصة المحاكاة الذي تم تشغيله بنجاح والاتصال بمثيل خدمة التوفير ليتم تعيينه إلى مركز محمصات إنترنت الأشياء بواسطة نهج التخصيص المخصص:

    Provisioning API Version: 1.3.6
    
    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:
    

محاكاة جهاز مضخة الحرارة Contoso

  1. لمحاكاة جهاز المضخة الحرارية، قم بتحديث المكالمة إلى prov_dev_set_symmetric_key_info()في prov_dev_client_sample.c مرة أخرى باستخدام معرف تسجيل المضخة الحرارية ومفتاح الجهاز المشتق الذي قمت بإنشائه مسبقا. القيمة الرئيسية 6uejA9PfkQgmYylj8Zerp3kcbeVrGZ172YLa7VSnJzg= الموضحة أدناه هي أيضاً فقط كمثال.

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

    احفظ الملف.

  2. في القائمة Visual Studio، حدد Debug>Start بدون تصحيح الأخطاء لتشغيل الحل. في المطالبة بإعادة إنشاء المشروع، حدد Yes لإعادة إنشاء المشروع قبل تشغيله.

    يعد الإخراج التالي مثالا على جهاز المضخة الحرارية المحاكي الذي تم تشغيله بنجاح وتوصيله بمثيل خدمة التوفير الذي سيتم تعيينه إلى مركز Contoso heat pumps IoT بواسطة سياسة التخصيص المخصصة:

    Provisioning API Version: 1.3.6
    
    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:
    

استكشاف أخطاء سياسات التخصيص المخصصة وإصلاحها

يعرض الجدول التالي السيناريوهات المتوقعة ورموز خطأ النتائج التي قد تتلقاها. استخدم هذا الجدول للمساعدة في استكشاف أخطاء فشل نهج التخصيص المخصص وإصلاحها باستخدام وظائف Azure.

السيناريو نتيجة التسجيل من خدمة التزويد توفير نتائج SDK
يقوم webhook بإرجاع 200 موافق مع تعيين "iotHubHostName" إلى اسم مضيف مركز إنترنت الأشياء صالح حالة النتيجة: تم تعيينها تقوم SDK بإرجاع PROV_DEVICE_RESULT_OK إلى جانب معلومات الموزع
يقوم webhook بإرجاع 200 موافق مع وجود "iotHubHostName" في الاستجابة ، ولكن تم تعيينه إلى سلسلة فارغة أو فارغة حالة النتيجة: فشل

رمز الخطأ: CustomAllocationIotHubNotSpecified (400208)
SDK ترجع PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED
يقوم خطاف الويب بإرجاع 401 غير مصرح به حالة النتيجة: فشل

رمز الخطأ: CustomAllocationUnauthorizedAccess (400209)
SDK ترجع PROV_DEVICE_RESULT_UNAUTHORIZED
تم إنشاء تسجيل فردي لتعطيل الجهاز حالة النتيجة: معطل SDK ترجع PROV_DEVICE_RESULT_DISABLED
يقوم webhook بإرجاع رمز >الخطأ = 429 ستعيد تنسيق DPS المحاولة عدة مرات. سياسة إعادة المحاولة هي حاليا:

  - عدد مرات إعادة المحاولة: 10
  - الفاصل الأولي: 1s
  - زيادة: 9 ثانية
ستتجاهل SDK الخطأ وترسل رسالة أخرى للحصول على الحالة في الوقت المحدد
يقوم webhook بإرجاع أي رمز حالة آخر حالة النتيجة: فشل

رمز الخطأ: CustomAllocationFailed (400207)
SDK ترجع PROV_DEVICE_RESULT_DEV_AUTH_ERROR

تنظيف الموارد

إذا كنت تخطط لمواصلة العمل بهذا الحدث، لا تُنظف الموارد المُنشأة في هذا المقال. إذا كنت لا تخطط لمتابعة استخدام الموارد، فاستخدم الخطوات التالية لحذف كافة الموارد التي تم إنشاؤها في هذه المقالة لتجنب المصاريف غير الضرورية.

تفترض الخطوات هنا إنشاء كافة الموارد في هذه المقالة كما هو محدد في نفس مجموعة الموارد المسماة contoso-us-resource-group.

هام

حذف مجموعة الموارد لا يمكن التراجع عنه. يتم حذف مجموعة الموارد وكافة الموارد المضمنة فيها بشكل دائم. يُرجى التأكد من عدم حذف مجموعة الموارد أو الموارد الخاطئة عن طريق الخطأ. إذا قمت بإنشاء مركز IoT داخل مجموعة موارد موجودة تحتوي على الموارد التي تريد الاحتفاظ بها، فقط احذف مورد IoT Hub نفسه بدلاً من حذف مجموعة الموارد.

لحذف مجموعة الموارد حسب الاسم:

  1. سجل الدخول إلىمدخل Microsoft Azureوحدد Resource groups.

  2. في مربع النص Filter by name...، اكتب اسم مجموعة الموارد التي تحتوي على الموارد الخاصة بك، contoso-us-resource-group.

  3. إلى يمين مجموعة الموارد في قائمة النتائج، حدد ... ثم Delete resource group.

  4. سيطلب منك تأكيد حذف مجموعة الموارد. اكتب اسم مجموعة الموارد مرة أخرى لتأكيده، واختر Delete. بعد لحظات قليلة، يتم حذف مجموعة الموارد وكافة الموارد المضمنة.

الخطوات التالية