إرسال رسائل من السحابة إلى الجهاز من مركز IoT

لإرسال إعلامات أحادية الاتجاه إلى تطبيق جهاز من الحل الخلفي، أرسل رسائل من السحابة إلى الجهاز من مركز IoT إلى جهازك. لمناقشة خيارات السحابة إلى الجهاز الأخرى التي يدعمها مركز Azure IoT، راجع إرشادات الاتصالات من السحابة إلى الجهاز.

ملاحظة

الميزات الموضحة في هذه المقالة متوفرة فقط في المستوى القياسي لـ IoT Hub. لمزيد من المعلومات حول مستويات IoT Hub الأساسية والقياسية/المجانية، راجع اختيار طبقة IoT Hub المناسبة للحل الخاص بك.

يمكنك إرسال رسائل من السحابة إلى الجهاز من خلال نقطة نهاية مواجهة للخدمة، /messages/devicebound. ثم يتلقى الجهاز الرسائل من خلال نقطة نهاية خاصة بالجهاز، /devices/{deviceId}/messages/devicebound.

لاستهداف كل رسالة من السحابة إلى الجهاز على جهاز واحد، يقوم مركز IoT بتعيين الخاصية إلى إلى /devices/{deviceId}/messages/devicebound.

تحتوي كل قائمة انتظار جهاز، على الأكثر، على 50 رسالة من السحابة إلى الجهاز. يحدث خطأ إذا حاولت إرسال المزيد من الرسائل إلى نفس الجهاز.

دورة حياة الرسالة من السحابة إلى الجهاز

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

يتم عرض الرسم البياني لحالة دورة الحياة في الرسم التخطيطي التالي:

رسم تخطيطي يوضح الرسم البياني لحالة دورة الحياة للرسائل من السحابة إلى الجهاز.

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

يمكن للجهاز أيضاً:

  • رفض الرسالة، مما يؤدي إلى تعيين مركز IoT لها إلى حالة الأحرف غير المستخدمة. لا يمكن للأجهزة التي تتصل عبر بروتوكول Message Queuing Telemetry Transport (MQTT) رفض الرسائل من السحابة إلى الجهاز.

  • التخلي عن الرسالة، مما يؤدي إلى إعادة مركز IoT إلى وضع الرسالة في قائمة الانتظار، مع تعيين الحالة إلى مدرج في قائمة الانتظار. لا يمكن للأجهزة التي تتصل عبر بروتوكول MQTT التخلي عن الرسائل من السحابة إلى الجهاز.

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

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

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

عادة ما يقوم الجهاز بإكمال رسالة من السحابة إلى جهاز عندما لا يؤثر فقدان الرسالة على قواعد منطقية للبرنامج. مثال على هذا الإكمال قد يكون عندما يستمر الجهاز في محتوى الرسالة محليا أو ينفذ عملية بنجاح. يمكن أن تحمل الرسالة أيضاً معلومات عابرة، والتي لن تؤثر خسارتها على وظائف التطبيق. في بعض الأحيان، بالنسبة للمهام طويلة الأمد، يمكنك:

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

  • إعلام خلفية الحل مع واحد أو أكثر من رسائل من الجهاز إلى السحابة في مراحل مختلفة من التقدم للمهمة.

انتهاء صلاحية الرسالة (مدة البقاء)

كل رسالة من السحابة إلى الجهاز لها وقت انتهاء الصلاحية. يتم تعيين هذه المرة بواسطة أي من الخيارات التالية:

  • الخاصية ExpiryTimeUtc في الخدمة
  • مركز IoT، باستخدام مدة البقاء الافتراضية المحددة كخاصية مركز IoT

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

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

  • قادر على تلقي الرسائل.
  • ليست على الإنترنت أو فشلت.

ملاحظات الرسائل

عند إرسال رسالة من السحابة إلى الجهاز، يمكن للخدمة طلب تسليم ملاحظات لكل رسالة حول الحالة النهائية لتلك الرسالة. يمكنك تكوين ملاحظات الرسائل عن طريق تعيين خاصية تطبيق iothub-ack في الرسالة من السحابة إلى الجهاز التي يتم إرسالها إلى إحدى القيم الأربع التالية:

قيمة خاصية Ack السلوك
بلا Default. لا يقوم مركز IoT بإنشاء رسالة ملاحظات.
إيجابي إذا وصلت رسالة من السحابة إلى الجهاز إلى الحالة مكتمل، يقوم مركز IoT بإنشاء رسالة ملاحظات.
سلبي إذا وصلت رسالة من السحابة إلى الجهاز إلى الحالة حروف غير مستخدمة، يقوم مركز IoT بإنشاء رسالة ملاحظات.
كامل يقوم مركز IoT بإنشاء رسالة ملاحظات في كلتا الحالتين.

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

كما هو موضح في نقاط النهاية، يقدم مركز IoT ملاحظات من خلال نقطة نهاية تواجه الخدمة، /messages/servicebound/feedback، كرسائل. دلالات تلقي الملاحظات هي نفسها لرسائل من السحابة إلى الجهاز. كلما أمكن، يتم تجميع ملاحظات الرسائل في رسالة واحدة بالتنسيق التالي:

