{"id":2171,"date":"2026-10-20T08:31:38","date_gmt":"2026-10-20T08:31:38","guid":{"rendered":"https:\/\/integrationobjects.com\/blog\/?p=2171"},"modified":"2026-10-20T08:31:38","modified_gmt":"2026-10-20T08:31:38","slug":"what-is-sparkplug-b-industrial-mqtt-explained","status":"publish","type":"post","link":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/","title":{"rendered":"What Is Sparkplug B? Industrial MQTT Explained"},"content":{"rendered":"<p><strong>Sparkplug B is an open Eclipse Foundation specification that defines how industrial devices and applications use MQTT.<\/strong> It fixes three things MQTT leaves open: the topic structure, the payload format, and how every subscriber knows whether a device is online and its data is current. Plain MQTT moves messages. Sparkplug B makes those messages interoperable between vendors without custom mapping.<\/p>\n<p>For plant and OT engineers, this is what turns an MQTT broker into a reliable backbone for SCADA, historians and analytics. It is also the most common way to feed a <a href=\"https:\/\/integrationobjects.com\/blog\/what-is-a-unified-namespace-uns-the-roles-of-mqtt-and-opc-ua\/\">Unified Namespace (UNS)<\/a> from the edge.<\/p>\n<p>This guide explains how Sparkplug B works, where it fits next to OPC UA, its practical limits, and how to run it with the SIOTH\u00ae <a href=\"https:\/\/integrationobjects.com\/sioth\/mqtt-universal-broker\">MQTT Universal Broker<\/a>.<\/p>\n<blockquote><p><strong>In short:<\/strong> Sparkplug B = MQTT + a standard topic namespace (spBv1.0\/&#8230;) + a Protocol Buffers payload + birth and death certificates for state awareness.<\/p><\/blockquote>\n<h2>Why plain MQTT is not enough on a plant<\/h2>\n<p>MQTT is a lightweight publish\/subscribe protocol: publishers send messages to a broker on named topics, and subscribers receive the topics they ask for (see <a href=\"https:\/\/integrationobjects.com\/blog\/what-is-mqtt-a-deep-dive-into-mqtt-and-the-role-of-mqtt-universal-broker\/\">What is MQTT<\/a>). It is efficient over low-bandwidth and unreliable links, which is why it spread quickly in IIoT. But MQTT deliberately defines only transport. On an industrial site, that leaves four gaps:<\/p>\n<ul>\n<li><strong>No topic convention.<\/strong> One integrator publishes plant1\/pump3\/flow, another site-a\/PU-03\/FT101\/value. Every consumer needs its own mapping.<\/li>\n<li><strong>No payload format.<\/strong> The payload is just bytes: JSON, CSV, a raw float or a vendor format. Data types, units, timestamps and quality are not guaranteed.<\/li>\n<li><strong>No state awareness.<\/strong> A subscriber that stops receiving values cannot tell whether the process is stable, the device is offline, or the link is down. For operations, a stale value shown as current is a safety and quality problem.<\/li>\n<li><strong>No discovery.<\/strong> A new SCADA or historian client cannot ask what tags exist. Someone has to configure them by hand.<\/li>\n<\/ul>\n<p>Sparkplug B closes these gaps without changing MQTT itself. Any standard MQTT broker can carry Sparkplug B traffic; the rules sit in the clients and, optionally, in a Sparkplug-aware broker.<\/p>\n<h2>How Sparkplug B works<\/h2>\n<p>Sparkplug B adds four elements on top of MQTT: defined roles, a topic namespace, a typed binary payload and a state-management sequence.<\/p>\n<h3>Roles<\/h3>\n<table width=\"660\">\n<thead>\n<tr>\n<td width=\"108\"><strong>Role<\/strong><\/td>\n<td width=\"300\"><strong>What it is<\/strong><\/td>\n<td width=\"253\"><strong>Typical example<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td width=\"108\">Edge Node<\/td>\n<td width=\"300\">MQTT client that publishes data on behalf of one or more devices and receives commands<\/td>\n<td width=\"253\">Gateway or edge software reading PLCs and RTUs<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">Device<\/td>\n<td width=\"300\">Physical or logical asset attached to an Edge Node<\/td>\n<td width=\"253\">PLC, flow meter, analyser, pump skid<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">Host Application<\/td>\n<td width=\"300\">Consumer that subscribes to data and can send commands<\/td>\n<td width=\"253\">SCADA, historian, MES, analytics platform<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">Primary Host Application<\/td>\n<td width=\"300\">The Host Application whose online status Edge Nodes track before publishing<\/td>\n<td width=\"253\">Main SCADA or the integration platform<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">MQTT server<\/td>\n<td width=\"300\">Broker that routes all messages between clients<\/td>\n<td width=\"253\">MQTT broker, optionally Sparkplug-aware<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure id=\"attachment_2172\" aria-describedby=\"caption-attachment-2172\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-2172\" src=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-roles-1024x348.png\" alt=\"Sparkplug B roles diagram: field devices, Edge Nodes, MQTT server and Primary Host SCADA\" width=\"640\" height=\"218\" srcset=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-roles-1024x348.png 1024w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-roles-300x102.png 300w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-roles-768x261.png 768w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-roles-1536x522.png 1536w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-roles.png 1600w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-2172\" class=\"wp-caption-text\">Figure 1. Sparkplug B roles: Edge Nodes publish birth, data and death messages through an MQTT server to Host Applications.<\/figcaption><\/figure>\n<h3>Topic namespace<\/h3>\n<p>Every Sparkplug B message uses the same structure:<\/p>\n<p>spBv1.0\/&lt;group_id&gt;\/&lt;message_type&gt;\/&lt;edge_node_id&gt;\/[&lt;device_id&gt;]<\/p>\n<figure id=\"attachment_2173\" aria-describedby=\"caption-attachment-2173\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-2173\" src=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-topic-namespace-1024x151.png\" alt=\"Sparkplug B topic namespace example: spBv1.0\/Desal_Plant\/DDATA\/RO_Train_2_Gateway\/HP_Pump_A\" width=\"640\" height=\"94\" srcset=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-topic-namespace-1024x151.png 1024w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-topic-namespace-300x44.png 300w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-topic-namespace-768x113.png 768w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-topic-namespace-1536x227.png 1536w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-topic-namespace.png 1600w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-2173\" class=\"wp-caption-text\">Figure 2. Anatomy of a Sparkplug B topic namespace, using a desalination plant example.<\/figcaption><\/figure>\n<p>Any compliant Host Application can parse it without project-specific mapping.<\/p>\n<h3>Message types<\/h3>\n<table width=\"660\">\n<thead>\n<tr>\n<td width=\"120\"><strong>Type<\/strong><\/td>\n<td width=\"216\"><strong>Sent by<\/strong><\/td>\n<td width=\"325\"><strong>Purpose<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td width=\"120\">NBIRTH \/ DBIRTH<\/td>\n<td width=\"216\">Edge Node<\/td>\n<td width=\"325\">Announces a node or device is online, with its full metric list, data types and current values<\/td>\n<\/tr>\n<tr>\n<td width=\"120\">NDATA \/ DDATA<\/td>\n<td width=\"216\">Edge Node<\/td>\n<td width=\"325\">Sends changed values only (report by exception)<\/td>\n<\/tr>\n<tr>\n<td width=\"120\">NDEATH \/ DDEATH<\/td>\n<td width=\"216\">Broker (NDEATH, via MQTT Last Will) or Edge Node<\/td>\n<td width=\"325\">Announces a node or device is offline; consumers mark its data stale<\/td>\n<\/tr>\n<tr>\n<td width=\"120\">NCMD \/ DCMD<\/td>\n<td width=\"216\">Host Application<\/td>\n<td width=\"325\">Writes a value or sends a control request, such as a rebirth request<\/td>\n<\/tr>\n<tr>\n<td width=\"120\">STATE<\/td>\n<td width=\"216\">Primary Host Application<\/td>\n<td width=\"325\">Publishes whether the host is online, so Edge Nodes know when to publish<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Payload<\/h3>\n<p>Sparkplug B payloads are encoded with Google Protocol Buffers, a compact binary format. Each metric carries a name, a data type, a value and a timestamp. Optional numeric aliases replace long metric names after the birth message, which cuts bandwidth further. Metrics can also carry properties (such as engineering units) and templates for reusable data structures.<\/p>\n<p>A sequence number on every message lets the host detect a lost message and request a fresh birth.<\/p>\n<h3>State management: birth, data, death<\/h3>\n<p>This is the part that makes Sparkplug B suitable for operations:<\/p>\n<ol>\n<li>The Edge Node connects to the broker and registers its NDEATH message as its MQTT Last Will.<\/li>\n<li>It publishes NBIRTH, then a DBIRTH per device: the full, typed list of every metric and its current value.<\/li>\n<li>After that, it publishes only changes (NDATA, DDATA).<\/li>\n<li>If the Edge Node drops off the network, the broker publishes its NDEATH automatically.<\/li>\n<li>Every Host Application then marks that node\u2019s data as stale instead of showing the last value as current.<\/li>\n<li>On reconnection, the Edge Node sends a new birth, and every consumer has a complete, current picture again.<\/li>\n<\/ol>\n<figure id=\"attachment_2174\" aria-describedby=\"caption-attachment-2174\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-2174\" src=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-birth-death-lifecycle-1024x417.png\" alt=\"Sparkplug B session lifecycle: NBIRTH, DDATA, NDEATH Last Will, stale data and rebirth\" width=\"640\" height=\"261\" srcset=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-birth-death-lifecycle-1024x417.png 1024w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-birth-death-lifecycle-300x122.png 300w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-birth-death-lifecycle-768x313.png 768w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-birth-death-lifecycle-1536x626.png 1536w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-birth-death-lifecycle.png 1600w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-2174\" class=\"wp-caption-text\">Figure 3. Sparkplug B session lifecycle: birth, report by exception, death and rebirth.<\/figcaption><\/figure>\n<h2>Sparkplug B vs plain MQTT<\/h2>\n<table width=\"660\">\n<thead>\n<tr>\n<td width=\"185\">&nbsp;<\/td>\n<td width=\"198\"><strong>Plain MQTT<\/strong><\/td>\n<td width=\"277\"><strong>MQTT with Sparkplug B<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td width=\"185\">Topic structure<\/td>\n<td width=\"198\">Free-form, defined per project<\/td>\n<td width=\"277\">Fixed: spBv1.0\/group\/type\/node\/device<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Payload<\/td>\n<td width=\"198\">Undefined (JSON, text, binary)<\/td>\n<td width=\"277\">Protocol Buffers, typed metrics with timestamps<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Device online\/offline status<\/td>\n<td width=\"198\">Not defined<\/td>\n<td width=\"277\">Birth and death certificates on every node and device<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Stale data detection<\/td>\n<td width=\"198\">Application-specific<\/td>\n<td width=\"277\">Built in: death marks data stale<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Tag discovery<\/td>\n<td width=\"198\">Manual configuration<\/td>\n<td width=\"277\">Automatic from birth messages<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Bandwidth use<\/td>\n<td width=\"198\">Depends on payload design<\/td>\n<td width=\"277\">Report by exception, binary encoding, metric aliases<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Commands to the field<\/td>\n<td width=\"198\">Custom topics<\/td>\n<td width=\"277\">Standard NCMD \/ DCMD<\/td>\n<\/tr>\n<tr>\n<td width=\"185\">Multi-vendor interoperability<\/td>\n<td width=\"198\">Requires mapping per pair<\/td>\n<td width=\"277\">Any compliant client and host<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Plain MQTT remains a good choice for simple telemetry to IT or cloud systems where JSON readability matters. Sparkplug B is the better choice when operations depend on knowing that the data is complete and current. For the broader protocol comparison, see <a href=\"https:\/\/integrationobjects.com\/blog\/mqtt-vs-opc-ua-which-protocol-should-you-use\/\">MQTT vs OPC UA<\/a>.<\/p>\n<h2>Sparkplug B and the Unified Namespace<\/h2>\n<p>Sparkplug B is a common transport for a Unified Namespace, but it is not a UNS by itself. A <a href=\"https:\/\/integrationobjects.com\/blog\/what-is-a-unified-namespace-uns-the-roles-of-mqtt-and-opc-ua\/\">Unified Namespace<\/a> is a single, event-driven source of truth, organized the way the business sees its assets, usually along ISA-95 levels (enterprise, site, area, line, asset).<\/p>\n<p>The Sparkplug B namespace is organized by communication path: group, Edge Node, device. That suits the edge, but it does not describe where an asset sits in the plant hierarchy or what it means to the business. Most industrial UNS architectures therefore combine:<\/p>\n<ul>\n<li><strong>Sparkplug B at the edge<\/strong>, for reliable, state-aware data collection from field devices and gateways.<\/li>\n<li><strong>A contextual model above it<\/strong>, which maps raw metrics to an ISA-95 asset hierarchy with units, limits and relationships.<\/li>\n<li><strong>Standard MQTT or other interfaces to IT<\/strong>, where consumers expect readable, structured topics.<\/li>\n<\/ul>\n<figure id=\"attachment_2175\" aria-describedby=\"caption-attachment-2175\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-2175\" src=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-unified-namespace-1024x470.png\" alt=\"Sparkplug B at the edge feeding an ISA-95 asset model and Unified Namespace for applications\" width=\"640\" height=\"294\" srcset=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-unified-namespace-1024x470.png 1024w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-unified-namespace-300x138.png 300w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-unified-namespace-768x352.png 768w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sparkplug-b-unified-namespace.png 1212w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-2175\" class=\"wp-caption-text\">Figure 4. Sparkplug B and the Unified Namespace: Sparkplug B at the edge, an ISA-95 asset model above it, applications on top.<\/figcaption><\/figure>\n<p>The broker connects these layers. The modelling layer is what makes the namespace usable by SCADA, historians, analytics and AI applications.<\/p>\n<h2>Sparkplug B and OPC UA: where each fits<\/h2>\n<p>The two are complementary, and most brownfield plants run both.<\/p>\n<table width=\"660\">\n<thead>\n<tr>\n<td width=\"145\">&nbsp;<\/td>\n<td width=\"258\"><strong>OPC UA<\/strong><\/td>\n<td width=\"258\"><strong>Sparkplug B<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td width=\"145\">Communication model<\/td>\n<td width=\"258\">Client\/server (plus PubSub)<\/td>\n<td width=\"258\">Publish\/subscribe through a broker<\/td>\n<\/tr>\n<tr>\n<td width=\"145\">Strength<\/td>\n<td width=\"258\">Rich information models, browsing, method calls, historical access, alarms and conditions<\/td>\n<td width=\"258\">Lightweight, report-by-exception, many-to-many distribution, state awareness<\/td>\n<\/tr>\n<tr>\n<td width=\"145\">Typical location<\/td>\n<td width=\"258\">Control network: DCS, PLC, SCADA, historian interfaces<\/td>\n<td width=\"258\">Edge to site and site to enterprise, including remote and low-bandwidth sites<\/td>\n<\/tr>\n<tr>\n<td width=\"145\">Network pattern<\/td>\n<td width=\"258\">Client connects to each server<\/td>\n<td width=\"258\">Edge Nodes connect outbound to one broker<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A practical pattern: read field and control data over OPC UA, Modbus, DNP3 or vendor protocols at the edge, then publish it as Sparkplug B to a central broker. Clients that need OPC UA browsing or historical access keep an OPC UA endpoint.<\/p>\n<p style=\"text-align: center;\"><strong>CTA: More detail in <a href=\"https:\/\/integrationobjects.com\/blog\/power-combining-opc-ua-mqtt-sparkplug\/\">combining OPC UA, MQTT and Sparkplug<\/a>.<\/strong><\/p>\n<h2>Design considerations and limits<\/h2>\n<p>Sparkplug B solves interoperability at the edge, but a production architecture still needs decisions in five areas:<\/p>\n<ul>\n<li><strong>Binary payloads are not human-readable.<\/strong> Debugging needs a Sparkplug-aware client or decoder. IT consumers that expect JSON need a translation layer.<\/li>\n<li><strong>The namespace is not an asset model.<\/strong> Group and Edge Node IDs follow the network, not the plant. Plan the ISA-95 context layer separately.<\/li>\n<li><strong>The Primary Host matters.<\/strong> Define which application is the Primary Host and how Edge Nodes behave when it is offline, including local buffering.<\/li>\n<li><strong>Security is not part of the specification.<\/strong> Sparkplug B relies on the MQTT layer: enable TLS, authentication and topic-level access control on the broker, and place it correctly across the IT\/OT boundary.<\/li>\n<li><strong>Not every \u201cMQTT-capable\u201d device speaks Sparkplug B.<\/strong> Many devices publish plain MQTT or JSON. A conversion layer at the edge brings them into the same namespace.<\/li>\n<\/ul>\n<h2>Sparkplug B with SIOTH\u00ae and the MQTT Universal Broker<\/h2>\n<p><a href=\"https:\/\/integrationobjects.com\/sioth\">SIOTH\u00ae (Smart IoT Highway)<\/a> is Integration Objects\u2019 industrial integration platform. It covers the full Sparkplug B architecture in one installation: field protocols, Sparkplug B publishing, the broker, the asset model and the applications that consume the data. Integration Objects is a member of the Eclipse Foundation, which maintains the Sparkplug specification.<\/p>\n<figure id=\"attachment_2176\" aria-describedby=\"caption-attachment-2176\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-2176\" src=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sioth-sparkplug-b-architecture-1024x538.png\" alt=\"SIOTH Sparkplug B architecture with Data Flow, MQTT Universal Broker and ISA-95 Data Model\" width=\"640\" height=\"336\" srcset=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sioth-sparkplug-b-architecture-1024x538.png 1024w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sioth-sparkplug-b-architecture-300x158.png 300w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sioth-sparkplug-b-architecture-768x403.png 768w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sioth-sparkplug-b-architecture-1536x806.png 1536w, https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/sioth-sparkplug-b-architecture.png 1600w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-2176\" class=\"wp-caption-text\">Figure 5. Sparkplug B architecture on SIOTH\u00ae: from field devices and third-party Edge Nodes to every consumer.<\/figcaption><\/figure>\n<h3>MQTT Universal Broker<\/h3>\n<p>The <a href=\"https:\/\/integrationobjects.com\/sioth\/mqtt-universal-broker\">MQTT Universal Broker<\/a> is a configurable server within SIOTH\u00ae Data Flow. It provides:<\/p>\n<ul>\n<li>MQTT Standard and Sparkplug B on the same broker<\/li>\n<li><strong>Eclipse Sparkplug B certified<\/strong><\/li>\n<li>TCP and WebSocket endpoints<\/li>\n<li>TLS\/SSL encryption, basic authentication and MQTT Last Will and Testament<\/li>\n<\/ul>\n<h3>SIOTH\u00ae as a Sparkplug B Edge Node<\/h3>\n<p>The MQTT connector in SIOTH\u00ae Data Flow publishes Sparkplug B. Devices that speak only Modbus, DNP3, OPC Classic, OPC UA, IEC 61850 or Siemens S7 can therefore join a Sparkplug B architecture through SIOTH\u00ae, with no extra gateway per device family.<\/p>\n<h3>The four SIOTH\u00ae modules in a Sparkplug B architecture<\/h3>\n<table width=\"660\">\n<thead>\n<tr>\n<td width=\"158\"><strong>SIOTH\u00ae module<\/strong><\/td>\n<td width=\"502\"><strong>Role in a Sparkplug B architecture<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td width=\"158\">Data Flow<\/td>\n<td width=\"502\">Connects 100+ OT protocols (OPC UA, OPC Classic DA\/AE\/HDA, Modbus TCP\/RTU, DNP3, IEC 60870-5-104, IEC 61850, Siemens S7 and more), publishes Sparkplug B through its MQTT connector, and hosts the MQTT Universal Broker. Store-and-forward buffering covers intermittent links. Also hosts the OPC UA Universal Server for clients that need a single OPC UA endpoint.<\/td>\n<\/tr>\n<tr>\n<td width=\"158\">Data Model<\/td>\n<td width=\"502\">Adds ISA-95 compatible asset context on top of Sparkplug B metrics, which turns edge data into a usable Unified Namespace.<\/td>\n<\/tr>\n<tr>\n<td width=\"158\">Rule and Workflow Engine<\/td>\n<td width=\"502\">Runs expert rules, scripts and ML models on live data.<\/td>\n<\/tr>\n<tr>\n<td width=\"158\">Unified HMI<\/td>\n<td width=\"502\">Web-based SCADA and dashboards, accessible from any device.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Outbound, SIOTH\u00ae writes to historians (native connectors for AVEVA PI, AVEVA PI AF and InfluxDB), relational databases, Apache Kafka, Azure Event Hub and REST APIs.<\/p>\n<p><strong>Security across the IT\/OT boundary.<\/strong> SIOTH\u00ae supports DMZ architectures with a protocol break at the integration boundary, end-to-end TLS, role-based access control, Active Directory and OAuth 2.0 authentication and a full audit trail. The platform is IEC 62443-aligned. This addresses the point Sparkplug B leaves to the implementation: securing the broker and the path to it.<\/p>\n<h2>Getting started: a seven-step checklist<\/h2>\n<ol>\n<li><strong>Inventory sources.<\/strong> List devices, PLCs, RTUs, OPC servers and their protocols, per site and network zone.<\/li>\n<li><strong>Define the group and Edge Node naming convention.<\/strong> Keep IDs stable; they appear in every topic.<\/li>\n<li><strong>Choose the Primary Host Application<\/strong> and define Edge Node behavior while it is offline.<\/li>\n<li><strong>Place the broker in the architecture.<\/strong> Decide its network zone, TLS certificates, authentication and topic access rights.<\/li>\n<li><strong>Design the asset model<\/strong> (ISA-95 levels, units, limits) that sits above the raw Sparkplug B metrics.<\/li>\n<li><strong>Pilot one area.<\/strong> Validate birth and death behavior by disconnecting an Edge Node and checking that every consumer marks the data stale.<\/li>\n<li><strong>Connect consumers:<\/strong> SCADA, historian, analytics, then scale site by site.<\/li>\n<\/ol>\n<h2>Frequently asked questions<\/h2>\n<style>#sp-ea-2178 .spcollapsing { height: 0; overflow: hidden; transition-property: height;transition-duration: 300ms;}#sp-ea-2178.sp-easy-accordion>.sp-ea-single {margin-bottom: 10px; border: 1px solid #e2e2e2; }#sp-ea-2178.sp-easy-accordion>.sp-ea-single>.ea-header a {color: #444;}#sp-ea-2178.sp-easy-accordion>.sp-ea-single>.sp-collapse>.ea-body {background: #fff; color: #444;}#sp-ea-2178.sp-easy-accordion>.sp-ea-single {background: #eee;}#sp-ea-2178.sp-easy-accordion>.sp-ea-single>.ea-header a .ea-expand-icon { float: left; color: #444;font-size: 16px;}.sp-easy-accordion .sp-ea-single .ea-header a{\r\n  display: block;\r\n    text-decoration: none;\r\n    cursor: pointer;\r\n    font-weight: 600;\r\n    color: #444;\r\n    font-size: 16px;\r\n    line-height: 1;\r\n  box-shadow: none;}<\/style><div id=\"sp_easy_accordion-1792484730\"><div id=\"sp-ea-2178\" class=\"sp-ea-one sp-easy-accordion\" data-ea-active=\"ea-click\" data-ea-mode=\"vertical\" data-preloader=\"\" data-scroll-active-item=\"\" data-offset-to-scroll=\"0\"><div class=\"ea-card ea-expand sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21780\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21780\" aria-controls=\"collapse21780\" href=\"#\" aria-expanded=\"true\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-minus\"><\/i> What is Sparkplug B in simple terms?<\/a><\/h3><div class=\"sp-collapse spcollapse collapsed show\" id=\"collapse21780\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21780\"> <div class=\"ea-body\"><p>A set of rules on top of MQTT that standardizes topic names, payload encoding and device state, so industrial devices and applications from different vendors can exchange data without custom mapping.<\/p><\/div><\/div><\/div><div class=\"ea-card sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21781\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21781\" aria-controls=\"collapse21781\" href=\"#\" aria-expanded=\"false\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-plus\"><\/i> What does the \u201cB\u201d in Sparkplug B mean?<\/a><\/h3><div class=\"sp-collapse spcollapse \" id=\"collapse21781\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21781\"> <div class=\"ea-body\"><p>It identifies the payload definition. An earlier version, Sparkplug A, used a different payload format and is no longer in use. The topic prefix spBv1.0 refers to Sparkplug B.<\/p><\/div><\/div><\/div><div class=\"ea-card sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21782\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21782\" aria-controls=\"collapse21782\" href=\"#\" aria-expanded=\"false\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-plus\"><\/i> Who maintains Sparkplug B?<\/a><\/h3><div class=\"sp-collapse spcollapse \" id=\"collapse21782\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21782\"> <div class=\"ea-body\"><p>The Eclipse Foundation, through the Sparkplug Working Group. The current version, Sparkplug 3.0, has also been published as the international standard ISO\/IEC 20237.<\/p><\/div><\/div><\/div><div class=\"ea-card sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21783\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21783\" aria-controls=\"collapse21783\" href=\"#\" aria-expanded=\"false\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-plus\"><\/i> Does Sparkplug B need a special MQTT broker?<\/a><\/h3><div class=\"sp-collapse spcollapse \" id=\"collapse21783\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21783\"> <div class=\"ea-body\"><p>No. Any standard MQTT broker can route Sparkplug B messages. A Sparkplug-aware broker adds functions such as retaining birth certificates for late-joining clients.<\/p><\/div><\/div><\/div><div class=\"ea-card sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21784\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21784\" aria-controls=\"collapse21784\" href=\"#\" aria-expanded=\"false\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-plus\"><\/i> Is Sparkplug B secure?<\/a><\/h3><div class=\"sp-collapse spcollapse \" id=\"collapse21784\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21784\"> <div class=\"ea-body\"><p>The specification does not define security. It relies on the MQTT layer: TLS encryption, client authentication and access control on the broker, plus correct network segmentation between OT and IT.<\/p><\/div><\/div><\/div><div class=\"ea-card sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21785\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21785\" aria-controls=\"collapse21785\" href=\"#\" aria-expanded=\"false\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-plus\"><\/i> Is Sparkplug B a Unified Namespace?<\/a><\/h3><div class=\"sp-collapse spcollapse \" id=\"collapse21785\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21785\"> <div class=\"ea-body\"><p>No. It is a common way to feed a UNS from the edge. The UNS also needs an asset model, usually ISA-95, that gives the data business context.<\/p><\/div><\/div><\/div><div class=\"ea-card sp-ea-single\"><h3 class=\"ea-header\"><a class=\"collapsed\" id=\"ea-header-21786\" role=\"button\" data-sptoggle=\"spcollapse\" data-sptarget=\"#collapse21786\" aria-controls=\"collapse21786\" href=\"#\" aria-expanded=\"false\" tabindex=\"0\"><i aria-hidden=\"true\" role=\"presentation\" class=\"ea-expand-icon eap-icon-ea-expand-plus\"><\/i> Does SIOTH\u00ae support Sparkplug B?<\/a><\/h3><div class=\"sp-collapse spcollapse \" id=\"collapse21786\" data-parent=\"#sp-ea-2178\" role=\"region\" aria-labelledby=\"ea-header-21786\"> <div class=\"ea-body\"><p>Yes. The MQTT connector in SIOTH\u00ae Data Flow publishes Sparkplug B, and the SIOTH\u00ae MQTT Universal Broker, a configurable server within Data Flow, supports MQTT Standard and Sparkplug B and is Eclipse Sparkplug B certified.<\/p><\/div><\/div><\/div><script type=\"application\/ld+json\">{ \"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"@id\": \"sp-ea-schema-2178-6ad795c06fd1c\", \"mainEntity\": [{ \"@type\": \"Question\", \"name\": \"What is Sparkplug B in simple terms?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"A set of rules on top of MQTT that standardizes topic names, payload encoding and device state, so industrial devices and applications from different vendors can exchange data without custom mapping.\" } },{ \"@type\": \"Question\", \"name\": \"What does the \u201cB\u201d in Sparkplug B mean?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"It identifies the payload definition. An earlier version, Sparkplug A, used a different payload format and is no longer in use. The topic prefix spBv1.0 refers to Sparkplug B.\" } },{ \"@type\": \"Question\", \"name\": \"Who maintains Sparkplug B?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"The Eclipse Foundation, through the Sparkplug Working Group. The current version, Sparkplug 3.0, has also been published as the international standard ISO\/IEC 20237.\" } },{ \"@type\": \"Question\", \"name\": \"Does Sparkplug B need a special MQTT broker?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"No. Any standard MQTT broker can route Sparkplug B messages. A Sparkplug-aware broker adds functions such as retaining birth certificates for late-joining clients.\" } },{ \"@type\": \"Question\", \"name\": \"Is Sparkplug B secure?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"The specification does not define security. It relies on the MQTT layer: TLS encryption, client authentication and access control on the broker, plus correct network segmentation between OT and IT.\" } },{ \"@type\": \"Question\", \"name\": \"Is Sparkplug B a Unified Namespace?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"No. It is a common way to feed a UNS from the edge. The UNS also needs an asset model, usually ISA-95, that gives the data business context.\" } },{ \"@type\": \"Question\", \"name\": \"Does SIOTH\u00ae support Sparkplug B?\", \"acceptedAnswer\": { \"@type\": \"Answer\", \"text\": \"Yes. The MQTT connector in SIOTH\u00ae Data Flow publishes Sparkplug B, and the SIOTH\u00ae MQTT Universal Broker, a configurable server within Data Flow, supports MQTT Standard and Sparkplug B and is Eclipse Sparkplug B certified.\" } }] }<\/script><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Sparkplug B is an open Eclipse Foundation specification that defines how industrial devices and applications use MQTT. It fixes three things MQTT leaves open: the<\/p>\n","protected":false},"author":1,"featured_media":2177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[186],"tags":[170,31],"class_list":["post-2171","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-industrial-mqtt","tag-mqtt-universal-broker","tag-sioth"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>What Is Sparkplug B? Industrial MQTT Explained<\/title>\n<meta name=\"description\" content=\"Sparkplug B standardizes MQTT topics, payloads and device state for industrial IoT. Learn how it works, how it fits a UNS, and how SIOTH\u00ae\u00ae supports it.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What Is Sparkplug B? Industrial MQTT Explained\" \/>\n<meta property=\"og:description\" content=\"Sparkplug B standardizes MQTT topics, payloads and device state for industrial IoT. Learn how it works, how it fits a UNS, and how SIOTH\u00ae\u00ae supports it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/\" \/>\n<meta property=\"og:site_name\" content=\"OPC Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Integration.Objects.OPC\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-20T08:31:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/What-is-Sparkplug-B.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1248\" \/>\n\t<meta property=\"og:image:height\" content=\"832\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"OPCBlogAdmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@IntegObjects\" \/>\n<meta name=\"twitter:site\" content=\"@IntegObjects\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"OPCBlogAdmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What Is Sparkplug B? Industrial MQTT Explained","description":"Sparkplug B standardizes MQTT topics, payloads and device state for industrial IoT. Learn how it works, how it fits a UNS, and how SIOTH\u00ae\u00ae supports it.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/","og_locale":"en_US","og_type":"article","og_title":"What Is Sparkplug B? Industrial MQTT Explained","og_description":"Sparkplug B standardizes MQTT topics, payloads and device state for industrial IoT. Learn how it works, how it fits a UNS, and how SIOTH\u00ae\u00ae supports it.","og_url":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/","og_site_name":"OPC Blog","article_publisher":"https:\/\/www.facebook.com\/Integration.Objects.OPC\/","article_published_time":"2026-10-20T08:31:38+00:00","og_image":[{"width":1248,"height":832,"url":"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/What-is-Sparkplug-B.png","type":"image\/png"}],"author":"OPCBlogAdmin","twitter_card":"summary_large_image","twitter_creator":"@IntegObjects","twitter_site":"@IntegObjects","twitter_misc":{"Written by":"OPCBlogAdmin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/","url":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/","name":"What Is Sparkplug B? Industrial MQTT Explained","isPartOf":{"@id":"https:\/\/integrationobjects.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/#primaryimage"},"image":{"@id":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/#primaryimage"},"thumbnailUrl":"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/What-is-Sparkplug-B.png","datePublished":"2026-10-20T08:31:38+00:00","author":{"@id":"https:\/\/integrationobjects.com\/blog\/#\/schema\/person\/6efbaf488a07e418b93ff77f00af386b"},"description":"Sparkplug B standardizes MQTT topics, payloads and device state for industrial IoT. Learn how it works, how it fits a UNS, and how SIOTH\u00ae\u00ae supports it.","breadcrumb":{"@id":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/#primaryimage","url":"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/What-is-Sparkplug-B.png","contentUrl":"https:\/\/integrationobjects.com\/blog\/wp-content\/uploads\/2026\/10\/What-is-Sparkplug-B.png","width":1248,"height":832,"caption":"Sparkplug B"},{"@type":"BreadcrumbList","@id":"https:\/\/integrationobjects.com\/blog\/what-is-sparkplug-b-industrial-mqtt-explained\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/integrationobjects.com\/blog\/"},{"@type":"ListItem","position":2,"name":"What Is Sparkplug B? Industrial MQTT Explained"}]},{"@type":"WebSite","@id":"https:\/\/integrationobjects.com\/blog\/#website","url":"https:\/\/integrationobjects.com\/blog\/","name":"OPC Blog","description":"OPC and related technologies news from Integration Objects","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/integrationobjects.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/integrationobjects.com\/blog\/#\/schema\/person\/6efbaf488a07e418b93ff77f00af386b","name":"OPCBlogAdmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/integrationobjects.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f2d787c3c48eb147d5b4d0c9d05c6f35a5946c7dc40af2eedbe64030e99ea299?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f2d787c3c48eb147d5b4d0c9d05c6f35a5946c7dc40af2eedbe64030e99ea299?s=96&d=mm&r=g","caption":"OPCBlogAdmin"}}]}},"_links":{"self":[{"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/posts\/2171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/comments?post=2171"}],"version-history":[{"count":1,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/posts\/2171\/revisions"}],"predecessor-version":[{"id":2179,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/posts\/2171\/revisions\/2179"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/media\/2177"}],"wp:attachment":[{"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/media?parent=2171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/categories?post=2171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/integrationobjects.com\/blog\/wp-json\/wp\/v2\/tags?post=2171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}