آموزش ESP32آموزش اینترنت اشیا

تغییر و مشاهده آدرس MAC در ماژول ESP32

هر ماژول ESP32 دارای یک آدرس MAC منحصربه‌فرد است که به‌صورت سخت‌افزاری در تراشه ذخیره شده و نقش مهمی در برقراری ارتباط مؤثر بین دستگاه‌ها ایفا می‌کند.

با این حال، گاهی اوقات ممکن است نیاز باشد که یک آدرس MAC جدید برای ESP32 تعیین کنید. به‌عنوان مثال، در زمینه‌ی امنیت شبکه ممکن است بخواهید لیست سفید (Whitelist) از آدرس‌های MAC مجاز ایجاد کنید تا فقط دستگاه‌های خاصی اجازه‌ی اتصال به شبکه Wi-Fi شما را داشته باشند.

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

آدرس MAC چیست؟

آدرس MAC (مخفف Media Access Control) رشته‌ای از حروف و اعداد است که به‌عنوان شناسه‌ی منحصربه‌فرد برای هر دستگاه شبکه‌ای عمل می‌کند.

هر آدرس MAC از 12 کاراکتر هگزادسیمال تشکیل شده که در قالب شش جفت نمایش داده می‌شود، مانند:
AA:BB:CC:DD:EE:FF

هر دستگاهی که به شبکه متصل می‌شود دارای یک کنترلر رابط شبکه (NIC) است؛ این تراشه وظیفه‌ی مدیریت ارتباط بین دستگاه و شبکه را از طریق پروتکل‌هایی مانند Wi-Fi، Bluetooth یا Ethernet بر عهده دارد. در فرآیند تولید، سازنده برای هر NIC یک آدرس MAC منحصربه‌فرد اختصاص می‌دهد و آن را به‌صورت دائمی در سخت‌افزار دستگاه ذخیره می‌کند.

این آدرس‌ها برای ارسال و دریافت داده‌ها در شبکه ضروری‌اند. در حالی که آدرس IP برای شناسایی ارتباط شبکه‌ای استفاده می‌شود، آدرس MAC سخت‌افزار فیزیکی را مشخص می‌کند.

برخلاف آدرس IP که می‌تواند تغییر کند، آدرس MAC معمولاً ثابت است، زیرا تنها در محدوده‌ی شبکه‌ی محلی کاربرد دارد.

با این وجود، در برخی سیستم‌ها (از جمله ESP32) امکان تغییر موقت آدرس MAC از طریق نرم‌افزار وجود دارد.
توجه داشته باشید که این تغییر فقط موقتی است و در صورت ریست شدن تراشه، آدرس MAC به مقدار پیش‌فرض کارخانه بازمی‌گردد، مگر آنکه آن را طوری برنامه‌ریزی کنید که در هر بار بوت مجدداً تنظیم شود.

آدرس MAC در ESP32

ماژول ESP32 دارای چندین آدرس MAC است که هرکدام مربوط به یکی از رابط‌های شبکه‌ای آن می‌باشد، از جمله:

  • Wi-Fi Station (حالت ایستگاه یا کلاینت)
  • Wi-Fi Access Point (نقطه دسترسی)
  • Bluetooth (نسخه کلاسیک و BLE)
  • Ethernet

فقط اولین مورد، که با عنوان Base MAC Address شناخته می‌شود، در eFuse یا حافظه‌ی خارجی ذخیره شده و سایر آدرس‌ها بر اساس آن تولید می‌شوند.

  • آدرس Wi-Fi Station (STA) همان Base MAC است.
  • آدرس Wi-Fi Access Point (AP) با افزودن عدد 1 به بایت آخر Base MAC به دست می‌آید.
  • آدرس Bluetooth با افزودن عدد 2 به بایت آخر Base MAC محاسبه می‌شود.
  • آدرس Ethernet نیز با افزودن عدد 3 به بایت آخر Base MAC تولید می‌شود.

مثال از آدرس‌های MAC در ESP32

رابط (Interface) نوع آدرس نمونه (Example)
Wi-Fi Station base_mac 80:7D:3A:CB:12:5C
Wi-Fi SoftAP base_mac + 1 80:7D:3A:CB:12:5D
Bluetooth base_mac + 2 80:7D:3A:CB:12:5E
Ethernet base_mac + 3 80:7D:3A:CB:12:5F

برای اطلاعات بیشتر، می‌توانید به مستندات رسمی شرکت Espressif مراجعه کنید.

یافتن آدرس MAC در ماژول ESP32

برای مشاهده‌ی آدرس MAC در ESP32، می‌توانید از Espressif IoT Development Framework (ESP-IDF) یا Arduino IDE استفاده کنید.

در این بخش، روش انجام این کار در Arduino IDE توضیح داده شده است.

