From 595dc0183097ec0591a45ed4ac2628e4e8adbbae Mon Sep 17 00:00:00 2001 From: dpnebert Date: Wed, 29 Nov 2023 04:11:46 -0600 Subject: [PATCH] Added example 'get mac address' (#8618) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Example sketch prints MAC for different interfaces Interfaces described in documenation: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/misc_system_api.html#mac-address * Update README.md to include 'MacAddress' * Add files via upload * Delete libraries/ESP32/examples/MacAddress/GetMacAddress.ino * Delete libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino * Delete libraries/ESP32/examples/MacAddress/GetMacAddress/MacAddress directory * Add files via upload * Add files via upload * Adds necessary MAC header file * Reverting - moving to the sketch * Adds include with esp_mac_type_t values --------- Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Co-authored-by: Rodrigo Garcia --- .../GetMacAddress/GetMacAddress.ino | 87 +++++++++++++++++++ libraries/README.md | 1 + 2 files changed, 88 insertions(+) create mode 100644 libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino diff --git a/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino b/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino new file mode 100644 index 000000000..b19efca84 --- /dev/null +++ b/libraries/ESP32/examples/MacAddress/GetMacAddress/GetMacAddress.ino @@ -0,0 +1,87 @@ +/* + * GetMacAddress + * + * This sketch prints out the MAC addresses for different interfaces. + * + * Written by: Daniel Nebert + * + * The first printed MAC address is obtained by calling 'esp_efuse_mac_get_default' + * (https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32/api-reference/system/misc_system_api.html#_CPPv425esp_efuse_mac_get_defaultP7uint8_t) + * which returns base MAC address which is factory-programmed by Espressif in EFUSE. + * + * The remaining printed MAC addresses is obtained by calling 'esp_read_mac' + * (https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32/api-reference/system/misc_system_api.html#_CPPv412esp_read_macP7uint8_t14esp_mac_type_t) + * and passing in the 'esp_mac_type_t' type. + * (https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32/api-reference/system/misc_system_api.html#esp__mac_8h_1a1b19aca597277a2179682869c140477a) + * + +esp_mac_type_t values: + + ESP_MAC_WIFI_STA - MAC for WiFi Station (6 bytes) + ESP_MAC_WIFI_SOFTAP - MAC for WiFi Soft-AP (6 bytes) + ESP_MAC_BT - MAC for Bluetooth (6 bytes) + ESP_MAC_ETH - MAC for Ethernet (6 bytes) + ESP_MAC_IEEE802154 - if CONFIG_SOC_IEEE802154_SUPPORTED=y, MAC for IEEE802154 (8 bytes) + ESP_MAC_BASE - Base MAC for that used for other MAC types (6 bytes) + ESP_MAC_EFUSE_FACTORY - MAC_FACTORY eFuse which was burned by Espressif in production (6 bytes) + ESP_MAC_EFUSE_CUSTOM - MAC_CUSTOM eFuse which was can be burned by customer (6 bytes) + ESP_MAC_EFUSE_EXT - if CONFIG_SOC_IEEE802154_SUPPORTED=y, MAC_EXT eFuse which is used as an extender for IEEE802154 MAC (2 bytes) + +*/ + +#include "esp_mac.h" // required - exposes esp_mac_type_t values + +void setup() { + + Serial.begin(115200); + while(!Serial) { delay( 100 ); } + + Serial.println("Interface\t\t\t\t\t\tMAC address (6 bytes, 4 universally administered, default)"); + + Serial.print("Wi-Fi Station (using 'esp_efuse_mac_get_default')\t"); + Serial.println(getDefaultMacAddress()); + + Serial.print("WiFi Station (using 'esp_read_mac')\t\t\t"); + Serial.println(getInterfaceMacAddress(ESP_MAC_WIFI_STA)); + + Serial.print("WiFi Soft-AP (using 'esp_read_mac')\t\t\t"); + Serial.println(getInterfaceMacAddress(ESP_MAC_WIFI_SOFTAP)); + + Serial.print("Bluetooth (using 'esp_read_mac')\t\t\t"); + Serial.println(getInterfaceMacAddress(ESP_MAC_BT)); + + Serial.print("Ethernet (using 'esp_read_mac')\t\t\t\t"); + Serial.println(getInterfaceMacAddress(ESP_MAC_ETH)); +} + +void loop() { /* Nothing in loop */ } + +String getDefaultMacAddress() { + + String mac = ""; + + unsigned char mac_base[6] = {0}; + + if(esp_efuse_mac_get_default(mac_base) == ESP_OK) { + char buffer[18]; // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator + sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]); + mac = buffer; + } + + return mac; +} + +String getInterfaceMacAddress(esp_mac_type_t interface) { + + String mac = ""; + + unsigned char mac_base[6] = {0}; + + if(esp_read_mac(mac_base, interface) == ESP_OK) { + char buffer[18]; // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator + sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]); + mac = buffer; + } + + return mac; +} diff --git a/libraries/README.md b/libraries/README.md index 5edeebba4..3b643ee2d 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -33,6 +33,7 @@ arduino-esp32 includes libraries for Arduino compatibility along with some objec * GPIO * HallSensor * I2S + * MacAddress * ResetReason * RMT * Time