إنشاء تسجيل فردي لخدمة تزويد الأجهزة برمجيا لإثبات TPM

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

على الرغم من أن هذه الخطوات تنطبق على نظامي تشغيل الكمبيوتر؛ Windows وLinux، فإن هذه المقالة تستخدم كمبيوتر تطوير يعمل بنظام تشغيل Windows.

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

  • قم بتثبيت .NET 6.0 SDK أو أحدث أو أحدث على جهازك المستند إلى Windows. يمكنك استخدام الأمر التالي للتحقق من الإصدار الخاص بك.

    dotnet --info
    
  • (اختياري) إذا كنت ترغب في تسجيل جهاز محاكاة في نهاية هذه المقالة، فاتبع الإجراء في إنشاء وتوفير جهاز TPM محاكى حتى الخطوة التي تحصل فيها على مفتاح مصادقة للجهاز. احفظ مفتاح المصادقة، كما يمكنك استخدامه لاحقا في هذه المقالة.

    إشعار

    لا تتبع خطوات إنشاء تسجيل فردي باستخدام مدخل Azure.

  • تثبيت Node.js الإصدار 4.0 والأعلى.

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

    إشعار

    لا تتبع خطوات إنشاء تسجيل فردي باستخدام مدخل Azure.

  • قم بتثبيت أداة التطوير Java SE Development Kit 8. تثبت هذه المقالة Java Service SDK لاحقا في المقالة. وهو يعمل على كل من Windows وLinux. تستخدم هذه المقالة Windows.

  • قم بتثبيت Maven 3.

  • قم بتثبيت Git وتأكد من إضافة المسار إلى متغير PATHالبيئة .

  • (اختياري) إذا كنت ترغب في تسجيل جهاز محاكاة في نهاية هذه المقالة، فاتبع الإجراء في إنشاء وتوفير جهاز TPM محاكى حتى الخطوة التي تحصل فيها على مفتاح مصادقة للجهاز. لاحظ مفتاح المصادقة ومعرف التسجيل، كما يمكنك استخدامها لاحقا في هذه المقالة.

    إشعار

    لا تتبع خطوات إنشاء تسجيل فردي باستخدام مدخل Azure.

الحصول على مفتاح مصادقة TPM (اختياري)

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

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

إشعار

لا تتبع خطوات إنشاء تسجيل فردي باستخدام مدخل Azure.

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

إشعار

لا تتبع خطوات إنشاء تسجيل فردي باستخدام مدخل Azure.

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

إشعار

لا تتبع خطوات إنشاء تسجيل فردي باستخدام مدخل Azure.

احصل على سلسلة الاتصال لخدمة التشغيل

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

  1. سجل الدخول إلى مدخل Azure.

  2. في القائمة اليسرى أو في صفحة المدخل، حدد جميع الموارد.

  3. تحديد خدمة تزويد الأجهزة خاصتك.

  4. في قائمة الإعدادات حدد نُهج الوصول المشتركة.

  5. حدد نهج الوصول الذي تريد استخدامه.

  6. في لوحة نهج الوصول، انسخ سلسلة اتصال المفتاح الأساسي واحفظها.

    Get provisioning service connection string from the portal.

إنشاء نموذج التسجيل الفردي

