استفاده از DHCP و DNS در آردوینو
در بخش قبلی یاد گرفتیم که چگونه در سخت ترین شرایط به یک سرویس IP دسترسی داشته باشیم. به این معنا که ما مجبور بودیم آدرس IP خودمان را بدانیم و آدرس IP سرویس مورد نظر را نیز بدانیم. برای پروژه های خانگی، این روش راحت و موثر است. به محض اینکه ما پروژه هایی ایجاد کنیم که باید در محیط های ناشناخته ای اجرا شوند، مجبوریم از یک روش انعطاف پذیر تر استفاده کنیم.
اگر می خواهید یک محصول واقعی بر اساس شبکه ی آردوینو ایجاد کنید، شما قطعا نمی خواهید مشتریان تان یک آدرس IP که مورد استفاده قرار نگرفته است را وارد کنند و یک اسکچ جدید را قبل از اینکه بتوانند از آن استفاده کنند، وارد کنند. در چنین مواردی، ما به یک راه حل انعطاف پذیر تر نیاز داریم.
در این بخش ما با استفاده از DNS (سیستم نام دامنه) آدرس های سرویس را تعیین می کنیم و با استفاده از DHCP (پروتکل پیکربندی هاست پویا) آدرس IP آردوینو را به دست می آوریم. در زیر یک نسخه از سرور زمان وجود دارد که از DHCP و DNS استفاده می کند:
بیشتر کار کردن با شبکه در آردوینو
به محبوبیت فناوری های پوشیدنی(Wearables) و منسوجات الکترونیکی(e-textiles) روز به روز افزوده می شود و آنها یک راه خوب برای تاثیر گذاشتن بر روی همکاران و دوستان به حساب می آیند. در هر مغازه ی مجهز، تی-شِرت های تعاملی متفاوت در دسترس هستند. برخی از آنها قدرت وای فای را نشان می دهند و برخی دیگر، به همراه یک گیتار الکترونیک راک داخلی می آیند.
با استفاده از یک آردوینوی LilyPad و یک دانگل بلوتوث و یک گوشی اندرویدی، ما می توانیم یک تی-شِرت ایجاد کنیم که تعداد فعلی ایمیل های خوانده نشده در صندوق ورودی(inbox) ایمیل ما را نشان می دهد. نه تنها می توانیم تعداد ایمیل های خوانده نشده را نشان دهیم، بلکه می توانیم از LilyPad و یک ماژول XBee ، اطلاعات مهم در مورد زنبورها و رفتار آنها، را به کودکان آموزش دهیم.
#include <SPI.h>
#include <Ethernet.h>
const unsigned int BAUD_RATE = 9600;
const unsigned int DAYTIME_PORT = 13;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char* time_server = "time.nist.gov";
EthernetClient client;
void setup() {
Serial.begin(BAUD_RATE);
if (Ethernet.begin(mac) == 0) {
for (;;) {
Serial.println("Could not obtain an IP address using DHCP.");
delay(1000);
}
} else {
print_ip_address(Ethernet.localIP());
}
}
void loop() {
delay(1000);
Serial.print("Connecting...");
if (client.connect(time_server, DAYTIME_PORT) <= 0) {
Serial.println("connection failed.");
} else {
Serial.println("connected.");
delay(300);
while (client.available()) {
char c = client.read();
Serial.print(c);
}
Serial.println("Disconnecting.");
client.stop();
}
}
void print_ip_address(IPAddress ip) {
const unsigned int OCTETS = 4;
Serial.print("We've got the following IP address: ");
for (unsigned int i = 0; i < OCTETS; i++) {
Serial.print(ip[i]);
if (i != OCTETS - 1)
Serial.print(".");
}
Serial.println();
}
این کدها در آدرس زیر قرار دارد:
Ethernet/TimeServerDnsDhcp/TimeServerDnsDhcp.ino
این برنامه همانند برنامه ی بخش قبلی کار می کند اما حاوی هیج آدرس آی پی صریحی نیست. جدای از آن، این برنامه خیلی با برنامه ی اصلی تفاوت ندارد. اولین تفاوت، در خط شماره 8 وجود دارد. در اینجا ما دیگر متغیر time_server را به صورت یک آبجکت IPAddress تعریف نمی کنیم؛ بلکه آن را به صورت یک رشته(string) تعریف می کنیم. این رشته حاوی نام سروری است که می خواهیم به آن متصل شویم.
در خط 13، ما دیگر، آدرس آی پی خود را به متد begin از کلاس Ethernet نمی دهیم. در این مورد، متد begin تلاش می کند تا با استفاده از سرور DHCP در شبکه ی محلی(local network)، یک آدرس آی پی یکتا را به دست بیاورد. اگر متد begin نتواند یک آدرس IP را به دست بیاورد، ما یک حلقه ی بی پایان را شروع می کنیم که در هر ثانیه، یک خطا(error) را چاپ(print) می کند. در غیر این صورت، ما با استفاده از یک تابع کوچک کمک کننده به نام print_ip_address، آدرس IP که داریم را چاپ می کنیم. در نهایت، ما در خط 27، رشته ی time_server را به متد connect می دهیم.
توجه کنید که ما این خط از کد را تغییر نداده ایم؛ بلکه تنها نوع(type) متغیر time_server را تغییر داده ایم. اگر تابع connect یک رشته را دریافت کند و یک آبجکت IPAddress را دریافت نکند، سعی میکند آدرس آی پی، که به نامِ سرورِ ذخیره شده در این رشته تعلق دارد، را با استفاده از DNS جستجو کند. اکنون برنامه را اجرا کنید و یک خروجی شبیه به زیر را مشاهده خواهید کرد:
We've got the following IP address: 192.168.2.113
Connecting...connected.
56807 14-11-04 16:34:18 50 0 0 259.2 UTC(NIST) *
Disconnecting.
ممکن است از خود بپرسید که چرا نباید همیشه از DHCP و DNS برای راحتی کار استفاده کنیم؟ دلیل آن این است که DHCP و DNS دو مفهوم هستند که می توانند به اشتباه گرفته شوند. دیباگ کردن سیستم های توکار(embedded systems) به خودی خود سخت است؛ بنابراین ما نباید با استفاده از سرویس هایی که واقعا نیاز نداریم، آن را سخت تر کنیم. برای اکثر اپلیکیشن ها، آدرس های IP آماده(hardwired)، کار راه انداز هستند. یک دلیل دیگر، سایز کدها است. استفاده از DHCP و DNS به طور قابل ملاحظه ای، سایز فایل باینری حاصل شده را افزایش می دهد. با اضافه کردن قابلیت DHCP به برنامه ی سرویس زمان(time service)، سایز آن تقریبا 3500 بایت افزایش می یابد.
با وجود این دلایل، هنوز هم DHCP و DNS ابزارهای مفیدی برای برخی از اپلیکیشن ها هستند و عالی است که آنها اکنون بخشی از کتابخانه ی استاندارد آردوینو هستند. در فصل بعدی، خواهید آموخت که چگونه یک پروتکل مهم شبکه ی دیگر را پیاده سازی کنید: یعنی خواهید آموخت که با استفاده از آردوینو، ایمیل ارسال کنید.
فناوری های جایگزین شبکه
اترنت(Ethernet) یکی از محبوب ترین و قدرتمند ترین فناوری های شبکه(networking) است. با استفاده از یک شیلد اترنت، ما به سادگی می توانیم بورد آردوینوی خود را به اینترنت متصل کنیم؛ هم به صورت یک کلاینت(client) و هم به صورت یک سرور.
بسته به نیازهای پروژه، گاهی اوقات بهتر است از یک کانکشن وایرلس استفاده کنیم. با استفاده از یک شیلد وای فای، به سادگی می توانیم آردوینوی خود را به یک دستگاه شبکه ی وایرلس تبدیل کنیم. اما اغلب ما به ظرفیت کامل اترنت نیازی نداریم، به خصوص اگر در یک شبکه ی خصوصی(personal area network)، تنها به ارتباطات بردِ کوتاه(shortrange) نیاز داشته باشیم. ما می توانیم گزینه های متفاوتی را در نظر بگیریم اما بلوتوث و ZigBee احتمالا جزو محبوب ترین ها هستند. برای هر دوی بلوتوث و زیگ بی، راه حل های عالی در آردونیو وجود دارد. در نهایت، ما حتی می توانیم با استفاده از آردوینو در شبکه های سلولی دخالت کنیم. کافیست یک شیلد GSM را به سیم کارت خود متصل کنید.
اگر کدها کار نکرد چه کار کنیم؟
شبکه ها پیچیده هستند و وقتی که داریم مثال های این فصل را تمرین می کنیم ممکن است اشتباه کنیم. متداول ترین مشکلاتی که می تواند پیش آید به صورت زیر هستند:
- ممکن است پورت سریال را در اپلیکیشن Processing به اشتباه انتخاب کنیم.
به طور پیش فرض، این اپلیکیشن از اولین پورت سریالی که بتواند پیدا کند، استفاده می کند. همچنین ممکن است ما آردوینوی خود را به یک پورت دیگر متصل کنیم. در این صورت، ما باید در عبارت زیر، اندیس 0 را بر طبق آن تغییر دهیم:
arduinoPort = new Serial(this, Serial.list()[0], BAUD_RATE);
- ممکن است فراموش کنیم که کابل اترنت را به شیلد اترنت متصل کنیم.
- روتر شبکه ی ما یک لیست سفید مک آدرس دارد که به ما امکان می دهد تا تنها به برخی از مک آدرس ها اجازه ی دسترسی به شبکه را بدهیم.
مطمئن شوید که مک آدرسی که در اسکچ های خود مورد استفاده قرار می دهید، در لیست سفید قرار گیرد. برای این کار، به مستندات روتر خود توجه کنید.
- ممکن است در شبکه ی خود از یک مک آدرس، دو بار استفاده کرده باشید.
- ممکن است از یک آدرس IP استفاده کرده باشید که در شبکه ی شما مجاز نباشد؛ یا قبلا توسط یک دستگاه دیگر مورد استفاده قرار گرفته باشد.
بنابراین دوباره آدرس IP خود را بررسی کنید.
- ممکن است از مدارک اشتباه برای دسترسی به یک سرویس مانند تویتر استفاده کرده باشید.
مطمئن شوید که از توکن های OAuth صحیح استفاده کنید.
- تویتر اجازه ی توییت های تکراری را نمی دهد. بنابراین وقتی که اپلیکیشن ما در فرستادن یک توییت با شکست مواجه می شود، مطمئن شوید که قبلا آن را توییت نکرده باشید.
- شبکه ها طی یکی دو دهه ی اخیر بسیار قابل اعتماد تر شده اند. اما آنها گاهی اوقات ضعیف عمل می کنند. بنابراین برخی اتصالات با شکست یا با وقفه(timeout) مواجه می شوند. برای حل این مشکل، سعی کنید تاخیرهای زمانی(delays) را در اسکچ های خود افزایش دهید.
تمرین های آخر فصل
- در اینترنت به دنبال دیگر پروژه های شیلد اترنت بگردید و حداقل یکی از آنها را انجام دهید. بعنوان مثال، یک پروژه ی بلند پروازانه این است که یک مرورگر وبِ کامل را در آردوینو پیاده سازی کنیم. مانند این سایت.
- یک اکانت را در Xively و Temboo یا هر سرویس اینترنت اشیاء دیگری ثبت کنید. و با آموزش های آنها کار کنید و حداقل یک اپلیکیشن آردوینو را ایجاد کنید.
- سعی کنید حداقل یک تکنولوژی شبکه ی دیگر، مانند بلوتوث و وای فای یا XBee را با آردوینو به کار ببرید.
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.