در سلسله آموزش های شبکه مش در بردهای ESP، قسمت پنجم ارسال دیتا از مرورگر به شبکه Mesh را به یک ویژگی جالب و بسیار کاربردی اختصاص می دهیم. در قسمت پیشین نحوه ایجاد یک پل ارتباطی بین دو شبکه مش را مورد بررسی قرار دادیم. آن طور که از قسمت پیشین به یاد داریم، به کمک قابلیت bridge توانستیم ارتباط بین دو شبکه را از طریق یک گره خاص برقرار کنیم. به این گره که گره ریشه(روت) گفته می شود، توانایی ایجاد برقراری ارتباط بین دو شبکه را با قرارگیری در حالت سرور ایجاد می نماید. در این آموزش اما قصد داریم به ایجاد یک ارتباط دیگر بپردازیم. در این آموزش قصد داریم تا داده هایی را از کاربر، از طریق مرورگر تلفن همراه یا رایانه، دریافت کرده و به شبکه مش ارسال کنیم. به کمک این قابلیت می توانیم از طریق تلفن همراه خود با شبکه مش در ارتباط باشیم. این مورد بسیار در خانه های هوشمند مورد استفاده قرار می گیرد. آنجاکه نیاز است تا تعداد زیادی دستگاه با فرمان کاربر کنترل شده و یا به تلفن کاربر داده ارسال نمایند. بنابراین، در ادامه آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.
عملکرد ارسال داده از مرورگر به شبکه Mesh
همانطور که اطلاع دارید، در این آموزش قصد داریم تا داده های را از کاربر دریافت و به شبکه مش ارسال کنیم. در این حالت، کاربر از طریق صفحه وب پیجی که ESP ایجاد می کند، داده های خود را به شبکه مش ارسال می نماید. بدین ترتیب می توان برای گره ها فرمان ارسال نمود.
در این آموزش یک ماژول ESP نقش واسط بین کاربر و شبکه مش را ایفا خواهد نمود. این ماژول در حالت همزمان نقطه دسترسی و ایستگاهی قرار می گیرد. بدین ترتیب همزمان این ماژول به صورت یک پل ارتباطی بین کاربر و شبکه مش، فعال خواهد بود. در طرف دیگر ماژول در حالت سرور هم تنظیم خواهد شد. در حالت سرور، ماژول یک وب پیج درست می کند. کاربر با اتصال به این وب پیج و مشاهده صفحه، داده ها را از کاربر دریافت کرده و به شبکه مش انتقال(broadcast) می نماید. در این سناریو، داده های به گره های لبه(edge node) در شبکه مش ارسال خواهد شد. در رابطه با مد سرور، پیشتر در سلسله آموزش های ماژول های ESP به طور کامل صحبت کرده ایم. جهت اطلاعات بیشتر در این زمینه می توانید بر روی این لینک کلیک کنید. پس از آشنایی با مکانیزم کار، نوبت به تحلیل و بررسی دستورات و کدهای برنامه نویسی در این روش می رسد. قسمت بعد را به این موضوع اختصاص می دهیم.
دستورات و کدهای ایجاد ارتباط
در قسمت پیشین مکانیزم کار را مورد بررسی قرار دادیم. آنطور که پیشتر نیز گفته شد، در روش شبکه مش ماژول ESP در حالت نقطه دسترسی و ایستگاهی قرار دارد. از طرف دیگر با تعریف مد وب سرور روی این ماژول، کاربر می تواند به ماژول متصل گردد و داده های خود را ارسال نماید. ماژول به کمک کدهای HTML فرمی را درست کرده که روی مرورگر کاربر اجرا می شود. به کمک این فرم شما می توانید داده های خود را به سرور ارسال کنید. سرور پس از دریافت داده، آن ها را تحت دستورات مش، به شبکه مش ارسال خواهد نمود. برای برقراری ارتباط، ابتدا مطابق آموزش های پیشین به کمک تابع init به شبکه مش متصل می شویم.
mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 )
مطابق تابع فوق، برای ورود به شبکه نام شبکه و رمز عبور را در ورودی های اول و دوم(از سمت چپ) تنظیم می کنیم. پس از آن، شماره پورت شبکه مش، حالت کاری در مد همزمان نقطه دسترسی و ایستگاهی تنظیم می گردد. در نهایت ورودی آخر شماره کانال وای فای را تعیین می کند. پس از این مرحله، به کمک تابع زیر حالت ایستگاهی تعیین می گردد.
stationManual(STATION_SSID, STATION_PASSWORD)
در قدم بعدی، تابع وب سرور تعریف می گردد. آنطور که در آموزش ایجاد وب سرور برای ماژول های ESP شرح داده ایم(آموزش را با کلیک بر روی این لینک می توانید مطالعه کنید) وب سرور داده ها را از کاربر دریافت کرده و مطابق کدها، درخواست را اجرا می نماید. در این جا ما از وب سرور به شیوه غیر همزمان(AsyncWebServer) استفاده می کنیم. در این شیوه تابع وب سرور نه به صورت دائم بله به صورت بازه زمانی اجرا می گردد. بدین صورت تابع مربوط به شبکه مش می تواند به صورت دائم اجرا گردد. به همین علات، به کمک تابع on می توانیم وب سرور خود را کانفیک و به کمک تابع begin وب سرور را راه اندازی نمایید. برای روشن تر شدن هر چه بیشتر موضوع، به اجرای یک نمونه برنامه در قسمت بعد می پردازیم.
اجرای یک برنامه Mesh
پس از بررسی دستورات اولیه، نوبت به اجرای برنامه ارسال داده از مرورگر به شبکه Mesh می رسد. در ابتدا به کدهای زیر که مربوط به اجرای برنامه است، دقت کنید.
//درج کتابخانه های مورد نیاز #include "IPAddress.h" //کتابحانه جهت دریافت ای پی آدرس از نقطه دسترسی #include "painlessMesh.h" #ifdef ESP8266 //در صورتیکه برد انتخاب شده توسط کاربرد ESP8266 باشد، دو کتابخانه زیر باید به پروژ] اضافه شوند. #include "Hash.h" #include <ESPAsyncTCP.h> #else //در صورتیکه برد انتخاب شده توسط کاربر ESP8266 نباشد، کتابخانه های زیر انتخاب می شود. #include <AsyncTCP.h> #endif #include <ESPAsyncWebServer.h> //کتابخانه وب سرور //مشخصات شبکه مش #define MESH_PREFIX "whateverYouLike" #define MESH_PASSWORD "somethingSneaky" #define MESH_PORT 5555 //مشخصات ارتباط به نقطه دسترسی #define STATION_SSID "mySSID" #define STATION_PASSWORD "myPASSWORD" #define HOSTNAME "HTTP_BRIDGE" //نام وب سرور در شبکه مش // Prototype void receivedCallback( const uint32_t &from, const String &msg ); //تابع دریافت پاسخ از شبکه مش IPAddress getlocalIP(); //به کمک این تابع که خروجی آن از نوع کلاس IPAddress است، آی پی آدرس تعیین می گردد. painlessMesh mesh; AsyncWebServer server(80); //اجرای سرور به روش غیر همزمان روی پورت ۸۰ IPAddress myIP(0,0,0,0); IPAddress myAPIP(0,0,0,0); void setup() { Serial.begin(115200); mesh.setDebugMsgTypes( ERROR | STARTUP | CONNECTION ); // دیباگ // راه اندازی ارتباط شبکه مش بر روی کانال ۶ وای فای mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 ); mesh.onReceive(&receivedCallback); //تنظیم تابع دریافت پیام mesh.stationManual(STATION_SSID, STATION_PASSWORD); //اتصال به نقطه دسترسی ایجاد شده توسط شبکه مش mesh.setHostname(HOSTNAME); //تنظیم نام سرور در شبکه مش mesh.setRoot(true); mesh.setContainsRoot(true); //اطللاع به کلیه گره های شبکه جهت وجود گره ریشه در شبکه myAPIP = IPAddress(mesh.getAPIP()); //نمایش آی پی آدرس دریافت شده از نقطه دسترسی شبکه مش Serial.println("My AP IP is " + myAPIP.toString()); //تابع سرور غیر همزمان server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ //اجرای سرور روی صفحه ریشه با متد GET و تعریف تابع سرور(کدهای تابع سرور در ورودی همین تابع قرار می گیرد) //کدهای HTML برای اجرا FORM request->send(200, "text/html", "<form>Text to Broadcast<br><input type='text' name='BROADCAST'><br><br><input type='submit' value='Submit'></form>"); //ارسال کدهای HTML جهت نمایش روی مرورگر if (request->hasArg("BROADCAST")){ //در هنگام اجرای سرور، داده ها به کمک فرم از طریق متد GET ارسال می گردند. در صورتیکه داده ای تحت این متد ارسال شود، این داده به شبکه مش ارسال خواهد شد. String msg = request->arg("BROADCAST"); //دریافت داده ارسالی mesh.sendBroadcast(msg); //ارسال داده به شبکه مش } }); server.begin(); //راه اندازی سرور } void loop() { mesh.update(); //اجرای شبکه مش if(myIP != getlocalIP()){ //دریافت آی پی و نمایش آن در صورتکیه آی پی تغییر کند بار دیگر آن را نمایش خواهد داد. این آی پی باید در مرورگر تایپ شود تا به سرور متصل شویم. myIP = getlocalIP(); Serial.println("My IP is " + myIP.toString()); } } void receivedCallback( const uint32_t &from, const String &msg ) { //تابع CALLBACK نمایش داده های دریافتی Serial.printf("bridge: Received from %u msg=%s\n", from, msg.c_str()); } IPAddress getlocalIP() { return IPAddress(mesh.getStationIP()); //بازگردادندن آی پی دریافتی از شبکه مش }
پس از اجرای کدهای برنامه، درون سریال مانیتور آی پی آدرس دریافت شده از نقطه دسترسی شبکه مش را مشاهده خواهیم کرد. با تایپ این آدرس در مروگر(پس از اتصال به نقطه دسترسی ماژول) صفحه زیر را مشاهده خواهید کرد.
لوازم مورد نیاز
جمع بندی
در سلسله آموزش های شبکه مش، این قسمت را به اجرای ارتباط بین کاربر و شبکه مش پرداختیم. در این حالت کاربر از طریق تلفن همراه یا رایانه خود می تواند با شبکه مش ارتباط برقرار نماید. بدین ترتیب کاربر به سادگی می تواند با تعداد زیادی دستگاه(گره) حاضر در شبکه مش به تبادل داده بپردازد. این روش در اجرای خانه های هوشمند بسیار کاربردی خواهد بود، آنجا که نیاز است تا کاربر تعداد زیادی از وسایل برقی منزل، اداره و یا هر محل دیگری را با تلفن همراه خود کنترل کند. در این آموزش ابتدا یک نقطه دسترسی ایجاد می شود. کاربر با اتصال تلفن یا رایانه خود به آن، پس از تایپ آدرس آی پی سرور در مرورگر خود، وارد صفحه وب سرور می گردد. در صفحه وب سرور با تایپ و تایید پیام در کادر مخصوص، متن پیامک به شبکه مش ارسال خواهد شد. در این آموزش ابتدا به نحوه برقراری ارتباط و مکانیزم تبادل داده پرداختیم. پس از این قسمت، توابع و دستورات برنامه نویسی مورد تحلیل و بررسی قرار گرفت. در نهایت با ارایه یک مثال، شیوه اجرای پروژه را مشاهده کردیم.
چنانچه مطالب ابن آموزش را گنگ یافتید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. تاکنون بیش از هزاران نظر و پاسخ در دیجی اسپارک درج شده است؛ پس نظرات شما ارزشمند بوده و سوالات بی پاسخ نمی مانند.
درود وقت بخیر من پروژه رو اجرا کردم انتظارم این بود که شبکه مش و گوشی هردو به شبکه وای فای STATION_SSID متصل شوند و با زدن ip اعلام شده وب پیج بالا آمده و ارسال دیتا انجام گیرد در صورتی که این کار انجام نمیشه و باید همه دیوایس ها به شبکه مش متصل باشند و فکر میکنم که شبکه ssid اصلا در این مورد کار نمیکنه ممنون میشم راهنمایی بفرمایید .نکته جالبتر اینکه با متصل شدن به شبکه مش دیگه نمیشه به شبکه ssid متصل شد تا زمانی که esp رو خاموش کنم . با تشکر از زحماتتون
خواهش می کنم
نام ssid تنها در شبکه مش قابل اجراست. از آنجاییکه تلفن و لپ تپ جزیی از شبکه مش نیستند، طبعا نمی توانند وارد این شبکه شوند. چون روش ارتباط تلفن و رایانه از طریق TCP/IP است، حال اینکه مش چنین نیست!