برد ESP8266 برد Nodemcu

شبکه مش Mesh در بردهای ESP قسمت چهارم: برقراری اتصال پل bridge

getting-started-with-mesh-network-esp8266-part-four-bridge-connection-digispark
نوشته شده توسط معین صابری

در سلسله آموزش های برد ESP تحت شبکه مش، قسمت چهارم را به اتصال bridge می پردازیم. در قسمت پیشین به برقراری ارتباط در شبکه مش به صورت پایه ای پرداختیم. در آن قسمت نحوه برقراری ارتباط در شبکه مش، تعریف نام شبکه و رمز عبور را مورد بررسی قرار دادیم. در ادامه نحوه تنظیم زمانبندی و ارتباط در شبکه را آموختیم. در این آموزش قصد داریم تا به یک مفهوم کلیدی و کاربردی در شبکه مش بپردازیم. این مفهوم که با نام پل یا bridge شناخته می شود، برقراری ارتباط را بین دو شبکه برقرار می سازد. به عبارت دیگر، یک گره از یک شبکه با یک گره از شبکه دیگر می توانند به تبادل داده بپردازند. در این آموزش قصد داریم تا به این مفهوم بپردازیم. در ابتدا به مفهوم bridge و روش های ارتباطی آن می پردازیم. سپس در ادامه توابع برنامه نویسی را معرفی خواهیم کرد. در نهایت با ارایه یک مثال، نحوه استفاده از توابع را مشاهده خواهیم نمود. در ادامه آموزش اتصال پل bridge در شبکه مش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک، همراه باشید.

 


مفهوم bridge و روش های پیاده سازی


همانطور که پیشتر هم گفته شد، مفهوم bridge به معنای ایجاد ارتباط از یک شبکه با شبکه دیگر است. برای روشن تر شدن موضوع، فرض کنید که یک شبکه مش با نام MESH1 در حال فعالیت است. در مجاورت این شبکه، یک شبکه دیگر با نام MESH2 به تبادل داده بین گره های خود می پردازد. حال به کمک مفهوم bridge یا همان پل، می توانیم بین دو شبکه ارتباط برقرار کنیم. برای این مورد، یک گره از هر شبکه به عنوان نماینده وظیفه تبادل داده با شبکه دیگر را بر عهده خواهد گرفت.

اتصال پل bridge در شبکه مش esp8266 - دیجی اسپارک

 

جهت ایجاد ارتباط پل در شبکه مش به کمک تراشه های ESP روش های مختلفی وجود دارد. در زیر روش های مختلف برقراری ارتباط پل را مشاهده می کنید.

  • برقراری ارتباط به کمک پورت سریال UART
  • برقراری ارتباط به صورت مدل کلاینت و سرور
  • استفاده از برد رزبری پای به عنوان گره نهایی
  • استفاده از متد MQTT و تعریف کلاینت و سرور MQTT

در روش نخست، دو برد ESP از هر شبکه به کمک ارتباط سریال UART به یکدیگر متصل می شوند. این مورد مستلزم سیم کشی بین دو گره است. از لحاظ پیاده سازی این روش بسیار ساده بوده،؛ اما بحث سیم کشی به نوعی می تواند سبب تضعیف عملکرد شبکه گردد. در مقابل این روش، گزینه شماره ۲ روش مناسب تری به شمار می رود. در این روش یک گره از شبکه به صورت سرور تعریف می گردد.  با تعریف گره به صورت سرور، تبادل داده ای بین گره از شبکه دیگر و ارتباط بین دو شبکه برقرار خواهد شد.