هذا المقطع يوضح كيفية إنشاء تطبيق لوحدة تحكم .NET Core يضيف تسجيل فردي لجهاز TPM إلى خدمة تكوين إعدادات تشغيل الخدمة.

  1. افتح موجه أوامر Windows وانتقل إلى مجلد حيث تريد إنشاء تطبيقك.

  2. لإنشاء مشروع وحدة تحكم، قم بتشغيل الأمر التالي:

    dotnet new console --framework net6.0 --use-program-main 
    
  3. لإضافة مرجع إلى خدمة DPS SDK، قم بتشغيل الأمر التالي:

    dotnet add package Microsoft.Azure.Devices.Provisioning.Service 
    

    تقوم هذه الخطوة بتنزيل وتثبيت وإضافة مرجع إلى حزمة NuGet لعميل خدمة Azure IoT DPS وتبعياتها. تتضمن هذه الحزمة الثنائيات لخدمة .NET SDK.

  4. افتح ملف Program.cs في محرر.

  5. استبدل عبارة مساحة الاسم في أعلى الملف بالآتي:

    namespace CreateIndividualEnrollment;
    
  6. أضف العبارات التالية using في أعلى الملف أعلى العبارة namespace :

    using System.Threading.Tasks;
    using Microsoft.Azure.Devices.Provisioning.Service;
    
  7. إضافة الحقول التالية إلى الفئة Program، وقم بعمل التغييرات المُدرجة.

    private static string ProvisioningConnectionString = "{ProvisioningServiceConnectionString}";
    private const string RegistrationId = "sample-registrationid-csharp";
    private const string TpmEndorsementKey =
        "AToAAQALAAMAsgAgg3GXZ0SEs/gakMyNRqXXJP1S124GUgtk8qHaGzMUaaoABgCAAEMAEAgAAAAAAAEAxsj2gUS" +
        "cTk1UjuioeTlfGYZrrimExB+bScH75adUMRIi2UOMxG1kw4y+9RW/IVoMl4e620VxZad0ARX2gUqVjYO7KPVt3d" +
        "yKhZS3dkcvfBisBhP1XH9B33VqHG9SHnbnQXdBUaCgKAfxome8UmBKfe+naTsE5fkvjb/do3/dD6l4sGBwFCnKR" +
        "dln4XpM03zLpoHFao8zOwt8l/uP3qUIxmCYv9A7m69Ms+5/pCkTu/rK4mRDsfhZ0QLfbzVI6zQFOKF/rwsfBtFe" +
        "WlWtcuJMKlXdD8TXWElTzgh7JS4qhFzreL0c1mI0GCj+Aws0usZh7dLIVPnlgZcBhgy1SSDQMQ==";
    
    // Optional parameters
    private const string OptionalDeviceId = "myCSharpDevice";
    private const ProvisioningStatus OptionalProvisioningStatus = ProvisioningStatus.Enabled;
    
    • استبدل قيمة العنصر النائب ProvisioningServiceConnectionString بسلسلة الاتصال الخاصة بخدمة التزويد التي نسختها في القسم السابق.

    • إذا كنت تستخدم هذه المقالة مع التشغيل السريع إنشاء وتوفير جهاز TPM محاكى لتوفير جهاز محاكاة، فاستبدل مفتاح المصادقة بالقيمة التي لاحظتها في هذا التشغيل السريع. يمكنك استبدال معرف الجهاز ومعرف التسجيل بالقيم المقترحة في هذا التشغيل السريع، أو استخدام القيم الخاصة بك، أو استخدام القيم الافتراضية في هذه العينة.

  8. إضافة الأسلوب التالي إلى الفئة Program. تنشئ هذه التعليمة البرمجية إدخال تسجيل فردي ثم تستدعي CreateOrUpdateIndividualEnrollmentAsync الأسلوب على ProvisioningServiceClient لإضافة التسجيل الفردي إلى خدمة التزويد.

    public static async Task RunSample()
    {
        Console.WriteLine("Starting sample...");
    
        using (ProvisioningServiceClient provisioningServiceClient =
                ProvisioningServiceClient.CreateFromConnectionString(ProvisioningConnectionString))
        {
            #region Create a new individualEnrollment config
            Console.WriteLine("\nCreating a new individualEnrollment object...");
            Attestation attestation = new TpmAttestation(TpmEndorsementKey);
            IndividualEnrollment individualEnrollment =
                    new IndividualEnrollment(
                            RegistrationId,
                            attestation);
    
            // The following parameters are optional. Remove them if you don't need them.
            individualEnrollment.DeviceId = OptionalDeviceId;
            individualEnrollment.ProvisioningStatus = OptionalProvisioningStatus;
            #endregion
    
            #region Create the individualEnrollment
            Console.WriteLine("\nAdding the individualEnrollment to the provisioning service...");
            IndividualEnrollment individualEnrollmentResult =
                await provisioningServiceClient.CreateOrUpdateIndividualEnrollmentAsync(individualEnrollment).ConfigureAwait(false);
            Console.WriteLine("\nIndividualEnrollment created with success.");
            Console.WriteLine(individualEnrollmentResult);
            #endregion
    
        }
    }
    
  9. وأخيراً، استبدل الأسلوب Main بالسطور التالية:

    static async Task Main(string[] args)
    {
        await RunSample();
        Console.WriteLine("\nHit <Enter> to exit ...");
        Console.ReadLine();
    }
    
  10. احفظ تغييراتك.

  1. من إطار أمر في مجلد العمل، قم بتشغيل:

    npm install azure-iot-provisioning-service
    

    تقوم هذه الخطوة بتنزيل وتثبيت وإضافة مرجع إلى حزمة عميل خدمة Azure IoT DPS وتبعياتها. تتضمن هذه الحزمة الثنائيات لخدمة Node.js SDK.

  2. باستخدام محرر نص، قم بإنشاء ملف create_individual_enrollment.js في مجلد العمل الخاص بك. أضف التعليمة البرمجية التالية في الملف.

    'use strict';
    
    var provisioningServiceClient = require('azure-iot-provisioning-service').ProvisioningServiceClient;
    
    var serviceClient = provisioningServiceClient.fromConnectionString(process.argv[2]);
    var endorsementKey = process.argv[3];
    
    var enrollment = {
      registrationId: 'first',
      attestation: {
        type: 'tpm',
        tpm: {
          endorsementKey: endorsementKey
        }
      }
    };
    
    serviceClient.createOrUpdateIndividualEnrollment(enrollment, function(err, enrollmentResponse) {
      if (err) {
        console.log('error creating the individual enrollment: ' + err);
      } else {
        console.log("enrollment record returned: " + JSON.stringify(enrollmentResponse, null, 2));
      }
    });
    
  3. احفظ الملف.

  1. افتح موجه أوامر Windows.

  2. استنساخ Microsoft Azure IoT SDKs ل Java GitHub repo:

    git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
    
  3. انتقل إلى مجلد العينة:

    cd azure-iot-sdk-java\provisioning\provisioning-service-client-samples\service-enrollment-sample
    
  4. افتح الملف \src\main\java\samples\com\microsoft\azure\sdk\iot\ServiceEnrollmentSample.java في محرر.

  5. استبدال [Provisioning Connection String] بسلسلة الاتصال التي قمت بنسخها في الحصول على سلسلة الاتصال لخدمة التوفير الخاصة بك.

    private static final String PROVISIONING_CONNECTION_STRING = "[Provisioning Connection String]";
    
  6. أضف تفاصيل جهاز TPM. استبدل و [RegistrationId][TPM Endorsement Key] في العبارات التالية بمفتاح المصادقة ومعرف التسجيل.

    private static final String REGISTRATION_ID = "[RegistrationId]";
    private static final String TPM_ENDORSEMENT_KEY = "[TPM Endorsement Key]";
    
    • إذا كنت تستخدم هذه المقالة مع التشغيل السريع إنشاء وتوفير جهاز TPM محاكى لتوفير جهاز محاكاة، فاستخدم قيم مفتاح معرف التسجيل والمصادقة التي لاحظتها من هذا التشغيل السريع.

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

      private static final String TPM_ENDORSEMENT_KEY = "AToAAQALAAMAsgAgg3GXZ0SEs/gakMyNRqXXJP1S124GUgtk8qHaGzMUaaoABgCAAEMAEAgAAAAAAAEAxsj2gUScTk1UjuioeTlfGYZrrimExB+bScH75adUMRIi2UOMxG1kw4y+9RW/IVoMl4e620VxZad0ARX2gUqVjYO7KPVt3dyKhZS3dkcvfBisBhP1XH9B33VqHG9SHnbnQXdBUaCgKAfxome8UmBKfe+naTsE5fkvjb/do3/dD6l4sGBwFCnKRdln4XpM03zLpoHFao8zOwt8l/uP3qUIxmCYv9A7m69Ms+5/pCkTu/rK4mRDsfhZ0QLfbzVI6zQFOKF/rwsfBtFeWlWtcuJMKlXdD8TXWElTzgh7JS4qhFzreL0c1mI0GCj+Aws0usZh7dLIVPnefZcBhgy1SSDQMQ==";
      

      أدخل القيمة الخاصة بك لمعرف التسجيل، على سبيل المثال، "myJavaDevice".

  7. بالنسبة للتسجيلات الفردية، يمكنك اختيار تعيين معرف جهاز يعينه DPS للجهاز عندما يقوم بتوفيره إلى IoT Hub. إذا لم تقم بتعيين معرف جهاز، فإن DPS تستخدم معرف التسجيل كمعرف الجهاز. بشكل افتراضي، يعين هذا النموذج "myJavaDevice" كمعرف الجهاز. إذا كنت تريد تغيير معرف الجهاز، فقم بتعديل العبارة التالية:

        private static final String DEVICE_ID = "myJavaDevice";
    

    إذا كنت لا تريد تعيين معرف جهاز معين، فعلق على العبارة التالية:

    individualEnrollment.setDeviceId(DEVICE_ID);
    
  8. تسمح لك العينة بتعيين مركز IoT في التسجيل الفردي لتوفير الجهاز إليه. يجب أن يكون مركز IoT هذا مرتبطا مسبقا بخدمة التزويد. بالنسبة لهذه المقالة، نسمح ل DPS بالاختيار من المراكز المرتبطة وفقا لنهج التخصيص الافتراضي، والتوزيع المرجح بالتساوي. التعليق خارج العبارة التالية في الملف:

    individualEnrollment.setIotHubHostName(IOTHUB_HOST_NAME);
    
  9. يقوم النموذج بإنشاء وتحديث واستعلامات وحذف تسجيل جهاز TPM فردي. للتحقق من التسجيل الناجح في المدخل، قم بالتعليق مؤقتا على الأسطر التالية من التعليمات البرمجية في نهاية الملف:

    // *********************************** Delete info of individualEnrollment ************************************
    System.out.println("\nDelete the individualEnrollment...");
    provisioningServiceClient.deleteIndividualEnrollment(REGISTRATION_ID);
    
  10. احفظ تغييراتك.

