مشاركة عبر


البرنامج التعليمي: الترميز باستخدام Azure Digital Twins SDK

عادة ما يكتب المطورون الذين يعملون مع Azure Digital Twins تطبيقات العميل للتفاعل مع مثيلها من خدمة Azure Digital Twins. يوفر هذا البرنامج التعليمي الذي يركز على المطور مقدمة للبرمجة مقابل خدمة Azure Digital Twins، باستخدام Azure Digital Twins SDK لـ .NET (C#). ويرشدك من خلال كتابة تطبيق عميل وحدة التحكم C# خطوة بخطوة، بدءاً من نقطة الصفر.

  • إنشاء المشروع
  • البدء باستخدام التعليمة البرمجية للمشروع
  • نموذج تعليمة برمجية كاملة
  • تنظيف الموارد
  • الخطوات التالية

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

يستخدم هذا البرنامج التعليمي Azure Digital Twins سطر الأوامر للإعداد وعمل المشروع. على هذا النحو، يمكنك استخدام أي محرر تعليمات برمجية خلال التدريبات.

ما تحتاجه للبدء:

  • أي محرر تعليمات برمجية
  • .NET Core 3.1 على جهازك الخاص بالتطوير. يمكنك تحميل هذا الإصدار من .NET Core SDK لمنصات متعددة من "Download .NET Core 3.1".

إعداد مثيل Azure Digital Twins

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

بعد إعداد المثيل الخاص بك، دون اسم مضيف المثيل. يمكنك العثور على اسم المضيف في بوابة Azure.

إعداد بيانات اعتماد Azure المحلية

تستخدم هذه العينة DefaultAzureCredential (جزء من مكتبة Azure.Identity) لمصادقة المستخدمين مع مثيل Azure Digital Twins عند تشغيله على جهازك المحلي. لمزيد من المعلومات حول الطرق المختلفة التي يمكن لتطبيق العميل مصادقتها باستخدام Azure Digital Twins، راجع كتابة تعليمات برمجية لمصادقة التطبيق.

سيبحث النموذج باستخدام DefaultAzureCredential عن بيانات اعتماد في بيئتك المحلية، مثل تسجيل الدخول إلى Microsoft Azure في Azure CLI محلي أو في Visual Studio أو Visual Studio Code. ولهذا السبب، يجب تسجيل الدخول محلياً إلى Microsoft Azure من خلال أحد هذه الآليات المخصصة لإعداد بيانات الاعتماد للنموذج.

إذا كنت تستخدم Visual Studio أو Visual Studio Code لتشغيل نماذج التعليمات البرمجية، فتأكد من تسجيل الدخول إلى هذا المحرر بنفس بيانات اعتماد Azure التي تريد استخدامها للوصول إلى مثيل Azure Digital Twins. إذا كنت تستخدم نافذة CLI محلية az login ، فقم بتشغيل الأمر لتسجيل الدخول إلى حساب Azure الخاص بك. بعد ذلك، عند تشغيل نموذج التعليمات البرمجية، يجب أن تتم مصادقتك تلقائيا.

إنشاء المشروع

بمجرد أن تصبح مستعداً لاستخدام مثيل Azure Digital Twins، ابدأ في إعداد مشروع تطبيق العميل.

افتح نافذة وحدة تحكم على جهازك، وأنشئ دليل مشروع فارغ حيث تريد تخزين عملك أثناء هذا البرنامج التعليمي. قم بتسمية الدليل بما تريد (على سبيل المثال، DigitalTwinsCodeTutorial).

انتقل إلى الدليل الجديد.

بمجرد دخولك إلى دليل المشروع، أنشئ مشروع تطبيق وحدة تحكم .NET فارغاً. في نافذة الأوامر، يمكنك تشغيل الأمر التالي لإنشاء مشروع C# بسيط لوحدة التحكم:

dotnet new console

ينشئ هذا الأمر عدة ملفات داخل الدليل، بما في ذلك ملف يسمى Program.cs حيث تكتب معظم التعليمات البرمجية الخاصة بك.

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

بعد ذلك، أضف تبعيتين إلى مشروعك مطلوبين للعمل مع Azure Digital Twins. التبعية الأولى هي حزمة Azure Digital Twins SDK ل .NET. توفر التبعية الثانية أدوات للمساعدة في المصادقة مقابل Azure.

dotnet add package Azure.DigitalTwins.Core
dotnet add package Azure.Identity

البدء باستخدام التعليمة البرمجية للمشروع

في هذا القسم، تبدأ في كتابة التعليمات البرمجية لمشروع التطبيق الجديد للعمل مع Azure Digital Twins. تشمل الإجراءات التي يتم تناولها ما يلي:

  • المصادقة مقابل الخدمة
  • تحميل نموذج
  • التقاط الأخطاء
  • إنشاء التوائم الرقمية
  • تصميم علاقات
  • الاستعلام عن التوائم الرقمية

وهناك أيضاً قسم يعرض التعليمات البرمجية الكاملة في نهاية البرنامج التعليمي. يمكنك استخدام هذا القسم كمرجع للتحقق من البرنامج أثناء التنقل.

للبدء، افتح الملف Program.cs في أي محرر تعليمات برمجية. ترى قالب الحد الأدنى من التعليمات البرمجية الذي يبدو كما يلي:

لقطة شاشة لقصاصة برمجية من نموذج التعليمات البرمجية في المحرر.

أولاً، أضف بعض الأسطر using في الجزء العلوي من التعليمة البرمجية لسحب التبعيات الضرورية.

using Azure.DigitalTwins.Core;
using Azure.Identity;

بعد ذلك، يمكنك إضافة تعليمة برمجية إلى هذا الملف لملء بعض الوظائف.

المصادقة مقابل الخدمة

أول شيء يحتاج تطبيقك إلى القيام به هو المصادقة مقابل خدمة Azure Digital Twins. بعد ذلك، يمكنك إنشاء فئة عميل خدمة للوصول إلى وظائف SDK.

للمصادقة، تحتاج إلى اسم المضيف لمثيل Azure Digital Twins الخاص بك.

في Program.cs، الصق التعليمات البرمجية التالية أسفل سطر الطباعة "Hello, World!" في Main الأسلوب . تعيين قيمة adtInstanceUrl إلى اسم مضيف مثيل Azure Digital Twins.

string adtInstanceUrl = "https://<your-Azure-Digital-Twins-instance-hostName>"; 

var credential = new DefaultAzureCredential();
var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credential);
Console.WriteLine($"Service client created – ready to go");

