fix(mqtt): birth-typed Sparkplug writes and QoS 1 for Plain writes (#602 STAB-25/26)
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
@@ -544,6 +544,11 @@ public sealed class MqttDriver
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// <b>Also the write path's type (STAB-25).</b> <see cref="WriteAsync"/> encodes a Sparkplug
|
||||
/// command with this same answer, so a birth-typed Int32 metric is commanded as Int32 rather than
|
||||
/// as the record's default.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>The precedence is the ingest path's, restated.</b> <c>SparkplugIngestor.PublishMetric</c>
|
||||
/// coerces every value with <c>DataTypeAuthored ? authored : birth</c>; a discovery surface
|
||||
/// that disagreed with it would advertise a type no value ever arrives as. The two must be
|
||||
@@ -674,7 +679,10 @@ public sealed class MqttDriver
|
||||
/// reference reject every other write in the same OPC UA request.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Good means "published", not "applied".</b> MQTT has no application-level write
|
||||
/// <b>Good means "published", not "applied".</b> A Plain-mode write is published at QoS 1
|
||||
/// (STAB-26), so "published" means the broker PUBACKed it — a broker-side refusal or a drop under
|
||||
/// the send is Bad, not Good. Sparkplug NCMD/DCMD stay at QoS 0 (a redelivered command would be
|
||||
/// re-applied). MQTT has no application-level write
|
||||
/// acknowledgement, so a successful PUBLISH is the strongest truth available at this seam —
|
||||
/// the same optimistic-Good posture Galaxy's fire-and-forget write takes. Device-level truth
|
||||
/// arrives afterwards, as the echoed value on the tag's read topic, and corrects the node
|
||||
@@ -709,7 +717,8 @@ public sealed class MqttDriver
|
||||
continue;
|
||||
}
|
||||
|
||||
var error = MqttWriteEncoder.TryEncode(_options.Mode, def, w.Value, out var encoded);
|
||||
var error = MqttWriteEncoder.TryEncode(
|
||||
_options.Mode, def, w.Value, out var encoded, ResolveDiscoveredDataType(def));
|
||||
if (error != MqttWriteEncodeError.None)
|
||||
{
|
||||
results[i] = new WriteResult(MapEncodeError(error));
|
||||
@@ -728,7 +737,7 @@ public sealed class MqttDriver
|
||||
try
|
||||
{
|
||||
await connection
|
||||
.PublishAsync(encoded.Topic, encoded.Payload, MqttWriteEncoder.WriteQos, retain: false, cancellationToken)
|
||||
.PublishAsync(encoded.Topic, encoded.Payload, encoded.Qos, retain: false, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
results[i] = new WriteResult(0u);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user