در روشی دیگر، امکان استفاده از برد رزبری پای به عنوان گره نهایی(end node) وجود دارد. در این روش برد رزبری پای به شبکه مش و تمام گره های شبکه جهت تبادل داده متصل می شود. برد رزبری پای در این سناریو نیاز به دو دستگاه وای فای، یکی برای اتصال به شبکه مش و دیگری برای اتصال به شبکه های بزرگتر، مثل اتصال به مودم برای اینترنت نیاز دارد. در روشی دیگر، مطابق پروتکل MQTT می توانیم به تبادل داده بپردازیم.  در این روش یک مد کلاینت و یک مود سرور MQTT خواهیم داشت. در این روش، تبادل داده بین شبکه مش و MQTT صورت خواهد گرفت. در این آموزش ما به بررسی روش دوم خواهیم پرداخت. در این روش همانطور که گفته شد، یک مد سرور و از سمت دیگر یک مد کلاینت جهت تبادل داده بین دو شبکه، حاضر می شوند. در قسمت بعدی ابتدا به توابع کلیدی و کاربردی این روش خواهیم پرداخت. سپس در ادامه بحث با اجرای یک برنامه، نحوه استفاده از توابع را مشاهده خواهیم نمود.

 


توابع کلیدی اتصال پل bridge


پس از آشنایی با روش های مختلف و انتخاب روش اجرای bridge، نوبت به بررسی توابع کلیدی و کاربردی می رسد. در ابتدا توجه داشته باشید که در این روش، گره ما هم به صورت نقطه دسترسی و هم به صورت STA عمل خواهد کرد. در حالت نقطه دسترسی ارتباط برای شبکه مش داخلی خود و در حالت STA جهت اتصال به شبکه مش دیگر، گره ESP تعریف می گردد. برای این مورد، ابتدا باید تابع init شبکه مش تغییراتی داشته باشد. این تابع در اینجا به شکل زیر فراخوانی می گردد.

  mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 )

 

 با تابع فوق در قسمت پیشین آشنا شدیم. این تابع همانطور که اطلاع دارید، جهت اجرای شبکه مش و راه اندازی آن با تنظیمات قرار گرفته در ورودی، از این تابع باید بهره گرفت. همانطور که اطلاع دارید، سه ورودی اول(از سمت چپ) مربوط به نام شبکه مش، رمز عبور شبکه و شماره پورت است. از آنجاییکه نیاز است تا در این روش گره به صورت نقطه دسترسی و ایستگاهی عمل کند، لذا در ورودی شماره چهارم این مورد تعیین می گردد. در نهایت آخرین ورودی مربوط به شماره کانال وای فای است. در این روش کانال شماره ۶ را به عنوان کانال ارتباط وای فای تعیین می کنیم. توجه داشته باشید که سایر گره های شبکه باید در همین کانال فعالیت کنند. در قدم بعد، تنظیمات مربوط به گره در حالت پل را انجام می دهیم. به همین منظور تابع زیر را فراخوانی می کنیم.

mesh.stationManual(STATION_SSID, STATION_PASSWORD, STATION_PORT, station_ip)

 

مطابق تابع فوق، ورودی ها از چپ به راست به صورت زیر تعریف می گردند.

  • STATION_SSID: نام SSID که گره باید به آن متصل شود.
  • STATION_PASSWORD: رمز عبور مربوط به SSID که باید به آن گره متصل شود.
  • STATION_PORT: شماره پورتی که ارتباط با سرور باید برقرار شود.
  • station_ip: آی پی سرور که این آدرس باید از AP برای گره در حالت STA دریافت گردد.

جهت برقراری ارتباط اتصال پل bridge در این روش، می بایست گره در حالت سرور قرار بگیرد. با قرارگیری گره در حالت سرور، ارتباط با دیگر شبکه مش به صورت bridge برقرار می شود. برای این مورد شماره پورت سرور برابر با ۵۵۵۵ بوده که با شماره پورت گره ها در شبکه مش برابر است. در طرف دیگر، آی پی آدرسی  نیز تعریف کرده ایم. این آی پی، در حقیقت آی پی دلخواهیست که قصد داریم از AP دریافت کنیم. به عبارت دیگر ما با این آی پی به نقطه دسترسی اعلام می کنیم که این آی پی را به گره تخصیص دهد. در طرف دیگر، آدرس سرور نیز برابر با همین آی پی خواهد. برای روشن تر شدن هرچه بیشتر موضوع، قسمت بعد را به کد کامل اختصاص می دهیم.

 


اجرای اتصال به روش bridge


پس از آشنایی با توابع اتصال پل bridge، نوبت به اجرای برنامه می رسد. در زیر نمونه برنامه جهت برقراری ارتباط bridge را مشاهده می کنید.

#include "painlessMesh.h" 
//اطلاعات مربوط به شبکه مش
#define   MESH_PREFIX     "whateverYouLike"
#define   MESH_PASSWORD   "somethingSneaky"
#define   MESH_PORT       5555
//اظلاعات مربوط به AP که قرار به اتصال آن است.
#define   STATION_SSID     "mySSID"
#define   STATION_PASSWORD "myPASSWORD"
#define   STATION_PORT     5555
uint8_t   station_ip[4] =  {192,168,1,128}; // این آی پی را از نقطه دسترسی درخواست می کنیم. این آی پی همان ای پی سرور هم خواهد بود.
//تابع دریافت و نمایش پاسخ
void receivedCallback( uint32_t from, String &msg );

painlessMesh  mesh;

void setup() {
  Serial.begin(115200);
  mesh.setDebugMsgTypes( ERROR | STARTUP | CONNECTION );  // خطایابی
  mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 );  //برقراری ارتباط مش
  mesh.initOTAReceive("bridge");  //به کمک این دستور بروز رسانی برنامه از طریق قابلیت OTA هم فعال می شود.
  mesh.stationManual(STATION_SSID, STATION_PASSWORD, STATION_PORT, station_ip);  //تابع برقراری ارتباط با AP
  mesh.setRoot(true);  //گره پل باید از نوع گره ریشه(روت) باشد. به همین دلیل این قابلیت را در شبکه فعال می کنیم.
  mesh.setContainsRoot(true);  //به کلیه گره ها حضو رگره روت در شبکه اطلاع داده می شود.
  mesh.onReceive(&receivedCallback);  //تابع دریافت پیام
}

void loop() {
  mesh.update();
}

void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("bridge: Received from %u msg=%s\n", from, msg.c_str());
}

 


لوازم مورد نیاز


برد NODEMCU به تعداد کافی!

 


جمع بندی


در مجموعه آموزش های شبکه مش، قسمت چهارم را به ارتباط پل یا bridge اختصاص دادیم. در ارتباط پل، یک گره از یک شبکه به عنوان پل ارتباطی با یک شبکه دیگر ارتباط برقرار می نماید. بدین ترتیب به کمک این ویژگی می توان شبکه ها را با هم ارتباط داد. در این آموزش به این ویژگی و روش های پیاده سازی آن پرداختیم. در ابتدا روشهای ایجاد ارتباط پل مورد بررسی قرار گرفت. سپس به تشریح هر کدام از این روش ها پرداخته شد. در ادامه با انتخاب یکی از روش ها، توابع و دستورات آن در آردوینو را بررسی کردیم. در نهایت با ارایه مثالی، نحوه اجرای یک نمونه برنامه مشاهده گردید.

 

چنانچه مطالب ابن آموزش را گنگ یافتید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. تاکنون  هزاران نظر و پاسخ در دیجی اسپارک درج شده است؛ پس نظرات شما ارزشمند بوده و سوالات بی پاسخ نمی مانند.

 

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۱ دیدگاه

  • سلام و عرض ادب ، ضمن تشکر از ارایه مطالب ارزنده شما یک سوال دارم از حضورتان

    من همین برنامه شما رو آپلود میکنم روی esp32 , 8266 ولی نمیتونه به ap متصل بشه ، البته وقتی پارامتر ip,port را در دستور mesh.stationManual(STATION_SSID, STATION_PASSWORD, STATION_PORT, station_ip); حذف میکنم به بعضی از ap ها متصل میشود .
    به نظر مشکل از کجاست ؟