تشغيل نموذج التسجيل الفردي

  1. قم بتشغيل العينة:

    dotnet run
    
  2. عند الإنشاء الناجح، تعرض نافذة الأوامر خصائص التسجيل الجديدة.

لتشغيل العينة، تحتاج إلى سلسلة الاتصال لخدمة التزويد التي نسختها في القسم السابق، ومفتاح المصادقة للجهاز. إذا اتبعت التشغيل السريع إنشاء جهاز محاكاة وتوفيره لإنشاء جهاز TPM محاكى، فاستخدم مفتاح المصادقة الذي تم إنشاؤه لهذا الجهاز. وإلا، لإنشاء نموذج تسجيل فردي، يمكنك استخدام مفتاح المصادقة التالي المتوفر مع Node.js Service SDK:

AToAAQALAAMAsgAgg3GXZ0SEs/gakMyNRqXXJP1S124GUgtk8qHaGzMUaaoABgCAAEMAEAgAAAAAAAEAxsj2gUScTk1UjuioeTlfGYZrrimExB+bScH75adUMRIi2UOMxG1kw4y+9RW/IVoMl4e620VxZad0ARX2gUqVjYO7KPVt3dyKhZS3dkcvfBisBhP1XH9B33VqHG9SHnbnQXdBUaCgKAfxome8UmBKfe+naTsE5fkvjb/do3/dD6l4sGBwFCnKRdln4XpM03zLpoHFao8zOwt8l/uP3qUIxmCYv9A7m69Ms+5/pCkTu/rK4mRDsfhZ0QLfbzVI6zQFOKF/rwsfBtFeWlWtcuJMKlXdD8TXWElTzgh7JS4qhFzreL0c1mI0GCj+Aws0usZh7dLIVPnlgZcBhgy1SSDQMQ==
  1. لإنشاء تسجيل فردي لجهاز TPM، قم بتشغيل الأمر التالي (تضمين علامات الاقتباس حول وسيطات الأمر):

    node create_individual_enrollment.js "<the connection string for your provisioning service>" "<endorsement key>"
    
  2. عند الإنشاء الناجح، تعرض نافذة الأوامر خصائص التسجيل الجديدة.

  1. من مجلد azure-iot-sdk-java\provisioning\provisioning-service-client-samples\service-enrollment-sample في موجه الأوامر، قم بتشغيل الأمر التالي لإنشاء النموذج:

    mvn install -DskipTests
    

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

  2. قم بالتبديل إلى المجلد الهدف وقم بتشغيل العينة. تقوم البنية في الخطوة السابقة بإخراج ملف .jar في المجلد الهدف بتنسيق الملف التالي: service-enrollment-sample-{version}-with-deps.jar؛ على سبيل المثال: service-enrollment-sample-1.8.1-with-deps.jar. قد تحتاج إلى استبدال الإصدار في الأمر التالي.

    cd target
    java -jar ./service-enrollment-sample-1.8.1-with-deps.jar
    
  3. عند الإنشاء الناجح، تعرض نافذة الأوامر خصائص التسجيل الجديدة.

