MQTT یک پروتکل ماشین به ماشین (M2M) برای اتصالات اینترنت اشیاء (IOT) است که به کمک سنسور، ارتباط برقرار میکند.
معماری ساختار MQTT شامل یک سرور مرکزی یا واسطه است که به شکل توپولوژی ستارهای با یک یا چند دستگاه ارتباط برقرار میکند. پایه ارتباطات بر اساس پیامها و تاپیکهایی است که به یک گره (دستگاه) ارسال میشود. دراینبین دیگر گرهها (دستگاهها) نیز میتوانند با اشتراکگذاری آن پیام را دریافت کنند. سرور مرکزی مسئول مدیریت شبکه و انتقال پیامها است. ارتباطات میتواند یک به یک یا گروهی باشد.
هدف از این پروژه ساخت یک آداپتور IOT است که به همهی دستگاههای عمومی بدون احتیاج به wifi اجازه میدهد تا بهعنوان یک گره IOT شناخته شوند. تنها شرط موردنیاز دارا بودن یک پورت سریال است.
جهت پیادهسازی یک سیستم با حداقل جزئیات، ما باید در مورد چگونگی کار یک سرور مرکزی (کارگزار) نیز بدانیم. گرهها بر پایهی یک ماژول ESP-03 و سرور مرکزی بر روی یک ماژول رزبری پای اجرا میشود. در تصویر شماره یک، میتوانید بلوک مربوط به دیاگرام سیستم را مشاهده کنید.
پروتکل MQTT:
یک دفتر کار را تصور کنید؛ شما به چندین دستگاه با یک واحد مرکزی نیاز دارید. دستگاههایی مانند ترموستات، آلارم یا دستگاههای مختلفی که باهم مرتبطاند ( مانند یک لامپ با سوئیچ قطع و وصل). ما به یک پروتکل ارتباطی نیاز داریم که بین همهی این دستگاهها مشترک باشد.
در میان پروتکلهای موجود، MQTT به دلایل زیر انتخاب شده است:
- متنباز بودن
- سازگاری با تمام دستگاهها (اندروید، لینوکس)
- پیادهسازی سادهی سیستم
این پروتکل مبتنی بر مبانی زیر است:
- هر دستگاهی میتواند دادهها را فراخوانی و منتشر کند.
- هر دستگاهی میتواند یک تاپیک را برای دیگر دستگاهها منتشر کند.
- دادههای منتشرشده توسط یک سرور مرکزی که کارگزار نامیده میشود مدیریت میشوند. درواقع کارگزار مسئول توزیع و دریافت دادههاست.
- دادهها و سلسلهمراتب آن توسط علامت “/” از یکدیگر جدا میشوند.
بهعنوان مثال، یک سنسور دما که در یک اتاق جلسه قرار دارد، دادههای زیر را منتشر میکند:
1 | Floor3/Room2/Temperature |
بهاینترتیب دستگاه تهویه هوایی که در اتاق نصب شده است با آگاه شدن از وضعیت دمای اتاق، قادر به تنظیم کردن دمای اتاق خواهد بود و دمای اتاق به خوبی مدیریت میشود. دیگر دستگاهها نیز میتوانند این مورد را مشاهده و تأیید کنند یا حتی جهت نظارت بر دمای تمام اتاقها، آن را با تاپیک “+/+/Temperature” به اشتراک بگذارند.
در ادامه مثال، دستگاه تهویه هوا نیز تاپیک “Floor3/Room2/AirConditioner” را به اشتراک میگذارد. این تاپیک میتواند دو مقدار (ON/OFF) را بگیرد. اگر این تاپیک بهصورت “Floor3/Room2/AirConditioner = ON”منتشر شود، دستگاه روشن میشود. هم دفتر تعمیر و نگهداری و هم اتاق کنترل از راه دور قادر هستند تا این تاپیک را منتشر کنند که البته جای نگرانی نیست و MQTT میتواند این موارد را نیز مدیریت کند.
کارگزار (Server):
این قسمت از سیستم باید همواره از تاپیکهایی که دستگاهها منتشر میکنند مطلع باشد و آن را بین همهی دستگاههایی که مرتبط با تاپیک فوق هستند، توزیع کند.
در بین تمامی کارگزارهای در دسترس، ما کارگزار Mosquitto را به دلایل زیر انتخاب کردیم:
- متنباز بودن
- نصب و مدیریت آسان
- موجود بودن برای رزبری پای، به این دلیل که باید بهصورت 24 ساعته در دسترس باشد. به نظر میرسد که استفاده از یک دستگاه باقدرت پایین انتخاب خوبی باشد.
اولین مرحله کار نصب Mosquitto بر روی رزبری پای است.
شاید برای شما مفید باشد: آموزش رزبری پای از 0 تا 100
کنسول برنامهنویسی خود را باز کنید و عبارت زیر را در آن تایپ کنید:
1 | $ sudo apt-get install mosquitto mosquitto-clients python-mosquitto |
در حال حاضر Mosquitto نصب شده و در حال اجرا است. همچنین پس از خاموش شدن و راهاندازی مجدد سیستم، بهصورت خودکار اجرا میشود.
به منظور بررسی عملکرد مناسب آن، یک جفت برنامه کاربردی را نصب و آماده اجرا میکنیم: یک منتشر کننده و یک مشترک.
ما این تاپیک را با موضوع “test” با تایپ سطر زیر پیادهسازی میکنیم:
1 | $ mosquitto_sub -d -t test |
برای دیگر قسمت برنامه، یک صفحهی جدید که مخصوص انتشار پیام است را در کنسول خود باز میکنیم:
1 | $ mosquitto_pub -d -t test -m Hello |
در پنجره اول میتوانیم ببینیم که پیغامی مبنی بر اینکه “مشترک، تاپیک فوق را دریافت کرده است” نمایش داده میشود:
1 | Client mosqsub/22163-raspberry received PUBLISH (d0, q0, r0, m0, 'test', ... (5 bytes)) Hello |
آداپتور اینترنت اشیاء IOT
استفاده از پروتکل MQTT برای اینترنت چیزها (IOT):
یکی از موارد مهم این است که آداپتوری که استفاده میکنیم باید به یک اینترنت بیسیم متصل بوده و از لحاظ موقعیت، در دسترس تمامی گرهها باشد.
بهعنوان هسته اصلی آداپتور IOT، به دلایلی که در پایین ذکرشده، ما یک دستگاه ESP-03 را بر پایه یک تراشه ESP8266 انتخاب کردیم:
- اندازهی کوچک
- هزینه بسیار پایین
- امکانات وای فای
- رابط سریال
- وابسته بودن به یک خانواده بزرگ (که درنتیجه دستگاه بهراحتی قابل تعویض است.)
- برنامهنویسی ساده به کمک Arduino IDE
با توجه به ویژگیهای منحصربهفرد آن، آداپتور IOT با کمی لحیمکاری میتواند به یک ESP-03 همراه با اتصالات 2.54 متصل شود.
سختافزار:
اشکال مهم ESP-03 این است که اتصالات آن از نوع 2.54 نیست. که مانع از اتصال به یک PCB با یک اتصال استاندارد میشود. راهحل اجراشده در تصویر دو قابلمشاهده است. ما یک سیم به هرکدام از پینها لحیم کردیم که خم شدن آنها باعث میشود تا به یک هدر 2.54 تبدیل شوند.
ESP-03 میتواند بهصورت متصل یا غیر متصل برنامهریزی شود. همچنین جایگاه عمودی ESP-03 کمک میکند تا سطح مورداستفاده PCB کاهش یابد.
پینها باید به مقدار حداقل ممکن برای اپلیکیشنها مورداستفاده قرار گیرند. در تصویر سه، پینهای خروجی اصلی ESP-03 و آرایش نهایی آداپتور IOT را میتوانید ببینید. ایضاً میبینید که 12 پین هدر مورداستفاده قرار گرفته است.
برای برنامهریزی آداپتور ما به یک فلش USB بهعنوان مبدل سریال نیاز داریم. با در نظر گرفتن اینکه ESP-03 از جریان برق 3.3V استفاده میکند. (و نه 5V) سیگنالهای Rx و Tx باید با ولتاژ فوق سازگار شود. به این منظور ما از یک کابل FTDI 5V استفاده کردیم و ولتاژ موردنظرمان را تغییر دادیم.
میزان ولتاژ Rx وقتیکه از کابل FTDI استفاده میکنیم باید کاهش یابد. به همین دلیل ما از دو مقاومت تقسیمکننده ولتاژ استفاده کردیم. از سوی دیگر سیگنال Tx با استفاده از کابل FTDI باید از 3.3 به 5 ولت افزایش یابد. در تئوری، به این کار نیازی نیست. زیرا 3.3 ولت از 2.5 ولت بالاتر است. ارزش کابل FTDI “1” در نظر گرفته میشود. شماتیک دیاگرام فوق را ببینید. بورد فوق بهراحتی بر روی یک پوسته نصب میشود.
نرمافزار:
(مواردی که در ادامه ذکر میشود تنها برای ESP-01 معتبر است.)
دستگاههای ESP-xx که در این پروژه از آنها نام برده میشود، همه از یک کارخانه بوده و بهوسیله یک پروتکل دستوری مشخص باهم ترکیب شدهاند.
امکان دوم این است که آنها به یک مترجم زبان LUA مجهز شدهاند، که البته MQTT را نیز پشتیبانی میکنند و پس از چند آزمایش مشاهده شد که به خوبی کار میکند.
امکان سوم، استفاده از محیط برنامهنویسی آردوینیو (Arduino) بهطور گسترده است. جهت برنامهنویسی بهتر میتوانید از برنامه ++C بهعنوان مترجم زبان برنامهنویسی استفاده کنید. ما درنهایت این راه را انتخاب کردیم.
شاید برای شما مفید باشد: پروتکل Matter
فرایندهای زیر را دنبال کنید:
- نصب نرم افزار Arduino IDE:
از طریق این لینک میتوانید آخرین نسخه نرمافزار را یافته و نصب کنید.
- راهاندازی IDE و پیدا کردن کامپایلر سازگار با ESP8266:
نرم افزار Arduino IDE را باز کنید. در قسمت منو این آدرس را دنبال کنید: File–Preferences سپس در باکس Additional Boards Manager URLs مقدار زیر را قرار دهید:
1 | http://arduino.esp8266.com/versions/2.0.0/package_esp8266com_index.json |
- نصب کامپایلر سازگار با ESP8266:
در قسمت منو به این آدرس بروید: Tools-Board-Boards Manager، گزینه esp8266 را پیدا کنید و فایل esp8266 by ESP8266 Community را نصب کنید.
در پنجره ای که ظاهر میشود به این آدرس بروید: Tools – Board – Generic ESP8266 Module
- نصب کتابخانه MQTT:
به این آدرس بروید : Sketch – Include library – Manage Libraries، به دنبال mqtt 8266 بگردید و PubSubClient را نصب کنید.
- بارگیری و کامپایل کردن طرح ارائه شده mqtt.ino:
جهت توصیف سختافزارها و آپلود برنامه، آداپتور IOT را به رایانه متصل کنید برای این کار دکمههای POWER و PROGRAM را بر روی برنامهریز بهطور همزمان فشار دهید. (توجه داشته باشید که بهطورمعمول دکمه POWER بهصورت بسته است.) سپس در ابتدا دکمه POWER و پسازآن دکمه PRGRAM را آزاد کنید. در حال حاضر ESP-01 منتظر دریافت برنامه است. دکمه آپلود را در Arduino IDE فشار دهید. بعد از آن برنامه ارسال میشود. سپس دکمه POWER را بهصورت لحظهای فشار دهید تا برنامه بر روی ESP-03 اجرا شود.
جهت راهاندازی نرمافزار موارد زیر را دنبال کنید:
- پس از راهاندازی، به روتر متصل شوید. SSID و پسورد آن در قسمت کد نمایش داده میشود.
- سپس، جهت برقراری ارتباط با کارگزار(server) اقدام کنید. آدرس IP آن در قسمت کد مشخص است.
- جهت دریافت اشتراک از شبکه منتظر بمانید و برای انتشار تاپیکها به سراغ سریال پورت بروید.
ارتباطات با دستگاههای عمومی از طریق پورت سریال انجام میگیرد که بر اساس یک پروتکل مبتنی بر متن ترکیبی است که در زیر میبینید. (برای هر دو Rx و Tx) :
1 | :[Command];[Parameter1];[Parameter2]CRLF |
که منظور از هرکدام اینچنین است:
Command : دستورها، پیامهای استاتوس
Parameter1
Parameter2 : یک یا دو پارامتر داریم. (بسته به قسمت Command)
CRFL : کاراکترهای اسکی 13و 10 که در پایان خط نشان داده میشوند.
دستورهایی که از دستگاه عمومی به آداپتور IOT ارسال میشوند به این صورت هستند:
1 | :publish;topic;payload |
انتشار یک تاپیک با یک مقدار ارزشگذاری مشخص
مثال:
اگر ترموستات دمای اتاق را منتشر کند، کد زیر را ارسال خواهد کرد:
1 | :publish;Floor3/Room2/Temperature;22.3 |
مشترک شدن در یک تاپیک.
1 | :subscribe;topic |
مثال:
یک سیستم تهویه متبوع، به یک سرویس خاموش-روشن مشترک شده است:
1 | :subscribe;Floor3/Room2/AirConditioner |
در نتیجهدستورات برگشتی دریافت خواهد شد که در زیر مشاهده میکنید.
دستورات از آداپتور IOT به دستگاههای عمومی به شکل زیر ارسال میشود:
1 | :callback;topic;payload |
یک تاپیک با ارزش مشخص دریافت شده است. البته تنها تاپیکهایی که از قبل دستگاه با آنها مشترک شده، قابل دریافت هستند.
مثال :
اگر دستگاه تهویه هوایی که قبلاً ذکر شد باید خاموش شود دستور زیر را دریافت خواهد کرد:
1 | :callback;Floor3/Room2/AirConditioner;OFF |
پیام های وضعیت:
آداپتور IOT، اطلاعاتی که در مورد پیشامدهای موجود هستند را به دستگاههای عمومی ارسال میکند. این پیامها، خارج از پروتکل MQTT هستند اما فرمت یکسانی دارند. پیامها عبارتند از:
START شروع برنامه ESP-03 بهصورت بوت
WIFI-ON روشن کردن وای فای و برقرار شدن ارتباط با روتر.
MQTT-ON روشن شدن MQTT و برقرار شدن ارتباط با کارگزار.
MQTT-ERR خطا در برقراری ارتباط با کارگزار. پس از گذشت 5 ثانیه مجدد تلاش کنید.
Error فرمان ناشناخته دریافت شده است.
Ping60 هر 60 ثانیه ارسال میشود، بهعنوان ناظر.
بازبینی:
بهمنظور بررسی عملکرد صحیح آداپتور IOT، آن را از طریق کانال سریال به کامپیوتر متصل کنید. مانند آنچه بر روی Arduino IDE دیده بودید، یک سریال کنسول بر روی کامپیوترتان آغاز بهکار میکند. ماژول آداپتور IOT را بدون فشار دادن دکمه PROGRAM راهاندازی کنید. برنامه شروع به کار خواهد کرد و اگر همهچیز بهدرستی کار کند، کنسول پیغام زیر را به نمایش میگذارد:
1 | :status;Start :status;WiFi_ON :status;MQTT_ON |
جهت بررسی اینکه آیا ماژول دستورات را به درستی دریافت میکند یا خیر میتوانیم از یک دستور نامعتبر استفاده کنیم:
1 | :aaa |
در این صورت ماژول باید پیغام زیر را نمایش دهد:
1 | :status;<span class="hljs-built_in">Error</span> |
حال ما میتوانیم کاربری مشترکمان با رزبری پای را آغاز کنیم:
1 | $ mosquitto_sub -d -t test |
اگر ما در کنسول IDE کد دستوری زیر را تایپ کنیم:
1 | :publish;test;Hello |
در کنسول رزبری پای باید تأییدیه رسیدن پیغام فوق، نمایش داده شود.
همچنین، اگر ما در کنسول IDE کد دستوری زیر را تایپ کنیم:
1 | :subscribe;mytopic |
و در کنسول رزبری پای کد زیر را تایپ کنیم:
1 | $ mosquitto_pub -d -t mytopic -m mymessage |
در کنسول IDE باید کد زیر به نمایش گذاشته شود:
1 | :callback;mytopic;mymessage |
ارتقاء:
یکی از امکانها برای بهبود توانایی، اضافه کردن دستورهای جدید جهت نمایان ساختن روتر ، SSID و پسورد و یا آدرس IP کارگزار است که بهجای کدهای ثابت میتوانند مورداستفاده قرار بگیرند.
این پروژه جهت کمک به دیگر مدارها و تبدیل آنها به یک عضو از اینترنت اشیاء (IOT) در نظر گرفته شده است. اما ESP-03 این قابلیت را دارد تا اگر پینهای (L/O) محدود آن برای یک برنامه خاص کافی باشند، خود بهعنوان یک ماژول مستقل عمل کند. در غیر این صورت ما به یک ماژول مشابه با تعداد پین بیشتر، مانند ESP-12 نیاز خواهیم داشت.
برنامهها:
حال، ما امکانات بیشماری داریم. استفاده از یک پروتکل استاندارد به ما این اجازه را خواهد داد تا دستگاههای متفاوت با برنامههای متفاوت و در مکانهای متفاوت را به یکدیگر متصل کنیم.
بهعنوان مثال، برنامههایی با سیستمعامل اندروید موجود هستند که به ما اجازه میدهند تا تاپیکهایی را منتشر کنیم یا با آنها مشترک شویم. و همانطور که ما به یک شبکه با اینترنت متصل میشویم، باکمی دستکاری سیستم روتر میتوانیم به دستگاههای اینترنت اشیاء، از هرجایی در جهان دسترسی داشته باشیم.
دانلود MQTT.INO
ترجمه: سیسوگ
سلام. میخوام روی هاست بروکر نصب کنم. راهنمایی کنید لطفا
سلام
شما باید vpsداشته باشید برای این کار
تشکر
تشکر برای من مناسب بود
سلام این لینک را بینید دقیق همین مقاله
بله دبدم متاسفانه بدون دادن هیج لینکی به منبع سیسوگ اون را نشر دادند
سلام
ممنونم واسه این همه مطالب مفیدتون. واقعا عالیه
من در رابطه با این مطلب چند تا سوال داشتم:
1 – اگه این پروتکل روی سرور نصب بشه تا به صورت آنلاین ارتباط برقرار بشه، ما فقط باید ادرس اون سرور رو بزاریم داخل برنامه یا نیاز به تغییرات دیگه ای هم داره؟
2 – سرور میتونه هروقت اطلاعاتی واسه ارسال داشت به میکرو بفرسته یا میکرو باید درخواستی واسه دریافت اطلاعات ارسال کنه؟
من تازه میخوام IOT یاد بگیرم و خیلی از اصلاحات واسم غریبه و دقیق متوجه نشدم
سلام
مقالات زیر رو مطالعه بفرمایید احتمالا جواب سوالاتتون رو پیدا میکنید
چطور به شبکه اینترنت اشیاء وصل شویم ؟
پروتکل MQTT چگونه کار میکند؟
coap چیست؟
سلام وقتتون بخیر، من یک پروژهدارم که باید با آردوینو و ماژول اینترنت و پروتکل mqtt یک لامپی رو از هر جایی روشن و خاموش کنم، برای قسمت mqtt نمیدونم چه کاری باید بکنم، شما می تونید کمک کنید؟
سلام دوست عزیز
خوب این کاری که میخواید انجام بدید کار پیچیده ای نیست ؛ اول لازمه این کار اینه که mqtt رو بشناسید و بتونید باهاش کار کنید ، قبلا در سایت سیسوگ پروتکل mqtt رو معرفی کردیم که میتونید اونو توی مقاله “پروتکل MQTT چگونه کار میکند؟”
مطالعه کنید
اگر سوالی بود حتما مطرح کنید.
با سلام
ممنون از ارائه مطالب خوبتون
توی اکثر جاهای این مطلب به جای IoT نوشتین LoT !
سلام دوست عزیز.
خیلی ممنون از تذکرتون.
متن اصلاح شد.
موفق باشید.
یک جاهایی نوشته توی باکس هایی که مربوط به کد هست به هم ریخته
لطفا اصلاح کنین
تشکر از مطالبتون
خواهش میکنم دوست عزیز
مطلب رو اصلاح کردیم