حفظ الملف.

في نافذة الأوامر، قم بتشغيل التعليمة البرمجية باستخدام هذا الأمر:

dotnet run

يستعيد هذا الأمر التبعيات عند التشغيل الأول، ثم ينفذ البرنامج.

  • إذا لم يحدث خطأ، يطبع البرنامج: "تم إنشاء عميل الخدمة - جاهز للانطلاق".
  • نظرا إلى عدم وجود أي معالجة للأخطاء في هذا المشروع، إذا كانت هناك أي مشكلات، فسترى استثناء تم طرحه بواسطة التعليمات البرمجية.

إشعار

توجد حاليا مشكلة معروفة تؤثر على DefaultAzureCredential فئة برنامج التضمين قد تؤدي إلى حدوث خطأ أثناء المصادقة. إذا واجهت هذه المشكلة، يمكنك محاولة إنشاء DefaultAzureCredential مثيل باستخدام المعلمة الاختيارية التالية لحلها: new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeSharedTokenCacheCredential = true });

لمزيد من المعلومات حول هذه المشكلة، راجع المشكلات المعروفة في Azure Digital Twins.

تحميل نموذج

لا يحتوي Azure Digital Twins على مفردات نطاق جوهرية. يمكنك استخدام النماذج لتحديد أنواع العناصر في بيئتك التي يمكنك تمثيلها في Azure Digital Twins. النماذج مشابهة لفئات في لغات البرمجة الموجهة للكائنات؛ أنها توفر قوالب مُعرَّفة من قِبل المستخدم للتوائم الرقمية للمتابعة وإنشاء مثيل في وقت لاحق. وتُكتب بلغة تشبه JSON تسمى Digital Twins Definition Language (DTDL).

