دعم IoT Hub MQTT 5 (مهمل)
الإصدار: 2.0 api-version: 2020-10-01-preview
يُعرف هذا المستند واجهة برمجة تطبيقات مستوى بيانات IoT Hub عبر بروتوكول MQTT الإصدار 5.0. راجع مرجع واجهة برمجة التطبيقات للتعريفات الكاملة في واجهة برمجة التطبيقات هذه.
إشعار
تم إهمال دعم MQTT 5 في IoT Hub ول IoT Hub دعم ميزات محدود ل MQTT. إذا كان الحل الخاص بك يحتاج إلى دعم MQTT v3.1.1 أو v5، نوصي بدعم MQTT في Azure Event Grid. لمزيد من المعلومات، راجع مقارنة دعم MQTT في مركز IoT وشبكة الأحداث.
المتطلبات الأساسية
- إنشاء مركز IoT جديد تماما مع تمكين وضع المعاينة. يتوفر MQTT 5 فقط في وضع المعاينة، ولا يمكنك تبديل مركز IoT موجود إلى وضع المعاينة. لمزيد من المعلومات، راجع تمكين وضع المعاينة
- معرفة مسبقة بمواصفات MQTT 5.
مستوى الدعم والقيود
دعم IoT Hub لـ MQTT 5 قيد المعاينة ومحدود بالطرق التالية (يتم توصيله إلى العميل عبر CONNACK
الخصائص ما لم يتم ذكر خلاف ذلك صراحة):
- لا يوجد دعم رسمي ل SDKs لجهاز Azure IoT حتى الآن.
- معرفات الاشتراك غير مدعومة.
- الاشتراكات المشتركة غير مدعومة.
RETAIN
غير مدعوم.Maximum QoS
عبارة عن1
.Maximum Packet Size
256 KiB
(يخضع لمزيد من القيود لكل عملية).- معرفات العميل المعينة غير مدعومة.
Keep Alive
يقتصر على19 min
(الحد الأقصى للتأخير لفحص الفعالية –28.5 min
).Topic Alias Maximum
عبارة عن10
.Response Information
غير مدعوم؛CONNACK
لا يرجع الخاصيةResponse Information
حتى لو كانتCONNECT
تحتوي على خاصيةRequest Response Information
.Receive Maximum
(الحد الأقصى لعدد حزم البيانات المعلقة المسموح بها غير المعترف بهاPUBLISH
(في اتجاه من عميل إلى خادم) معQoS: 1
) هو16
.- لا يمكن أن يكون للعميل الواحد أكثر من
50
اشتراك. إذا وصل العميل إلى حد الاشتراك،SUBACK
فسترجع0x97
رمز سبب (تجاوز الحصة النسبية) للاشتراكات.
دورة حياة الاتصال
الاتصال
لتوصيل عميل بـ IoT Hub باستخدام واجهة برمجة التطبيقات هذه، قم بإنشاء اتصال لكل مواصفات MQTT 5.
يجب على العميل إرسال حزمة البيانات CONNECT
في غضون 30 ثانية بعد تأكيد اتصال TLS الناجح، أو يقوم الخادم بإغلاق الاتصال.
وإليك مثال على حزمة بيانات CONNECT
:
-> CONNECT
Protocol_Version: 5
Clean_Start: 0
Client_Id: D1
Authentication_Method: SAS
Authentication_Data: {SAS bytes}
api-version: 2020-10-10
host: abc.azure-devices.net
sas-at: 1600987795320
sas-expiry: 1600987195320
client-agent: artisan;Linux
- الخاصية
Authentication Method
مطلوبة وتحدد أسلوب المصادقة المستخدم. لمزيد من المعلومات حول أسلوب المصادقة، راجع المصادقة. Authentication Data
تعتمد معالجة الخصائص علىAuthentication Method
. إذا تم تعيينAuthentication Method
إلىSAS
، فهذاAuthentication Data
مطلوب ويجب أن يحتوي على توقيع صالح. لمزيد من المعلومات حول بيانات المصادقة، راجع المصادقة.- الخاصية
api-version
مطلوبة ويجب تعيينها إلى قيمة إصدار واجهة برمجة التطبيقات المتوفرة في عنوان هذه المواصفات لتطبيق هذه المواصفات. - تحدد الخاصية
host
اسم المضيف للمستأجر. وهو مطلوب ما لم يتم تقديم ملحق SNI في سجل Client Hello أثناء تأكيد اتصال TLS sas-at
يحدد وقت الاتصال.sas-expiry
يحدد وقت انتهاء الصلاحية لـ SAS المتوفر.client-agent
يقوم بشكل اختياري بتوصيل معلومات حول العميل الذي يقوم بإنشاء الاتصال.
إشعار
Authentication Method
وغيرها من الخصائص في المواصفات ذات الأسماء الكبيرة هي خصائص من الدرجة الأولى في MQTT 5 - تم وصفها بالتفصيل في مواصفات MQTT 5. api-version
وغيرها من الخصائص في حالة الشرطة هي خصائص مستخدم خاصة بواجهة برمجة تطبيقات IoT Hub.
يستجيب IoT Hub مع حزمة بيانات CONNACK
بمجرد الانتهاء من المصادقة وإحضار البيانات لدعم الاتصال. إذا تم تأسيس الاتصال بنجاح، يبدو CONNACK
كما يلي:
<- CONNACK
Session_Present: 1
Reason_Code: 0x00
Session_Expiry_Interval: 0xFFFFFFFF # included only if CONNECT specified value less than 0xFFFFFFFF and more than 0x00
Receive_Maximum: 16
Maximum_QoS: 1
Retain_Available: 0
Maximum_Packet_Size: 262144
Topic_Alias_Maximum: 10
Subscription_Identifiers_Available: 0
Shared_Subscriptions_Available: 0
Server_Keep_Alive: 1140 # included only if client did not specify Keep Alive or if it specified a bigger value
خصائص حزمة البيانات هذه CONNACK
تتبع مواصفات MQTT 5. وهي تعكس إمكانات IoT Hub.
المصادقة
تعرف الخاصية Authentication Method
على العميل CONNECT
نوع المصادقة التي يستخدمها لهذا الاتصال:
SAS
- يتم توفير توقيع الوصول المشترك في خاصيةCONNECT
Authentication Data
،X509
- يعتمد العميل على مصادقة شهادة العميل.
تفشل المصادقة إذا لم تتطابق طريقة المصادقة مع أسلوب العميل الذي تم تكوينه في IoT Hub.
إشعار
تتطلب واجهة برمجة التطبيقات هذه تعيين الخاصية Authentication Method
في حزمة بيانات CONNECT
. إذا لم يتم توفير الخاصية Authentication Method
، يفشل الاتصال مع استجابة Bad Request
.
مصادقة اسم المستخدم/كلمة المرور المستخدمة في إصدارات واجهة برمجة التطبيقات السابقة غير مدعومة.
SAS
باستخدام المصادقة المستندة إلى SAS، يجب على العميل توفير توقيع سياق الاتصال. يثبت التوقيع صحة اتصال MQTT. يجب أن يستند التوقيع إلى أحد مفتاحي المصادقة في تكوين العميل في IoT Hub. أو يجب أن يستند إلى أحد مفتاحي الوصول المشتركين لنهج الوصول المشترك.
يجب تشكيل سلسلة لتوقيعها على النحو التالي:
{host name}\n
{Client Id}\n
{sas-policy}\n
{sas-at}\n
{sas-expiry}\n
host name
مشتق إما من ملحق SNI (المقدم من قبل العميل في سجل Client Hello أثناء تأكيد اتصال TLS) أو خاصية المستخدمhost
في حزمة بياناتCONNECT
.Client Id
هو معرف العميل في حزمة بياناتCONNECT
.sas-policy
- إذا كان موجودًا، يحدد نهج الوصول إلى IoT Hub المستخدم للمصادقة. يتم ترميزه كخاصية مستخدم على حزمة بياناتCONNECT
. اختياري: يعني حذف ذلك استخدام إعدادات المصادقة في سجل الجهاز بدلا من ذلك.sas-at
- إذا كان موجودًا، يحدد وقت الاتصال - الوقت الحالي. يتم ترميزه كخاصية مستخدم من نوعtime
على حزمة بياناتCONNECT
.sas-expiry
يحدد وقت انتهاء الصلاحية للمصادقة. إنها خاصية مستخدمtime
مكتوبة على حزمة بياناتCONNECT
. هذه الخاصية مطلوبة.
بالنسبة للمعلمات الاختيارية، إذا تم حذفها، يجب استخدام سلسلة فارغة بدلاً من ذلك في السلسلة للتوقيع.
يتم استخدام HMAC-SHA256 لتجزئة السلسلة استنادًا إلى أحد المفاتيح المتماثلة للجهاز. ثم يتم تعيين قيمة التجزئة كقيمة للخاصية Authentication Data
.
X509
إذا تم تعيين الخاصية Authentication Method
إلى X509
، يقوم IoT Hub بمصادقة الاتصال استنادًا إلى شهادة العميل المتوفرة.
Reauthentication
إذا تم استخدام المصادقة المستندة إلى SAS، نوصي باستخدام رموز المصادقة المميزة قصيرة الأجل. للحفاظ على مصادقة الاتصال ومنع قطع الاتصال بسبب انتهاء الصلاحية، يجب على العميل إعادة المصادقة عن طريق إرسال حزمة بيانات AUTH
مع Reason Code: 0x19
(إعادة المصادقة):
-> AUTH
Reason_Code: 0x19
Authentication_Method: SAS
Authentication_Data: {SAS bytes}
sas-at: {current time}
sas-expiry: {SAS expiry time}
القواعد:
Authentication Method
يجب أن يكون هو نفسه المستخدم للمصادقة الأولية- إذا تمت مصادقة الاتصال في الأصل باستخدام SAS استنادًا إلى نهج الوصول المشترك، فيجب أن يستند التوقيع المستخدم في إعادة المصادقة إلى نفس النهج.
إذا نجحت إعادة المصادقة، يرسل IoT Hub حزمة بيانات AUTH
مع Reason Code: 0x00
(نجاح). وإلا، يرسل IoT Hub حزمة بيانات DISCONNECT
مع Reason Code: 0x87
(غير مصرح به) ويغلق الاتصال.
قطع الاتصال
يمكن للخادم قطع اتصال العميل لعدة أسباب، بما في ذلك:
- يسيء العميل التصرف بطريقة يستحيل الرد عليها بإقرار سلبي (أو استجابة) مباشرة،
- فشل الخادم في الحفاظ على حالة الاتصال محدثة،
- يتصل عميل آخر بنفس الهوية.
قد يقطع الخادم الاتصال بأي تعليمة برمجية لسبب من الأسباب التي تم تحديدها في مواصفات MQTT 5.0. إشارات ملحوظة:
135
(غير مصرح به) عند فشل إعادة المصادقة أو انتهاء صلاحية رمز SAS الحالي أو تغيير بيانات اعتماد الجهاز.142
(تم السيطرة على الجلسة) عند فتح اتصال جديد بنفس هوية العميل.159
(تم تجاوز معدل الاتصال) عندما يتجاوز معدل الاتصال لمركز IoT الحد.131
يُستخدم (خطأ خاص بالتنفيذ) لأي أخطاء مخصصة معرفة في واجهة برمجة التطبيقات هذه.status
reason
وتستخدم الخصائص لتوصيل مزيد من التفاصيل حول سبب قطع الاتصال (راجع الاستجابة للحصول على التفاصيل).
العمليات
يتم التعبير عن جميع الوظائف في واجهة برمجة التطبيقات هذه كعمليات. فيما يلي مثال على عملية "إرسال بيانات تتبع الاستخدام":
-> PUBLISH
QoS: 1
Packet_Id: 3
Topic: $iothub/telemetry
Payload: Hello
<- PUBACK
Packet_Id: 3
Reason_Code: 0
للحصول على مواصفات كاملة للعمليات في واجهة برمجة التطبيقات هذه، راجع مرجع MQTT 5 API لمستوى بيانات IoT Hub.
إشعار
يتم عرض جميع النماذج في هذه المواصفات من منظور العميل. توقيع ->
يعني أن العميل يرسل الحزمة، <-
- يتم الاستلام.
موضوعات واشتراكات الرسائل
تبدأ الموضوعات المستخدمة في رسائل العمليات في واجهة برمجة التطبيقات هذه بـ $iothub/
.
لا تنطبق دلالات وسيط MQTT على هذه العمليات (راجع "الموضوعات التي تبدأ بـ $" للحصول على التفاصيل).
الموضوعات التي تبدأ بـ $iothub/
التي لم يتم تعريفها في واجهة برمجة التطبيقات هذه غير مدعومة:
- يؤدي إرسال رسائل إلى موضوع
Not Found
غير معرف إلى الاستجابة (راجع الاستجابة للحصول على التفاصيل)، - يؤدي الاشتراك في موضوع غير معرف إلى
SUBACK
معReason Code: 0x8F
(عامل تصفية غير صالح للموضوع).
أسماء الموضوعات وأسماء الخصائص حساسة لحالة الأحرف ويجب أن تكون متطابقة تمامًا. على سبيل المثال، $iothub/telemetry/
غير مدعوم، بينما $iothub/telemetry
مدعوم.
إشعار
أحرف البدل في الاشتراكات ضمن $iothub/..
غير مدعومة. أي، لا يمكن للعميل الاشتراك في $iothub/+
أو $iothub/#
. تؤدي محاولة القيام بذلك إلى SUBACK
مع Reason Code: 0xA2
(اشتراكات أحرف البدل غير مدعومة). يتم دعم أحرف البدل ذات المقطع الواحد فقط (+
) بدلاً من معلمات المسار في اسم الموضوع للعمليات التي تحتوي عليها.
أنواع التفاعل
تستند جميع العمليات في واجهة برمجة التطبيقات هذه إلى أحد نوعي التفاعل:
- رسالة مع رسالة إقرار اختيارية (MessageAck)
- طلب-رد (ReqRep)
تختلف العمليات أيضًا حسب الاتجاه (يتم تحديدها حسب اتجاه الرسالة الأولية في المقابل):
- عميل إلى خادم (c2s)
- خادم إلى عميل (s2c)
على سبيل المثال، "إرسال بيانات تتبع الاستخدام" هي عملية "من عميل إلى خادم" من نوع "رسالة مع رسالة إقرار"، بينما "معالجة الأسلوب المباشر" هي عملية من "خادم إلى عميل" من نوع "طلب-رد".
تفاعلات رسالة الإقرار
يتم التعبير عن الرسالة ذات تفاعل الإقرار الاختياري (MessageAck) كتبادل لحزم بيانات PUBLISH
وPUBACK
في MQTT. الإقرار اختياري ويمكن للمرسل اختيار عدم طلبه عن طريق إرسال PUBLISH
الحزمة باستخدام QoS: 0
.
إشعار
إذا كان يجب اقتطاع الخصائص في حزمة بيانات PUBACK
بسبب Maximum Packet Size
المعلن عنه من قبل العميل، فسيحتفظ IoT Hub بالعديد من "خصائص المستخدم" بقدر ما يمكن احتواؤها ضمن الحد المحدد. خصائص المستخدم المدرجة أولاً لها فرصة أكبر لإرسالها من تلك المدرجة لاحقًا؛ خاصية Reason String
لها أقل أولوية.
مثال على تفاعل MessageAck البسيط
رسالة:
PUBLISH
QoS: 1
Packet_Id: 34
Topic: $iothub/{request.path}
Payload: <any>
رسالة الإقرار (نجاح):
PUBACK
Packet_Id: 34
Reason_Code: 0
تفاعلات طلب-رد
في تفاعلات طلب-رد (ReqRep)، يترجم كل من "الطلب" و"الاستجابة" إلى حزمة بيانات PUBLISH
باستخدام QoS: 0
.
يجب تعيين الخاصية Correlation Data
في كليهما ويتم استخدامها لمطابقة حزمة بيانات "الاستجابة" مع حزمة بيانات "الطلب".
تستخدم واجهة برمجة التطبيقات هذه موضوع استجابة واحدًا $iothub/responses
لجميع عمليات ReqRep. الاشتراك في / إلغاء الاشتراك من هذا الموضوع لعمليات عميل إلى خادم غير مطلوب - يفترض الخادم اشتراك جميع العملاء.
مثال على تفاعل ReqRep البسيط
طلب:
PUBLISH
QoS: 0
Topic: $iothub/{request.path}
Correlation_Data: 0x01 0xFA
Payload: ...
الاستجابة (نجاح):
PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x01 0xFA
Payload: ...
لا تدعم تفاعلات ReqRep حزم بيانات PUBLISH
مع QoS: 1
كرسائل طلب أو استجابة. يؤدي إرسال الطلب PUBLISH
إلى استجابة Bad Request
.
الحد الأقصى للطول المدعوم في خاصية Correlation Data
هو 16 بايت. إذا تم تعيين الخاصية Correlation Data
على حزمة بيانات PUBLISH
إلى قيمة أطول من 16 بايت، يرسل IoT Hub DISCONNECT
مع نتيجة Bad Request
، ويغلق الاتصال. ينطبق هذا السلوك فقط على حزم البيانات المتبادلة داخل واجهة برمجة التطبيقات هذه.
إشعار
بيانات الارتباط هي تسلسل بايت تحكمي، على سبيل المثال، لا يضمن أن تكون سلسلة UTF-8.
يستخدم ReqRep مواضيع معرفة مسبقًا للاستجابة؛ يتم تجاهل خاصية "موضوع الاستجابة" في حزمة بيانات "الطلب" PUBLISH
(إذا تم تعيينها بواسطة المرسل).
يشترك IoT Hub تلقائيًا في مواضيع الاستجابة لجميع عمليات ReqRep من عميل إلى خادم. حتى إذا ألغى العميل الاشتراك صراحة من موضوع الاستجابة، فإن IoT Hub يعيد الاشتراك تلقائيًا. بالنسبة لتفاعلات ReqRep من خادم إلى عميل، لا يزال من الضروري أن يشترك الجهاز.
خصائص الرسالة
يتم التعبير عن خصائص العملية - النظام أو المستخدم المعرف - كخصائص حزمة بيانات في MQTT 5.
أسماء خصائص المستخدم حساسة لحالة الأحرف ويجب كتابتها بالضبط كما هو محدد. على سبيل المثال، Trace-ID
غير مدعوم، بينما trace-id
مدعوم.
تؤدي الطلبات ذات خصائص المستخدم خارج المواصفات وبدون بادئة @
إلى خطأ.
يتم ترميز خصائص النظام إما كخصائص من الدرجة الأولى (على سبيل المثال، Content Type
) أو "كخصائص المستخدم". توفر المواصفات قائمة شاملة بخصائص النظام المدعومة.
يتم تجاهل جميع خصائص الفئة الأولى ما لم يذكر دعمها صراحة في المواصفات.
حيث يتم السماح بالخصائص المعرفة من قبل المستخدم، يجب أن تتبع أسماءها التنسيق @{property name}
. تدعم الخصائص المعرفة من قبل المستخدم قيم سلسلة UTF-8 صالحة فقط. على سبيل المثال، يجب ترميز الخاصية MyProperty1
ذات القيمة 15
"كخاصية مستخدم" بالاسم @MyProperty
والقيمة 15
.
إذا لم يتعرف IoT Hub على خاصية المستخدم، فإنه يعتبر خطأ، ويستجيب IoT Hub مع PUBACK
Reason Code: 0x83
(خطأ خاص بالتنفيذ) و status: 0100
(طلب غير صحيح). إذا لم يتم طلب الإقرار (QoS: 0)، DISCONNECT
يتم إرسال الحزمة التي لها نفس الخطأ مرة أخرى ويتم إنهاء الاتصال.
تحدد واجهة برمجة التطبيقات هذه أنواع البيانات التالية بالإضافة إلى string
:
time
: عدد المللي ثانية منذ1970-01-01T00:00:00.000Z
. على سبيل المثال،1600987195320
لـ2020-09-24T22:39:55.320Z
،u32
: رقم عدد صحيح 32 بت غير موقع،u64
: رقم عدد صحيح 64 بت غير موقع،i32
: رقم عدد صحيح 32 بت مُوقع.
استجابة
يمكن أن تؤدي التفاعلات إلى نتائج مختلفة: Success
وBad Request
وNot Found
وغيرها.
يتم تمييز النتائج عن بعضها البعض بواسطة خاصية المستخدم status
. Reason Code
في حزم بيانات PUBACK
(لتفاعلات MessageAck) يتطابق مع status
في المعنى حيثما أمكن ذلك.
إشعار
إذا حدد العميل Request Problem Information: 0
في حزمة بيانات CONNECT، فلن يتم إرسال أي خصائص مستخدم على حزم بيانات PUBACK
للامتثال لمواصفات MQTT 5، بما في ذلك خاصية status
. في هذه الحالة، لا يزال بإمكان العميل الاعتماد على Reason Code
لتحديد ما إذا كانت رسالة إقرار إيجابي أم سلبي.
كل تفاعل له إعداد افتراضي (أو نجاح). يحتوي على Reason Code
بخصائص 0
وstatus
من "لم يتم التعيين". وإلا:
- بالنسبة لتفاعلات MessageAck، يحصل
PUBACK
علىReason Code
غير 0x0 (نجاح). قد تكون الخاصيةstatus
موجودة لتوضيح النتيجة بشكل أكبر. - بالنسبة لتفاعلات ReqRep، تحصل الاستجابة
PUBLISH
على مجموعة الخصائصstatus
. - نظرًا لعدم وجود طريقة للاستجابة لتفاعلات MessageAck مع
QoS: 0
مباشرة، يتم إرسال حزمة بياناتDISCONNECT
بدلاً من ذلك بمعلومات الاستجابة، متبوعة بقطع الاتصال.
أمثلة:
طلب غير صحيح (MessageAck):
PUBACK
Reason_Code: 131
status: 0100
reason: Unknown property `test`
غير مصرح به (MessageAck):
PUBACK
Reason_Code: 135
status: 0101
غير مصرح به (ReqRep):
PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: ...
status: 0101
عند الحاجة، يقوم IoT Hub بتعيين خصائص المستخدم التالية:
status
- التعليمات البرمجية الموسعة لـ IoT Hub لحالة العملية. يمكن استخدام هذه التعليمة البرمجية للتمييز بين النتائج.trace-id
- معرف التتبع للعملية؛ قد يحتفظ IoT Hub بمزيد من التشخيصات المتعلقة بالعملية التي يمكن استخدامها للتحقيق الداخلي.reason
- رسالة يمكن للبشر قراءتها توفر معلومات إضافية حول سبب انتهاء العملية في حالة تشير إليها خاصيةstatus
.
إشعار
إذا قام العميل بتعيين الخاصية Maximum Packet Size
في حزمة بيانات CONNECT إلى قيمة صغيرة جدًا، فقد لا تتلاءم جميع خصائص المستخدم ولن تظهر في حزمة البيانات.
reason
مخصص فقط للأشخاص ولا ينبغي استخدامه في منطق العميل. تسمح واجهة برمجة التطبيقات هذه بتغيير الرسائل في أي وقت دون تحذير أو تغيير الإصدار.
إذا أرسل العميل RequestProblemInformation: 0
في حزمة بيانات CONNECT، فلن يتم تضمين خصائص المستخدم في رسائل الإقرارات لكل مواصفات MQTT 5.
كود الحالة
تحمل الخاصية status
التعليمة البرمجية للحالة للعملية. تم تحسينها لكفاءة قراءة الجهاز.
وهي تتكون من عدد صحيح غير موقع ثنائي البايت مرمز كسداسي عشري في سلسلة مثل 0501
.
بنية التعليمات البرمجية (مخطط بت):
7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0
0 0 0 0 0 R T T | C C C C C C C C
يتم استخدام البايت الأول للعلامات:
- تشير البتات 0 و1 إلى نوع النتائج:
00
- نجاح01
- خطأ العميل10
- خطأ الخادم
- بت 2:
1
يشير إلى أن الخطأ قابل لإعادة المحاولة - البت من 3 إلى 7 محجوزة ويجب تعيينها إلى
0
يحتوي البايت الثاني على رمز استجابة مميز فعلي. يمكن أن تحتوي رموز الخطأ ذات العلامات المختلفة على نفس قيمة البايت الثانية. على سبيل المثال، يمكن أن تكون رموز الخطأ 0001
و0101
و0201
و0301
لها معنى مميز.
على سبيل المثال، Too Many Requests
هو عميل، خطأ قابل لإعادة المحاولة مع الرمز الخاص به لـ 1
. القيمة هي 0000 0101 0000 0001
أو 0x0501
.
قد يستخدم العملاء وحدات بت النوع لتحديد ما إذا كانت العملية قد انتهت بنجاح. قد يستخدم العملاء أيضًا بت قابل لإعادة المحاولة لتحديد ما إذا كان من المعقول إعادة محاولة العملية.
التوصيات
إدارة جلسات العمل
تحمل حزمة بيانات CONNACK
خاصية Session Present
للإشارة إلى ما إذا كان الخادم قد قام باستعادة جلسة العمل التي تم إنشاؤها مسبقًا. استخدم هذه الخاصية لمعرفة ما إذا كنت تريد الاشتراك في الموضوعات أو تخطي الاشتراك بما أن الاشتراك تم في وقت سابق.
للاعتماد على Session Present
، يجب على العميل تعقب الاشتراكات التي تم إجراؤها (أي حزمة البيانات SUBSCRIBE
المرسلة وSUBACK
المستلمة بالتعليمة البرمجية لسبب ناجح)، أو التأكد من الاشتراك في جميع الموضوعات في تبادل واحدSUBSCRIBE
/SUBACK
. وإلا، إذا أرسل العميل حزمتين SUBSCRIBE
، وكان الخادم يعالج حزمة واحدة فقط بنجاح، يتصل Session Present: 1
الخادم أثناء CONNACK
قبول جزء فقط من اشتراكات العميل.
لمنع الحالة التي لم يشترك فيها إصدار أقدم من العميل في جميع الموضوعات، من الأفضل الاشتراك دون شروط عند تغيير سلوك العميل (على سبيل المثال، كجزء من تحديث البرنامج الثابت). أيضًا، لضمان عدم ترك أي اشتراكات قديمة (أخذ من الحد الأقصى المسموح به لعدد الاشتراكات)، قم بإلغاء الاشتراك صراحة من الاشتراكات التي لم تعد قيد الاستخدام.
الدفعات
لا يوجد تنسيق خاص لإرسال دفعة من الرسائل. لتقليل النفقات العامة للعمليات كثيفة الموارد في TLS والشبكات، قم بتجميع حزم البيانات (PUBLISH
وPUBACK
وSUBSCRIBE
، وهكذا) معًا قبل تسليمها إلى مكدس TLS/TCP الأساسي. أيضًا، يمكن للعميل تسهيل الاسم المستعار للموضوع ضمن "الدفعة":
- ضع اسم الموضوع الكامل في حزمة البيانات الأولى
PUBLISH
للاتصال وإقران الاسم المستعار للموضوع به، - ضع حزمة البيانات التالية لنفس الموضوع مع اسم موضوع فارغ وخاصية اسم مستعار للموضوع فارغة.
الترحيل
يسرد هذا القسم التغييرات في واجهة برمجة التطبيقات مقارنة بدعم MQTT السابق.
- بروتوكول النقل هو MQTT 5. سابقًا - MQTT 3.1.1.
- يتم تضمين معلومات السياق لمصادقة SAS في حزمة بيانات
CONNECT
مباشرة بدلاً من ترميزها مع التوقيع. - يتم استخدام "أسلوب المصادقة" للإشارة إلى أسلوب المصادقة المستخدم.
- يتم وضع "توقيع الوصول المشترك" في خاصية "بيانات المصادقة". تم استخدام حقل "كلمة المرور سابقًا".
- مواضيع العمليات مختلفة:
- بيانات تتبع الاستخدام:
$iothub/telemetry
بدلاً منdevices/{Client Id}/messages/events
، - الأوامر:
$iothub/commands
بدلاً منdevices/{Client Id}/messages/devicebound
، - تم الإبلاغ عن توأم التصحيح:
$iothub/twin/patch/reported
بدلاً من$iothub/twin/PATCH/properties/reported
، - إعلام حالة التوأم المرغوبة التي تم تغييرها:
$iothub/twin/patch/desired
بدلاً من$iothub/twin/PATCH/properties/desired
.
- بيانات تتبع الاستخدام:
- الاشتراك لموضوع استجابة عمليات طلب-رد من عميل إلى خادم غير مطلوب.
- يتم استخدام خصائص المستخدم بدلاً من ترميز الخصائص في مقطع اسم الموضوع.
- يتم كتابة أسماء الخصائص في إصلاح التسمية "حالة شرطة" بدلاً من الاختصارات ذات البادئة الخاصة. تتطلب الخصائص المعرفة من قبل المستخدم الآن بادئة بدلاً من ذلك. على سبيل المثال،
$.mid
هو الآنmessage-id
، بينماmyProperty1
يصبح@myProperty1
. - يتم استخدام خاصية "بيانات الارتباط" لربط رسائل الطلب والاستجابة لعمليات طلب-رد بدلاً من الخاصية
$rid
المرمزة في الموضوع. - لم يعد يتم إضافة طابع على الخاصية
iothub-connection-auth-method
على أحداث بيانات تتبع الاستخدام. - لا يتم إزالة أوامر C2D في غياب الاشتراك من الجهاز. تظل في قائمة الانتظار حتى يشترك الجهاز أو تنتهي صلاحيتها.
الأمثلة
إرسال بيانات تتبع الاستخدام
رسالة:
-> PUBLISH
QoS: 1
Packet_Id: 31
Topic: $iothub/telemetry
@myProperty1: My String Value # optional
creation-time: 1600987195320 # optional
@ No_Rules-ForUser-PROPERTIES: Any UTF-8 string value # optional
Payload: <data>
رسالة الإقرار:
<- PUBACK
Packet_Id: 31
Reason_Code: 0
رسالة الإقرار البديل (مقيدة):
<- PUBACK
Packet_Id: 31
Reason_Code: 151
status: 0501
إرسال حالة الحصول على التوأم
طلب:
-> PUBLISH
QoS: 0
Topic: $iothub/twin/get
Correlation_Data: 0x01 0xFA
Payload: <empty>
الاستجابة (نجاح):
<- PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x01 0xFA
Payload: <twin/desired state>
الاستجابة (غير مسموح بها):
<- PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x01 0xFA
status: 0102
reason: Operation not allowed for `B2` SKU
Payload: <empty>
معالجة استدعاء الأسلوب المباشر
طلب:
<- PUBLISH
QoS: 0
Topic: $iothub/methods/abc
Correlation_Data: 0x0A 0x10
Payload: <data>
الاستجابة (نجاح):
-> PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x0A 0x10
response-code: 200 # user defined response code
Payload: <data>
إشعار
لم يتم تعيين status
- إنها استجابة نجاح.
استجابة الجهاز غير المتوفرة:
-> PUBLISH
QoS: 0
Topic: $iothub/responses
Correlation_Data: 0x0A 0x10
status: 0603
خطأ أثناء استخدام QoS 0، الجزء 1
طلب:
-> PUBLISH
QoS: 0
Topic: $iothub/twin/gett # misspelled topic name - server won't recognize it as Request-Response interaction
Correlation_Data: 0x0A 0x10
Payload: <data>
الاستجابة:
<- DISCONNECT
Reason_Code: 144
reason: "Unsupported topic: `$iothub/twin/gett`"
خطأ أثناء استخدام QoS 0، الجزء 2
طلب:
-> PUBLISH # missing Correlation Data
QoS: 0
Topic: $iothub/twin/get
Payload: <data>
الاستجابة:
<- DISCONNECT
Reason_Code: 131
status: 0100
reason: "`Correlation Data` property is missing"
الخطوات التالية
- لمراجعة مرجع MQTT 5 preview API، راجع مرجع MQTT 5 API لمستوى بيانات IoT Hub (معاينة).
- لمتابعة نموذج C#، راجع مستودع نموذج GitHub.