پس از سال ۲۰۰۰ که با فراگیر شدن اینترنت جهانی و مفهوم دهکده جهانی واژه اینترنت چیزها نیز مطرح شد که هدفش ایجاد یک سیستم یک پارچه با قابلیت کنترل از طریق شبکه بود.اما چالشهای اصلی این ایده شامل امنیت و پیچیدگی سطوح اجرای و بستر نامناسب (اینترنت بستر قابل اطمینانی از نظر اتصال پایدار نیست) و همچنین نبود یک سخت افزار قدرتمند و ارزان با ارتباطی دو طرفه و پایدار با مصرف انرژی پایین که از اهداف اصلی IOT است , مانع رسیدن به اهداف کامل این ایده شده است.در اینترنت اشیاء علاوه بر نگرانی های موجود در رابطه با حفظ حریم خصوصی , اینترنت اشیا از تکه تکه شدن پلت فرم و نداشتن استانداردهای فنی رنج می برد . یک وضعیت که در آن انواع دستگاههای اینترنت اشیا، از نظر هر دو تغییرات سخت افزاری و تفاوت در نرم افزار در حال اجرا بر روی آنها، باعث می شود کار توسعه برنامه های کاربردی که به طور مداوم بین اکوسیستم های مختلف فن آوری ناسازگار سخت شود.
اینترنت چیزها:
اینترنت چیزها یا چیزنت (به انگلیسی: Internet of Things) (مخفف انگلیسی: IoT) که گاهی در زبان انگلیسی اینترنت اشیا هم برای این کلمه استفاده میشود، به طور کلی اشاره دارد به بسیاری از چیزها شامل اشیا و وسایل محیط پیرامونمان که به شبکه اینترنت متصل شده و بتوان توسط اپلیکیشنهای موجود در تلفنهای هوشمند و تبلت کنترل و مدیریت شوند. اینترنت چیزها به زبان ساده، ارتباط سنسورها و دستگاهها با شبکهای است که از طریق آن میتوانند با یکدیگر و با کاربرانشان تعامل کنند. این مفهوم میتواند بهسادگی ارتباط یک گوشی هوشمند با تلویزیون باشد و یا به پیچیدگی نظارت بر زیرساختهای شهری و ترافیک. از ماشین لباسشویی و یخچال گرفته تا پوشاکمان؛ این شبکه بسیاری از دستگاههای اطراف ما را در برمیگیرد.
پروتکل MQTT:
معماری ساختار MQTT شامل یک سرور مرکزی یا واسطه است که به شکل توپولوژی ستارهای با یک یا چند دستگاه ارتباط برقرار میکند. پایه ارتباطات بر اساس پیامها و تاپیکهایی است که به یک گره (دستگاه) ارسال میشود. دراینبین دیگر گرهها (دستگاهها) نیز میتوانند با اشتراکگذاری آن پیام را دریافت کنند. سرور مرکزی مسئول مدیریت شبکه و انتقال پیامها است. ارتباطات میتواند یک به یک یا گروهی باشد. هدف از این پروژه ساخت یک آداپتور IOT است که به همهی دستگاههای عمومی بدون احتیاج به wifi اجازه میدهد تا بهعنوان یک گره IOT شناخته شوند. تنها شرط موردنیاز دارا بودن یک پورت سریال است.
جهت پیادهسازی یک سیستم با حداقل جزئیات، ما باید در مورد چگونگی کار یک سرور مرکزی (کارگزار) نیز بدانیم. گرهها بر پایهی یک ماژول ESP-12E و سرور مرکزی بر روی یک ماژول رزبری پای اجرا میشود. در تصویر شماره یک، میتوانید بلوک مربوط به دیاگرام سیستم را مشاهده کنید. یک دفتر کار را تصور کنید؛ شما به چندین دستگاه با یک واحد مرکزی نیاز دارید. دستگاههایی مانند ترموستات، آلارم یا دستگاههای مختلفی که باهم مرتبطاند ( مانند یک لامپ با سوئیچ قطع و وصل). ما به یک پروتکل ارتباطی نیاز داریم که بین همهی این دستگاهها مشترک باشد.
در میان پروتکلهای موجود، MQTT به دلایل زیر انتخاب شده است:
- متنباز بودن
- سازگاری با تمام دستگاهها (اندروید، لینوکس)
- پیادهسازی سادهی سیستم
این پروتکل مبتنی بر مبانی زیر است:
- هر دستگاهی میتواند دادهها را فراخوانی و منتشر کند.
- هر دستگاهی میتواند یک تاپیک را برای دیگر دستگاهها منتشر کند.
- دادههای منتشرشده توسط یک سرور مرکزی که کارگزار نامیده میشود مدیریت میشوند. درواقع کارگزار مسئول توزیع و دریافت دادههاست.
- دادهها و سلسله مراتب آن توسط علامت “/” از یکدیگر جدا میشوند.
بهعنوان مثال، یک سنسور دما که در یک اتاق جلسه قرار دارد، دادههای زیر را منتشر میکند:
“Floor3/Room2/Temperature”
بهاینترتیب دستگاه تهویه هوایی که در اتاق نصب شده است با آگاه شدن از وضعیت دمای اتاق، قادر به تنظیم کردن دمای اتاق خواهد بود و دمای اتاق به خوبی مدیریت میشود. دیگر دستگاهها نیز میتوانند این مورد را مشاهده و تأیید کنند یا حتی جهت نظارت بر دمای تمام اتاقها، آن را با تاپیک “+/+/Temperature” به اشتراک بگذارند. در ادامه مثال، دستگاه تهویه هوا نیز تاپیک “Floor3/Room2/AirConditioner” را به اشتراک میگذارد. این تاپیک میتواند دو مقدار (ON/OFF) را بگیرد. اگر این تاپیک بهصورت “Floor3/Room2/AirConditioner = ON”منتشر شود، دستگاه روشن میشود. هم دفتر تعمیر و نگهداری و هم اتاق کنترل از راه دور قادر هستند تا این تاپیک را منتشر کنند که البته جای نگرانی نیست و MQTT میتواند این موارد را نیز مدیریت کند.
کارگزار:
این قسمت از سیستم باید همواره از تاپیکهایی که دستگاهها منتشر میکنند مطلع باشد و آن را بین همهی دستگاههایی که مرتبط با تاپیک فوق هستند، توزیع کند.
در بین تمامی کارگزارهای در دسترس، ما کارگزار 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
استفاده از پروتکل MQTT برای اینترنت چیزها (IOT):
یکی از موارد مهم این است که آداپتوری که استفاده میکنیم باید به یک اینترنت بیسیم متصل بوده و از لحاظ موقعیت، در دسترس تمامی گرهها باشد.
بهعنوان هسته اصلی آداپتور IOT، به دلایلی که در پایین ذکرشده، ما یک دستگاه ESP-12E را بر پایه یک تراشه ESP8266 انتخاب کردیم:
- اندازهی کوچک
- هزینه بسیار پایین
- امکانات وای فای
- رابط سریال
- وابسته بودن به یک خانواده بزرگ (که درنتیجه دستگاه بهراحتی قابل تعویض است.)
- برنامهنویسی ساده به کمک Arduino IDE
سختافزار:
اشکال مهم ESP-12E این است که اتصالات آن از نوع 2.54 نیست. که مانع از اتصال به یک PCB با یک اتصال استاندارد میشود. راهحل اجراشده در تصویر دو قابلمشاهده است. ما یک سیم به هرکدام از پینها لحیم کردیم که خم شدن آنها باعث میشود تا با یک هدر 2.54 مواجه شوند. (حداکثر دقت باید اعمال شود. زیرا تلاش برای استفاده از حداقل لحیمکاری ممکن است موجب به وجود آمدن اتصالات کوتاه شود که غیرقابلبازگشت است.)
ESP-03 میتواند بهصورت متصل یا غیر متصل برنامهریزی شود. البته افزایش حجم، در صورت اتصال حداقل مقدار، ممکن است. همچنین جایگاه عمودی ESP-12E کمک میکند تا سطح مورداستفاده PCB کاهش یابد.
پینها باید به مقدار حداقل ممکن برای اپلیکیشنها مورداستفاده قرار گیرند. در تصویر سه، پینهای خروجی اصلی ESP-12E و آرایش نهایی آداپتور LOT را میتوانید ببینید. ایضاً میبینید که 12 پین هدر مورداستفاده قرار گرفته است.
برای برنامهریزی آداپتور ما به یک فلش USB بهعنوان مبدل سریال نیاز داریم. با در نظر گرفتن اینکه ESP-12E از جریان برق 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 بهعنوان مترجم زبان برنامهنویسی استفاده کنید. ما درنهایت این راه را انتخاب کردیم.
فرایندهای زیر را دنبال کنید:
- نصب نرم افزار Arduino IDE:
از طریق لینک ” https://www.arduino.cc/en/Main/Software” میتوانید آخرین نسخه نرمافزار را یافته و نصب کنید.
- راهاندازی 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 و پسورد آن در قسمت کد نمایش داده میشود.
- سپس، جهت برقراری ارتباط با کارگزار اقدام کنید. آدرس IP آن در قسمت کد مشخص است.
- جهت دریافت اشتراک از شبکه منتظر بمانید و برای انتشار تاپیکها به سراغ سریال پورت بروید.
ارتباطات با دستگاههای عمومی از طریق پورت سریال انجام میگیرد که بر اساس یک پروتکل مبتنی بر متن ترکیبی است که در زیر میبینید. (برای هر دو Rx و Tx) :
:[Command];[Parameter1];[Parameter2]CRLF
که منظور از هرکدام اینچنین است:
- Command : دستورها، پیامهای استاتوس
- Parameter1
- Parameter2 : یک یا دو پارامتر داریم. (بسته به قسمت Command)
- CRFL : کاراکترهای اسکی 13و 10 که در پایان خط نشان داده میشوند.
دستورهایی که از دستگاه عمومی به آداپتور LOT ارسال میشوند به این صورت هستند:
:publish;topic;payload
انتشار یک تاپیک با یک مقدار ارزشگذاری مشخص
مثال:
اگر ترموستات دمای اتاق را منتشر کند، کد زیر را ارسال خواهد کرد:
:publish;Floor3/Room2/Temperature;22.3
:subscribe;topic
مشترک شدن در یک تاپیک.
مثال:
یک سیستم تهویه متبوع، به یک سرویس خاموش-روشن مشترک شده است:
:subscribe;Floor3/Room2/AirConditioner
در نتیجه دستورات برگشتی دریافت خواهد شد که در زیر مشاهده میکنید.
دستورات از آداپتور LOT به دستگاههای عمومی به شکل زیر ارسال میشود:
:callback;topic;payload
یک تاپیک با ارزش مشخص دریافت شده است. البته تنها تاپیکهایی که از قبل دستگاه با آنها مشترک شده، قابل دریافت هستند.
مثال :
اگر دستگاه تهویه هوایی که قبلاً ذکر شد باید خاموش شود دستور زیر را دریافت خواهد کرد:
:callback;Floor3/Room2/AirConditioner;OFF
پیام های وضعیت:
آداپتورIOT، اطلاعاتی که در مورد پیشامدهای موجود هستند را به دستگاههای عمومی ارسال میکند. این پیامها، خارج از پروتکل MQTT هستند اما فرمت یکسانی دارند. پیامها عبارتند از:
- START شروع برنامه ESP-12E بهصورت بوت
- WIFI–ON روشن کردن وای فای و برقرار شدن ارتباط با روتر.
- MQTT-ON روشن شدن MQTT و برقرار شدن ارتباط با کارگزار.
- MQTT-ERR خطا در برقراری ارتباط با کارگزار. پس از گذشت 5 ثانیه مجدد تلاش کنید.
- Error فرمان ناشناخته دریافت شده است.
- Ping60 هر 60 ثانیه ارسال میشود، بهعنوان ناظر.
بازبینی:
بهمنظور بررسی عملکرد صحیح آداپتور IOT، آن را از طریق کانال سریال به کامپیوتر متصل کنید. مانند آنچه بر روی Arduino IDE دیده بودید، یک سریال کنسول بر روی کامپیوترتان آغاز بهکار میکند. ماژول آداپتور IOT را بدون فشار دادن دکمه PROGRAM راهاندازی کنید. برنامه شروع به کار خواهد کرد و اگر همهچیز بهدرستی کار کند، کنسول پیغام زیر را به نمایش میگذارد:
:status;Start :status;WiFi_ON :status;MQTT_ON
جهت بررسی اینکه آیا ماژول دستورات را به درستی دریافت میکند یا خیر میتوانیم از یک دستور نامعتبر استفاده کنیم:
در این صورت ماژول باید پیغام زیر را نمایش دهد:
حال ما میتوانیم کاربری مشترکمان با رزبری پای را آغاز کنیم:
$ mosquitto_sub -d -t test
اگر ما در کنسول IDE کد دستوری زیر را تایپ کنیم:
:publish;test;Hello
در کنسول رزبری پای باید تأییدیه رسیدن پیغام فوق، نمایش داده شود.
همچنین، اگر ما در کنسول IDE کد دستوری زیر را تایپ کنیم:
:subscribe;mytopic
و در کنسول رزبری پای کد زیر را تایپ کنیم:
در کنسول IDE باید کد زیر به نمایش گذاشته شود:
ارتقاء:
یکی از امکانها برای بهبود توانایی، اضافه کردن دستورهای جدید جهت نمایان ساختن روتر ، SSID و پسورد و یا آدرس IP کارگزار است که بهجای کدهای ثابت میتوانند مورداستفاده قرار بگیرند.این پروژه جهت کمک به دیگر مدارها و تبدیل آنها به یک عضو از اینترنت اشیاء (LOT) در نظر گرفته شده است. اما ESP-03 این قابلیت را دارد تا اگر پینهای (L/O) محدود آن برای یک برنامه خاص کافی باشند، خود بهعنوان یک ماژول مستقل عمل کند. در غیر این صورت ما به یک ماژول مشابه با تعداد پین بیشتر، مانند ESP-12 نیاز خواهیم داشت.
برنامهها:
حال، ما امکانات بیشماری داریم. استفاده از یک پروتکل استاندارد به ما این اجازه را خواهد داد تا دستگاههای متفاوت با برنامههای متفاوت و در مکانهای متفاوت را به یکدیگر متصل کنیم.بهعنوان مثال، برنامههایی با سیستمعامل اندروید موجود هستند که به ما اجازه میدهند تا تاپیکهایی را منتشر کنیم یا با آنها مشترک شویم. و همانطور که ما به یک شبکه با اینترنت متصل میشویم، باکمی دستکاری سیستم روتر میتوانیم به دستگاههای اینترنت اشیاء، از هرجایی در جهان دسترسی داشته باشیم.