الخاصية الوصف
EnqueuedTime طابع زمني يشير إلى وقت تلقي رسالة الملاحظات من قبل المركز.
معرّف المستخدم {iot hub name}
ContentType application/vnd.microsoft.iothub.feedback.json

سيرسل النظام الملاحظات إما عندما تصل الدفعة إلى 64 رسالة، أو في 15 ثانية من آخر إرسال، أيهما يأتي أولا.

النص الأساسي صفيف تسلسل JSON من السجلات، كل بالخصائص التالية:

الخاصية الوصف
enqueuedTimeUtc طابع زمني يشير إلى وقت حدوث نتيجة الرسالة. على سبيل المثال، طابع زمني يشير إلى وقت تلقي المركز لرسالة الملاحظات أو انتهاء صلاحية الرسالة الأصلية.
originalMessageId MessageId للرسالة من السحابة إلى الجهاز التي تتعلق بها معلومات الملاحظات هذه.
statusCode سلسلة مطلوبة، تستخدم في رسائل الملاحظات التي يتم إنشاؤها بواسطة مركز IoT:
نجاح
انتهت الصلاحية
DeliveryCountExceeded
مرفوض وغير موافق عليه
تمت إزالته
الوصف قيم السلسلة ل StatusCode.
معرف الجهاز DeviceId للجهاز الهدف للرسالة من السحابة إلى الجهاز التي تتعلق بها هذه القطعة من الملاحظات.
deviceGenerationId DeviceGenerationId للجهاز الهدف للرسالة من السحابة إلى الجهاز التي تتعلق بها هذه الملاحظات.

يجب أن تحدد الخدمة MessageId بحيث يمكن للرسالة من السحابة إلى الجهاز ربط ملاحظاتها بالرسالة الأصلية.

يظهر نص رسالة الملاحظات في مثال التعليمات البرمجية التالي:

[
  {
    "originalMessageId": "0987654321",
    "enqueuedTimeUtc": "2015-07-28T16:24:48.789Z",
    "statusCode": "Success",
    "description": "Success",
    "deviceId": "123",
    "deviceGenerationId": "abcdefghijklmnopqrstuvwxyz"
  },
  {
    ...
  },
  ...
]

الملاحظات المعلقة للأجهزة المحذوفة

عند حذف جهاز، يتم حذف أي ملاحظات معلقة أيضاً. يتم إرسال ملاحظات الجهاز على دفعات. يمكن أن تحدث نافذة ضيقة، غالبا أقل من ثانية واحدة، بين عندما يؤكد الجهاز استلام الرسالة ومتى يتم إعداد دفعة الملاحظات التالية. إذا تم حذف جهاز في تلك النافذة الضيقة، فلن تحدث الملاحظات.

يمكنك معالجة هذا السلوك عن طريق الانتظار فترة من الوقت حتى تصل الملاحظات المعلقة قبل حذف جهازك. يجب افتراض فقدان ملاحظات الرسائل ذات الصلة بمجرد حذف الجهاز.

خيارات تكوين من السحابة إلى الجهاز

يعرض كل مركز IoT خيارات التكوين التالية للمراسلة من السحابة إلى الجهاز:

الخاصية الوصف النطاق والافتراضي
defaultTtlAsIso8601 TTL الافتراضي للرسائل من السحابة إلى الجهاز ISO_8601 الفاصل الزمني لمدة تصل إلى يومين (دقيقة واحدة على الأقل)؛ الافتراضي: ساعة واحدة
maxDeliveryCount الحد الأقصى لعدد التسليم لقوائم الانتظار من السحابة إلى الجهاز لكل جهاز من 1 إلى 100؛ القيمة الافتراضية: 10
feedback.ttlAsIso8601 استبقاء البيانات لرسائل الملاحظات المرتبطة بالخدمة ISO_8601 الفاصل الزمني لمدة تصل إلى يومين (دقيقة واحدة على الأقل)؛ الافتراضي: ساعة واحدة
feedback.maxDeliveryCount الحد الأقصى لعدد التسليم لقائمة انتظار الملاحظات من 1 إلى 100؛ القيمة الافتراضية: 10
feedback.lockDurationAsIso8601 مدة تأمين قائمة انتظار الملاحظات ISO_8601 الفاصل الزمني من 5 إلى 300 ثانية (خمس ثوان على الأقل)؛ الافتراضي: 60 ثانية.

يمكنك تعيين خيارات التكوين بإحدى الطرق التالية:

  • مدخل Azure: ضمن إعدادات المركز على مركز IoT، حدد نقاط النهاية المضمنة وانتقل إلى المراسلة من السحابة إلى الجهاز. (تعيين الخاصيتين feedback.maxDeliveryCount وfeedback.lockDurationAsIso8601 غير مدعومتين حالياً في مدخل Azure.)

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

  • Azure CLI: استخدم الأمر az iot hub update:

    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.defaultTtlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.ttlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.lockDurationAsIso8601=PT0H1M0S
    

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

للحصول على معلومات حول SDKs التي يمكنك استخدامها لتلقي رسائل من السحابة إلى الجهاز، راجع Azure IoT Hub SDKs.

لتجربة تلقي رسائل من السحابة إلى الجهاز، راجع البرنامج التعليمي إرسال سحابة إلى جهاز.