تتمثل الخطوة الأولى في إنشاء حل Azure Digital Twins في تحديد نموذج واحد على الأقل في ملف DTDL.

في الدليل حيث أنشأت مشروعك، قم بإنشاء ملف .json جديد يسمى SampleModel.json. الصق في نص الملف التالي:

{
  "@id": "dtmi:example:SampleModel;1",
  "@type": "Interface",
  "displayName": "SampleModel",
  "contents": [
    {
      "@type": "Relationship",
      "name": "contains"
    },
    {
      "@type": "Property",
      "name": "data",
      "schema": "string"
    }
  ],
  "@context": "dtmi:dtdl:context;3"
}

تلميح

إذا كنت تستخدم Visual Studio لهذا البرنامج التعليمي، فقد تحتاج إلى تحديد ملف JSON الذي تم إنشاؤه حديثا وتعيين الخاصية Copy to Output Directory في Property inspector إلى Copy if Newer أو Copy Always. تمكن قيمة الخاصية هذه Visual Studio من العثور على ملف JSON بالمسار الافتراضي عند تشغيل البرنامج باستخدام F5 أثناء بقية البرنامج التعليمي.

تلميح

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

بعد ذلك، أضف المزيد من التعليمات البرمجية إلى Program.cs لتحميل النموذج الذي أنشأته في مثيل Azure Digital Twins.

أولاً، إضافة بعض العبارات using إلى أعلى الملف:

using System.Threading.Tasks;
using System.IO;
using System.Collections.Generic;
using Azure;

بعد ذلك، الاستعداد لاستخدام أساليب غير متزامنة في C# service SDK عن طريق تغيير توقيع الأسلوب Main للسماح بالتنفيذ غير المتزامن.