پیش از هر چیز مطمئن شوید که پشتیبانی از برد ESP32 را در Arduino IDE نصب کرده‌اید. برای این کار می‌توانید از مقاله آموزش برنامه نویسی ESP32 در آردوینو استفاده کنید.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

کد نمونه برای نمایش آدرس MAC دستگاه

#include <WiFi.h>

void setup(){
  Serial.begin(115200);
  
  // متغیر برای ذخیره آدرس MAC
  uint8_t baseMac[6];
  
  // دریافت آدرس MAC رابط Wi-Fi Station
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("Station MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02X\n", baseMac[5]);
  
  // دریافت آدرس MAC رابط Wi-Fi Access Point
  esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
  Serial.print("SoftAP MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02X\n", baseMac[5]);
  
  // دریافت آدرس MAC رابط Bluetooth
  esp_read_mac(baseMac, ESP_MAC_BT);
  Serial.print("Bluetooth MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02X\n", baseMac[5]);

  // دریافت آدرس MAC رابط Ethernet
  esp_read_mac(baseMac, ESP_MAC_ETH);
  Serial.print("Ethernet MAC: ");
  for (int i = 0; i < 5; i++) {
    Serial.printf("%02X:", baseMac[i]);
  }
  Serial.printf("%02X\n", baseMac[5]);
}
 
void loop(){
}

نحوه اجرای برنامه

پس از آپلود کردن کد در ESP32، Serial Monitor را باز کرده و نرخ انتقال داده (Baud Rate) را روی 115200 تنظیم کنید.

سپس دکمه‌ی EN (ریست) روی ماژول ESP32 را فشار دهید.

در خروجی Serial Monitor، باید آدرس‌های MAC مربوط به هر رابط شبکه (Wi-Fi Station، SoftAP، Bluetooth و Ethernet) نمایش داده شوند.

یافتن آدرس MAC در ماژول ESP32

توضیح خط‌ به‌ خط کد

کد با افزودن کتابخانه‌ی WiFi.h شروع می‌شود که شامل توابع لازم برای مدیریت ارتباطات Wi-Fi در ESP32 است.

#include "WiFi.h"

در تابع setup()، ارتباط سریال با نرخ 115200 بیت بر ثانیه آغاز می‌شود تا داده‌ها روی مانیتور سریال نمایش داده شوند:

Serial.begin(115200);

در ادامه، متغیری به نام baseMac از نوع آرایه‌ی uint8_t با شش عنصر تعریف می‌شود تا آدرس MAC در آن ذخیره شود.
هر عنصر این آرایه یک عدد 8 بیتی بدون علامت است (محدوده‌ی 00 تا FF در مبنای هگزادسیمال).

uint8_t baseMac[6];

خواندن آدرس MAC مربوط به Wi-Fi Station

تابع زیر آدرس MAC مربوط به رابط Wi-Fi Station (حالت کلاینت) را می‌خواند و در آرایه‌ی baseMac ذخیره می‌کند:

esp_read_mac(baseMac, ESP_MAC_WIFI_STA);

سپس با استفاده از یک حلقه‌ی for، بایت‌های آدرس MAC به‌صورت دو رقم هگزادسیمال (با جداکننده‌ی “:”) چاپ می‌شوند:

Serial.print("Station MAC: ");
for (int i = 0; i < 5; i++) {
  Serial.printf("%02X:", baseMac[i]);
}
Serial.printf("%02X\n", baseMac[5]);

خواندن آدرس MAC مربوط به Wi-Fi Access Point

برای دریافت آدرس MAC در حالت Access Point (SoftAP) از همان تابع با پارامتر متفاوت استفاده می‌شود:

esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
Serial.print("SoftAP MAC: ");
...

خواندن آدرس MAC مربوط به Bluetooth

در این قسمت، از پارامتر ESP_MAC_BT برای خواندن آدرس MAC بلوتوث استفاده می‌شود:

esp_read_mac(baseMac, ESP_MAC_BT);
Serial.print("Bluetooth MAC: ");
...

خواندن آدرس MAC مربوط به Ethernet

به‌صورت مشابه، آدرس MAC مربوط به رابط Ethernet از طریق دستور زیر خوانده می‌شود:

esp_read_mac(baseMac, ESP_MAC_ETH);
Serial.print("Ethernet MAC: ");
...

تابع loop()

تابع loop() خالی است، زیرا این برنامه تنها یک بار در زمان راه‌اندازی اجرا شده و آدرس‌ها را چاپ می‌کند:

void loop(){
}

نتیجه:
با اجرای این برنامه، شما می‌توانید آدرس MAC مربوط به هر یک از رابط‌های ارتباطی ماژول ESP32 را به‌صورت دقیق مشاهده کنید.

این اطلاعات برای پیکربندی شبکه، شناسایی دستگاه و مدیریت امنیت Wi-Fi بسیار مفید است.