للتحقق من إنشاء التسجيل الفردي:

  1. في مدخل Microsoft Azure، انتقل إلى مثيل خدمة تزويد الأجهزة.

  2. في قائمة الإعدادات، حدد ⁧⁩"إدارة التسجيلات"⁧⁩.

  3. حدد علامة التبويب التسجيلات الفردية. يجب أن تشاهد إدخال تسجيل جديد يتوافق مع معرف التسجيل الذي استخدمته في العينة.

Screenshot that shows verifying enrollment for a C# individual device in the portal.

Screenshot that shows verifying enrollment for a Node.js individual device in the portal.

Screenshot that shows verifying enrollment for a Java individual device in the portal.

تسجيل جهاز محاكاة (اختياري)

إذا كنت تتبع الخطوات في التشغيل السريع إنشاء وتوفير جهاز TPM محاكى لتوفير جهاز محاكاة، فاستأنف التشغيل السريع في تسجيل الجهاز.

إذا كنت تتبع الخطوات في التشغيل السريع إنشاء وتوفير جهاز TPM محاكى لتوفير جهاز محاكاة، فاستأنف التشغيل السريع في تسجيل الجهاز.

إذا كنت تتبع الخطوات في التشغيل السريع إنشاء وتوفير جهاز TPM محاكى لتوفير جهاز محاكاة، فاستأنف التشغيل السريع في تسجيل الجهاز.

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

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

  1. في مدخل Microsoft Azure، انتقل إلى مثيل خدمة تزويد الأجهزة.

  2. في قائمة الإعدادات، حدد ⁧⁩"إدارة التسجيلات"⁧⁩.

  3. حدد علامة التبويب التسجيلات الفردية.

  4. حدد خانة الاختيار بجوار معرف التسجيل لإدخال التسجيل الذي أنشأته في هذه المقالة.

  5. في الجزء العلوي من الصفحة، حدد حذف.

  1. إذا اتبعت الخطوات في إنشاء وتكوين إعدادات تشغيل الخدمة لجهاز TPMمُحاكى لإنشاء جهاز TPM مُحاكى، اتبع الخطوات التالية:

    1. في مدخل Azure، انتقل إلى IoT Hub حيث تم تكوين إعدادات تشغيل الخدمة لجهازك.

    2. في القائمة اليسرى ضمن إدارة الأجهزة، حدد الأجهزة.

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

    4. في الجزء العلوي من الصفحة، حدد "حذف".

  1. إذا اتبعت الخطوات في إنشاء وتكوين إعدادات تشغيل الخدمة لجهاز TPMمُحاكى لإنشاء جهاز TPM مُحاكى، اتبع الخطوات التالية:

    1. إغلاق نافذة محاكاة TPM ونافذة إخراج نموذج للجهاز المُحاكى.

    2. في مدخل Azure، انتقل إلى IoT Hub حيث تم تكوين إعدادات تشغيل الخدمة لجهازك.

    3. في القائمة اليسرى ضمن إدارة الأجهزة، حدد الأجهزة.

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

    5. في الجزء العلوي من الصفحة، حدد "حذف".

  1. إذا اتبعت الخطوات في إنشاء وتكوين إعدادات تشغيل الخدمة لجهاز TPMمُحاكى لإنشاء جهاز TPM مُحاكى، اتبع الخطوات التالية:

    1. إغلاق نافذة محاكاة TPM ونافذة إخراج نموذج للجهاز المُحاكى.

    2. في مدخل Azure، انتقل إلى IoT Hub حيث تم تكوين إعدادات تشغيل الخدمة لجهازك.

    3. في القائمة اليسرى ضمن إدارة الأجهزة، حدد الأجهزة.

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

    5. في الجزء العلوي من الصفحة، حدد "حذف".

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

في هذه المقالة، قمت بإنشاء إدخال تسجيل فردي لجهاز TPM برمجيا. في هذا التشغيل السريع، اخترت إنشاء جهاز TPM مُحاكى على جهازك وكوّنت إعدادات تشغيل الخدمة لمركز IoT باستخدام Azure IoT Hub Device Provisioning Service. لاستكشاف المزيد، تحقق من الروابط التالية: