Layer: L7 Application ยท Build flags: PROTOCORE_ENABLE_DEVICE_ID
What this example teaches
A fleet of identical firmware images needs a stable per-device identity. protocore_device_uuid() derives a deterministic RFC 4122 v5 UUID from the chip's factory MAC: the same value on every boot, with no storage to wear out or provision. Use it for mDNS hostnames, MQTT client IDs, telemetry tags, and the like.
Compute once, reuse everywhere:
static char g_uuid[PROTOCORE_UUID_STR_LEN];
protocore_device_uuid(g_uuid);
PROTOCORE_UUID_STR_LEN sizes the caller-owned buffer (no heap). Because it is derived (hashed from the MAC, not random) it is reproducible and needs no NVS. GET /id returns it as JSON.
Build and run
pio ci --board=esp32dev --project-option="framework=arduino" \
--project-option="build_flags=-DPROTOCORE_ENABLE_DEVICE_ID=1" \
--lib="." examples/L7-Application/DeviceUuid/DeviceUuid.ino
curl http://<ip>/id # {"uuid":"...."} - identical across reboots
Annotated source
The complete sketch (DeviceUuid.ino), reproduced verbatim with added explanatory comments:
#define PROTOCORE_ENABLE_DEVICE_ID 1
#include "protocore.h"
static const char *SSID = "YOUR_SSID";
static const char *PASSWORD = "YOUR_PASSWORD";
PC server;
static char g_uuid[PROTOCORE_UUID_STR_LEN];
void setup()
{
Serial.begin(115200);
Physical.wifi->init(SSID, PASSWORD);
Serial.print("Connecting to WiFi");
while (!Physical.wifi->ready())
{
delay(250);
Serial.print('.');
}
uint32_t ip = Physical.link->egress_ip();
Serial.printf("IP: %u.%u.%u.%u\n", (unsigned)(ip & 0xFF), (unsigned)((ip >> 8) & 0xFF),
(unsigned)((ip >> 16) & 0xFF), (unsigned)((ip >> 24) & 0xFF));
protocore_device_uuid(g_uuid);
Serial.printf("device UUID: %s\n", g_uuid);
char body[64];
snprintf(body, sizeof(body), "{\"uuid\":\"%s\"}", g_uuid);
server.send(id, 200, "application/json", body);
});
server.begin(80);
}
void loop()
{
server.handle();
}
Stable device UUID derived from the chip MAC (PROTOCORE_ENABLE_DEVICE_ID).
@ HTTP_GET
Safe, idempotent read.
Layer 1 (Physical) - link bring-up, the interface registry, and live egress reporting.