این روزها دنیای مهندسی از جایگاه زبان سی در حال انتقال به جایگاه زبان پایتون است! اگر روزهایی بود که برای پیاده سازی یک راهکار خاص، مهندسها باید درگیر جزییات پیاده سازی میشدند. امروز با گسترش ابزارها و طراحی ماژولار، تمرکز اصلی را بر روی توسعهی خود راهکار میگذارند. شبیه زبان پایتون که کافی است چند کتابخانه را import کنید و تمام! با خواندن این پست از مهندسین دوران پایتونی اینترنت اشیا شوید.
پروتکل MQTT یک پروتکل سبک و کارآمد برای ارتباط بین چندین دیوایس است. این پروتکل در دستهی M2M که اختصار Machine to Machine است، قرار میگیرد. MQTT به دلیل فضای کمی که برای پیاده سازی نیاز دارد، به راحتی در سیستمهای Embedded قابل پیاده سازی است و به همین دلیل گزینهی مناسبی جهت راهکارهای اینترنت اشیاست. در این پست چگونگی راهاندازی یک پروژه ساده مبتنی بر پروتکل MQTT و ابزارهای رایگان نشان داده خواهد شد. برای اطلاعات بیشتر در مورد جزییات این پروتکل میتوانید از سرنخهایی که در انتهای این پست داده شده است، استفاده کنید.
اول؛ کمی بدانیم
پروتکل MQTT از مدل Publish/Subscribe برای ارتباط بین نودها استفاده میکند. در این روش هر نود میتواند منتشر کنندهی داده (Publisher) برای یک موضوع خاص باشد. این موضوع در پروتکل MQTT تاپیک نامیده میشود. به عنوان مثال دیوایسی که دمای محیط را اندازهگیری میکند، میتواند در هر زمان دلخواه، دمای اندازهگیری شده را به سوی سرور MQTT منتشر نماید. این داده میتواند یک عدد اعشاری باشد. این انتشار بر روی یک تاپیک که آن هم نام دلخواهی دارد، برای نمونه tempMohit، صورت میگیرد. حالا هر دیوایسی که علاقه مند به دانستن این دما میباشد، به عنوان Subscriber به سرور MQTT اعلام میکند که من علاقه مند به دریافت دادههای تاپیک tempMohit هستم. سرور هم دادههای دریافتی از Publisher یک تاپیک را به Subscriber های آن تاپیک میرساند. بدین ترتیب در بستر MQTT عدهای منتشر کنندهی داده و عدهای علاقه مند به دریافت این داده ها میشوند و همه چیز به همین سادگی جلو میرود.
معمولا از اصطلاح Broker برای سرور MQTT استفاده میکنند. در شکل زیر نمایی از معماری مبتنی بر پروتکل MQTT را مشاهده میکنید.

