# 32.DeviceUuid - a stable MAC-derived device UUID

**Layer:** L7 Application · **Build flags:** `DETWS_ENABLE_DEVICE_ID`

## What this example teaches

A fleet of identical firmware images needs a stable per-device identity.
`detws_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:**

```cpp
static char g_uuid[DETWS_UUID_STR_LEN];
detws_device_uuid(g_uuid);          // stable per-chip UUID string
```

`DETWS_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

```sh
pio ci --board=esp32dev --project-option="framework=arduino" \
  --project-option="build_flags=-DDETWS_ENABLE_DEVICE_ID=1" \
  --lib="." examples/L7-Application/32.DeviceUuid/32.DeviceUuid.ino
```

```sh
curl http://<ip>/id   # {"uuid":"...."} - identical across reboots
```

## Annotated source

The complete sketch ([32.DeviceUuid.ino](32.DeviceUuid.ino)), reproduced verbatim
with added explanatory comments:

```cpp
// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
// SPDX-License-Identifier: AGPL-3.0-or-later

#define DETWS_ENABLE_DEVICE_ID 1

#include "dwserver.h"
#include "network_drivers/physical/physical.h"
#include "services/device_id/device_id.h"
#include <WiFi.h>

static const char *SSID = "YOUR_SSID";
static const char *PASSWORD = "YOUR_PASSWORD";

DetWebServer server;
static char g_uuid[DETWS_UUID_STR_LEN]; // caller-owned (no heap)

void setup()
{
    Serial.begin(115200);
    init_wifi_physical(SSID, PASSWORD);
    Serial.print("Connecting to WiFi");
    while (!wifi_ready())
    {
        delay(250);
        Serial.print('.');
    }
    Serial.print("\nIP: ");
    Serial.println(WiFi.localIP());
    WiFi.setSleep(false);

    detws_device_uuid(g_uuid); // stable per-chip UUID (v5, derived from the MAC)
    Serial.printf("device UUID: %s\n", g_uuid);

    server.on("/id", HTTP_GET, [](uint8_t id, HttpReq *) {
        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();
}
```