تغییر آدرس MAC در ESP32

در این بخش یاد می‌گیرید چطور آدرس MAC پایه‌ی ماژول ESP32 را تغییر دهید و سپس آدرس‌های جدید مربوط به هر رابط شبکه (Wi-Fi، Bluetooth و Ethernet) را مشاهده کنید.

نکته‌ی مهم این است که تنها لازم است آدرس Base MAC را تغییر دهید، زیرا سایر آدرس‌های MAC مربوط به رابط‌های مختلف به‌صورت خودکار از همین آدرس پایه و با اختلاف‌های خاص محاسبه می‌شوند.

مرحله 1: تنظیم آدرس MAC جدید

قبل از آپلود کد، باید مقدار متغیر newMAC را با آدرس دلخواه خود جایگزین کنید:

uint8_t newMAC[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

این آدرس یک آرایه از شش عدد هگزادسیمال است که هرکدام نماینده‌ی یک بایت از آدرس MAC هستند.

کد کامل تغییر MAC Address در ESP32

#include <WiFi.h>
#include <esp_wifi.h>

// تعریف آدرس MAC جدید
uint8_t newMAC[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

void setup(){
  Serial.begin(115200);
  
  // غیرفعال کردن WiFi برای تنظیم MAC جدید
  WiFi.mode(WIFI_OFF);
  
  Serial.println("[OLD]---");
  FindMACAddress();
  
  // تنظیم آدرس MAC جدید
  if (esp_base_mac_addr_set(newMAC) == ESP_OK) {
    Serial.println("MAC address set successfully");
  } else {
    Serial.println("Failed to set MAC address");
  }
  
  Serial.println();
  Serial.println("[NEW]---");
  FindMACAddress();
}
 
void loop(){
}

void FindMACAddress(){
  uint8_t baseMac[6];
  
  // WiFi Station
  esp_read_mac(baseMac, ESP_MAC_WIFI_STA);
  Serial.print("Station MAC: ");
  for (int i = 0; i < 5; i++) Serial.printf("%02X:", baseMac[i]);
  Serial.printf("%02X\n", baseMac[5]);
  
  // WiFi Access Point
  esp_read_mac(baseMac, ESP_MAC_WIFI_SOFTAP);
  Serial.print("SoftAP MAC: ");
  for (int i = 0; i < 5; i++) Serial.printf("%02X:", baseMac[i]);
  Serial.printf("%02X\n", baseMac[5]);
  
  // Bluetooth
  esp_read_mac(baseMac, ESP_MAC_BT);
  Serial.print("Bluetooth MAC: ");
  for (int i = 0; i < 5; i++) Serial.printf("%02X:", baseMac[i]);
  Serial.printf("%02X\n", baseMac[5]);

  // Ethernet
  esp_read_mac(baseMac, ESP_MAC_ETH);
  Serial.print("Ethernet MAC: ");
  for (int i = 0; i < 5; i++) Serial.printf("%02X:", baseMac[i]);
  Serial.printf("%02X\n", baseMac[5]);
  
  Serial.println();
}

مرحله 2: مشاهده خروجی

  1. پس از آپلود کد، Serial Monitor را باز کنید و baud rate را روی 115200 قرار دهید.
  2. دکمه EN روی ماژول ESP32 را فشار دهید.
  3. اکنون باید هر چهار آدرس (Wi-Fi Station، Wi-Fi AP، Bluetooth و Ethernet) را مشاهده کنید، شامل نسخه قدیمی و نسخه جدید آن‌ها.

تغییر آدرس MAC در ESP32

نکته بسیار مهم

تغییرات انجام‌شده در این کد دائمی نیستند. با هر بار ریست شدن برد یا آپلود کد جدید، آدرس MAC به مقدار پیش‌فرض کارخانه بازمی‌گردد.

اگر می‌خواهید آدرس MAC سفارشی شما همیشه تنظیم شود، باید کد مربوط به esp_base_mac_addr_set() را در ابتدای برنامه‌ی اصلی خود (مثلاً در setup()) قرار دهید تا در هر بوت اجرا شود.

توضیح کد

  • کتابخانه‌های WiFi.h و esp_wifi.h برای مدیریت عملیات شبکه و دسترسی به توابع خاص ESP32 استفاده می‌شوند.
  • تابع esp_base_mac_addr_set() آدرس پایه MAC را تنظیم می‌کند.
  • تابع FindMACAddress() همان کدی است که در بخش قبل نوشتیم و برای نمایش آدرس‌ها در قالب هگزادسیمال استفاده می‌شود.
  • WiFi.mode(WIFI_OFF) باعث می‌شود تا قبل از تنظیم MAC جدید، هیچ ارتباطی از طریق Wi-Fi برقرار نباشد.
5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *