Device route architecture

The browser management plane and device data plane meet at backend services; a browser never calls the DDI gateway and a device never calls a browser BFF.

┌──────────────────────────── Device and terminal ────────────────────────────┐
│ Unified DDI SDK: Python │ Android/Kotlin │ C │ emulator                     │
└───────────────────┬────────────────────────────────┬────────────────────────┘
                    │ HTTPS 443                      │ MQTT 8883
                    │ identify, provision,           │ telemetry, attributes,
                    │ rotate, time, OTA              │ commands, shared config
                    ▼                                ▼
         ┌──────────────────────┐         ┌──────────────────────┐
         │ things.flexgalaxy.ai │         │ things.flexgalaxy.ai │
         │ DDI HTTPS edge       │         │ shared EMQX listener │
         └──────────┬───────────┘         └──────────┬───────────┘
                    │ mTLS identity +                │
                    │ internal workload trust        │
                    ▼                                ▼
         ┌──────────────────────┐         ┌──────────────────────┐
         │ ddi-gateway          │◄────────┤ shared subscription  │
         │ enrollment + OTA     │────────►│ + down-channel       │
         └───────┬───────┬──────┘         └──────────┬───────────┘
                 │       │                           │
        identify │       │ OTA                       │ Kafka / workload JWT
       provision │       │ relay                     │
          rotate ▼       ▼                           ▼
         ┌────────────┐ ┌────────────┐       ┌──────────────────────┐
         │ TrustMint  │ │ HawkBit    │       │ TrustMint services   │
         │ ThingMake  │ │ private    │       │ ThingIO / ThingHub   │
         │ device CA  │ │ shared-svc │       │ telemetry + commands │
         └────────────┘ └─────▲──────┘       └──────────────────────┘
                              │ rollout and assignment management
                    ┌─────────┴──────────┐
                    │ Bazaar services    │
                    │ Dev2M / OTAForge   │
                    └─────────▲──────────┘
                              │ browser + DotID user authorization
                    ┌─────────┴──────────┐
                    │ Authorized user    │
                    │ browser            │
                    └────────────────────┘

The public host deliberately hides backend product names and infrastructure. HawkBit, Kafka, internal TrustMint routes, and server-held tokens remain private.

Composite products

A customer-visible product can contain more than one DDI identity. Give each computer that independently opens MQTT and OTA sessions its own certificate and thing_id, then group those identities under one management-plane asset. A non-networked MCU can remain a component of its controller, with telemetry and OTA installation proxied by that controller. See Composite robot terminal design for the complete two-device example.

Which calls use DDI

  • Device-originated identity, telemetry, attributes, commands, time, and OTA use the DDI device surface when that capability is marked live.

  • Bazaar management calls remain in Bazaar. DDI does not carry Marketplace, EntitleKit approval/billing, publication, or rollout-authoring traffic. A future certificate-bound device license-status route may be exposed by DDI, but the management workflow and external integrator AK/SK remain in EntitleKit.

  • TrustMint management calls remain in TrustMint APIs. Device data reaches those services only after the gateway or broker authenticates and translates it.