HTTP is the simplest way to get a device onto CORE-M. A device that can make an
authenticated POST request can send telemetry — no broker, no persistent
connection, no special client library. Every other protocol in this section
ultimately normalizes to the same internal TelemetryPoint that the HTTP
endpoint accepts directly.
The endpoint is fronted by the CORE-M gateway, which authenticates the request,
enforces the per-tenant rate limit, and forwards it to the telemetry service.
The tenant is derived from the credential — you never put tenant_id in a place
where a client could spoof it.
HTTP ingest is one-way. For server→device messages (shared-attribute pushes,
RPC requests, command delivery), a device opens a long-lived Server-Sent
Events stream and reads downlinks as they arrive. Each event is a single
data: line carrying a JSON-encoded downlink, terminated by a blank line per
the SSE spec:
The device keeps the stream open and reacts to each event; if no stream is
connected, downlinks queue until one is. Replies (e.g. an RPC response) are sent
back as normal authenticated uplinks.
sequenceDiagram
participant Dev as Device
participant GW as Gateway :8080
participant Tel as Telemetry service
participant RP as Redpanda telemetry.raw.{tenant}
Dev->>GW: POST /api/v1/telemetry (Bearer key, JSON)
GW->>GW: Authenticate + rate limit
alt invalid credential
GW-->>Dev: 401 (payload not published)
else authenticated
GW->>Tel: IngestTelemetry(points)
Tel->>Tel: Normalize to TelemetryPoint(s)
Tel->>RP: Publish accepted points
Tel-->>GW: { accepted, rejected }
GW-->>Dev: 200 { accepted, rejected }
end
Once the first point lands, the device flips to online. If it stops sending
for longer than the offline threshold (default 120 seconds) it is marked
offline again.