static async Task Main(string[] args)
{

إشعار

لا يلزم استخدام async بشكل صارم، حيث يوفر SDK أيضا إصدارات متزامنة من جميع المكالمات. يمارس هذا البرنامج التعليمي استخدام async.

يأتي بعد ذلك الجزء الأول من التعليمة البرمجية الذي يتفاعل مع خدمة Azure Digital Twins. يقوم هذا الرمز بتحميل ملف DTDL الذي قمت بإنشائه من القرص، ثم تحميله إلى مثيل خدمة Azure Digital Twins.

الصق التعليمة البرمجية التالية ضمن رمز التخويل الذي أضفته سابقاً.

Console.WriteLine();
Console.WriteLine($"Upload a model");
string dtdl = File.ReadAllText("SampleModel.json");
var models = new List<string> { dtdl };
// Upload the model to the service
await client.CreateModelsAsync(models);

في نافذة الأوامر، قم بتشغيل البرنامج باستخدام هذا الأمر:

dotnet run

تتم طباعة "تحميل نموذج" في الإخراج للإشارة إلى أنه تم الوصول إلى هذه التعليمة البرمجية. ومع ذلك، لا يوجد إخراج حتى الآن للإشارة إلى ما إذا كان التحميل ناجحا.

لإضافة عبارة طباعة تعرض جميع النماذج التي تم تحميلها بنجاح إلى المثيل، أضف التعليمات البرمجية التالية مباشرة بعد القسم السابق:

// Read a list of models back from the service
AsyncPageable<DigitalTwinsModelData> modelDataList = client.GetModelsAsync();
await foreach (DigitalTwinsModelData md in modelDataList)
{
    Console.WriteLine($"Model: {md.Id}");
}

قبل تشغيل البرنامج مرة أخرى لاختبار التعليمة البرمجية الجديدة، تذكر أنك قمت بتحميل النموذج الخاص بك بالفعل في آخر تشغيل للبرنامج. لا يسمح لك Azure Digital Twins بتحميل نفس النموذج مرتين، لذلك إذا حاولت تحميل نفس النموذج مرة أخرى، يجب أن يطرح البرنامج استثناء.

مع وضع هذه المعلومات في الاعتبار، قم بتشغيل البرنامج مرة أخرى باستخدام هذا الأمر في نافذة الأوامر الخاصة بك:

dotnet run

يجب أن يطرح البرنامج استثناءً. عند محاولة تحميل نموذج تم تحميله بالفعل، تقوم الخدمة بإرجاع خطأ "طلب غير صحيح" عبر واجهة برمجة تطبيقات REST. ونتيجة لذلك، يطرح SDK عميل Azure Digital Twins استثناء، لكل رمز إرجاع خدمة بخلاف النجاح.

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

التقاط الأخطاء

لمنع تعطل البرنامج، يمكنك إضافة تعليمة برمجية للاستثناء حول التعليمة البرمجية لتحميل النموذج. تضمين استدعاء العميل await client.CreateModelsAsync(typeList) الموجود في معالج try/catch، على هذا النحو:

try
{
    await client.CreateModelsAsync(models);
    Console.WriteLine("Models uploaded to the instance:");
}
catch (RequestFailedException e)
{
    Console.WriteLine($"Upload model error: {e.Status}: {e.Message}");
}

قم بتشغيل البرنامج مرة أخرى باستخدام dotnet run في نافذة الأوامر الخاصة بك. ترى أنك تحصل على مزيد من التفاصيل حول مشكلة تحميل النموذج، بما في ذلك رمز خطأ يفيد بأن ModelIdAlreadyExists.

من هذه النقطة فصاعدا، يلتف البرنامج التعليمي جميع الاستدعاءات إلى أساليب الخدمة في معالجات try/catch.

إنشاء التوائم الرقمية

الآن بعد أن قمت بتحميل نموذج إلى Azure Digital Twins، يمكنك استخدام تعريف النموذج هذا لإنشاء توائم رقمية. التوائم الرقمية هي مثيلات للنموذج وتمثل الكيانات داخل بيئة عملك — أشياء مثل أجهزة الاستشعار في مزرعة أو الغرف في المبنى أو الأضواء في السيارة. ينشئ هذا القسم بعض التوائم الرقمية استناداً إلى النموذج الذي قمت بتحميله سابقاً.

لإنشاء وتهيئة ثلاثة توائم رقمية استنادا إلى هذا النموذج، أضف التعليمات البرمجية التالية إلى نهاية Main الأسلوب.

var twinData = new BasicDigitalTwin();
twinData.Metadata.ModelId = "dtmi:example:SampleModel;1";
twinData.Contents.Add("data", $"Hello World!");

string prefix = "sampleTwin-";
for (int i = 0; i < 3; i++)
{
    try
    {
        twinData.Id = $"{prefix}{i}";
        await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinData.Id, twinData);
        Console.WriteLine($"Created twin: {twinData.Id}");
    }
    catch(RequestFailedException e)
    {
        Console.WriteLine($"Create twin error: {e.Status}: {e.Message}");
    }
}

في نافذة الأوامر، قم بتشغيل البرنامج باستخدام dotnet run. في الإخراج، ابحث عن رسائل الطباعة التي تم إنشاؤها sampleTwin-0، وsampleTwin-1، وsampleTwin-2.

ثم قم بتشغيل البرنامج مرة أخرى.

لاحظ أنه لا يتم طرح أي خطأ عند إنشاء التوائم للمرة الثانية، على الرغم من وجود التوائم بالفعل بعد التشغيل الأول. على عكس إنشاء النموذج، إنشاء التوأم هو استدعاء PUT مع دلالات upsert على مستوى REST. استخدام هذا النوع من استدعاء REST يعني أنه إذا كان التوأم موجودا بالفعل، فإن محاولة إنشاء نفس التوأم مرة أخرى تحل محل التوأم الأصلي فقط. لا يتم طرح خطأ.

إنشاء علاقات

بعد ذلك، يمكنك إنشاء علاقات بين التوائم التي قمت بإنشائها، لتوصيلها برسم بياني مزدوج. تستخدم الرسوم البيانية للتوائم لتمثيل بيئتك بالكامل.

أضف أسلوبا ثابتا جديدا إلى Program الفئة ، أسفل Main الأسلوب (التعليمات البرمجية لديها الآن طريقتان):

public async static Task CreateRelationshipAsync(DigitalTwinsClient client, string srcId, string targetId)
{
    var relationship = new BasicRelationship
    {
        TargetId = targetId,
        Name = "contains"
    };

    try
    {
        string relId = $"{srcId}-contains->{targetId}";
        await client.CreateOrReplaceRelationshipAsync(srcId, relId, relationship);
        Console.WriteLine("Created relationship successfully");
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine($"Create relationship error: {e.Status}: {e.Message}");
    }
}

بعد ذلك، أضف التعليمة البرمجية التالية إلى نهاية الأسلوب Main، لاستدعاء الأسلوب CreateRelationship واستخدام التعليمات البرمجية التي كتبتها للتو:

// Connect the twins with relationships
await CreateRelationshipAsync(client, "sampleTwin-0", "sampleTwin-1");
await CreateRelationshipAsync(client, "sampleTwin-0", "sampleTwin-2");

في نافذة الأوامر، قم بتشغيل البرنامج باستخدام dotnet run. في الإخراج، ابحث عن عبارات الطباعة التي تفيد بأنه تم إنشاء العلاقتين بنجاح.

لا يسمح لك Azure Digital Twins بإنشاء علاقة إذا كانت هناك علاقة أخرى بنفس المعرف موجودة بالفعل. ونتيجة لذلك، ترى استثناءات على إنشاء العلاقة إذا قمت بتشغيل البرنامج عدة مرات. تلتقط هذه التعليمة البرمجية الاستثناءات وتتجاهلها.

قائمة العلاقات

تسمح لك التعليمات البرمجية التالية التي ستضيفها برؤية قائمة العلاقات التي أنشأتها.

أضف الأسلوب الجديد التالي إلى Program الفئة :

