164 lines
6.1 KiB
C++
164 lines
6.1 KiB
C++
/**
|
||
* 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();
|
||
}
|