اینرنت اشیا با رزبری پای و ESP8266 (نصب MQTT)
MQTT یک پروتکل ماشین به ماشین (M2M) برای اتصالات اینترنت اشیاء (IOT) است که به کمک سنسور، ارتباط برقرار میکند.
معماری ساختار MQTT شامل یک سرور مرکزی یا واسطه است که به شکل توپولوژی ستارهای با یک یا چند دستگاه ارتباط برقرار میکند. پایه ارتباطات بر اساس پیامها و تاپیکهایی است که به یک گره (دستگاه) ارسال میشود. دراینبین دیگر گرهها (دستگاهها) نیز میتوانند با اشتراکگذاری آن پیام را دریافت کنند. سرور مرکزی مسئول مدیریت شبکه و انتقال پیامها است. ارتباطات میتواند یک به یک یا گروهی باشد.
هدف از این پروژه ساخت یک آداپتور IOT است که به همهی دستگاههای عمومی بدون احتیاج به wifi اجازه میدهد تا بهعنوان یک گره IOT شناخته شوند. تنها شرط موردنیاز دارا بودن یک پورت سریال است.
جهت پیادهسازی یک سیستم با حداقل جزئیات، ما باید در مورد چگونگی کار یک سرور مرکزی نیز بدانیم. گرهها بر پایهی یک ماژول ESP-03 و سرور مرکزی بر روی یک ماژول رزبری پای اجرا میشود. در تصویر ، میتوانید بلوک مربوط به دیاگرام سیستم را مشاهده کنید.
پروتکل MQTT:
یک دفتر کار را تصور کنید؛ شما به چندین دستگاه با یک واحد مرکزی نیاز دارید. دستگاههایی مانند ترموستات، آلارم یا دستگاههای مختلفی که باهم مرتبطاند ( مانند یک لامپ با سوئیچ قطع و وصل). ما به یک پروتکل ارتباطی نیاز داریم که بین همهی این دستگاهها مشترک باشد.
در میان پروتکلهای موجود، MQTT به دلایل زیر انتخاب شده است:
- متنباز بودن
- سازگاری با تمام دستگاهها (اندروید، لینوکس)
- پیادهسازی سادهی سیستم
این پروتکل مبتنی بر مبانی زیر است:
- هر دستگاهی میتواند دادهها را فراخوانی و منتشر کند.
- هر دستگاهی میتواند یک تاپیک را برای دیگر دستگاهها منتشر کند.
- دادههای منتشرشده توسط یک سرور مرکزی که کارگزار نامیده میشود مدیریت میشوند. درواقع کارگزار مسئول توزیع و دریافت دادههاست.
- دادهها و سلسلهمراتب آن توسط علامت “/” از یکدیگر جدا میشوند.
بهعنوان مثال، یک سنسور دما که در یک اتاق جلسه قرار دارد، دادههای زیر را منتشر میکند:
Floor3/Room2/Temperature
بهاینترتیب دستگاه تهویه هوایی که در اتاق نصب شده است با آگاه شدن از وضعیت دمای اتاق، قادر به تنظیم کردن دمای اتاق خواهد بود و دمای اتاق به خوبی مدیریت میشود. دیگر دستگاهها نیز میتوانند این مورد را مشاهده و تأیید کنند یا حتی جهت نظارت بر دمای تمام اتاقها، آن را با تاپیک “+/+/Temperature” به اشتراک بگذارند.
در ادامه مثال، دستگاه تهویه هوا نیز تاپیک “Floor3/Room2/AirConditioner” را به اشتراک میگذارد. این تاپیک میتواند دو مقدار (ON/OFF) را بگیرد. اگر این تاپیک بهصورت “Floor3/Room2/AirConditioner = ON”منتشر شود، دستگاه روشن میشود. هم دفتر تعمیر و نگهداری و هم اتاق کنترل از راه دور قادر هستند تا این تاپیک را منتشر کنند که البته جای نگرانی نیست و MQTT میتواند این موارد را نیز مدیریت کند.
کارگزار (Server):
این قسمت از سیستم باید همواره از تاپیکهایی که دستگاهها منتشر میکنند مطلع باشد و آن را بین همهی دستگاههایی که مرتبط با تاپیک فوق هستند، توزیع کند. در بین تمامی کارگزارهای در دسترس، ما کارگزار Mosquitto را به دلایل زیر انتخاب کردیم:
- متنباز بودن
- نصب و مدیریت آسان
- موجود بودن برای رزبری پای، به این دلیل که باید بهصورت 24 ساعته در دسترس باشد. به نظر میرسد که استفاده از یک دستگاه باقدرت پایین انتخاب خوبی باشد.
اولین مرحله کار نصب Mosquitto بر روی رزبری پای است. کنسول برنامهنویسی خود را باز کنید و عبارت زیر را در آن تایپ کنید:
sudo apt-get install mosquitto mosquitto-clients python-mosquitto
در حال حاضر Mosquitto نصب شده و در حال اجرا است. همچنین پس از خاموش شدن و راهاندازی مجدد سیستم، بهصورت خودکار اجرا میشود. به منظور بررسی عملکرد مناسب آن، یک جفت برنامه کاربردی را نصب و آماده اجرا میکنیم: یک منتشر کننده و یک مشترک. ما این تاپیک را با موضوع “test” با تایپ سطر زیر پیادهسازی میکنیم:
mosquitto_sub -d -t test
برای دیگر قسمت برنامه، یک صفحهی جدید که مخصوص انتشار پیام است را در کنسول خود باز میکنیم:
mosquitto_pub -d -t test -m Hello
در پنجره اول میتوانیم ببینیم که پیغامی مبنی بر اینکه “مشترک، تاپیک فوق را دریافت کرده است” نمایش داده میشود:
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-xx که در این پروژه از آنها نام برده میشود، همه از یک کارخانه بوده و بهوسیله یک پروتکل دستوری مشخص باهم ترکیب شدهاند.
امکان دوم این است که آنها به یک مترجم زبان LUA مجهز شدهاند، که البته MQTT را نیز پشتیبانی میکنند و پس از چند آزمایش مشاهده شد که به خوبی کار میکند.
امکان سوم، استفاده از محیط برنامهنویسی آردوینیو (Arduino) بهطور گسترده است. جهت برنامهنویسی بهتر میتوانید از برنامه ++C بهعنوان مترجم زبان برنامهنویسی استفاده کنید. ما درنهایت این راه را انتخاب کردیم.
فرایندهای زیر را دنبال کنید:
- نصب نرم افزار Arduino IDE:
از طریق این لینک میتوانید آخرین نسخه نرمافزار را یافته و نصب کنید.
- راهاندازی IDE و پیدا کردن کامپایلر سازگار با ESP8266:
نرم افزار Arduino IDE را باز کنید. در قسمت منو این آدرس را دنبال کنید: File–Preferences سپس در باکس Additional Boards Manager URLs مقدار زیر را قرار دهید:
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) :
:[Command];[Parameter1];[Parameter2]CRLF
که منظور از هرکدام اینچنین است:
Command : دستورها، پیامهای استاتوس
Parameter1
Parameter2 : یک یا دو پارامتر داریم. (بسته به قسمت Command)
CRFL : کاراکترهای اسکی 13و 10 که در پایان خط نشان داده میشوند.
دستورهایی که از دستگاه عمومی به آداپتور IOT ارسال میشوند به این صورت هستند:
:publish;topic;payload
انتشار یک تاپیک با یک مقدار ارزشگذاری مشخص مثال: اگر ترموستات دمای اتاق را منتشر کند، کد زیر را ارسال خواهد کرد:
:publish;Floor3/Room2/Temperature;22.3
مشترک شدن در یک تاپیک.
:subscribe;topic
مثال: یک سیستم تهویه مطبوع، به یک سرویس خاموش-روشن مشترک شده است:
:subscribe;Floor3/Room2/AirConditioner
در نتیجه دستورات برگشتی دریافت خواهد شد که در زیر مشاهده میکنید. دستورات از آداپتور IOT به دستگاههای عمومی به شکل زیر ارسال میشود:
:callback;topic;payload
یک تاپیک با ارزش مشخص دریافت شده است. البته تنها تاپیکهایی که از قبل دستگاه با آنها مشترک شده، قابل دریافت هستند.
مثال : اگر دستگاه تهویه هوایی که قبلاً ذکر شد باید خاموش شود دستور زیر را دریافت خواهد کرد:
: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 راهاندازی کنید. برنامه شروع به کار خواهد کرد و اگر همهچیز بهدرستی کار کند، کنسول پیغام زیر را به نمایش میگذارد:
:status;Start :status;WiFi_ON :status;MQTT_ON
جهت بررسی اینکه آیا ماژول دستورات را به درستی دریافت میکند یا خیر میتوانیم از یک دستور نامعتبر استفاده کنیم:
:aaa
در این صورت ماژول باید پیغام زیر را نمایش دهد:
:status;<span class="hljs-built_in">Error</span>
حال ما میتوانیم کاربری مشترکمان با رزبری پای را آغاز کنیم:
mosquitto_sub -d -t test
اگر ما در کنسول IDE کد دستوری زیر را تایپ کنیم:
:publish;test;Hello
در کنسول رزبری پای باید تأییدیه رسیدن پیغام فوق، نمایش داده شود. همچنین، اگر ما در کنسول IDE کد دستوری زیر را تایپ کنیم:
:subscribe;mytopic
و در کنسول رزبری پای کد زیر را تایپ کنیم:
:callback;mytopic;mymessage
ارتقاء:
یکی از امکانها برای بهبود توانایی، اضافه کردن دستورهای جدید جهت نمایان ساختن روتر ، SSID و پسورد و یا آدرس IP کارگزار است که بهجای کدهای ثابت میتوانند مورداستفاده قرار بگیرند.
این پروژه جهت کمک به دیگر مدارها و تبدیل آنها به یک عضو از اینترنت اشیاء (IOT) در نظر گرفته شده است. اما ESP-03 این قابلیت را دارد تا اگر پینهای (L/O) محدود آن برای یک برنامه خاص کافی باشند، خود بهعنوان یک ماژول مستقل عمل کند. در غیر این صورت ما به یک ماژول مشابه با تعداد پین بیشتر، مانند ESP-12 نیاز خواهیم داشت.
برنامهها:
حال، ما امکانات بیشماری داریم. استفاده از یک پروتکل استاندارد به ما این اجازه را خواهد داد تا دستگاههای متفاوت با برنامههای متفاوت و در مکانهای متفاوت را به یکدیگر متصل کنیم.
بهعنوان مثال، برنامههایی با سیستمعامل اندروید موجود هستند که به ما اجازه میدهند تا تاپیکهایی را منتشر کنیم یا با آنها مشترک شویم. و همانطور که ما به یک شبکه با اینترنت متصل میشویم، باکمی دستکاری سیستم روتر میتوانیم به دستگاههای اینترنت اشیاء، از هرجایی در جهان دسترسی داشته باشیم.
منبع ترجمه سیسوگ
سلام وقتتون بخیر من یک پروژه برای کنترلنور لامپ با استفاده ار برد آردوینو و ماژول اینترنت و mqtt دارم می خوام ببینم قسمت mqtt به چه صورتی هستش؟
خیلی جالب بود،فقط یه سوال برام پیش اومده،بروکر که وظیفش گرفتن و انتقال دیتا هست میتونه یه چیز ساده تر مثل اردوینو باشه؟
سلام.
من یه برد رزبری مدل +B دارم و ورژن پایتونش ۲.۷
پایه های GPIO برد، ولتاژ دیفالت دارن. بعضی ۲.۸ و خب یه سری ۰.۴۰ و چنتایی هم صفر ولت.
و بدتر از اون اینه که کد رو که اجرا می کنم هیچ تاثیری روی پین ها نمی ذاره.
لطفا راهنماییم کنید.