public async static Task ListRelationshipsAsync(DigitalTwinsClient client, string srcId)
{
    try
    {
        AsyncPageable<BasicRelationship> results = client.GetRelationshipsAsync<BasicRelationship>(srcId);
        Console.WriteLine($"Twin {srcId} is connected to:");
        await foreach (BasicRelationship rel in results)
        {
            Console.WriteLine($" -{rel.Name}->{rel.TargetId}");
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine($"Relationship retrieval error: {e.Status}: {e.Message}");
    }
}

بعد ذلك، أضف التعليمة البرمجية التالية إلى نهاية الأسلوب Main، لاستدعاء التعليمة البرمجية ListRelationships:

//List the relationships
await ListRelationshipsAsync(client, "sampleTwin-0");

في نافذة الأوامر، قم بتشغيل البرنامج باستخدام dotnet run. يجب أن تشاهد قائمة بجميع العلاقات التي قمت بإنشائها في عبارة إخراج تبدو كما يلي:

لقطة شاشة لوحدة تحكم تعرض إخراج البرنامج، ينتج عنه رسالة تسرد العلاقات التوائم.

الاستعلام عن التوائم الرقمية

الميزة الرئيسية لـ Azure Digital Twins هي القدرة على الاستعلام عن الرسم البياني للتوأم بسهولة وكفاءة للإجابة عن الأسئلة حول بيئتك.

يقوم القسم الأخير من التعليمة البرمجية المراد إضافته في هذا البرنامج التعليمي بتشغيل استعلام مقابل مثيل Azure Digital Twins. يرجع الاستعلام المستخدم في هذا المثال جميع التوائم الرقمية في المثيل.

أضف العبارة using لتمكين استخدام الفئة JsonSerializer للمساعدة في تقديم معلومات التوأم الرقمي:

using System.Text.Json;

بعد ذلك، أضف التعليمة البرمجية التالية إلى نهاية الأسلوب Main:

// Run a query for all twins
string query = "SELECT * FROM digitaltwins";
AsyncPageable<BasicDigitalTwin> queryResult = client.QueryAsync<BasicDigitalTwin>(query);

await foreach (BasicDigitalTwin twin in queryResult)
{
    Console.WriteLine(JsonSerializer.Serialize(twin));
    Console.WriteLine("---------------");
}

في نافذة الأوامر، قم بتشغيل البرنامج باستخدام dotnet run. يجب أن ترى جميع التوائم الرقمية في هذا المثيل في الإخراج.

إشعار

بعد إجراء تغيير على البيانات في الرسم البياني، قد يكون هناك زمن انتقال مدته 10 ثوان بحد أقصى قبل ظهور التغييرات في الاستعلامات.

يُظهر DigitalTwins API التغييرات على الفور، لذا، إذا كنت بحاجة إلى استجابة فورية، استخدم طلب API(DigitalTwins GetById) أو استدعاء SDK (GetDigitalTwin) للحصول على بيانات مزدوجة بدلاً من استعلام.

نموذج تعليمة برمجية كاملة

في هذه المرحلة من البرنامج التعليمي، لديك تطبيق عميل كامل يمكنه تنفيذ الإجراءات الأساسية مقابل Azure Digital Twins. كمرجع، يسرد المثال التالي التعليمات البرمجية الكاملة للبرنامج في Program.cs:

using System;
// <Azure_Digital_Twins_dependencies>
using Azure.DigitalTwins.Core;
using Azure.Identity;
// </Azure_Digital_Twins_dependencies>
// <Model_dependencies>
using System.Threading.Tasks;
using System.IO;
using System.Collections.Generic;
using Azure;
// </Model_dependencies>
// <Query_dependencies>
using System.Text.Json;
// </Query_dependencies>

namespace DigitalTwins_Samples
{
    class DigitalTwinsClientAppSample
    {
        // <Async_signature>
        static async Task Main(string[] args)
        {
        // </Async_signature>
            Console.WriteLine("Hello World!");
            // <Authentication_code>
            string adtInstanceUrl = "https://<your-Azure-Digital-Twins-instance-hostName>"; 
            
            var credential = new DefaultAzureCredential();
            var client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credential);
            Console.WriteLine($"Service client created – ready to go");
            // </Authentication_code>

            // <Model_code>
            Console.WriteLine();
            Console.WriteLine("Upload a model");
            string dtdl = File.ReadAllText("SampleModel.json");
            var models = new List<string> { dtdl };

            // Upload the model to the service
            // <Model_try_catch>
            try
            {
                await client.CreateModelsAsync(models);
                Console.WriteLine("Models uploaded to the instance:");
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine($"Upload model error: {e.Status}: {e.Message}");
            }
            // </Model_try_catch>

            // <Print_model>
            // Read a list of models back from the service
            AsyncPageable<DigitalTwinsModelData> modelDataList = client.GetModelsAsync();
            await foreach (DigitalTwinsModelData md in modelDataList)
            {
                Console.WriteLine($"Model: {md.Id}");
            }
            // </Print_model>
            // </Model_code>

            // <Initialize_twins>
            var twinData = new BasicDigitalTwin();
            twinData.Metadata.ModelId = "dtmi:example:SampleModel;1";
            twinData.Contents.Add("data", $"Hello World!");
            
            string prefix = "sampleTwin-";
            for (int i = 0; i < 3; i++)
            {
                try
                {
                    twinData.Id = $"{prefix}{i}";
                    await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>(twinData.Id, twinData);
                    Console.WriteLine($"Created twin: {twinData.Id}");
                }
                catch(RequestFailedException e)
                {
                    Console.WriteLine($"Create twin error: {e.Status}: {e.Message}");
                }
            }
            // </Initialize_twins>

            // <Use_create_relationship>
            // Connect the twins with relationships
            await CreateRelationshipAsync(client, "sampleTwin-0", "sampleTwin-1");
            await CreateRelationshipAsync(client, "sampleTwin-0", "sampleTwin-2");
            // </Use_create_relationship>

            // <Use_list_relationships>
            //List the relationships
            await ListRelationshipsAsync(client, "sampleTwin-0");
            // </Use_list_relationships>

            // <Query_twins>
            // Run a query for all twins
            string query = "SELECT * FROM digitaltwins";
            AsyncPageable<BasicDigitalTwin> queryResult = client.QueryAsync<BasicDigitalTwin>(query);
            
            await foreach (BasicDigitalTwin twin in queryResult)
            {
                Console.WriteLine(JsonSerializer.Serialize(twin));
                Console.WriteLine("---------------");
            }
            // </Query_twins>
        }

        // <Create_relationship>
        public async static Task CreateRelationshipAsync(DigitalTwinsClient client, string srcId, string targetId)
        {
            var relationship = new BasicRelationship
            {
                TargetId = targetId,
                Name = "contains"
            };
        
            try
            {
                string relId = $"{srcId}-contains->{targetId}";
                await client.CreateOrReplaceRelationshipAsync(srcId, relId, relationship);
                Console.WriteLine("Created relationship successfully");
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine($"Create relationship error: {e.Status}: {e.Message}");
            }
        }
        // </Create_relationship>
        
        // <List_relationships>
        public async static Task ListRelationshipsAsync(DigitalTwinsClient client, string srcId)
        {
            try
            {
                AsyncPageable<BasicRelationship> results = client.GetRelationshipsAsync<BasicRelationship>(srcId);
                Console.WriteLine($"Twin {srcId} is connected to:");
                await foreach (BasicRelationship rel in results)
                {
                    Console.WriteLine($" -{rel.Name}->{rel.TargetId}");
                }
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine($"Relationship retrieval error: {e.Status}: {e.Message}");
            }
        }
        // </List_relationships>
    }
}

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

