إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تمنحك نهج التخصيص المخصصة مزيدا من التحكم في كيفية تعيين الأجهزة إلى مراكز IoT الخاصة بك. باستخدام نهج التخصيص المخصصة، يمكنك تحديد نهج التخصيص الخاصة بك عندما لا تفي النهج التي توفرها خدمة توفير جهاز Azure IoT Hub (DPS) بمتطلبات السيناريو الخاص بك. يتم تنفيذ نهج تخصيص مخصص في خطاف ويب مستضاف في Azure Functions ويتم تكوينه على واحد أو أكثر من التسجيلات الفردية و/أو مجموعات التسجيل. عندما يسجل جهاز مع DPS باستخدام إدخال تسجيل مكون، يستدعي DPS خطاف الويب لمعرفة مركز IoT الذي يجب تسجيل الجهاز فيه، واختياريا، حالته الأولية. لمعرفة المزيد، راجع فهم نهج التخصيص المخصصة باستخدام خدمة توفير جهاز Azure IoT Hub.
يوضح هذا البرنامج التعليمي نهج تخصيص مخصص باستخدام وظيفة Azure المكتوبة بلغة C#. يتم تعيين الأجهزة إلى أحد مركزي IoT اللذين يمثلان قسم محمصات Contoso وقسم مضخات الحرارة في Contoso. يجب أن يكون للأجهزة التي تطلب التزويد معرف تسجيل بإحدى اللاحقات التالية ليتم قبولها للتزويد:
- -contoso-tstrsd-007 لقسم محمصات Contoso
- -contoso-hpsd-088 لقسم مضخات الحرارة Contoso
تتم محاكاة الأجهزة باستخدام عينة توفير مضمنة في Azure IoT C SDK.
في هذا الدرس، تقوم بتنفيذ الإجراءات التالية:
- استخدم Azure CLI لإنشاء مثيل DPS ولإنشاء وربط مركزي IoT لقسم Contoso (قسم محمصات Contoso وقسم مضخات الحرارة Contoso) به.
- إنشاء دالة Azure التي تنفذ نهج التخصيص المخصص.
- إنشاء مجموعة تسجيل جديدة تستخدم وظيفة Azure لنهج التخصيص المخصص.
- إنشاء مفاتيح متماثلة للجهاز لجهازين محاكاة.
- إعداد بيئة التطوير ل Azure IoT C SDK.
- محاكاة الأجهزة والتحقق من توفيرها وفقا لمثال التعليمات البرمجية في نهج التخصيص المخصص.
إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.
المتطلبات الأساسية
المتطلبات الأساسية التالية هي لبيئة تطوير Windows. بالنسبة إلى Linux أو macOS، راجع القسم المناسب في إعداد بيئة التطوير في وثائق SDK.
Visual Studio 2022 مع تمكين حمل العمل "تطوير سطح المكتب مع C++". كما يتم دعم Visual Studio 2015 وVisual Studio 2017.
تم تثبيت Git. لمزيد من المعلومات، راجع تنزيلات Git.
Azure CLI مُثبت. لمزيد من المعلومات، راجع كيفية تثبيت Azure CLI. أو يمكنك تشغيل الأوامر في هذا البرنامج التعليمي في بيئة Bash في Azure Cloud Shell.
إنشاء خدمة التزويد ومركزي IoT
في هذا القسم، يمكنك استخدام Azure Cloud Shell لإنشاء خدمة توفير ومركزي IoT يمثلان قسم محمصات Contoso وقسم Contoso Heat Pumps.
أولا، قم بتعيين متغيرات البيئة في مساحة العمل الخاصة بك لتبسيط الأوامر في هذا البرنامج التعليمي.
يجب أن تكون أسماء DPS وIoT Hub فريدة عالميا. استبدل
SUFFIXالعنصر النائب بقيمتك الخاصة.أيضا، تبحث التعليمات البرمجية ل Azure Function التي تقوم بإنشائها لاحقا في هذا البرنامج التعليمي عن مراكز IoT التي تحتوي على أو
-toasters--heatpumps-في أسمائها. إذا قمت بتغيير القيم المقترحة، فتأكد من استخدام الأسماء التي تحتوي على السلاسل الفرعية المطلوبة.#!/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"تلميح
تنشئ الأوامر المستخدمة في هذا البرنامج التعليمي موارد في موقع غرب الولايات المتحدة بشكل افتراضي. نوصي بإنشاء مواردك في المنطقة الأقرب إليك التي تدعم خدمة توفير الأجهزة. يمكنك عرض قائمة بالمواقع المتاحة من خلال الذهاب إلى صفحة حالة Azure والبحث عن "خدمة توفير الأجهزة". في الأوامر، يمكن تحديد المواقع إما بصيغة كلمة واحدة أو بصيغة متعددة الكلمات؛ على سبيل المثال: Westus، West US، West US، وغيرها. القيمة ليست حساسة لعلامات الحرف.
استخدم الأمر az group create لإنشاء مجموعة موارد Azure. مجموعة موارد Azure هي حاوية منطقية يتم بها نشر موارد Azure وإدارتها.
ينشئ المثال التالي مجموعة موارد. نوصي باستخدام مجموعة واحدة لجميع الموارد التي تم إنشاؤها في هذا البرنامج التعليمي. سيجعل هذا النهج التنظيف أسهل بعد الانتهاء.
az group create --name $RESOURCE_GROUP --location $LOCATIONاستخدم الأمر az iot dps create لإنشاء مثيل لخدمة توفير الأجهزة (DPS). تتم إضافة خدمة التوفير إلى contoso-us-resource-group.
az iot dps create --name $DPS --resource-group $RESOURCE_GROUP --location $LOCATIONقد يستغرق هذا الأمر بضع دقائق لإكماله.
استخدم الأمر az iot hub create لإنشاء مركز Contoso Toasters Division IoT. تتم إضافة مركز IoT إلى contoso-us-resource-group.
az iot hub create --name $TOASTER_HUB --resource-group $RESOURCE_GROUP --location $LOCATION --sku S1قد يستغرق هذا الأمر بضع دقائق لإكماله.
استخدم الأمر az iot hub create لإنشاء مركز Contoso Heat Pumps Division IoT. تتم إضافة مركز IoT هذا أيضا إلى contoso-us-resource-group.
az iot hub create --name $HEATPUMP_HUB --resource-group $RESOURCE_GROUP --location $LOCATION --sku S1قد يستغرق هذا الأمر بضع دقائق لإكماله.
قم بتشغيل الأمرين التاليين للحصول على سلسلة الاتصال للمراكز التي قمت بإنشائها.
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قم بتشغيل الأوامر التالية لربط المراكز بمورد DPS. استبدل العناصر النائبة بالمركز سلسلة الاتصال من الخطوة السابقة.
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>
إنشاء دالة التخصيص المخصصة
في هذا القسم، يمكنك إنشاء دالة Azure التي تنفذ نهج التخصيص المخصص. تحدد هذه الدالة مركز IoT القسمي الذي يجب تسجيل الجهاز فيه بناء على ما إذا كان معرف التسجيل الخاص به يحتوي على السلسلة -contoso-tstrsd-007 أو -contoso-hpsd-088. كما أنه يحدد الحالة الأولية للجهاز المزدوج بناء على ما إذا كان الجهاز محمصة أو مضخة حرارية.
قم بتسجيل الدخول إلى بوابة Azure.
في مربع البحث، ابحث عن Function App وحدده.
حدد Create or Create Function App.
في صفحة إنشاء تطبيق الوظائف ، تحت تبويب الأساسيات ، أدخل الإعدادات التالية لتطبيق الوظائف الجديد واختر مراجعة + إنشائ:
المعلمة القيمة الاشتراك تأكد من تحديد الاشتراك الذي أنشأت فيه الموارد لهذا البرنامج التعليمي. مجموعة الموارد حدد مجموعة الموارد التي قمت بإنشائها في القسم السابق. الإعداد الافتراضي المتوفر في القسم السابق هو contoso-us-resource-group. اسم تطبيق الوظائف أدخل اسما لتطبيق الوظائف. مكدس وقت التشغيل NET. الإصدار حدد أي إصدار نموذج قيد المعالجة. المنطقة حدد أقرب منطقة إليك. إشعار
بشكل افتراضي، يتم تمكين Application Insights. Application Insights ليس ضروريا لهذا الدرس، لكنه قد يساعدك على فهم وتحقيق أي مشاكل تواجهها مع التخصيص المخصص. إذا كنت تفضل ذلك، يمكنك تعطيل Application Insights عن طريق تحديد علامة التبويب Monitoring ثم تحديد No للخيار Enable Application Insights.
في علامة التبويب Review + create ، حدد Create لإنشاء تطبيق الوظائف.
قد يستغرق النشر عدة دقائق. عند الانتهاء، حدد Go to resource.
في الجزء الأيمن من صفحة نظرة عامة على تطبيق الوظائف، حدد Create function.
في صفحة Create function ، حدد قالب HTTP Trigger ثم حدد Next.
في علامة التبويب تفاصيل القالب، حدد مجهول كمستوى التخويل ثم حدد إنشاء.
تلميح
إذا أبقيت مستوى التفويض كوظيفة، فستحتاج إلى تكوين تسجيلات DPS باستخدام مفتاح واجهة برمجة التطبيقات الخاصة بالوظائف. لمزيد من المعلومات، راجع مشغل HTTP لوظائف Azure.
عند فتح الدالة HttpTrigger1 ، حدد Code + Test في الجزء الأيمن. يتيح لك هذا الاختيار تعديل الكود الخاص بالدالة. يجب فتح ملف التعليمات البرمجية run.csx للتحرير.
الرجوع إلى حزم NuGet المطلوبة. لإنشاء توأم الجهاز الأولي، تستخدم دالة التخصيص المخصصة الفئات التي تم تعريفها في حزمتي NuGet التي يجب تحميلها في بيئة الاستضافة. باستخدام Azure Functions، تتم الإشارة إلى حزم NuGet باستخدام ملف function.proj . في هذه الخطوة، يمكنك حفظ وتحميل ملف function.proj للتجميعات المطلوبة. لمزيد من المعلومات، راجع استخدام حزم NuGet.
انسخ الأسطر التالية في المحرر المفضل لديك واحفظ الملف على الكمبيوتر الخاص بك ك 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>حدد الزر Upload الموجود أعلى محرر التعليمات البرمجية لتحميل ملف function.proj. بعد التحميل، حدد الملف في محرر التعليمات البرمجية باستخدام مربع القائمة المنسدلة للتحقق من المحتويات.
حدد الملف function.proj في محرر التعليمات البرمجية وتحقق من محتوياته. إذا كان ملف function.proj فارغا، انسخ الأسطر السابقة إلى الملف واحفظه. (في بعض الأحيان يقوم التحميل بإنشاء الملف دون تحميل المحتويات.)
تأكد من تحديد 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 مع سلسلة من الثقة.
سجل الدخول إلى مدخل Microsoft Azure وانتقل إلى مثيل خدمة تزويد الأجهزة.
حدد إدارة التسجيلات من قسم الإعدادات في قائمة التنقل.
حدد Add enrollment group.
في علامة التبويب Registration + provisioning في صفحة Add enrollment group ، قم بتوفير المعلومات التالية لتكوين تفاصيل مجموعة التسجيل:
الحقل الوصف شهاده حدد مفتاح متماثل كآلية التصديق. إعدادات المفتاح المتماثل حدد المربع إنشاء مفاتيح متماثلة تلقائيا. اسم المجموعة أدخل contoso-custom-custom-allocated-devices كاسم المجموعة. حالة التوفير حدد المربع تمكين هذا التسجيل. حدد Next: IoT hubs.
في علامة التبويب IoT hubs في صفحة Add enrollment group ، قم بتوفير المعلومات التالية لتحديد مراكز IoT التي يمكن لمجموعة التسجيل توفير الأجهزة لها:
الحقل الوصف مراكز IoT المستهدفة حدد واحدا أو أكثر من مراكز IoT المرتبطة، أو أضف ارتباطا جديدا إلى مركز IoT. نهج التخصيص حدد Custom (use Azure Function). حدد Select Azure function، ثم اتبع المطالبات لتحديد الدالة التي قمت بإنشائها لهذا البرنامج التعليمي. حدد "Review + create".
في علامة التبويب Review + create ، تحقق من جميع القيم الخاصة بك ثم حدد Create.
بعد حفظ التسجيل، أعد فتحه وقم بتدوين المفتاح الأساسي. يجب حفظ التسجيل أولاً لإنشاء المفاتيح. يستخدم هذا المفتاح لإنشاء مفاتيح جهاز فريدة للأجهزة المحاكية في القسم التالي.
تلميح
عند إنشاء مجموعة تسجيل في مدخل Microsoft Azure وتحديد نهج تخصيص مخصص، يقوم مدخل Azure تلقائيا باسترداد المفتاح الوظيفي وتضمينه نيابة عنك. إذا قمت بإنشاء تسجيل برمجيا، فستحتاج إلى توفير المفتاح كجزء من خطوة الإنشاء.
اشتقاق مفاتيح جهاز فريدة
لا تستخدم الأجهزة المفتاح المتماثل الأساسي لمجموعة التسجيل مباشرة. بدلا من ذلك، يمكنك استخدام المفتاح الأساسي لاشتقاق مفتاح جهاز لكل جهاز. في هذا القسم، يمكنك إنشاء مفتاحي جهاز فريدين. يتم استخدام مفتاح واحد لجهاز محمصة محاكاة. يتم استخدام المفتاح الآخر لجهاز مضخة حرارية محاكاة.
لاشتقاق مفتاح الجهاز، تستخدم المفتاح الأساسي لمجموعة التسجيل التي أشرت إليها سابقا لحساب تجزئة HMAC-SHA256 لمعرف تسجيل الجهاز لكل جهاز وتحويل النتيجة إلى صيغة Base 64. لمزيد من المعلومات حول إنشاء مفاتيح الأجهزة المشتقة مع مجموعات التسجيل، راجع قسم تسجيلات المجموعات باستخدام المفاتيح المتماثلة في شهادة المفاتيح المتماثلة.
على سبيل المثال في هذا البرنامج التعليمي، استخدم معرفي تسجيل الجهاز التاليين واحسب مفتاح جهاز لكلا الجهازين. يحتوي معرفا التسجيل على لاحقة صالحة للعمل مع مثال التعليمات البرمجية لنهج التخصيص المخصص:
- breakroom499-contoso-tstrsd-007
- mainbuilding167-contoso-hpsd-088
يوفر ملحق IoT ل Azure CLI الأمر iot dps enrollment-group compute-device-key لإنشاء مفاتيح الأجهزة المشتقة. يمكن استخدام هذا الأمر على الأنظمة المستندة إلى Windows أو Linux، من PowerShell أو Bash shell.
استبدل قيمة الوسيطة --key بـ Primary Key من مجموعة التسجيل.
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
إشعار
يمكنك أيضا توفير معرف مجموعة التسجيل بدلا من المفتاح المتماثل للأمر iot dps enrollment-group compute-device-key . على سبيل المثال:
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
تستخدم أجهزة المحاكاة مفاتيح الجهاز المشتقة مع كل معرف تسجيل لإجراء إثبات المفتاح المتماثل.
إعداد بيئة تطوير SDK IoT C من Azure
في هذا القسم، سيتم تحضير بيئة التطوير المستخدمة في إنشاء SDK IoT C Azure. يتضمن SDK نموذج التعليمات البرمجية للجهاز المحاكى. يحاول هذا الجهاز المحاكى التوفير أثناء تسلسل إقلاع الجهاز.
يتم توجيه هذا المقال نحو محطة عمل تستند إلى Windows. لمثال على لينكس، راجع قسم إنشاء أجهزة لينكس الافتراضية الإقليمية في التعليم: توفير التأخير الجغرافي.
قم بتنزيل نظام CMake build.
من المهم تثبيت المتطلبات الأساسية ل Visual Studio (Visual Studio و "تطوير سطح المكتب مع حمل العمل C++" على جهازك، قبل بدء
CMakeالتثبيت. بمجرد أن يتم وضع المتطلبات الأساسية، ويتم التحقق من التنزيل، قم بتثبيت نظام بنية CMake.ابحث عن اسم العلامة لأحدث إصدار من SDK.
افتح موجه الأوامر أو Git Bash shell. قم بتشغيل الأوامر التالية لاستنساخ أحدث إصدار من Azure IoT Device SDK لمستودع C GitHub. استخدم العلامة التي وجدتها في الخطوة السابقة كقيمة للمعلمة
-b، على سبيل المثال:lts_03_2025.git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --initيجب أن تتوقع أن تستغرق هذه العملية عدة دقائق حتى تكتمل.
إنشاء
cmakeدليل فرعي في الدليل الجذر لمستودع git ثم انتقل إلى ذلك المجلد. تشغيل الأوامر التالية من الدليلazure-iot-sdk-c:mkdir cmake cd cmakeتشغيل الأمر التالي الذي ينشئ إصدار 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 باستخدام نهج التخصيص المخصص.
في مدخل Microsoft Azure، حدد علامة التبويب Overview لخدمة إدارة الأجهزة الخاصة بك وقم بتدوين قيمة ID Scope.
في Visual Studio، افتح ملف الحل azure_iot_sdks.sln الذي تم إنشاؤه بواسطة تشغيل CMake مسبقًا. يجب أن يكون ملف الحل في الموقع التالي:
azure-iot-sdk-c\cmake\azure_iot_sdks.sln.في نافذة مستكشف الحلول Visual Studio، انتقل إلى مجلد Provision_Samples. قم بتوسيع نموذج المشروع المسمى prov_dev_client_sample. قم بتوسيع ملفات المصدر، وافتح prov_dev_client_sample.c.
ابحث عن
id_scopeالثابت، واستبدل القيمة بقيمة نطاق معرفك التي قمت بنسخها سابقاً.static const char* id_scope = "0ne00002193";ابحث عن تعريف الدالة
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;في الدالة
main()، ابحث عن الاستدعاء إلىProv_Device_Register_Device(). قبل ذلك الاستدعاء، قم بإضافة الأسطر التالية من التعليمات البرمجية التي تستخدمProv_Device_Set_Provisioning_Payload()لتمرير حمولة JSON مخصصة أثناء التوفير. يمكن استخدام هذه الحمولة المخصصة لتوفير مزيد من المعلومات لوظائف التخصيص المخصصة لديك. يمكن أيضا استخدام هذه الحمولة لتمرير نوع الجهاز بدلا من فحص معرف التسجيل. لمزيد من المعلومات حول إرسال واستقبال حمولات البيانات المخصصة باستخدام 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)); }انقر بزر الماوس الأيمن فوق مشروع prov_dev_client_sample وحدد تعيين كمشروع بدء التشغيل.
محاكاة جهاز محمصة Contoso
لمحاكاة جهاز المحمصة، ابحث عن الاستدعاء في
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>");قم بإلغاء تعليق استدعاء الوظيفة، واستبدل قيم العناصر النائبة (بما في ذلك أقواس الزاوية) بمعرف تسجيل المحمصة ومفتاح الجهاز المشتق الذي أنشأته مسبقًا. القيمة المفتاحية JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs= المعروضة في الكود التالي موضحة فقط كمثال.
// Set the symmetric key if using they auth type prov_dev_set_symmetric_key_info("breakroom499-contoso-tstrsd-007", "JC8F96eayuQwwz+PkE7IzjH2lIAjCUnAa61tDigBnSs=");حفظ الملف.
في القائمة Visual Studio حدد Debug> البدء من دون تصحيح الأخطاء لتشغيل الحل. في المطالبة بإعادة إنشاء المشروع، حدد Yes لإعادة إنشاء المشروع قبل تشغيله.
الإخراج التالي هو مثال على جهاز محمصة محاكاة التشغيل بنجاح والاتصال بمثيل خدمة التوفير ليتم تعيينه إلى مركز IoT المحمصة بواسطة نهج التخصيص المخصص:
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:الإخراج التالي هو مثال على إخراج التسجيل من التعليمة البرمجية لدالة التخصيص المخصصة التي تعمل لجهاز المحمصة. لاحظ أنه تم تحديد مركز بنجاح لجهاز محمصة. لاحظ أيضا الخاصية
payloadالتي تحتوي على محتوى JSON المخصص الذي أضفته إلى التعليمات البرمجية. هذا المحتوى متاح لكودك لاستخدامه ضمن .deviceRuntimeContextيتوفر هذا التسجيل بالنقر فوق Logs ضمن التعليمة البرمجية للوظيفة في المدخل:
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
لمحاكاة جهاز مضخة الحرارة، قم بتحديث الاستدعاء إلى
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=");حفظ الملف.
في القائمة Visual Studio حدد Debug> البدء من دون تصحيح الأخطاء لتشغيل الحل. في المطالبة بإعادة إنشاء المشروع، حدد Yes لإعادة إنشاء المشروع قبل تشغيله.
الإخراج التالي هو مثال على جهاز مضخة الحرارة المحاكاة بنجاح التمهيد والاتصال بمثيل خدمة التزويد ليتم تعيينه إلى مركز مضخات الحرارة Contoso IoT بواسطة نهج التخصيص المخصص:
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:
استكشاف أخطاء نهج التخصيص المخصصة وإصلاحها
يعرض الجدول التالي السيناريوهات المتوقعة ورموز خطأ النتائج التي قد تتلقاها. استخدم هذا الجدول للمساعدة في استكشاف أخطاء فشل نهج التخصيص المخصص وإصلاحها باستخدام Azure Functions.
| السيناريو | نتيجة التسجيل من خدمة التزويد | توفير نتائج SDK |
|---|---|---|
| يعيد webhook 200 موافق مع تعيين 'iotHubHostName' على اسم مضيف صالح لمركز إنترنت الأشياء | حالة النتيجة: تم التعيين | ترجع SDK PROV_DEVICE_RESULT_OK مع معلومات المركز |
| يعود webhook إلى 200 OK مع وجود 'iotHubHostName' في الرد، لكنه مضبوط على سلسلة فارغة أو null | حالة النتيجة: فشل رمز الخطأ: CustomAllocationIotHubNotSpecified (400208) |
ترجع SDK PROV_DEVICE_RESULT_HUB_NOT_SPECIFIED |
| يقوم خطاف الويب بإرجاع 401 غير مصرح به | حالة النتيجة: فشل رمز الخطأ: CustomAllocationUnauthorizedAccess (400209) |
ترجع SDK PROV_DEVICE_RESULT_UNAUTHORIZED |
| تم إنشاء تسجيل فردي لتعطيل الجهاز | حالة النتيجة: معطل | ترجع SDK PROV_DEVICE_RESULT_DISABLED |
| يقوم الإخطار على الويب بإرجاع رمز >الخطأ = 429 | يعيد توزيع DPS عدة محاولات. نهج إعادة المحاولة حاليا: - عدد مرات إعادة المحاولة: 10 - الفاصل الزمني الأولي: 1 ثانية - الزيادة: 9 ثانية |
تتجاهل SDK الخطأ وترسل رسالة الحصول على حالة أخرى في الوقت المحدد |
| يقوم خطاف الويب بإرجاع أي رمز حالة آخر | حالة النتيجة: فشل رمز الخطأ: CustomAllocationFailed (400207) |
ترجع SDK PROV_DEVICE_RESULT_DEV_AUTH_ERROR |
تنظيف الموارد
إذا كنت تخطط لمواصلة العمل مع الموارد التي تم إنشاؤها في هذا البرنامج التعليمي، يمكنك تركها. إذا كنت لا تخطط لمتابعة استخدام الموارد، فاستخدم الخطوات التالية لحذف جميع الموارد التي تم إنشاؤها في هذا البرنامج التعليمي لتجنب الرسوم غير الضرورية.
تفترض الخطوات هنا أنك أنشأت جميع الموارد في هذا البرنامج التعليمي كما هو موضح في نفس مجموعة الموارد المسماة contoso-us-resource-group.
هام
حذف مجموعة الموارد لا يمكن التراجع عنه. يتم حذف مجموعة الموارد وكافة الموارد المضمنة فيها بشكل دائم. يُرجى التأكد من عدم حذف مجموعة الموارد أو الموارد غير الصحيحة عن طريق الخطأ. إذا قمت بإنشاء مركز IoT داخل مجموعة موارد موجودة تحتوي على الموارد التي تريد الاحتفاظ بها، فاحذف مورد IoT Hub نفسه فقط بدلا من حذف مجموعة الموارد.
لحذف مجموعة الموارد حسب الاسم:
سجل الدخول إلىمدخل Azureوحددمجموعات الموارد.
في مربع النص Filter by name...، اكتب اسم مجموعة الموارد التي تحتوي على الموارد الخاصة بك، contoso-us-resource-group.
إلى يمين مجموعة الموارد في قائمة النتائج، حدد ... ثم Delete resource group.
يُطلب منك تأكيد حذف مجموعة الموارد. اكتب اسم مجموعة الموارد مرة أخرى لتأكيده، واختر Delete. بعد لحظات قليلة، يتم حذف مجموعة الموارد وكافة الموارد المضمنة.
الخطوات التالية
لمعرفة المزيد حول نهج التخصيص المخصصة، راجع