MQTT Engine: switching brokers breaks Sparkplug functionality

@wes0johnson

Running Ignition 8.1.4 with MQTT Engine 4.0.7.

MQTT Engine enters a non-functional condition after manually switching from one broker to another.
Procedure:

  1. Enable Ignition trial and connect MQTT Engine to a broker
  2. Begin receiving data from a single node and its device
  3. MQTT Engine initiates a birth certificate due to receiving the new data
  4. Note that the system is in steady state
  5. Disable MQTT Server connection
  6. Enable a different MQTT Server with same sparkplug node (clustered brokers, for example)
  7. Observe the following log messages in Ignition (note: actual ID values replaced below):
  • “Received DDATA for OFFLINE edge node that didn’t send a birth: spBv1.0/[groupID]/DDATA/[nodeID]/[deviceID]”
  • “Received node data message for an edge node that didn’t send a birth! spBv1.0/[groupID]/NDATA/[nodeID]”
  • "Requesting Rebirth from [groupID]/[nodeID]
  • “Unable to publish message on topic spBv1.0/[groupID]/NCMD/[nodeID], client is offline”

During this condition, I observe from a separate MQTT client that an NCMD is not sent from MQTT Engine requesting a NBIRTH or DBIRTH.

If I recall, having the trial expire and resuming the trial with whichever broker is connected allows MQTT Engine to continue in a stable configuration.

I believe you may be running into an issue that was fixed in the 4.0.7 version of MQTT Engine. From the release notes there was this comment:

  • Added code to send a rebirth request in the case DDATA messages arrive before DBIRTH

If you are running a version older than 4.0.7 and using Ignition8, can you upgrade to the latest version and see if you still have this issue?

Unfortunately, I am running 8.1.4 and version 4.0.7.

The MQTT Engine module seems to handle the situation when the Ignition trial license has expired and then clicking activate where the first message is DDATA, it is able to sync up.

The issue is after it’s synced with the SpB data, and the MQTT server is disabled from within the MQTT Engine configuration and a different server (in the same cluster) is enabled, the Engine is never able to sync up to the data stream.

It may be of interest that after switching to the 2nd MQTT Server, if I disable the 2nd server and switch back to the first, it is able to lock into the data stream immediately. Seems that the mechanism doesn’t work across multiple server connections.

Hmmm - In looking closer at the log message it appears that MQTT Engine was no longer connected to the MQTT Server right before it should’ve published the rebirth request. I’m not quite sure what is going on here. Could you open a ticket at support@cirrus-link.com so we can debug further? I might take a quick screen share to figure this out.

Hi,

im playing around with MQTT and Sparkplug and after hours of searching i came to same result as 321lifoft.
Can you share youre results, once you have some :slight_smile:

Thanks in advance!

br,
Roland

@wes0johnson a support ticket was created.

@KonfektionE Will do.

There was an issue with MQTT Engine where Rebirth requests were not sent properly in certain scenarios with multiple MQTT Server configurations. This has been resolved in our nightly build of MQTT Engine here: Nightly Module Builds - MQTT Modules for Ignition 7.x - Confluence.

1 Like