قسمت اول – مقدمه ای بر پروتکل MQTT در IOT و اینترنت اشیاء

Post image

حدود سال 1999 بود که برای اولین بار پروتکلی به نام MQTT برای برقراری و استفاده در ارتباطات ماهواره ای نوشته شد . اون زمان کمتر کسی فکرشو میکرد که یه روزی این پروتکل برای IOT یا اصلاح فارسی غلطش (اینترنت اشیاء) مورد استفاده قرار بگیره .

این پروتکل شباهت های زیادی به websocket یا socketIO داره (از لحاظ فنی) اما برتری هاش واقعا قابل ملاحظه هستش.شاید بزرگترین مزیتش قابلیت رمزگذاری باشه.

توی این آموزش ما اول کمی این پروتکل رو معرفی میکنیم و اگه خسته نشید ، بیشتر راجع به بحث خود پروتکل می نویسم و در پایان (بخش های بعدی )یک پیاده سازی عادی توی ویندوز خواهیم داشت و میبینیم که چطور کار میکنه این پروتکل.

MQTT چیست ؟

یک پروتکل استاندارد برمبنای publish/subscribe هستش که به صورت پیام رد و بدل میشه.

این پروتکل با هدف ارتباط M2M یا ماشین با ماشین ساخته شده.اما publish/subscribe چیه؟

این publish/subscribe که اغلب به اختصار pub-sub خونده میشه در حقیقت قلب اصلی ارتباط کلاینت ها با هم هستش .یعنی یکی از کلاینت ها مثلا یه مطلب یا موضوعی رو publish میکنه و بقیه کلاینت ها می تونند اونو subscribe کنند و پیامشو ببینند.

این پروتکل خیلی شبیه ارتباط کلاینت سرور هستش و به سرورش broker میگند

(اما کلاینت/سرور نیست ).و الباقی کلاینت ها یه توپولوژی ستاره ای شکل رو با سرور صورت میدند . یعنی سرور میشه قلب این پروتکل و کلاینت ها همه به اون وصل میشند.

طبق استاندارد این پروتکل کلاینت می تونه یه topic یا موضوع رو publish یا subscribe کنه .کمی گنگه نه !!

بذارید یه مثال بزنم . فرض کنید ما می خوایم با سنسور دمای داخل آشپزخانه ی خونه رو بگیریم ، topic اون میشه

‘sensors/temperature/home/kitchen’ که ما با استفاده از ” / ” میتونیم یک ساختار درختی به اون topic یا موضوع بدیم .

یک مثال دیگه

فرض کنید ما میخوایم دمای هرجای دنیا رو هر یک دقیقه در میان بگیریم .برای این کار سنسور ها هر یک دقیقه یک بار یک عدد ازدمای خودشون رو به broker میدند (publish) میکنند .و ما میتونیم با استفاده از broker دمای هرجایی که خواستیم رو بخونیم یا subscribe کنیم .
{sensors/temperature/{country}/{city}/{street name}

حالا فرض کنید من میخوام مانگین دمای یک کشور رو بگیرم .در اون صورت می تونم از wildcards ها بهره بگیرم . بله این پروتکل از wildcards های + و # پشتیبانی میکنه

اگه بخوام تمام سنسور ها رو ببینم از + استفاده میکنم sensors/+/uk/london/baker_street.

(+ یعنی تمام topic های موجود )

اگه بخوام تمامی دماهای دنیا رو ببینم از # استفاده میکنم #/sensors/temperature/

(# یعنی تمامی زیرشاخه های موجود)

این پروتکل همچنین دارای QOS نیز میباشد . (Quality of Service)

خب اینو بگم که qos دراین پروتکل سه حالت داره .

QoS Level 0:

ساده ترین حالت برقراری ارتباط با broker هست که نیازی به acknowledgment نداره .

QoS Level 1:

در این حالت سرور مطمئن میشه که حداقل یک بار یا بیشتر بسته به کلاینت رسیده و ACK از کلاینت میگیره.

QoS Level 2:

در این حالت broker یک و فقط یک بسته به کلاینت میفرسته و مطمئن میشه که بسته رسیده.این حالتش خیلی توصیه نمیشه .

همچنین این پروتکل حالاتی رو تشخیص میده که ارتباط قطع شده یا به هر دلیلی کلاینت نمیتونه با broker ارتباط برقرار کنه و در این حالت broker اقدام لازم رو انجام میده تا به خطا بر نخوریم. در همه این شرایط broker بقیه کلاینت ها رو هم با خبر میکنه.

Security

کلاینت ها میتونند با فرستادن username و password با broker ارتباط برقرار کنند .اما این یه مشکل امنیتی داره که هر بار توی همون بسته اطلاعات تصدیق هویتی رو بدون رمز گذاری میفرسته . البته خوشبختانه broker هایی هم هستند که قابلیت رمز گذاری TLS رو پشتیبانی میکنند .

چند نمونه از نرم افزار های Broker

تا کنون broker های متفاوتی برای این پروتکل نوشته شده که در زیر چند نمونه رو معرفی میکنیم .

  • Mosquitto اولین نسخه broker نوشته شده با زبان C و دارای تنظیمات مختلف.
  • Mosca نوشته شده با Nodejs و بسیار محبوب ، سریع و قابل توسعه و با تنظیمات راحت.
  • RSMB نسخه نوشته شده توسط کمپانی IBM و کمتر محبوب اما با تنظیمات بسیار عالی ، پیاده سازی شده با زبان C
  • HiveMQ این نسخه یک بازیگر جدیده که بسیار خوب ظاهر شده.گفته میشه که توی این نسخه قابلیت رمزگذاری TLS پشتیبانی میشه.

کتابخانه های کلاینت این زبان

برای کلاینت این پروتکل میتونید به اینترنت مراجعه کنید .تقریبا برای اکثر زبان های برنامه نویسی نسخه کلاینت داره . زبان های C , java , python , javascript از پشتیبانی کننده های اون هستند . (به علت این که برای زبان های مختلف کلاینت داره محبوب IOT شده و در آینده نزیک توی قسمت های بعد اونو روی سخت افزار های اینترنت اشیاء پیاده خواهیم کرد. )

در پایان عکس زیر یک بسته که از کلاینت به سمت سرور میره رو خواهید دید که شامل چه اطلاعاتی هست.

نکته مهم عکس بالا اینه که اگه پارامتر cleanSession برابر با false باشه .اون وقت سرور داده ها رو کش (cache) خواهد کرد و اگر کلاینتی دوباره متصل بشه .مقدار داده های قدیمی رو هم دریافت خواهد کرد.

عکس زیر هم جوابی هست که broker به کلاینت میده .

پایان قسمت اول.

You May Also Like