smart-home/view_esp32_hardware_ids.cpp
2026-02-26 09:16:34 +08:00

164 lines
6.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* ESP32硬件ID查看程序
* 显示ESP32芯片的所有出厂自带标识符
*/
#include <esp_system.h>
#include <esp_wifi.h>
#include <esp_log.h>
#include <esp_mac.h>
#include <esp_efuse.h>
#include <esp_chip_info.h>
static const char* TAG = "ESP32_HW_ID";
/**
* 查看ESP32所有硬件标识符
*/
void view_esp32_hardware_ids() {
ESP_LOGI(TAG, "");
ESP_LOGI(TAG, "========================================");
ESP_LOGI(TAG, "🔍 ESP32 硬件标识符查看程序");
ESP_LOGI(TAG, "📋 显示芯片出厂自带的唯一标识符");
ESP_LOGI(TAG, "========================================");
ESP_LOGI(TAG, "");
// ============ 1. 芯片基本信息 ============
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
ESP_LOGI(TAG, "🔧 【芯片基本信息】");
ESP_LOGI(TAG, " 芯片型号: %s", CONFIG_IDF_TARGET);
ESP_LOGI(TAG, " 芯片版本: %d", chip_info.revision);
ESP_LOGI(TAG, " CPU核心数: %d", chip_info.cores);
ESP_LOGI(TAG, " Flash大小: %dMB", spi_flash_get_chip_size() / (1024 * 1024));
ESP_LOGI(TAG, "");
// ============ 2. MAC地址出厂烧录 ============
uint8_t mac[6];
char mac_str[18];
ESP_LOGI(TAG, "📡 【MAC地址 - 出厂烧录,全球唯一】");
// WiFi Station MAC
esp_wifi_get_mac(WIFI_IF_STA, mac);
snprintf(mac_str, sizeof(mac_str), "%02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
ESP_LOGI(TAG, " WiFi STA MAC: %s", mac_str);
// WiFi AP MAC
esp_wifi_get_mac(WIFI_IF_AP, mac);
snprintf(mac_str, sizeof(mac_str), "%02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
ESP_LOGI(TAG, " WiFi AP MAC: %s", mac_str);
// 以太网MAC
esp_read_mac(mac, ESP_MAC_ETH);
snprintf(mac_str, sizeof(mac_str), "%02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
ESP_LOGI(TAG, " 以太网 MAC: %s", mac_str);
// 蓝牙MAC
esp_read_mac(mac, ESP_MAC_BT);
snprintf(mac_str, sizeof(mac_str), "%02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
ESP_LOGI(TAG, " 蓝牙 MAC: %s", mac_str);
ESP_LOGI(TAG, "");
// ============ 3. 芯片ID基于MAC地址 ============
ESP_LOGI(TAG, "🆔 【芯片ID - 硬件级唯一标识】");
// 获取默认MAC地址用于生成芯片ID
uint8_t default_mac[6];
esp_efuse_mac_get_default(default_mac);
snprintf(mac_str, sizeof(mac_str), "%02X:%02X:%02X:%02X:%02X:%02X",
default_mac[0], default_mac[1], default_mac[2],
default_mac[3], default_mac[4], default_mac[5]);
ESP_LOGI(TAG, " 默认MAC地址: %s", mac_str);
// 计算64位芯片ID
uint64_t chip_id = 0;
for (int i = 0; i < 6; i++) {
chip_id |= ((uint64_t)default_mac[i]) << (8 * (5 - i));
}
ESP_LOGI(TAG, " 芯片ID (64位): 0x%016llX", chip_id);
ESP_LOGI(TAG, " 芯片ID (十进制): %llu", chip_id);
// 32位芯片ID常用
uint32_t chip_id_32 = (uint32_t)(chip_id & 0xFFFFFFFF);
ESP_LOGI(TAG, " 芯片ID (32位): 0x%08X", chip_id_32);
ESP_LOGI(TAG, " 芯片ID (十进制): %u", chip_id_32);
ESP_LOGI(TAG, "");
// ============ 4. 设备标识符生成 ============
ESP_LOGI(TAG, "🏷️ 【设备标识符 - 基于硬件ID生成】");
// 方法1使用MAC地址后4字节
char device_id_mac[16];
snprintf(device_id_mac, sizeof(device_id_mac), "FF_%02X%02X%02X%02X",
default_mac[2], default_mac[3], default_mac[4], default_mac[5]);
ESP_LOGI(TAG, " MAC设备ID: %s", device_id_mac);
// 方法2使用32位芯片ID
char device_id_chip[16];
snprintf(device_id_chip, sizeof(device_id_chip), "ESP_%08X", chip_id_32);
ESP_LOGI(TAG, " 芯片设备ID: %s", device_id_chip);
// 方法3数字形式设备ID
uint32_t numeric_id = (default_mac[2] << 24) | (default_mac[3] << 16) |
(default_mac[4] << 8) | default_mac[5];
ESP_LOGI(TAG, " 数字设备ID: %u (0x%08X)", numeric_id, numeric_id);
ESP_LOGI(TAG, "");
// ============ 5. eFuse信息 ============
ESP_LOGI(TAG, "🔒 【eFuse信息 - 一次性可编程存储器】");
// 检查MAC地址是否为出厂默认
if (esp_efuse_mac_get_default(default_mac) == ESP_OK) {
ESP_LOGI(TAG, " ✅ MAC地址来源: 出厂eFuse烧录");
} else {
ESP_LOGI(TAG, " ⚠️ MAC地址来源: 自定义设置");
}
// 显示eFuse MAC地址块
ESP_LOGI(TAG, " eFuse MAC块: %02X:%02X:%02X:%02X:%02X:%02X",
default_mac[0], default_mac[1], default_mac[2],
default_mac[3], default_mac[4], default_mac[5]);
ESP_LOGI(TAG, "");
// ============ 6. 唯一性验证 ============
ESP_LOGI(TAG, "✅ 【唯一性验证】");
ESP_LOGI(TAG, " 🌍 MAC地址: 全球唯一由IEEE分配给乐鑫");
ESP_LOGI(TAG, " 🔧 芯片ID: 基于MAC地址硬件级唯一");
ESP_LOGI(TAG, " 🏭 出厂烧录: 无法修改,永久有效");
ESP_LOGI(TAG, " 📱 设备识别: 可用于多设备管理");
ESP_LOGI(TAG, "");
ESP_LOGI(TAG, "========================================");
ESP_LOGI(TAG, "🎯 推荐使用: %s", device_id_mac);
ESP_LOGI(TAG, "📋 用途: 多设备TCP连接标识符");
ESP_LOGI(TAG, "========================================");
}
/**
* 在app_main.cpp中调用此函数查看硬件ID
*/
void setup_hardware_id_viewer() {
// 初始化WiFi获取MAC地址需要
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
esp_netif_create_default_wifi_ap();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_start();
// 等待WiFi初始化完成
vTaskDelay(pdMS_TO_TICKS(1000));
// 显示所有硬件ID信息
view_esp32_hardware_ids();
}