<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: zakiullah barakzai</title>
    <description>The latest articles on DEV Community by zakiullah barakzai (@zakiullah_barakzai_bcb8ee).</description>
    <link>https://dev.to/zakiullah_barakzai_bcb8ee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3577260%2F9bae1614-9b43-41e1-8c21-e44ce069f049.jpg</url>
      <title>DEV Community: zakiullah barakzai</title>
      <link>https://dev.to/zakiullah_barakzai_bcb8ee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zakiullah_barakzai_bcb8ee"/>
    <language>en</language>
    <item>
      <title>MQTT Topic and Message Payload Design Best Practices: ISA-95 and UNS Principles for Industrial Solution</title>
      <dc:creator>zakiullah barakzai</dc:creator>
      <pubDate>Tue, 21 Oct 2025 14:41:12 +0000</pubDate>
      <link>https://dev.to/zakiullah_barakzai_bcb8ee/mqtt-topic-and-message-payload-design-best-practices-isa-95-and-uns-principles-for-industrial-c6l</link>
      <guid>https://dev.to/zakiullah_barakzai_bcb8ee/mqtt-topic-and-message-payload-design-best-practices-isa-95-and-uns-principles-for-industrial-c6l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you're designing an MQTT communication architecture for industrial systems, the typical "just publish and subscribe" approach won't get you very far. Whether you're working with autonomous vehicles, manufacturing equipment, or any complex IoT system, you need a structure that can scale across multiple sites, handle hundreds of assets, support multiple subscribers, and remain maintainable as your system grows.&lt;/p&gt;

&lt;p&gt;Through my experience working with MQTT technology in industrial environments, I've found that combining &lt;strong&gt;ISA-95 equipment hierarchy&lt;/strong&gt;, &lt;strong&gt;Unified Namespace (UNS)&lt;/strong&gt; principles, and &lt;strong&gt;MQTT 5&lt;/strong&gt; features creates a robust, self-documenting architecture that optimizes bandwidth, improves discoverability, and supports enterprise-scale growth.&lt;/p&gt;

&lt;p&gt;In this article, I'll share these best practices and design patterns I've learned. The examples used throughout are from autonomous vehicle and industrial control scenarios—I've chosen these because I work in this industry and implement MQTT solutions here. Whether you're building a manufacturing IoT platform, managing autonomous fleets, or designing any distributed system, these patterns will help you create scalable and maintainable architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Flat MQTT Topics
&lt;/h2&gt;

&lt;p&gt;Many MQTT implementations start with simple, flat topics like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sim/telemetry/localization
av/commands/navigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach seems fine at first, but quickly reveals limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No scalability&lt;/strong&gt;: How do you support multiple simulation instances or sites?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poor discoverability&lt;/strong&gt;: New developers struggle to understand the data flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited filtering&lt;/strong&gt;: Subscribers can't efficiently filter by asset type or location&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No standards&lt;/strong&gt;: Custom patterns mean reinventing the wheel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata bloat&lt;/strong&gt;: Stuffing metadata into payloads wastes bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A structured, hierarchical approach solves these challenges systematically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Principles: The Foundation
&lt;/h2&gt;

&lt;p&gt;A robust MQTT architecture should be built on three core principles:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ISA-95 Equipment Hierarchy Model
&lt;/h3&gt;

&lt;p&gt;The ISA-95 standard defines five levels of organizational hierarchy used across manufacturing and industrial IoT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Level 4: Enterprise
Level 3: Site (Manufacturing Operations)
Level 2: Area (Production Unit)
Level 1: Cell (Work Center)
Level 0: Equipment (Process/Device)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an industrial IoT system, these levels can be mapped as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise&lt;/strong&gt;: Company-wide namespace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site&lt;/strong&gt;: Simulation/deployment instance (e.g., &lt;code&gt;sim-instance-001&lt;/code&gt;, &lt;code&gt;production-site-01&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Area&lt;/strong&gt;: System component (Simulation Engine, Control System)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line&lt;/strong&gt;: Asset management domain (assets, infrastructure)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cell&lt;/strong&gt;: Asset type (truck, crane, agv, robot)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Equipment&lt;/strong&gt;: Asset instance (specific vehicle/equipment ID)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Unified Namespace (UNS) Principles
&lt;/h3&gt;

&lt;p&gt;UNS creates a &lt;strong&gt;single source of truth&lt;/strong&gt; for all data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical Organization&lt;/strong&gt;: Clear, logical structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish Once, Subscribe Many&lt;/strong&gt;: Data producers publish to canonical topics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Documenting&lt;/strong&gt;: Topic structure reveals data meaning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven&lt;/strong&gt;: Real-time data propagation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Preservation&lt;/strong&gt;: Location and metadata embedded in topic hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. MQTT 5 Native Features
&lt;/h3&gt;

&lt;p&gt;Instead of reinventing the wheel, leverage MQTT 5's built-in capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request-Response Pattern&lt;/strong&gt;: Built-in correlation mechanism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Properties&lt;/strong&gt;: Extensible metadata without payload bloat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Type&lt;/strong&gt;: Standard content negotiation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topic Aliases&lt;/strong&gt;: Bandwidth optimization for long topics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Subscriptions&lt;/strong&gt;: Load balancing for scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Don't fight the protocol. MQTT 5 already solved many of your problems—use its features!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The 8-Level Topic Hierarchy
&lt;/h2&gt;

&lt;p&gt;Here's a recommended topic structure that follows ISA-95 and UNS principles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enterprise/
  {simulationId | siteId}/
    {area}/
      assets/
        {assetType}/
          {assetId}/
            {dataCategory}/
              {messageType}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Breaking Down Each Level
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Values&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Company namespace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Simulation ID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unique instance&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sim-instance-001&lt;/code&gt;, &lt;code&gt;production-site-01&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Area&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System component&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;simulation-engine&lt;/code&gt;, &lt;code&gt;control-system&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Line&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Domain category&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;assets&lt;/code&gt;, &lt;code&gt;infrastructure&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cell&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Asset type&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;truck&lt;/code&gt;, &lt;code&gt;crane&lt;/code&gt;, &lt;code&gt;agv&lt;/code&gt;, &lt;code&gt;robot&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Equipment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Asset instance ID&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;vehicle-001&lt;/code&gt;, &lt;code&gt;crane-alpha&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Data Category&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Message category&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;telemetry&lt;/code&gt;, &lt;code&gt;commands&lt;/code&gt;, &lt;code&gt;events&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Message Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specific message&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;localization&lt;/code&gt;, &lt;code&gt;navigation&lt;/code&gt;, &lt;code&gt;safety&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why 8 Levels? ISA-95 + MQTT Extensions
&lt;/h3&gt;

&lt;p&gt;ISA-95 provides the first 5 levels (organizational hierarchy). Three additional levels address MQTT-specific needs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extension 1: Line Level&lt;/strong&gt; (&lt;code&gt;assets/&lt;/code&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reason&lt;/strong&gt;: Organizational flexibility&lt;/li&gt;
&lt;li&gt;Allows separation of &lt;code&gt;assets/&lt;/code&gt; from future categories like &lt;code&gt;infrastructure/&lt;/code&gt;, &lt;code&gt;fleet/&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;enterprise/sim-001/simulation-engine/infrastructure/broker/status&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Extension 2: Data Category&lt;/strong&gt; (&lt;code&gt;telemetry/&lt;/code&gt;, &lt;code&gt;commands/&lt;/code&gt;, &lt;code&gt;events/&lt;/code&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reason&lt;/strong&gt;: MQTT topic organization&lt;/li&gt;
&lt;li&gt;Enables efficient wildcard subscriptions&lt;/li&gt;
&lt;li&gt;Clear separation between data types&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;enterprise/sim-001/simulation-engine/assets/+/+/telemetry/#&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Extension 3: Message Type&lt;/strong&gt; (&lt;code&gt;localization&lt;/code&gt;, &lt;code&gt;perception&lt;/code&gt;, etc.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reason&lt;/strong&gt;: Message type specificity&lt;/li&gt;
&lt;li&gt;Allows highly detailed topic filtering&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;enterprise/sim-001/simulation-engine/assets/truck/+/telemetry/localization&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Topic Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Telemetry Topics (Data from Simulation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enterprise/sim-instance-001/simulation-engine/assets/truck/vehicle-001/telemetry/localization
enterprise/sim-instance-001/simulation-engine/assets/truck/vehicle-002/telemetry/perception
enterprise/sim-instance-001/simulation-engine/assets/truck/vehicle-001/telemetry/vehicle_feedback
enterprise/sim-instance-001/simulation-engine/assets/crane/crane-alpha/telemetry/localization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Command Topics (Commands to Simulation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enterprise/sim-instance-001/simulation-engine/assets/truck/vehicle-001/commands/navigation
enterprise/sim-instance-001/simulation-engine/assets/truck/vehicle-001/commands/control
enterprise/sim-instance-001/simulation-engine/assets/truck/vehicle-001/commands/handle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Understanding Topic Organization by Destination
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Topics represent &lt;strong&gt;where the data lives&lt;/strong&gt; (the target system), not who sends it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/truck/vehicle-001/commands/navigation
                    ↑                                             ↑
                    |                                             |
            Target system                              Command being sent
            (Simulation Engine                         to Simulation Engine's
             owns these assets)                        asset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Who publishes vs who subscribes:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Publisher&lt;/th&gt;
&lt;th&gt;Subscriber&lt;/th&gt;
&lt;th&gt;Why this area?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enterprise/.../simulation-engine/assets/vehicle-001/telemetry/localization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Simulation Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Control System&lt;/td&gt;
&lt;td&gt;Simulation Engine's asset telemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enterprise/.../simulation-engine/assets/vehicle-001/commands/navigation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Control System&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simulation Engine&lt;/td&gt;
&lt;td&gt;Commands for Simulation Engine's asset&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;source of the message&lt;/strong&gt; is captured in MQTT 5 User Properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-Properties:
  source-system: control-system    ← Control System sent it
  source-system: simulation-engine ← Simulation Engine sent it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wildcard Subscription Patterns
&lt;/h3&gt;

&lt;p&gt;MQTT supports powerful wildcard subscriptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; (single-level wildcard): Matches exactly one level&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; (multi-level wildcard): Matches zero or more levels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Common patterns:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All data for one asset&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/truck/vehicle-001/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All messages for vehicle-001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All trucks in simulation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/truck/+/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All messages from all trucks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All localization data&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/+/+/telemetry/localization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Localization from all assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All telemetry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/+/+/telemetry/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All telemetry from all assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All commands to trucks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/truck/+/commands/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Commands to any truck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All safety events&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/simulation-engine/assets/+/+/events/safety&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Safety events from all assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entire simulation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;enterprise/sim-001/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Everything in simulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  MQTT 5 Message Properties: Eliminating Payload Bloat
&lt;/h2&gt;

&lt;p&gt;A key best practice in MQTT 5 is moving metadata from payloads to message properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Payload Bloat Problem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditionally, all metadata is included within the payload - resulting in bloated messages:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prev-msg-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                 &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Ns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Utc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-10-20..."&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"simulation-engine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"assetId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vehicle-001"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;                                            &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ACTUAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;DATA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;STARTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HERE&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"towHeadPose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;155 bytes of metadata + 45 bytes of actual data = 200 bytes total&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using MQTT v5 User Properties – Streamlined Payload:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"towHeadPose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;45 bytes of actual data + metadata in MQTT properties&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;High-frequency telemetry at 20 Hz:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;v1.0: 200 bytes × 20 messages/sec = 4,000 bytes/sec per asset&lt;/li&gt;
&lt;li&gt;v2.0: ~80 byte &lt;strong&gt;(binary encoded metadata)&lt;/strong&gt; × 20 messages/sec = 1600 bytes/sec per asset&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~35% reduction in bandwidth!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For 100 assets, that's &lt;strong&gt;≈ 0.23 MB/sec saved&lt;/strong&gt; on bandwidth costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standard MQTT 5 Properties
&lt;/h3&gt;

&lt;p&gt;The user properties can be represented as shown in the table below. Since they are binary encoded, they are lighter than the payload itself.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property Key&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Payload format&lt;/td&gt;
&lt;td&gt;&lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Message-Expiry-Interval&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UInt32&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;TTL in seconds&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;60&lt;/code&gt; (commands), &lt;code&gt;5&lt;/code&gt; (telemetry)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;schema-version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Schema semantic version&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.0.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source-system&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Publishing system&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;simulation-engine&lt;/code&gt;, &lt;code&gt;control-system&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source-instance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Instance ID for multi-node&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sim-node-01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp-ns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Nanosecond timestamp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1234567890123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp-utc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;ISO-8601 UTC timestamp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2025-10-20T14:30:00.123Z&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;asset-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Type of asset&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;truck&lt;/code&gt;, &lt;code&gt;crane&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;asset-id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Specific asset instance&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vehicle-001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;message-id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unique message identifier&lt;/td&gt;
&lt;td&gt;UUID/ULID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Request-Response Pattern with MQTT 5
&lt;/h2&gt;

&lt;p&gt;MQTT 5's native request-response eliminates custom correlation logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request Message (Control System → Simulation Engine)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/sim-001/simulation-engine/assets/truck/vehicle-001/commands/navigation&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MQTT Properties:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Response Topic: enterprise/sim-001/control-system/responses/vehicle-001
Correlation Data: &amp;lt;binary-correlation-id&amp;gt;
Content Type: application/json
User Properties:
  schema-version: 2.0.0
  source-system: control-system
  message-id: 550e8400-e29b-41d4-a716-446655440000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nav_command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waypoints"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qz"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.707&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.707&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"behavior"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"targetSpeedMps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Response Message (Simulation Engine → Control System)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/sim-001/control-system/responses/vehicle-001&lt;/code&gt; (from Response Topic)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MQTT Properties:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Correlation Data: &amp;lt;same-binary-correlation-id&amp;gt;
Content Type: application/json
User Properties:
  schema-version: 2.0.0
  source-system: simulation-engine
  message-id: 660e8400-e29b-41d4-a716-446655440111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Payload:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command_ack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accepted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Navigation command accepted and queued"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Message Schema Design Philosophy
&lt;/h2&gt;

&lt;p&gt;Following these principles for all payloads creates cleaner, more maintainable systems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Payload&lt;/strong&gt;: Only business data in payload; metadata in MQTT properties&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strongly Typed&lt;/strong&gt;: Use &lt;code&gt;payloadType&lt;/code&gt; field for message discrimination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flat Structure&lt;/strong&gt;: Avoid deep nesting where possible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: Optional fields for future enhancement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt;: JSON Schema available for all message types&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Base Payload Structure
&lt;/h3&gt;

&lt;p&gt;All payloads follow this minimal structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;message-type&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"&amp;lt;message-specific-fields&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Examples - Telemetry Messages
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Localization
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/{simId}/simulation-engine/assets/{assetType}/{assetId}/telemetry/localization&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; 20 Hz&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QoS:&lt;/strong&gt; 0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"towHeadPose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qz"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.707&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.707&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trailerPose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qz"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.707&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"qw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.707&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"covariance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"frameId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"map"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Perception
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/{simId}/simulation-engine/assets/{assetType}/{assetId}/telemetry/perception&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; 10 Hz&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QoS:&lt;/strong&gt; 0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"perception"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"objects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"trackId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"trk-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"truck"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"globalPosition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qz"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"qw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;....&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Vehicle Feedback
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/{simId}/simulation-engine/assets/{assetType}/{assetId}/telemetry/vehicle_feedback&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; 10 Hz&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QoS:&lt;/strong&gt; 0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vehicle_feedback"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"speedMps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steerAngleDeg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gear"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"throttlePct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brakePct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lights"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"head"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"brake"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"leftIndicator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rightIndicator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hazard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"faults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Heartbeat
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/{simId}/simulation-engine/assets/{assetType}/{assetId}/telemetry/heartbeat&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; 10 Hz&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QoS:&lt;/strong&gt; 0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Retained:&lt;/strong&gt; true (optional, for last-will monitoring)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"heartbeat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"simTimeNs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567890123456789&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paused"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"running"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Command Messages
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Navigation Command
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/{simId}/simulation-engine/assets/{assetType}/{assetId}/commands/navigation&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; On-demand / 10 Hz&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QoS:&lt;/strong&gt; 1&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Response Required:&lt;/strong&gt; Yes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nav_command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waypoints"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pose"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;30.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"speedLimitMps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"behavior"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hardStop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Status Event (Acknowledgment)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; &lt;code&gt;enterprise/{simId}/simulation-engine/assets/{assetType}/{assetId}/events/status&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Frequency:&lt;/strong&gt; On-demand&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QoS:&lt;/strong&gt; 1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payloadType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status_event"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acknowledged"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"referenceMessageId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Navigation command accepted"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quality of Service (QoS) Strategy
&lt;/h2&gt;

&lt;p&gt;Choosing the right QoS level for each message type is critical for performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  QoS Level Selection
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Message Category&lt;/th&gt;
&lt;th&gt;QoS&lt;/th&gt;
&lt;th&gt;Rationale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;High-frequency telemetry&lt;/strong&gt; (localization, perception, vehicle_feedback)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Low latency priority; acceptable message loss; next message arrives quickly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Heartbeat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Periodic; missing one heartbeat acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Commands&lt;/strong&gt; (navigation, control, handle)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Must be delivered at least once; deduplication acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Events&lt;/strong&gt; (safety, status)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Critical information; must be delivered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration changes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Must be delivered exactly once (if needed)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Don't use QoS 1 or 2 for high-frequency telemetry. The acknowledgment overhead will kill your performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Retention Policy
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic Pattern&lt;/th&gt;
&lt;th&gt;Retained&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*/telemetry/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;High-frequency, time-sensitive data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*/telemetry/heartbeat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes (optional)&lt;/td&gt;
&lt;td&gt;Last-will indicator for monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*/commands/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Time-sensitive, obsolete quickly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*/events/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Point-in-time events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*/state/#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Reflects current state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Message Expiry
&lt;/h3&gt;

&lt;p&gt;Set &lt;strong&gt;Message Expiry Interval&lt;/strong&gt; property based on data type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Telemetry&lt;/strong&gt;: 5 seconds (data stale quickly)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commands&lt;/strong&gt;: 30 seconds (time-sensitive actions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events&lt;/strong&gt;: 60 seconds (important but not time-critical)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security and Access Control
&lt;/h2&gt;

&lt;p&gt;Security is implemented through Access Control Lists (ACLs) at the broker level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simulation Engine Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUBLISH:
  enterprise/+/simulation-engine/assets/+/+/telemetry/#
  enterprise/+/simulation-engine/assets/+/+/events/#
  enterprise/+/control-system/responses/#

SUBSCRIBE:
  enterprise/+/simulation-engine/assets/+/+/commands/#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Control System Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUBLISH:
  enterprise/+/simulation-engine/assets/+/+/commands/#
  enterprise/+/control-system/assets/+/+/state/#

SUBSCRIBE:
  enterprise/+/simulation-engine/assets/+/+/telemetry/#
  enterprise/+/simulation-engine/assets/+/+/events/#
  enterprise/+/control-system/responses/#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Monitoring/Dashboard Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUBSCRIBE:
  enterprise/+/#

PUBLISH:
  (none)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  TLS/SSL Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Protocol&lt;/strong&gt;: TLS 1.3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutual Authentication&lt;/strong&gt;: Required for production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certificate Management&lt;/strong&gt;: Auto-renewal with Let's Encrypt or internal CA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why TLS 1.3?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster&lt;/strong&gt;: 1 round-trip vs 2-3 for TLS 1.2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure&lt;/strong&gt;: Removed all known vulnerabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Future-proof&lt;/strong&gt;: Will be supported for years&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance&lt;/strong&gt;: Meets all current security standards
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TLS 1.2: Client → Server → Client → Server (4 steps)
TLS 1.3: Client → Server (2 steps)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For high-frequency MQTT (20 Hz telemetry), TLS 1.3 adds minimal overhead while TLS 1.2 can cause noticeable latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Lessons from Working with MQTT at Scale
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Don't Reinvent MQTT 5 Features
&lt;/h3&gt;

&lt;p&gt;I've seen many projects build custom correlation logic, custom metadata envelopes, and custom content negotiation—all of which are already built into MQTT 5. Learn the protocol features first before building custom solutions!&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Standards Matter
&lt;/h3&gt;

&lt;p&gt;Using ISA-95/UNS principles makes your architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier to explain to new team members&lt;/li&gt;
&lt;li&gt;Compatible with third-party tools&lt;/li&gt;
&lt;li&gt;Ready for organizational growth&lt;/li&gt;
&lt;li&gt;Self-documenting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Pay Attention to QoS
&lt;/h3&gt;

&lt;p&gt;Using QoS 1 for 20 Hz telemetry can be disastrous. The acknowledgment overhead crushes performance. QoS 0 for high-frequency data is almost always the right choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Metadata in Properties, Not Payload
&lt;/h3&gt;

&lt;p&gt;Leveraging MQTT 5 User Properties for metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces bandwidth significantly&lt;/li&gt;
&lt;li&gt;Makes payloads cleaner and easier to parse&lt;/li&gt;
&lt;li&gt;Separates concerns properly&lt;/li&gt;
&lt;li&gt;Enables better caching and routing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Think Multi-Tenant from Day One
&lt;/h3&gt;

&lt;p&gt;Even if you only have one instance today, design for multiple from the start. Adding instance/site ID to the topic hierarchy early prevents painful refactoring later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Topic Naming Conventions
&lt;/h2&gt;

&lt;p&gt;Here are practical conventions that work well in industrial MQTT systems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use lowercase&lt;/strong&gt;: &lt;code&gt;enterprise/sim-001/simulation-engine&lt;/code&gt; not &lt;code&gt;Enterprise/Sim-001/SimulationEngine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use hyphens for multi-word&lt;/strong&gt;: &lt;code&gt;vehicle-001&lt;/code&gt; not &lt;code&gt;vehicle_001&lt;/code&gt; or &lt;code&gt;vehicle001&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be consistent&lt;/strong&gt;: Same pattern across all levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it readable&lt;/strong&gt;: &lt;code&gt;telemetry&lt;/code&gt; not &lt;code&gt;tlm&lt;/code&gt;, &lt;code&gt;localization&lt;/code&gt; not &lt;code&gt;loc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No special characters&lt;/strong&gt;: Only alphanumeric and hyphens&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building an industrial-grade MQTT architecture isn't just about publishing and subscribing. It's about creating a system that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scales gracefully from development to production&lt;/li&gt;
&lt;li&gt;Documents itself through topic structure&lt;/li&gt;
&lt;li&gt;Optimizes bandwidth without sacrificing functionality&lt;/li&gt;
&lt;li&gt;Follows industry standards for interoperability&lt;/li&gt;
&lt;li&gt;Provides flexibility for future growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These best practices—combining ISA-95 hierarchy, UNS principles, and MQTT 5 features—come from my hands-on experience working with MQTT in industrial environments. When applied properly, this approach can reduce bandwidth consumption significantly, improve discoverability, and create architectures that remain maintainable as systems grow.&lt;/p&gt;

&lt;p&gt;Whether you're building an autonomous vehicle system, a manufacturing IoT platform, or any other industrial system, these patterns provide a solid foundation for scalable and maintainable MQTT communication.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Would You Do Differently?
&lt;/h3&gt;

&lt;p&gt;I'd love to hear your thoughts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have you implemented similar patterns?&lt;/li&gt;
&lt;li&gt;What challenges did you face with MQTT at scale?&lt;/li&gt;
&lt;li&gt;What would you change in this architecture?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below or reach out—I'm always learning!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! If you found this helpful, please give it a ❤️ and share with your team.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>mqtt</category>
      <category>architecture</category>
      <category>uns</category>
    </item>
  </channel>
</rss>
