Layer: L7 Application ยท Build flags: PC_ENABLE_DEVICE_ID
What this example teaches
A fleet of identical firmware images needs a stable per-device identity. pc_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[PC_UUID_STR_LEN];
pc_device_uuid(g_uuid);
PC_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=-DPC_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 PC_ENABLE_DEVICE_ID 1
static const char *SSID = "YOUR_SSID";
static const char *PASSWORD = "YOUR_PASSWORD";
static char g_uuid[PC_UUID_STR_LEN];
void setup()
{
Serial.print("Connecting to WiFi");
{
delay(250);
Serial.print('.');
}
Serial.printf("IP: %u.%u.%u.%u\n", (unsigned)(ip & 0xFF), (unsigned)((ip >> 8) & 0xFF),
(unsigned)((ip >> 16) & 0xFF), (unsigned)((ip >> 24) & 0xFF));
pc_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);
});
}
void loop()
{
}
Single-port HTTP server with deterministic, zero-allocation execution.
void send(uint8_t slot_id, int code, const char *content_type, const char *payload)
Send an HTTP response with a body and close the connection.
int32_t begin(const WebServerConfig *cfg=nullptr)
Initialize all connection slots and open all registered listeners.
void on(const char *path, HttpMethod method, Handler callback)
Register a route handler.
void handle()
Drive the server - call every Arduino loop() iteration.
Stable device UUID derived from the chip MAC (PC_ENABLE_DEVICE_ID).
bool init_wifi_physical(const char *, const char *)
Connect to a WiFi access point.
uint32_t pc_net_egress_ip(void)
IPv4 (network byte order) of the current egress interface, or 0 if none.
bool wifi_ready()
True if the WiFi station link is up (associated + an IP is assigned).
Layer 1 (Physical) - link bring-up and live egress-interface reporting.
Layer 7 (Application) - public HTTP routing API.
@ HTTP_GET
Safe, idempotent read.
Fully-parsed HTTP/1.1 request.