بعد الانتهاء من هذا البرنامج التعليمي، يمكنك اختيار الموارد التي تريد إزالتها، اعتمادًا على ما تريد القيام به بعد ذلك.

  • إذا كنت تخطط لمتابعة البرنامج التعليمي التالي، يمكنك إعادة استخدام المثيل المُستخدم في هذا البرنامج التعليمي في البرنامج التعليمي التالي. يمكنك الاحتفاظ بموارد Azure Digital Twins التي قمت بإعدادها هنا وتخطي باقي هذا القسم.
  • إذا كنت ترغب في متابعة استخدام مثيل Azure Digital Twins من هذه المقالة، ولكن مسح جميع نماذجه وتوائمه وعلاقاته، فقم بتشغيل الأمر az dt job deletion CLI التالي:

    az dt job deletion create -n <name-of-Azure-Digital-Twins-instance> -y
    

    إذا كنت تريد حذف بعض هذه العناصر فقط، يمكنك استخدام أوامر حذف العلاقة المزدوجة az dt وaz dt twin delete وaz dt model delete لحذف العناصر التي تريد إزالتها بشكل انتقائي فقط.

  • إذا لم تكن بحاجة إلى أي من الموارد التي قمت بإنشائها في هذا البرنامج التعليمي، يمكنك حذف مثيل Azure Digital Twins وجميع الموارد الأخرى من هذه المقالة باستخدام الأمر az group delete CLI. يؤدي هذا إلى حذف جميع موارد Azure الموجودة في مجموعة مورد ما، بالإضافة إلى مجموعة الموارد نفسها.

    هام

    حذف مجموعة الموارد لا يمكن التراجع عنه. يتم حذف مجموعة الموارد وكافة الموارد المضمنة فيها بشكل دائم. يُرجى التأكد من عدم حذف مجموعة الموارد أو الموارد غير الصحيحة عن طريق الخطأ.

    افتح Azure Cloud Shell أو نافذة CLI محلية، ثم قم بتشغيل الأمر التالي لحذف مجموعة الموارد وكل ما تحتوي عليه.

    az group delete --name <your-resource-group>
    

قد تحتاج أيضا إلى حذف مجلد المشروع من جهازك المحلي.

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

في هذا البرنامج التعليمي، قمت بإنشاء تطبيق عميل وحدة تحكم .NET من الصفر. كتبت التعليمات البرمجية لتطبيق العميل هذا لتنفيذ الإجراءات الأساسية على مثيل Azure Digital Twins.

تابع إلى البرنامج التعليمي التالي لاستكشاف الأشياء التي يمكنك القيام بها باستخدام نموذج تطبيق العميل هذا: