البرنامج التعليمي: الترميز باستخدام 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 في أي محرر تعليمات برمجية. سترى قالب تعليمة برمجية بسيطاً يبدو كالتالي:

Screenshot of a snippet of sample code in a code editor.

أولاً، أضف بعض الأسطر 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" في عارض الخصائص إلى "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

ستتم طباعة "Upload a 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}");
}

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

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

dotnet run

يجب أن يطرح البرنامج استثناءً. عند محاولة تحميل نموذج تم تحميله بالفعل، ترجع الخدمة خطأ "bad request" عبر واجهة برمجة تطبيقات 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.

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

لاحظ أنه لا يتم طرح أي خطأ عند إنشاء التوائم للمرة الثانية، على الرغم من وجود التوائم بالفعل بعد التشغيل الأول. على عكس إنشاء النموذج، يكون إنشاء التوأم، على مستوى REST، استدعاء PUT باستخدام دلالات upsert. يعني استخدام هذا النوع من استدعاء 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. يجب أن تشاهد قائمة بجميع العلاقات التي قمت أنشأتها في عبارة إخراج تبدو كالتالي:

Screenshot of a console showing the program output, which results in a message that lists the twin relationships.

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

الميزة الرئيسية لـ 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.

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