چند هفته گذشته بیشتر با Firebase بازی می کردم زیرا می خواستم با این فناوری آشنا شوم. بنابراین در برخی موارد فکر کردم که اتصال آردوینو به Firebase ایده خوبی خواهد بود. تصور کنید که یک سنسور دمای ساده دارید که دمای آب دیگ بخار را هر چند دقیقه اندازه گیری می کند و می خواهید یک گزارش تاریخچه آن را نگه دارید تا تنظیماتی در ترموستات انجام دهید. اگر میخواهید این اندازهگیریها بهصورت آنلاین در دسترس باشند تا بتوانید در هر زمان به آنها دسترسی داشته باشید، هر خوانش حسگر باید در جایی ذخیره شود.
یکی از راه های عالی که من نیز برای این نوع چیزها استفاده می کردم، Xively است. در ابتدا Pachube بود، سپس Cosm و اکنون Xively. امیدوارم بچه ها دیگه تصمیم نگیرن اسم رو عوض کنن! با مشتری Xively برای آردوینو، شما به سادگی به Api آنها متصل می شوید و خوانش ها را برای آنها ارسال می کنید. سریع، ساده است و آنها همچنین یک طرح رایگان دارند. اما چند چیز وجود دارد که ممکن است برای شما مفید نباشد. یکی از آنها محدودیت خواندنی است که می توانید ذخیره کنید، در حال حاضر در طرح رایگان می توانید تا 3 ماه سابقه داشته باشید.
چیز دیگر این است که شما نمی توانید داده ها را هر 1 ثانیه ارسال کنید، بنابراین ذخیره کردن قرائت های زمان واقعی غیرممکن است. و در آخر باید در نظر داشته باشید که داده های خود را در پایگاه داده ای ذخیره می کنید که کنترل آن را ندارید.
پس، چه چیز جایگزین هست؟ داشتن سرور پایگاه داده sql خود، نه تنها به دلیل هزینه، بلکه به دلایل تعمیر و نگهداری، کاری بیش از حد است. برای چنین پروژههای سادهای نیازی نیست هزینه زیادی کنید. بنابراین اینجا جایی است که Firebase می آید. بچه های Firebase به شما امکان می دهد به پایگاه داده firebase خود متصل شوید و تمام عملیات CRUD را از طریق تماس های ساده با api آنها انجام دهید. می توانید از وب سایت آنها بازدید کنید و آنها یک پایگاه داده 100 مگابایتی را رایگان به شما می دهند. که برای ذخیره حداقل یک سال خواندن کافی است. این همان چیزی بود که من فکر می کردم اما به سرعت با یک مشکل بزرگ روبرو شدم. Firebase به دلایل امنیتی فقط از HTTPS استفاده می کند و ریزپردازنده Arduino Uno من قدرت کافی برای آن را ندارد. در این لینک می توانید آنچه یکی از اعضای تیم firebase در مورد پشتیبانی ssl می گوید را بخوانید. ایده دور زدن این مشکل این است که درخواست ها را از طریق سروری که می تواند ssl صحبت کند، پروکسی کنید. برای رسیدن به این هدف از کتابخانه Firebase PHP استفاده کردم که در اینجا می توانید پیدا کنید . مانند این آردوینو-> وب سایت Php-> Firebase به آن فکر کنید. هنگامی که داده ها در Firebase هستند، آنها را به روش های مختلف بازیابی می کنید. بیایید شروع به ساخت پروژه خود کنیم و خواهید دید که چگونه همه قطعات به یکدیگر متصل می شوند.
ابتدا قسمت سخت افزاری در مورد من از سنسور دمای محبوب DS1820 استفاده کردم. با اتصال آن به آردوینو یونو، دمای اتاق را دریافت کردم. همچنین مجبور شدم از محافظ اترنت استفاده کنم. من یک W5100 یدکی داشتم، بنابراین یک پشته کوچک ساختم: Arduino Uno-Ethernet Sheild W5100-Prototyping Sheild. نمودار مدار این است:
و این هم مال من با تمام قطعات متصل:
گام بعدی این است که پایگاه داده firebase رایگان خود را در http://www.firebase.com ایجاد کنید . سپس وارد پایگاه داده شوید و به آخرین آیتم منو "Secrets" بروید. از آنجا رمز مخفی خود را دریافت خواهید کرد. آن را یادداشت کنید زیرا بعداً به آن نیاز خواهیم داشت. بنابراین اکنون سخت افزار و پایگاه داده را آماده کرده ایم. اگر در حال حاضر دامنه یا دامنه فرعی ندارید، یکی از رجیستار مورد علاقه خود را دریافت کنید و فایل کتابخانه php Firebase را در یکی از هزاران ارائه دهنده میزبانی که برنامه های رایگان ارائه می دهند میزبانی کنید. من شخصا یک اکانت ویندوز لاجوردی دارم، بنابراین فقط به آنجا رفتم و یک وب سایت جدید ایجاد کردم.
سپس با ftp من firebaseLib.php را آپلود کردم:
<?php /** * Firebase PHP Client Library * * @author Tamas Kalman <ktamas77@gmail.com> * @link https://www.firebase.com/docs/rest-api.html * */ /** * Firebase PHP Class * * @author Tamas Kalman <ktamas77@gmail.com> * @link https://www.firebase.com/docs/rest-api.html * */ class Firebase { private $_baseURI; private $_timeout; private $_token; /** * Constructor * * @param String $baseURI Base URI * * @return void */ function __construct($baseURI = '', $token = '') { if (!extension_loaded('curl')) { trigger_error('Extension CURL is not loaded.', E_USER_ERROR); } $this->setBaseURI($baseURI); $this->setTimeOut(10); $this->setToken($token); } /** * Sets Token * * @param String $token Token * * @return void */ public function setToken($token) { $this->_token = $token; } /** * Sets Base URI, ex: http://yourcompany.firebase.com/youruser * * @param String $baseURI Base URI * * @return void */ public function setBaseURI($baseURI) { $baseURI .= (substr($baseURI, -1) == '/' ? '' : '/'); $this->_baseURI = $baseURI; } /** * Returns with the normalized JSON absolute path * * @param String $path to data */ private function _getJsonPath($path) { $url = $this->_baseURI; $path = ltrim($path, '/'); $auth = ($this->_token == '') ? '' : '?auth=' . $this->_token; return $url . $path . '.json' . $auth; } /** * Sets REST call timeout in seconds * * @param Integer $seconds Seconds to timeout * * @return void */ public function setTimeOut($seconds) { $this->_timeout = $seconds; } /** * Writing data into Firebase with a PUT request * HTTP 200: Ok * * @param String $path Path * @param Mixed $data Data * * @return Array Response */ public function set($path, $data) { return $this->_writeData($path, $data, 'PUT'); } /** * Pushing data into Firebase with a POST request * HTTP 200: Ok * * @param String $path Path * @param Mixed $data Data * * @return Array Response */ public function push($path, $data) { return $this->_writeData($path, $data, 'POST'); } /** * Updating data into Firebase with a PATH request * HTTP 200: Ok * * @param String $path Path * @param Mixed $data Data * * @return Array Response */ public function update($path, $data) { return $this->_writeData($path, $data, 'PATCH'); } /** * Reading data from Firebase * HTTP 200: Ok * * @param String $path Path * * @return Array Response */ public function get($path) { try { $ch = $this->_getCurlHandler($path, 'GET'); $return = curl_exec($ch); curl_close($ch); } catch (Exception $e) { $return = null; } return $return; } /** * Deletes data from Firebase * HTTP 204: Ok * * @param type $path Path * * @return Array Response */ public function delete($path) { try { $ch = $this->_getCurlHandler($path, 'DELETE'); $return = curl_exec($ch); curl_close($ch); } catch (Exception $e) { $return = null; } return $return; }/** * Returns with Initialized CURL Handler * * @param String $mode Mode * * @return CURL Curl Handler */ private function _getCurlHandler($path, $mode) { $url = $this->_getJsonPath($path); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, $this->_timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->_timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $mode); return $ch; } private function _writeData($path, $data, $method = 'PUT') { $jsonData = json_encode($data); $header = array( 'Content-Type: application/json', 'Content-Length: ' . strlen($jsonData) ); try { $ch = $this->_getCurlHandler($path, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); $return = curl_exec($ch); curl_close($ch); } catch (Exception $e) { $return = null; } return $return; } }
و اکنون مهمترین فایلی که باید در پوشه هاست خود آپلود کنید. این فایلی است که به درخواست های آردوینو پاسخ می دهد. اسمش را گذاشتم firebaseTest.php
برای جزئیات بیشتر: ذخیره داده های آردوینو در پایگاه داده Firebase [Howto]
در ادامه، متن انگلیسی این مطلب را میتوانید مشاهده نمایید:
The last few weeks I was playing with Firebase mostly because I wanted to get familiar with this technology. So at some point I thought that it will be a great idea to connect Arduino with Firebase. Imagine that you have a simple temperature sensor that measures the boiler’s water temperature every few minutes and you want to keep a history log of it in order to make some adjustments to thermostat. If you also want those measurements to be available online so you will be able to access them at any time then each sensor reading has to be stored somewhere.
One great way that I was also using for that kind of things is Xively. Originally it was Pachube , then Cosm and now Xively. I hope the guys don’t decide to change the name again! With Xively client for arduino you simply connect to their Api and you send them the readings. Its fast, its simple and they also have a free plan. But there are a few things that might not work for you. One of them is the limit of readings that you can store, at the moment in free plan you can have up to 3 months history.
Another thing is that you can’t send data every 1 sec, so its impossible to store almost real time readings. And last but not least you need to consider that you are storing YOUR data in a database that you do not have control.