حالا پس از شناخت پروتکل، نوبت به قسمت جذاب و دوستداشتنی اجرای پروژه میرسد.
دوم؛ سرورم کجا بود؟
برای شروع و تست، استفاده از گزینههای رایگان گزینههای جذابتری هستند. یکی از سرورهای رایگان MQTT که در دسترس عموم قرار دارد، در آدرس http://www.mqtt-dashboard.com قابل دسترس است. البته آدرس مربوط به خود سرور، broker.hivemq.com بر روی پورت 1883 است. برای استفاده از سرور جز دانستن این دو مورد، به کار دیگری نیاز نداریم. در آدرس وب این سرور میتوانید گزارش استفادهی جاری تمام کاربران دنیا از این سرور را مشاهده کنید.
سوم؛ انتشار اطلاعات
در این مرحله نیاز به یک نود داوطلب داریم که اطلاعاتی از خودش را منتشر کند. خوشبختانه NodeMCU این وظیفهی خطیر را به دوش میکشد. (اگر اطلاعات کافی از NodeMCU ندارید ابتدا در سه سوت به وای فای متصل شویم را بخوانید). پس از آنکه محیط آردوینو برای NodeMCU را باز کردید، به منوی Sketch/includeLibrary/Manage Libraries بروید. در پنجرهی باز شده، عبارت PubSubClient را جستجو کنید و اطمینان حاصل کنید که کتابخانهای با همین نام بر روی سیستم نصب شده باشد.
حالا نوبت به کد نویسی میرسد. از کد زیر برای NodeMCU استفاده کنید. با این کد، NodeMCU به سرور hiveMQ که معرفی شد متصل میشود و هر دو ثانیه عبارت hello world #number را به عنوان دادهی خودش و بر روی یک تاپیک مشخص ارسال میکند. همچنین بر روی یک تاپیک دیگر خودش را به عنوان علاقه مند دریافت داده ثبت میکند و چنانچه دادهی "1" را دریافت کند، LED تعبیه شده بر روی NodeMCU روشن و با دریافت "0" آن را خاموش میکند.
حتما توجه داشته باشید که برای اجرای کد لازم است تا خطوط ۲۲ الی ۲۷ را مطابق تنظیمات دلخواه خودتان تغییر دهید. نام شبکهی wifi خودتان را جایگزین عبارت ssid و پسورد شبکه را جایگزین عبارت password نمایید. همچنین مقادیر ؟؟؟؟ مربوط به نام تاپیکها را یا کل نام تاپیک را با یک عبارت دلخواه خودتان جایگرین نمایید. به عنوان مثال من از نامهای nooby/inTopic و nooby/outTopic استفاده کردم. در صورت عدم تغییر این موارد ممکن است با مشکلاتی در اجرا روبرو شوید. یک نام دلخواه هم جایگرین عبارت name نمایید.
کد را بر روی NodeMCU اجرا کنید و پس از اطمینان از درستی عملکرد و اتصال به سرور، به مرحلهی بعد بروید. (از طریق یک کنسول، لاگهای ایجاد شده توسط NodeMCU را مشاهده نمایید)
چهارم؛ علاقهمندی به اطلاعات
برای دریافت دادههایی که NodeMCU از طریق MQTT منتشر مینماید، روشهای زیادی وجود دارد. ترجیح میدهم این دادهها را بر روی گوشی اندرویدی و از طریق یک برنامهی رایگان دریافت نمایم. نسخهی رایگان برنامهی IoT MQTT Dashboard را از گوگل پلی دریافت نمایید و بر روی گوشی نصب کنید.
زمانی که برنامه را باز میکنید، در صفحهی اصلی هر یک از سرورهایی که قبلا به آنها متصل شدهاید را لیست میکند. قاعدتا چون برای اولین بار وارد شدهاید لیستی هم وجود ندارد؛ پس دکمهی + را بزنید تا اولین سرور را تنظیم نمایید. یک نام برای این دیوایس (به عنوان نمونه من از nooby_client استفاده کردم) انتخاب کنید و آدرس سرور که broker.hivemq.com و پورت 1883 را وارد نمایید و دکمهی CREATE را بفشارید. اگر همه چیز درست باشد، به قسمت بعد منتقل میشوید و عبارت Connected را در بالای صفحه خواهید دید.
حالا باید علاقه مندی خودتان به دریافت اطلاعات منتشر شده از سوی NodeMCU را به اطلاع سرور برسانید. در تب SUBSCRIBE، بر روی دکمهی + کلیک کنید. در فرم باز شده نام یک نام دلخواه برای نمایشگر داده وارد کنید. همچنین نام تاپیکی که NodeMCU اطلاعاتش را بر روی آن منتشر میکند، در فیلد Topic وارد نمایید. در این قسمت باید از همان عبارتی استفاده نمایید که جایگزین "outTopic/????" نمودید. من از عبارت nooby/outTopic استفاده کردم.دکمهی CREATE را بفشارید و اگر همه چیز درست پیش رفته باشد، دادههای ارسالی از سوی NodeMCU را هر دو ثانیه بر روی صفحهی گوشی مشاهده خواهید کرد.
اگر به یاد بیاورید، در کد مربوط به NodeMCU قسمتی بود که NodeMCU به سرور اعلام میکرد بر روی یک تاپیک خاص علاقه مند به دریافت داده نیز میباشد. در تابع callback، چنانچه دادهی دریافتی بر روی این تاپیک عبارت "1" باشد، LED مربوط به NodeMCU روشن خواهد شد و اگر "0" باشد، خاموش میشود. در برنامه IoT MQTT Dashboard این امکان را دارید که یک Button تعریف نمایید و قطع و وصل این دکمه را متناظر ارسال داده بر روی یک تاپیک تعریف نمایید. از این قابلیت استفاده خواهیم کرد تا بتوانیم از راه دور LED موجود بر روی NodeMCU را خاموش و روشن نماییم.
به تب PUBLISH بروید و پس از فشار +، گزینهی Switch را انتخاب نمایید و مقادیر را مشابه تصویر تکمیل نمایید. توجه کنید که Topic را برابر با آنچه در کد NodeMCU جایگزین "inTopic/????" نمودید، قرار دهید.
تبریک! پروژهی اینترنت اشیا شما آماده است.
برای آنها که میخواهد بیشتر بدانند
اگر علاقه مند هستید که در مورد MQTT و استفاده از آن بیشتر بدانید، لینکهای زیر سرنخهای خوبی برای شروع این دانستن است:
https://www.baldengineer.com/mqtt-tutorial.html
https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt
این هم ویدیوی اجرای کد بر رو NodeMCU و خاموش و روشن کردن LED از طریق برنامهی اندروید: