Protocol Architecture

One Protocol to Connect
Every Machine

MQTT is the lightweight, secure, publish-subscribe protocol that unifies Allen-Bradley, Siemens, Beckhoff, and every other PLC under one standard. No proprietary lock-in. Native JSON. Cloud-ready from day one.

<100 KB
Client Footprint
2 bytes
Min Header Size
TLS 1.3
Encryption
Pub/Sub
Architecture

MQTT vs Industrial Protocols

Industrial protocols weren't designed for the cloud era. MQTT was. Here's how they stack up across the attributes that matter for modern manufacturing.

Attribute
MQTT
OPC-UA
Modbus
PROFINET
EtherNet/IP
Lightweight
★★★★★
★★
★★★★
★★
★★
Cloud Native
★★★★★
★★★
Pub/Sub
Native
v1.04+
No
No
No
JSON Support
Native
XML/Binary
Binary only
Binary only
Binary only
TLS Security
TLS 1.3
TLS 1.3
None
TLS optional
TLS optional
Bandwidth
2-byte header
Heavy
Low
High
High
Multi-Vendor
Any PLC
Most PLCs
Most PLCs
Siemens
Rockwell
Bidirectional
Pub/Sub both
Client/Server
Master/Slave
Controller
Producer
Edge Gateway
Built-in
Requires server
Converter needed
Gateway needed
Gateway needed
AWS IoT
Native
Via Greengrass
Not supported
Not supported
Not supported

Why MQTT + Sparkplug B

MQTT provides the transport. Sparkplug B adds the industrial semantics. Together, they give you a standardized, interoperable data layer across every machine.

Lightweight & Fast

MQTT's minimal 2-byte header and binary protocol means less bandwidth, less CPU, and lower latency than OPC-UA or HTTP-based alternatives.

  • Client library fits in <100KB of flash memory
  • Runs on microcontrollers and edge PLCs
  • 10x less bandwidth than OPC-UA for same data
  • Designed for unreliable networks (QoS 0/1/2)

Native JSON Payloads

Unlike binary-only protocols (Modbus, PROFINET), MQTT carries JSON natively. No custom parsers, no binary-to-text converters, no middleware translation layers.

  • Human-readable payloads for debugging
  • Direct mapping to NoSQL documents (DynamoDB, MongoDB)
  • Sparkplug B adds typed metrics with timestamps
  • Schema-on-read — no rigid data contracts

Enterprise Security

TLS 1.3 encryption, certificate-based authentication, and topic-level ACLs. Modbus TCP has zero security. PROFINET and EtherNet/IP treat security as optional.

  • TLS 1.3 with mutual authentication (mTLS)
  • X.509 certificates per device
  • Topic-level access control lists
  • AWS IoT Core policies per thing/device

Universal Protocol Bridge

Every PLC vendor speaks a different language. MQTT acts as the universal translator — one protocol from shop floor to cloud, regardless of PLC brand.

  • Allen-Bradley → Ignition Edge → MQTT
  • Siemens S7 → OPC-UA Gateway → MQTT
  • Beckhoff → Native MQTT client
  • Modbus RTU → Edge converter → MQTT

From Shop Floor to Cloud

MQTT unifies all your PLCs into a single data stream. On-premise broker for local speed, AWS IoT Core for cloud persistence and analytics.

PLCs
Allen-Bradley
EtherNet/IP • CIP
Siemens
PROFINET • S7
Beckhoff
ADS • TwinCAT
Modbus Devices
RTU • TCP
All converge to MQTT + Sparkplug B
On-Premise
MQTT Broker (On-Premise)
Mosquitto • HiveMQ • EMQX
Local NoSQL DB
MongoDB • InfluxDB • TimescaleDB
Cloud
AWS IoT Core
MQTT Bridge • Rules Engine
DynamoDB
NoSQL • Serverless • Auto-scaling
PulseMQ Dashboard
React • GraphQL • Real-time

Native JSON vs Binary Protocols

MQTT payloads map directly to NoSQL documents. No translation, no middleware, no data loss.

MQTT + Sparkplug B Payload
// Direct to DynamoDB - no conversion needed
{
  "topic": "spBv1.0/CUST00/DDATA/LOC01/MACH02",
  "metrics": [
    { "name": "machine_state",  "value": 1,     "type": "Int32"   },
    { "name": "line_speed",     "value": 12.4,  "type": "Float"   },
    { "name": "temperature",    "value": 185.2, "type": "Float"   },
    { "name": "fabric_length",  "value": 4521,  "type": "Float"   }
  ],
  "timestamp": 1710288000000
}
Modbus / PROFINET (Binary)
// Requires custom parser + register mapping
// Register 40001: 0x0001 (machine_state?)
// Register 40002: 0x4148 0xCCCD (line_speed?)
// Register 40004: 0x4339 0x3333 (temperature?)
// Register 40006: 0x458D 0x2000 (fabric_length?)

// No field names, no types, no timestamps
// Must maintain register map spreadsheet
// Byte order varies by vendor (big/little endian)
// Changes require rewriting parser code

01 03 00 00 00 08 44 0C // raw bytes

Sparkplug B Specification

Sparkplug B (Eclipse Foundation, v3.0) adds industrial semantics on top of MQTT. It defines topic structure, metric types, birth/death certificates, and state management — turning raw MQTT into a plug-and-play industrial data bus.

Topic Namespace

namespace/group_id/message_type/edge_node_id/device_id
spBv1.0/CUST00/DDATA/LOC01/MACH02
group_id = Customer / Site message_type = DBIRTH, DDATA, DDEATH... edge_node = Location / Gateway device_id = Machine / PLC

Message Types

NBIRTH Node

Edge node comes online. Declares all available devices and their metric definitions. Acts as the birth certificate for the gateway.

NDEATH Node

Edge node goes offline (via MQTT Last Will & Testament). Broker publishes automatically — no code needed. All device data marked stale.

DBIRTH Device

Device (PLC) comes online. Publishes complete metric list with names, types, and initial values. Defines the data contract for this machine.

DDATA Device

Runtime data. Only publishes changed values (report by exception). Minimizes bandwidth while keeping all subscribers current.

DDEATH Device

Device goes offline. Published by the edge node (not the device itself). Dashboard instantly shows machine as disconnected.

DCMD Command

Write command to device. MES sends recipe parameters, batch commands, or state transitions to the PLC. Bidirectional control.

Metric Structure (Protobuf Encoded)

DBIRTH — Full State (all metrics)
// Device birth: complete metric catalog
{
  "timestamp": 1710288000000,
  "metrics": [
    {
      "name": "machine_state",
      "alias": 1,
      "timestamp": 1710288000000,
      "dataType": "Int32",
      "value": 0
    },
    {
      "name": "line_speed",
      "alias": 2,
      "dataType": "Float",
      "value": 0.0
    },
    {
      "name": "Outputs/total_length",
      "alias": 3,
      "dataType": "Float",
      "value": 0.0
    },
    {
      "name": "Recipe/temperature_setpoint",
      "alias": 4,
      "dataType": "Float",
      "value": 185.0
    }
  ],
  "seq": 0
}
DDATA — Changed Values Only
// Runtime data: only what changed (RBE)
{
  "timestamp": 1710288005000,
  "metrics": [
    {
      "name": "line_speed",
      "alias": 2,
      "timestamp": 1710288005000,
      "dataType": "Float",
      "value": 12.4
    },
    {
      "name": "Outputs/total_length",
      "alias": 3,
      "timestamp": 1710288005000,
      "dataType": "Float",
      "value": 4521.8
    }
  ],
  "seq": 42
}

// Alias allows compact wire format
// Seq tracks ordering (0-255, wraps)
// If seq gap detected → rebirth request

Session Awareness & Auto-Discovery

Birth Certificate

When a device connects, DBIRTH publishes every metric with name, type, and initial value. Subscribers instantly know the data contract — zero configuration.

Death Certificate

MQTT Last Will & Testament triggers NDEATH/DDEATH automatically on disconnect. Dashboard shows offline state within seconds — no polling.

Report by Exception

DDATA only sends changed metrics. If temperature hasn't changed, it's not in the payload. Reduces bandwidth by 80-95% vs polling protocols.

Sequence Ordering

Every message has a seq number (0-255). If a gap is detected, subscriber requests a rebirth — self-healing data.

Supported Data Types

Int8 / Int16
Signed integers
Int32 / Int64
Machine state, counters
UInt8–UInt64
Unsigned integers
Float / Double
Speed, temp, length
Boolean
On/off, alarms
String
Job ID, lot numbers
DateTime
ms since epoch
Bytes
Binary blobs, files
DataSet
Tabular data (rows/cols)
Template
UDT definitions

How PulseMQ Uses Sparkplug B

Inbound (PLC → Cloud)

  • DBIRTH → Auto-discover machine signals & data types
  • DDATA → Real-time OEE, job tracking, material flow
  • DDEATH → Machine offline detection (<5s)
  • AWS IoT Core rules parse Sparkplug B topics

Outbound (Cloud → PLC)

  • DCMD → Recipe download (ISA-88 batch parameters)
  • DCMD → PackML state commands (Start, Stop, Abort)
  • DCMD → Material validation ACK from MES
  • DCMD → Boundary ACK for continuous processes

Security Built In

MQTT was designed with security from the ground up. Modbus has none. PROFINET and EtherNet/IP treat it as an afterthought.

TLS 1.3 Encryption

Every message encrypted in transit. Mutual TLS (mTLS) with X.509 certificates ensures both client and broker verify each other's identity.

Topic-Level ACLs

Fine-grained access control per device, per topic. Machine MACH02 can only publish to its own topics. Operators can subscribe but not command.

AWS IoT Policies

Per-thing policies in AWS IoT Core. Each device gets its own certificate, its own permissions, and its own audit trail. Compromised device? Revoke instantly.

Hybrid Data Architecture

MQTT's JSON payloads map directly to NoSQL documents — no ORM, no schema migration, no ETL pipeline. Store locally for speed, replicate to the cloud for analytics.

On-Premise (Low Latency)
PLC (Any Vendor)
MQTT Broker
Local NoSQL (MongoDB / InfluxDB)
MQTT Bridge — Automatic Cloud Replication
AWS IoT Core
Lambda (Serverless)
DynamoDB (Cloud NoSQL)
PulseMQ Dashboard

On-Premise NoSQL

  • Sub-millisecond reads for real-time HMI
  • Works during internet outages
  • JSON documents — same format as cloud
  • Time-series optimized (InfluxDB / TimescaleDB)

AWS DynamoDB (Cloud)

  • Serverless — no database servers to manage
  • Auto-scaling — 10 machines or 10,000
  • DynamoDB Streams trigger Lambda for OEE calculation
  • Point-in-time recovery — 35-day backups

Stop Fighting Protocols.
Start Connecting Machines.

PulseMQ uses MQTT + Sparkplug B to give you one unified data layer from every PLC to the cloud — with native JSON, enterprise security, and zero proprietary lock-in.

Request a Demo