استيراد وتصدير هويات أجهزة IoT Hub بكميات كبيرة
يحتوي كل مركز IoT على سجل هوية يمكنك استخدامه لإنشاء موارد الجهاز في الخدمة. يمكّنك سجل الهوية أيضاً من التحكم في الوصول إلى نقاط النهاية التي تواجه الجهاز. توضح هذه المقالة كيفية استيراد هويات الجهاز وتصديرها بشكل مجمع من وإلى سجل هوية، باستخدام نموذج ImportExportDeviceSample المضمن مع Microsoft Azure IoT SDK ل .NET. لمزيد من المعلومات حول كيفية استخدام هذه الإمكانية عند ترحيل مركز IoT إلى منطقة مختلفة، راجع كيفية ترحيل مركز Azure IoT يدويا باستخدام قالب Azure Resource Manager.
إشعار
أضاف IoT Hub مؤخرا دعم الشبكة الظاهرية في عدد محدود من المناطق. تؤمن هذه الميزة عمليات الاستيراد والتصدير وتقضي على الحاجة إلى تمرير مفاتيح المصادقة. حاليا، يتوفر دعم الشبكة الظاهرية فقط في هذه المناطق: WestUS2 و EastUS و SouthCentralUS. لمعرفة المزيد حول دعم الشبكة الظاهرية واستدعاءات واجهة برمجة التطبيقات لتنفيذه، راجع دعم IoT Hub للشبكات الظاهرية.
تتم عمليات الاستيراد والتصدير في سياق المهام التي تمكنك من تنفيذ عمليات الخدمة المجمعة مقابل مركز IoT.
تتضمن فئة RegistryManager في SDK أساليب ExportDevicesAsync و ImportDevicesAsync التي تستخدم إطار عمل الوظيفة. تمكنك هذه الطرق من تصدير واستيراد ومزامنة سجل هوية مركز إنترنت الأشياء بالكامل.
تتناول هذه المقالة استخدام فئة RegistryManager ونظام الوظيفة لإجراء عمليات استيراد وتصدير مجمعة للأجهزة من وإلى سجل هوية مركز IoT. يمكنك أيضا استخدام Azure IoT Hub Device Provisioning Service لتمكين التزويد باللمس الصفري في الوقت المناسب لواحد أو أكثر من مراكز IoT. لمعرفة المزيد، راجع وثائق خدمة التزويد.
إشعار
يتم تضمين بعض أجزاء التعليمات البرمجية في هذه المقالة من نموذج خدمة ImportExportDevicesSample المتوفر مع Microsoft Azure IoT SDK ل .NET. يقع النموذج في /iothub/service/samples/how to guides/ImportExportDevicesSample
مجلد SDK، وحيثما تم تحديده، يتم تضمين قصاصات التعليمات البرمجية من ImportExportDevicesSample.cs
ملف نموذج SDK هذا. لمزيد من المعلومات حول نموذج ImportExportDevicesSample وعينات الخدمة الأخرى المضمنة في for.NET Azure IoT SDK، راجع نماذج خدمة مركز Azure IoT ل C#.
ما هي الوظائف؟
تستخدم عمليات سجل الهوية نظام الوظيفة عند العملية:
يحتمل أن يكون وقت تنفيذ طويل مقارنة بعمليات وقت التشغيل القياسية.
إرجاع كمية كبيرة من البيانات للمستخدم.
بدلا من استدعاء API واحد في انتظار أو حظر نتيجة العملية، تقوم العملية بشكل غير متزامن بإنشاء مهمة لمركز IoT هذا. تقوم العملية على الفور بإرجاع عنصر JobProperties.
هام
تتضمن هذه المقالة خطوات الاتصال بخدمة باستخدام توقيع وصول مشترك. أسلوب المصادقة هذا مناسب للاختبار والتقييم، ولكن المصادقة على خدمة باستخدام معرف Microsoft Entra أو الهويات المدارة هي نهج أكثر أمانا. لمعرفة المزيد، راجع أفضل ممارسات الأمان أمان السحابة>.
يوضح قصاصة برمجية التعليمة البرمجية #C التالي كيفية إنشاء وظيفة تصدير:
// Call an export job on the IoT hub to retrieve all devices
JobProperties exportJob = await
registryManager.ExportDevicesAsync(containerSasUri, false);
إشعار
لاستخدام فئة RegistryManager في التعليمة البرمجية #C، أضف حزمة NuGet Microsoft.Azure.Devices إلى مشروعك. فئة RegistryManager موجودة في Microsoft.Azure.Devices مساحة الاسم.
يمكنك استخدام فئة RegistryManager للاستعلام عن حالة Job باستخدام البيانات التعريفية التي تم إرجاعها JobProperties. لإنشاء مثيل لفئة RegistryManager، استخدم الطريقة CreateFromConnectionString.
RegistryManager registryManager =
RegistryManager.CreateFromConnectionString("{your IoT Hub connection string}");
للعثور على سلسلة الاتصال لـ IoT Hub الخاص بك، في مدخل Microsoft Azure:
انتقل إلى IoT Hub الخاص بك.
حدد سياسات الوصول المشترك.
حدد نهج، مع مراعاة الأذونات التي تحتاجها.
انسخ سلسلة الاتصال لهذا النهج.
يوضح مقتطف التعليمات البرمجية C# التالي، من الأسلوب WaitForJobAsync في نموذج SDK، كيفية الاستقصاء كل خمس ثوان لمعرفة ما إذا كانت المهمة قد انتهت من التنفيذ:
// Wait until job is finished
while (true)
{
job = await registryManager.GetJobAsync(job.JobId);
if (job.Status == JobStatus.Completed
|| job.Status == JobStatus.Failed
|| job.Status == JobStatus.Cancelled)
{
// Job has finished executing
break;
}
Console.WriteLine($"\tJob status is {job.Status}...");
await Task.Delay(TimeSpan.FromSeconds(5));
}
إشعار
إذا كان حساب التخزين الخاص بك يحتوي على تكوينات جدار حماية تقيد اتصال IoT Hub، ففكر في استخدام استثناء موثوق به من قِبَل شركة Microsoft (متوفر في مناطق محددة لمراكز IoT ذات هوية الخدمة المدارة).
حدود مهمة استيراد/تصدير الجهاز
يسمح بمهمة استيراد أو تصدير جهاز نشط واحدة فقط في كل مرة لجميع مستويات IoT Hub. يحتوي IoT Hub أيضاً على حدود لمعدل عمليات الوظائف. لمعرفة المزيد، انظر الحصص النسبية والتقييد لـ IoT Hub.
تصدير الأجهزة
استخدم طريقة ExportDevicesAsync لتصدير سجل هوية مركز IoT بالكامل إلى حاوية تخزين البيانات الثنائية الكبيرة Azure Storage باستخدام توقيع وصول مشترك (SAS). تمكنك هذه الطريقة من إنشاء نسخ احتياطية موثوقة لمعلومات جهازك في حاوية البيانات الثنائية الكبيرة التي تتحكم فيها.
تتطلب طريقة ExportDevicesAsync معلمتين:
سلسلة تحتوي على URI لحاوية البيانات الثنائية الكبيرة. يجب أن يحتوي URI هذا على رمز SAS المميز الذي يمنح حق الوصول للكتابة إلى الحاوية. تُنشئ الوظيفة blob كتلة في هذه الحاوية لتخزين بيانات جهاز التصدير المتسلسل. يجب أن يتضمن رمز SAS هذه الأذونات:
SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Delete
منطقي يوضح ما إذا كنت تريد استبعاد مفاتيح المصادقة من بيانات التصدير. إذا كان خطأ، يتم تضمين مفاتيح المصادقة في إخراج التصدير. وإلا، فسيتم تصدير المفاتيح على أنها فارغة.
يوضح قصاصة برمجية تعليمة برمجية #C التالي كيفية بدء مهمة تصدير تتضمن مفاتيح مصادقة الجهاز في بيانات التصدير ثم الاستقصاء للاكتمال:
// Call an export job on the IoT Hub to retrieve all devices
JobProperties exportJob =
await registryManager.ExportDevicesAsync(containerSasUri, false);
// Wait until job is finished
while(true)
{
exportJob = await registryManager.GetJobAsync(exportJob.JobId);
if (exportJob.Status == JobStatus.Completed ||
exportJob.Status == JobStatus.Failed ||
exportJob.Status == JobStatus.Cancelled)
{
// Job has finished executing
break;
}
await Task.Delay(TimeSpan.FromSeconds(5));
}
يمكنك العثور على تعليمات برمجية مشابهة في الأسلوب ExportDevicesAsync من نموذج SDK. تخزن الوظيفة ناتجها في حاوية البيانات الثنائية الكبيرة المتوفرة على هيئة blob كتلة بالاسم devices.txt. تتكون بيانات الإخراج من بيانات الجهاز التسلسلية JSON، مع جهاز واحد لكل خط.
يوضح المثال التالي بيانات الإخراج:
{"id":"Device1","eTag":"MA==","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device2","eTag":"MA==","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device3","eTag":"MA==","status":"disabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device4","eTag":"MA==","status":"disabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device5","eTag":"MA==","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
إذا كان الجهاز يحتوي على بيانات مزدوجة، فسيتم أيضاً تصدير البيانات المزدوجة مع بيانات الجهاز. يوضح المثال التالي هذا التنسيق. جميع البيانات من سطر "twinETag" حتى النهاية عبارة عن بيانات ثنائية.
{
"id":"export-6d84f075-0",
"eTag":"MQ==",
"status":"enabled",
"authentication":null,
"twinETag":"AAAAAAAAAAI=",
"tags":{
"Location":"LivingRoom"
},
"properties":{
"desired":{
"Thermostat":{
"Temperature":75.1,
"Unit":"F"
},
},
"reported":{}
}
}
إذا كنت بحاجة إلى الوصول إلى هذه البيانات في التعليمات البرمجية، يمكنك إلغاء تسلسل هذه البيانات باستخدام فئة ExportImportDevice . يوضح مقتطف التعليمات البرمجية C# التالي، من الأسلوب ReadFromBlobAsync في نموذج SDK، كيفية قراءة معلومات الجهاز التي تم تصديرها مسبقا من ExportImportDevice إلى مثيل BlobClient:
private static async Task<List<string>> ReadFromBlobAsync(BlobClient blobClient)
{
// Read the blob file of devices, import each row into a list.
var contents = new List<string>();
using Stream blobStream = await blobClient.OpenReadAsync();
using var streamReader = new StreamReader(blobStream, Encoding.UTF8);
while (streamReader.Peek() != -1)
{
string line = await streamReader.ReadLineAsync();
contents.Add(line);
}
return contents;
}
استيراد الأجهزة
تمكّنك طريقة ImportDevicesAsync في فئة RegistryManager من إجراء عمليات استيراد ومزامنة مجمعة في سجل هوية مركز إنترنت الأشياء. مثل طريقة ExportDevicesAsync، تستخدم طريقة ImportDevicesAsync إطار عمل Job.
توخ الحذر عند استخدام طريقة ImportDevicesAsync لأنه بالإضافة إلى توفير أجهزة جديدة في سجل الهوية الخاص بك، يمكنه أيضاً تحديث وحذف الأجهزة الحالية.
تحذير
لا يمكن التراجع عن عملية الاستيراد. احرص دائماً على الاحتفاظ بنسخة احتياطية من بياناتك الحالية باستخدام طريقة ExportDevicesAsync إلى حاوية blob أخرى قبل إجراء تغييرات مجمعة على سجل هويتك.
تأخذ طريقة ImportDevicesAsync معلمتين:
سلسلة تحتوي على URI لحاوية كائن ثنائي كبير الحجم ل Azure Storage لاستخدامها كمدخل للوظيفة. يجب أن يحتوي عنوان URI هذا على رمز SAS المميز الذي يمنح حق الوصول للقراءة إلى الحاوية. يجب أن تحتوي هذه الحاوية على blob بالاسم devices.txt والذي يحتوي على بيانات الجهاز التسلسلية لاستيرادها إلى سجل الهوية الخاص بك. يجب أن تحتوي بيانات الاستيراد على معلومات الجهاز بنفس تنسيق JSON الذي تستخدمه مهمة ExportImportDevice عند إنشاء كائن blob devices.txt. يجب أن يتضمن رمز SAS هذه الأذونات:
SharedAccessBlobPermissions.Read
سلسلة تحتوي على URI لحاوية كائن ثنائي كبير الحجم ل Azure Storage لاستخدامها كإخراج من الوظيفة. تنشئ الوظيفة كائن ثنائي كبير الحجم للكتلة في هذه الحاوية لتخزين أي معلومات خطأ من مهمة الاستيراد المكتملة. يجب أن يتضمن رمز SAS هذه الأذونات:
SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Delete
إشعار
يمكن أن تشير المعلمتان إلى نفس حاوية البيانات الثنائية الكبيرة. تتيح المعلمات المنفصلة ببساطة مزيداً من التحكم في بياناتك حيث تتطلب حاوية الإخراج أذونات إضافية.
يوضح قصاصة برمجية تعليمة برمجية #C التالي كيفية بدء مهمة استيراد:
JobProperties importJob =
await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);
يمكن أيضاً استخدام هذه الطريقة لاستيراد البيانات لجهاز مزدوج. تنسيق إدخال البيانات هو نفس التنسيق الموضح في قسم ExportDevicesAsync. بهذه الطريقة، يمكنك إعادة استيراد البيانات التي تم تصديرها.
سلوك الاستيراد
يمكنك استخدام طريقة ImportDevicesAsync لإجراء العمليات المجمعة التالية في سجل الهوية الخاص بك:
- التسجيل الجماعي للأجهزة الجديدة
- عمليات الحذف المجمعة للأجهزة الموجودة
- تغييرات الحالة المجمعة (تمكين الأجهزة أو تعطيلها)
- التخصيص المجمع لمفاتيح مصادقة الجهاز الجديدة
- التجديد التلقائي المجمع لمفاتيح مصادقة الجهاز
- التحديث المجمع للبيانات المزدوجة
يمكنك إجراء أي مجموعة من العمليات السابقة داخل استدعاء ImportDevicesAsync واحد. على سبيل المثال، يمكنك تسجيل أجهزة جديدة وحذف أو تحديث الأجهزة الموجودة في نفس الوقت. عند استخدامها مع طريقة ExportDevicesAsync، يمكنك ترحيل جميع أجهزتك بالكامل من IoT Hub إلى آخر.
استخدم خاصية importMode الاختيارية في استيراد بيانات التسلسل لكل جهاز للتحكم في عملية الاستيراد لكل جهاز. تحتوي الخاصية importMode على الخيارات التالية:
- إنشاء
- CreateOrUpdate (افتراضي)
- CreateOrUpdateIfMatchETag
- حذف
- DeleteIfMatchETag
- تحديث
- UpdateIfMatchETag
- UpdateTwin
- UpdateTwinIfMatchETag
للحصول على تفاصيل حول كل خيار من خيارات وضع الاستيراد هذه، راجع ImportMode
استكشاف أخطاء مهام الاستيراد وإصلاحها
قد يفشل استخدام مهمة استيراد لإنشاء أجهزة مع مشكلة الحصة النسبية عندما تكون قريبة من حد عدد الأجهزة في مركز IoT. يمكن أن يحدث هذا الفشل حتى إذا كان إجمالي عدد الأجهزة لا يزال أقل من حد الحصة النسبية. يتم إرجاع الخطأ IotHubQuotaExceeded (403002) مع رسالة الخطأ التالية: "تجاوز إجمالي عدد الأجهزة على IotHub الحصة النسبية المخصصة."
إذا تلقيت هذا الخطأ، يمكنك استخدام الاستعلام التالي لإرجاع العدد الإجمالي للأجهزة المسجلة على مركز IoT الخاص بك:
SELECT COUNT() as totalNumberOfDevices FROM devices
للحصول على معلومات حول العدد الإجمالي للأجهزة التي يمكن تسجيلها في مركز IoT، راجع حدود مركز IoT.
إذا كانت هناك حصة نسبية لا تزال متوفرة، يمكنك فحص كائن ثنائي كبير الحجم لإخراج المهمة للأجهزة التي فشلت مع خطأ IotHubQuotaExceeded (403002 ). يمكنك بعد ذلك محاولة إضافة هذه الأجهزة بشكل فردي إلى مركز IoT. على سبيل المثال، يمكنك استخدام أساليب AddDeviceAsync أو AddDeviceWithTwinAsync. لا تحاول إضافة الأجهزة باستخدام وظيفة أخرى حيث قد تواجه نفس الخطأ.
مثال على استيراد الأجهزة - توفير الأجهزة المجمّعة
يوضح مقتطف التعليمات البرمجية C# التالي، من أسلوب GenerateDevicesAsync في نموذج SDK، كيفية إنشاء هويات أجهزة متعددة:
- قم بتضمين مفاتيح المصادقة.
- اكتب معلومات الجهاز في كتلة.
- استيراد الأجهزة إلى سجل الهوية.
private async Task GenerateDevicesAsync(RegistryManager registryManager, int numToAdd)
{
var stopwatch = Stopwatch.StartNew();
Console.WriteLine($"Creating {numToAdd} devices for the source IoT hub.");
int interimProgressCount = 0;
int displayProgressCount = 1000;
int totalProgressCount = 0;
// generate reference for list of new devices we're going to add, will write list to this blob
BlobClient generateDevicesBlob = _blobContainerClient.GetBlobClient(_generateDevicesBlobName);
// define serializedDevices as a generic list<string>
var serializedDevices = new List<string>(numToAdd);
for (int i = 1; i <= numToAdd; i++)
{
// Create device name with this format: Hub_00000000 + a new guid.
// This should be large enough to display the largest number (1 million).
string deviceName = $"Hub_{i:D8}_{Guid.NewGuid()}";
Debug.Print($"Adding device '{deviceName}'");
// Create a new ExportImportDevice.
var deviceToAdd = new ExportImportDevice
{
Id = deviceName,
Status = DeviceStatus.Enabled,
Authentication = new AuthenticationMechanism
{
SymmetricKey = new SymmetricKey
{
PrimaryKey = GenerateKey(32),
SecondaryKey = GenerateKey(32),
}
},
// This indicates that the entry should be added as a new device.
ImportMode = ImportMode.Create,
};
// Add device to the list as a serialized object.
serializedDevices.Add(JsonConvert.SerializeObject(deviceToAdd));
// Not real progress as you write the new devices, but will at least show *some* progress.
interimProgressCount++;
totalProgressCount++;
if (interimProgressCount >= displayProgressCount)
{
Console.WriteLine($"Added {totalProgressCount}/{numToAdd} devices.");
interimProgressCount = 0;
}
}
// Now have a list of devices to be added, each one has been serialized.
// Write the list to the blob.
var sb = new StringBuilder();
serializedDevices.ForEach(serializedDevice => sb.AppendLine(serializedDevice));
// Write list of serialized objects to the blob.
using Stream stream = await generateDevicesBlob.OpenWriteAsync(overwrite: true);
byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString());
for (int i = 0; i < bytes.Length; i += BlobWriteBytes)
{
int length = Math.Min(bytes.Length - i, BlobWriteBytes);
await stream.WriteAsync(bytes.AsMemory(i, length));
}
await stream.FlushAsync();
Console.WriteLine("Running a registry manager job to add the devices.");
// Should now have a file with all the new devices in it as serialized objects in blob storage.
// generatedListBlob has the list of devices to be added as serialized objects.
// Call import using the blob to add the new devices.
// Log information related to the job is written to the same container.
// This normally takes 1 minute per 100 devices (according to the docs).
// First, initiate an import job.
// This reads in the rows from the text file and writes them to IoT Devices.
// If you want to add devices from a file, you can create a file and use this to import it.
// They have to be in the exact right format.
try
{
// The first URI is the container to import from; the file defaults to devices.txt, but may be specified.
// The second URI points to the container to write errors to as a blob.
// This lets you import the devices from any file name. Since we wrote the new
// devices to [devicesToAdd], need to read the list from there as well.
var importGeneratedDevicesJob = JobProperties.CreateForImportJob(
_containerUri,
_containerUri,
_generateDevicesBlobName);
importGeneratedDevicesJob = await registryManager.ImportDevicesAsync(importGeneratedDevicesJob);
await WaitForJobAsync(registryManager, importGeneratedDevicesJob);
}
catch (Exception ex)
{
Console.WriteLine($"Adding devices failed due to {ex.Message}");
}
stopwatch.Stop();
Console.WriteLine($"GenerateDevices, time elapsed = {stopwatch.Elapsed}.");
}
مثال على استيراد الأجهزة - الحذف بالجملة
يوضح لك مقتطف التعليمات البرمجية C# التالي، من أسلوب DeleteFromHubAsync في نموذج SDK، كيفية حذف جميع الأجهزة من مركز IoT:
private async Task DeleteFromHubAsync(RegistryManager registryManager, bool includeConfigurations)
{
var stopwatch = Stopwatch.StartNew();
Console.WriteLine("Deleting all devices from an IoT hub.");
Console.WriteLine("Exporting a list of devices from IoT hub to blob storage.");
// Read from storage, which contains serialized objects.
// Write each line to the serializedDevices list.
BlobClient devicesBlobClient = _blobContainerClient.GetBlobClient(_destHubDevicesImportBlobName);
Console.WriteLine("Reading the list of devices in from blob storage.");
List<string> serializedDevices = await ReadFromBlobAsync(devicesBlobClient);
// Step 1: Update each device's ImportMode to be Delete
Console.WriteLine("Updating ImportMode to be 'Delete' for each device and writing back to the blob.");
var sb = new StringBuilder();
serializedDevices.ForEach(serializedEntity =>
{
// Deserialize back to an ExportImportDevice and change import mode.
ExportImportDevice device = JsonConvert.DeserializeObject<ExportImportDevice>(serializedEntity);
device.ImportMode = ImportMode.Delete;
// Reserialize the object now that we've updated the property.
sb.AppendLine(JsonConvert.SerializeObject(device));
});
// Step 2: Write the list in memory to the blob.
BlobClient deleteDevicesBlobClient = _blobContainerClient.GetBlobClient(_hubDevicesCleanupBlobName);
await WriteToBlobAsync(deleteDevicesBlobClient, sb.ToString());
// Step 3: Call import using the same blob to delete all devices.
Console.WriteLine("Running a registry manager job to delete the devices from the IoT hub.");
var importJob = JobProperties.CreateForImportJob(
_containerUri,
_containerUri,
_hubDevicesCleanupBlobName);
importJob = await registryManager.ImportDevicesAsync(importJob);
await WaitForJobAsync(registryManager, importJob);
// Step 4: delete configurations
if (includeConfigurations)
{
BlobClient configsBlobClient = _blobContainerClient.GetBlobClient(_srcHubConfigsExportBlobName);
List<string> serializedConfigs = await ReadFromBlobAsync(configsBlobClient);
foreach (string serializedConfig in serializedConfigs)
{
try
{
Configuration config = JsonConvert.DeserializeObject<Configuration>(serializedConfig);
await registryManager.RemoveConfigurationAsync(config.Id);
}
catch (Exception ex)
{
Console.WriteLine($"Failed to deserialize or remove a config.\n\t{serializedConfig}\n\n{ex.Message}");
}
}
}
stopwatch.Stop();
Console.WriteLine($"Deleted IoT hub devices and configs: time elapsed = {stopwatch.Elapsed}");
}
احصل على حاوية SAS URI
يوضح لك نموذج التعليمة البرمجية التالي كيفية إنشاء SAS URI بأذونات القراءة والكتابة والحذف لحاوية blob:
static string GetContainerSasUri(CloudBlobContainer container)
{
// Set the expiry time and permissions for the container.
// In this case no start time is specified, so the
// shared access signature becomes valid immediately.
var sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
sasConstraints.Permissions =
SharedAccessBlobPermissions.Write |
SharedAccessBlobPermissions.Read |
SharedAccessBlobPermissions.Delete;
// Generate the shared access signature on the container,
// setting the constraints directly on the signature.
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
// Return the URI string for the container,
// including the SAS token.
return container.Uri + sasContainerToken;
}
الخطوات التالية
في هذه المقالة، تعلمت كيفية إجراء عمليات مجمعة مقابل تسجيل الهوية في IoT Hub. يتم استخدام العديد من هذه العمليات، بما في ذلك كيفية نقل الأجهزة من مركز إلى آخر، في قسم إدارة الأجهزة المسجلة في مركز IoT في كيفية ترحيل مركز Azure IoT يدويا باستخدام قالب Azure Resource Manager.